Patch - Joystick coef[] doesn't support dial with low number of positions.
authorSam Lantinga <slouken@libsdl.org>
Mon, 11 Feb 2013 16:51:00 -0800
changeset 6845 e14535915e3e
parent 6844 e09997fb33cc
child 6846 97eb26e2dee0
Patch - Joystick coef[] doesn't support dial with low number of positions. Simon <simon@mungewell.org> 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
--- a/src/joystick/linux/SDL_sysjoystick.c	Mon Feb 11 16:45:24 2013 -0800
+++ b/src/joystick/linux/SDL_sysjoystick.c	Mon Feb 11 16:51:00 2013 -0800
@@ -668,13 +668,13 @@
                 } 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 @@
 
     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 @@
             value -= correct->coef[0];
         }
         value *= correct->coef[2];
-        value >>= 14;
+        value >>= 13;
     }
 
     /* Clamp and return */