src/joystick/bsd/SDL_sysjoystick.c patch

The *BSD USB HID joystick code has two serious bugs:

  1. If a joystick reports unhandled hid_input usage (for example HUG_RZ or
    HUG_DIAL), then the last handled value will be overwritten with an
    arbitrary value. (Fixed in the patch below by adding a default case.)

  2. The current code does only handle logical coordinates in the range 0-255,
    while a big part of available joysticks report -128 - 127. (This is solved
    in the patch below by first center the range around 0, and then stretch
    it to the correct range.)

    /Krister

Index: SDL_sysjoystick.c===================================================================
RCS file: /home/sdlweb/libsdl.org/cvs/SDL12/src/joystick/bsd/SDL_sysjoystick.c,v
retrieving revision 1.10
diff -u -r1.10 SDL_sysjoystick.c
— SDL_sysjoystick.c 2002/06/12 03:32:01 1.10
+++ SDL_sysjoystick.c 2002/07/18 21:31:00
@@ -332,23 +332,14 @@
case HUG_WHEEL:
naxe = JOYAXE_WHEEL;
goto scaleaxe;

  •   		default:
    
  •   			continue;
      		}
    

scaleaxe:
v = (Sint32)hid_get_data(REP_BUF_DATA(rep),
&hitem);

  •   		if (v != 127) {
    
  •   			if (v < 127) {
    
  •   				v = -(256 - v);
    
  •   				v <<= 7;
    
  •   				v++;
    
  •   			} else {
    
  •   				v++;
    
  •   				v <<= 7;
    
  •   				v--;
    
  •   			}
    
  •   		} else {
    
  •   			v = 0;
    
  •   		}
    
  •   		v -= (hitem.logical_maximum + hitem.logical_minimum + 1)/2;
    
  •   		v *= 32768/((hitem.logical_maximum - hitem.logical_minimum + 1)/2);
      		if (v != joy->axes[naxe]) {
      			SDL_PrivateJoystickAxis(joy, naxe, v);
      		}