From 354604b7bbfdf32cbdb06bea19f888c619bff6ec Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Mon, 11 Feb 2013 16:51:00 -0800 Subject: [PATCH] Patch - Joystick coef[] doesn't support dial with low number of positions. Simon I am working on joystick support for the SRW-S1 gaming wheel on Linux, this device has 3 dials with only a few positions each. At present SDL2 only fail to report the highest position value, due to the interger math used for coef[]'s. So with a 4 position switch I have input values (with evtest) -- Event: time 1358967246.173186, type 3 (EV_ABS), code 9 (ABS_GAS), value 2 Event: time 1358967246.173186, -------------- SYN_REPORT ------------ Event: time 1358967246.369150, type 3 (EV_ABS), code 9 (ABS_GAS), value 1 Event: time 1358967246.369150, -------------- SYN_REPORT ------------ Event: time 1358967246.930277, type 3 (EV_ABS), code 9 (ABS_GAS), value 0 Event: time 1358967246.930277, -------------- SYN_REPORT ------------ Event: time 1358967249.369832, type 3 (EV_ABS), code 9 (ABS_GAS), value 1 Event: time 1358967249.369832, -------------- SYN_REPORT ------------ Event: time 1358967249.514382, type 3 (EV_ABS), code 9 (ABS_GAS), value 2 Event: time 1358967249.514382, -------------- SYN_REPORT ------------ Event: time 1358967249.626189, type 3 (EV_ABS), code 9 (ABS_GAS), value 3 Event: time 1358967249.626189, -------------- SYN_REPORT ------------ -- Testjoystick reports -- Joystick has 6 axes, 1 hats, 0 balls, and 17 buttons Joystick 0 axis 5 value: 32767 Joystick 0 axis 5 value: 0 Joystick 0 axis 5 value: -32768 Joystick 0 axis 5 value: 0 Joystick 0 axis 5 value: 32767 Joystick 0 axis 5 value: 0 Joystick 0 axis 5 value: -32768 -- The attached patch 'shifts' the coef[], so that 1/2 values can be computed/seen and allows testjoystick to report correctly. -- Joystick has 6 axes, 1 hats, 0 balls, and 17 buttons Joystick 0 axis 5 value: -10923 Joystick 0 axis 5 value: 10922 Joystick 0 axis 5 value: 32767 Joystick 0 axis 5 value: 10922 Joystick 0 axis 5 value: -10923 Joystick 0 axis 5 value: -32768 Joystick 0 axis 5 value: -10923 Joystick 0 axis 5 value: 10922 Joystick 0 axis 5 value: 32767 -- Cheers, Simon --- src/joystick/linux/SDL_sysjoystick.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/joystick/linux/SDL_sysjoystick.c b/src/joystick/linux/SDL_sysjoystick.c index 74e3c1aa9..339d9a803 100644 --- a/src/joystick/linux/SDL_sysjoystick.c +++ b/src/joystick/linux/SDL_sysjoystick.c @@ -668,13 +668,13 @@ ConfigJoystick(SDL_Joystick * joystick, int fd) } else { joystick->hwdata->abs_correct[i].used = 1; joystick->hwdata->abs_correct[i].coef[0] = - (absinfo.maximum + absinfo.minimum) / 2 - absinfo.flat; + (absinfo.maximum + absinfo.minimum) - 2 * absinfo.flat; joystick->hwdata->abs_correct[i].coef[1] = - (absinfo.maximum + absinfo.minimum) / 2 + absinfo.flat; - t = ((absinfo.maximum - absinfo.minimum) / 2 - 2 * absinfo.flat); + (absinfo.maximum + absinfo.minimum) + 2 * absinfo.flat; + t = ((absinfo.maximum - absinfo.minimum) - 4 * absinfo.flat); if (t != 0) { joystick->hwdata->abs_correct[i].coef[2] = - (1 << 29) / t; + (1 << 28) / t; } else { joystick->hwdata->abs_correct[i].coef[2] = 0; } @@ -815,6 +815,7 @@ AxisCorrect(SDL_Joystick * joystick, int which, int value) correct = &joystick->hwdata->abs_correct[which]; if (correct->used) { + value *= 2; if (value > correct->coef[0]) { if (value < correct->coef[1]) { return 0; @@ -824,7 +825,7 @@ AxisCorrect(SDL_Joystick * joystick, int which, int value) value -= correct->coef[0]; } value *= correct->coef[2]; - value >>= 14; + value >>= 13; } /* Clamp and return */