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
This commit is contained in:
parent
7b84e779ec
commit
354604b7bb
1 changed files with 6 additions and 5 deletions
|
@ -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 */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue