Christoph Frick wrote:
On Thu, Jan 11, 2007 at 10:25:51AM -0700, Vitaliy Margolen wrote:
@@ -128,11 +122,20 @@ struct JoystickImpl /* The 'parent' DInput */ IDirectInputImpl *dinput;
- /* autodetecting ranges per axe by following movement */
- LONG havemax[8];
- LONG havemin[8];
I could never understood why we need these? In other joystick_linux the range assumed to be 0 - 0xffff.
linux/input.h reports us the proper ranges from the device. these numbers will also be used as teh want(min|max). so what this numbers are good for. apps that want the input as "pure" as it gets dont SetProperty some something and just get what the hardware tells them (e.g. RBR does so).
What you described is SetProperty(DIPROP_RANGE). What I'm talking about is the range we get from device itself. In the map_axis we have:
if (val > hmax) This->joydev->havemax[axis] = hmax = val; if (val < hmin) This->joydev->havemin[axis] = hmin = val;
We either need to query the device for what it's ranges are, or use default range (as it's done in joystick_linux). Auto-detecting range will work only if you move joystick on all axes from min to max. And even then it still doesn't work here. I'm using joystick sample from DXSDK and it always shows 0-128-256 range for accelerator - brake pedals (as a combined Z axis). joystick_linux shows it correctly - 0..1000 (it sets this range for all axes).
- fake_current_js_state(newDevice);
Can you explain what this suppose to do? Why do we need to "fake current state" everywhere?
after e.g. SetProperties and initializing the device we have to put the values of the DIJOYSTATE2 in a sane state. e.g. GPL set the ranges to 1000-25k; where my pedals are in 0..512; so the app gets in the next step after the setting a default value of 512 (clutch not pressed) and gets nuts.
Right. But can we query device for the current axes position? They are analog devices, and should provide absolute position.
Vitaliy.