Commit ee603558 authored by Sam Lantinga's avatar Sam Lantinga

Merged FreeBSD joystick patch

--HG--
branch : SDL-1.2
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/branches/SDL-1.2%402446
parent bd653f81
...@@ -123,6 +123,12 @@ struct joystick_hwdata { ...@@ -123,6 +123,12 @@ struct joystick_hwdata {
struct report_desc *repdesc; struct report_desc *repdesc;
struct report inreport; struct report inreport;
int axis_map[JOYAXE_count]; /* map present JOYAXE_* to 0,1,..*/ int axis_map[JOYAXE_count]; /* map present JOYAXE_* to 0,1,..*/
int x;
int y;
int xmin;
int ymin;
int xmax;
int ymax;
}; };
static char *joynames[MAX_JOYS]; static char *joynames[MAX_JOYS];
...@@ -257,6 +263,12 @@ SDL_SYS_JoystickOpen(SDL_Joystick *joy) ...@@ -257,6 +263,12 @@ SDL_SYS_JoystickOpen(SDL_Joystick *joy)
joy->hwdata = hw; joy->hwdata = hw;
hw->fd = fd; hw->fd = fd;
hw->path = strdup(path); hw->path = strdup(path);
hw->x = 0;
hw->y = 0;
hw->xmin = 0xffff;
hw->ymin = 0xffff;
hw->xmax = 0;
hw->ymax = 0;
if (! SDL_strncmp(path, "/dev/joy", 8)) { if (! SDL_strncmp(path, "/dev/joy", 8)) {
hw->type = BSDJOY_JOY; hw->type = BSDJOY_JOY;
joy->naxes = 2; joy->naxes = 2;
...@@ -380,43 +392,42 @@ SDL_SYS_JoystickUpdate(SDL_Joystick *joy) ...@@ -380,43 +392,42 @@ SDL_SYS_JoystickUpdate(SDL_Joystick *joy)
#if defined(__FREEBSD__) || SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H #if defined(__FREEBSD__) || SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H
struct joystick gameport; struct joystick gameport;
static int x, y, xmin = 0xffff, ymin = 0xffff, xmax = 0, ymax = 0;
if (joy->hwdata->type == BSDJOY_JOY) { if (joy->hwdata->type == BSDJOY_JOY) {
if (read(joy->hwdata->fd, &gameport, sizeof gameport) != sizeof gameport) if (read(joy->hwdata->fd, &gameport, sizeof gameport) != sizeof gameport)
return; return;
if (abs(x - gameport.x) > 8) { if (abs(joy->hwdata->x - gameport.x) > 8) {
x = gameport.x; joy->hwdata->x = gameport.x;
if (x < xmin) { if (joy->hwdata->x < joy->hwdata->xmin) {
xmin = x; joy->hwdata->xmin = joy->hwdata->x;
} }
if (x > xmax) { if (joy->hwdata->x > joy->hwdata->xmax) {
xmax = x; joy->hwdata->xmax = joy->hwdata->x;
} }
if (xmin == xmax) { if (joy->hwdata->xmin == joy->hwdata->xmax) {
xmin--; joy->hwdata->xmin--;
xmax++; joy->hwdata->xmax++;
} }
v = (Sint32)x; v = (Sint32)joy->hwdata->x;
v -= (xmax + xmin + 1)/2; v -= (joy->hwdata->xmax + joy->hwdata->xmin + 1)/2;
v *= 32768/((xmax - xmin + 1)/2); v *= 32768/((joy->hwdata->xmax - joy->hwdata->xmin + 1)/2);
SDL_PrivateJoystickAxis(joy, 0, v); SDL_PrivateJoystickAxis(joy, 0, v);
} }
if (abs(y - gameport.y) > 8) { if (abs(joy->hwdata->y - gameport.y) > 8) {
y = gameport.y; joy->hwdata->y = gameport.y;
if (y < ymin) { if (joy->hwdata->y < joy->hwdata->ymin) {
ymin = y; joy->hwdata->ymin = joy->hwdata->y;
} }
if (y > ymax) { if (joy->hwdata->y > joy->hwdata->ymax) {
ymax = y; joy->hwdata->ymax = joy->hwdata->y;
} }
if (ymin == ymax) { if (joy->hwdata->ymin == joy->hwdata->ymax) {
ymin--; joy->hwdata->ymin--;
ymax++; joy->hwdata->ymax++;
} }
v = (Sint32)y; v = (Sint32)joy->hwdata->y;
v -= (ymax + ymin + 1)/2; v -= (joy->hwdata->ymax + joy->hwdata->ymin + 1)/2;
v *= 32768/((ymax - ymin + 1)/2); v *= 32768/((joy->hwdata->ymax - joy->hwdata->ymin + 1)/2);
SDL_PrivateJoystickAxis(joy, 1, v); SDL_PrivateJoystickAxis(joy, 1, v);
} }
if (gameport.b1 != joy->buttons[0]) { if (gameport.b1 != joy->buttons[0]) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment