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
--- 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 */