Date: Thu, 18 Jul 2002 23:51:40 +0200 (MEST)
authorSam Lantinga <slouken@libsdl.org>
Tue, 20 Aug 2002 06:08:42 +0000
changeset 461 1d36f593078a
parent 460 a888b3ae31ff
child 462 1be0cdaf8092
Date: Thu, 18 Jul 2002 23:51:40 +0200 (MEST) From: Krister Walfridsson Subject: [SDL] 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.)
src/joystick/bsd/SDL_sysjoystick.c
--- a/src/joystick/bsd/SDL_sysjoystick.c	Tue Aug 20 06:01:20 2002 +0000
+++ b/src/joystick/bsd/SDL_sysjoystick.c	Tue Aug 20 06:08:42 2002 +0000
@@ -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);
 				}