mirror of
https://github.com/Relintai/sdl2_frt.git
synced 2024-12-20 22:16:49 +01:00
Fixed bug 2090 - Some joystick inputs are delayed on FreeBSD
kikuchan Some joysticks with high sampling rate need to be read() more fast, otherwise it delay user inputs due to internal queue. Especially, an app that issues SDL_PollEvent() not so frequent
This commit is contained in:
parent
10ffa28a28
commit
dc9ddf1f61
@ -446,48 +446,47 @@ SDL_SYS_JoystickUpdate(SDL_Joystick * joy)
|
|||||||
static int x, y, xmin = 0xffff, ymin = 0xffff, xmax = 0, ymax = 0;
|
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) !=
|
while (read(joy->hwdata->fd, &gameport, sizeof gameport) == sizeof gameport) {
|
||||||
sizeof gameport)
|
if (abs(x - gameport.x) > 8) {
|
||||||
return;
|
x = gameport.x;
|
||||||
if (abs(x - gameport.x) > 8) {
|
if (x < xmin) {
|
||||||
x = gameport.x;
|
xmin = x;
|
||||||
if (x < xmin) {
|
}
|
||||||
xmin = x;
|
if (x > xmax) {
|
||||||
|
xmax = x;
|
||||||
|
}
|
||||||
|
if (xmin == xmax) {
|
||||||
|
xmin--;
|
||||||
|
xmax++;
|
||||||
|
}
|
||||||
|
v = (Sint32) x;
|
||||||
|
v -= (xmax + xmin + 1) / 2;
|
||||||
|
v *= 32768 / ((xmax - xmin + 1) / 2);
|
||||||
|
SDL_PrivateJoystickAxis(joy, 0, v);
|
||||||
}
|
}
|
||||||
if (x > xmax) {
|
if (abs(y - gameport.y) > 8) {
|
||||||
xmax = x;
|
y = gameport.y;
|
||||||
|
if (y < ymin) {
|
||||||
|
ymin = y;
|
||||||
|
}
|
||||||
|
if (y > ymax) {
|
||||||
|
ymax = y;
|
||||||
|
}
|
||||||
|
if (ymin == ymax) {
|
||||||
|
ymin--;
|
||||||
|
ymax++;
|
||||||
|
}
|
||||||
|
v = (Sint32) y;
|
||||||
|
v -= (ymax + ymin + 1) / 2;
|
||||||
|
v *= 32768 / ((ymax - ymin + 1) / 2);
|
||||||
|
SDL_PrivateJoystickAxis(joy, 1, v);
|
||||||
}
|
}
|
||||||
if (xmin == xmax) {
|
if (gameport.b1 != joy->buttons[0]) {
|
||||||
xmin--;
|
SDL_PrivateJoystickButton(joy, 0, gameport.b1);
|
||||||
xmax++;
|
|
||||||
}
|
}
|
||||||
v = (Sint32) x;
|
if (gameport.b2 != joy->buttons[1]) {
|
||||||
v -= (xmax + xmin + 1) / 2;
|
SDL_PrivateJoystickButton(joy, 1, gameport.b2);
|
||||||
v *= 32768 / ((xmax - xmin + 1) / 2);
|
|
||||||
SDL_PrivateJoystickAxis(joy, 0, v);
|
|
||||||
}
|
|
||||||
if (abs(y - gameport.y) > 8) {
|
|
||||||
y = gameport.y;
|
|
||||||
if (y < ymin) {
|
|
||||||
ymin = y;
|
|
||||||
}
|
}
|
||||||
if (y > ymax) {
|
|
||||||
ymax = y;
|
|
||||||
}
|
|
||||||
if (ymin == ymax) {
|
|
||||||
ymin--;
|
|
||||||
ymax++;
|
|
||||||
}
|
|
||||||
v = (Sint32) y;
|
|
||||||
v -= (ymax + ymin + 1) / 2;
|
|
||||||
v *= 32768 / ((ymax - ymin + 1) / 2);
|
|
||||||
SDL_PrivateJoystickAxis(joy, 1, v);
|
|
||||||
}
|
|
||||||
if (gameport.b1 != joy->buttons[0]) {
|
|
||||||
SDL_PrivateJoystickButton(joy, 0, gameport.b1);
|
|
||||||
}
|
|
||||||
if (gameport.b2 != joy->buttons[1]) {
|
|
||||||
SDL_PrivateJoystickButton(joy, 1, gameport.b2);
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -495,65 +494,62 @@ SDL_SYS_JoystickUpdate(SDL_Joystick * joy)
|
|||||||
|
|
||||||
rep = &joy->hwdata->inreport;
|
rep = &joy->hwdata->inreport;
|
||||||
|
|
||||||
if (read(joy->hwdata->fd, REP_BUF_DATA(rep), rep->size) != rep->size) {
|
while (read(joy->hwdata->fd, REP_BUF_DATA(rep), rep->size) == rep->size) {
|
||||||
return;
|
|
||||||
}
|
|
||||||
#if defined(USBHID_NEW) || (defined(__FREEBSD__) && __FreeBSD_kernel_version >= 500111) || defined(__FreeBSD_kernel__)
|
#if defined(USBHID_NEW) || (defined(__FREEBSD__) && __FreeBSD_kernel_version >= 500111) || defined(__FreeBSD_kernel__)
|
||||||
hdata = hid_start_parse(joy->hwdata->repdesc, 1 << hid_input, rep->rid);
|
hdata = hid_start_parse(joy->hwdata->repdesc, 1 << hid_input, rep->rid);
|
||||||
#else
|
#else
|
||||||
hdata = hid_start_parse(joy->hwdata->repdesc, 1 << hid_input);
|
hdata = hid_start_parse(joy->hwdata->repdesc, 1 << hid_input);
|
||||||
#endif
|
#endif
|
||||||
if (hdata == NULL) {
|
if (hdata == NULL) {
|
||||||
fprintf(stderr, "%s: Cannot start HID parser\n", joy->hwdata->path);
|
/*fprintf(stderr, "%s: Cannot start HID parser\n", joy->hwdata->path);*/
|
||||||
return;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (nbutton = 0; hid_get_item(hdata, &hitem) > 0;) {
|
for (nbutton = 0; hid_get_item(hdata, &hitem) > 0;) {
|
||||||
switch (hitem.kind) {
|
switch (hitem.kind) {
|
||||||
case hid_input:
|
case hid_input:
|
||||||
switch (HID_PAGE(hitem.usage)) {
|
switch (HID_PAGE(hitem.usage)) {
|
||||||
case HUP_GENERIC_DESKTOP:
|
case HUP_GENERIC_DESKTOP:
|
||||||
{
|
{
|
||||||
unsigned usage = HID_USAGE(hitem.usage);
|
unsigned usage = HID_USAGE(hitem.usage);
|
||||||
int joyaxe = usage_to_joyaxe(usage);
|
int joyaxe = usage_to_joyaxe(usage);
|
||||||
if (joyaxe >= 0) {
|
if (joyaxe >= 0) {
|
||||||
naxe = joy->hwdata->axis_map[joyaxe];
|
naxe = joy->hwdata->axis_map[joyaxe];
|
||||||
/* scaleaxe */
|
/* scaleaxe */
|
||||||
v = (Sint32) hid_get_data(REP_BUF_DATA(rep), &hitem);
|
v = (Sint32) hid_get_data(REP_BUF_DATA(rep), &hitem);
|
||||||
v -= (hitem.logical_maximum +
|
v -= (hitem.logical_maximum +
|
||||||
hitem.logical_minimum + 1) / 2;
|
hitem.logical_minimum + 1) / 2;
|
||||||
v *= 32768 /
|
v *= 32768 /
|
||||||
((hitem.logical_maximum -
|
((hitem.logical_maximum -
|
||||||
hitem.logical_minimum + 1) / 2);
|
hitem.logical_minimum + 1) / 2);
|
||||||
if (v != joy->axes[naxe]) {
|
if (v != joy->axes[naxe]) {
|
||||||
SDL_PrivateJoystickAxis(joy, naxe, v);
|
SDL_PrivateJoystickAxis(joy, naxe, v);
|
||||||
|
}
|
||||||
|
} else if (usage == HUG_HAT_SWITCH) {
|
||||||
|
v = (Sint32) hid_get_data(REP_BUF_DATA(rep), &hitem);
|
||||||
|
SDL_PrivateJoystickHat(joy, 0,
|
||||||
|
hatval_to_sdl(v) -
|
||||||
|
hitem.logical_minimum);
|
||||||
}
|
}
|
||||||
} else if (usage == HUG_HAT_SWITCH) {
|
break;
|
||||||
v = (Sint32) hid_get_data(REP_BUF_DATA(rep), &hitem);
|
|
||||||
SDL_PrivateJoystickHat(joy, 0,
|
|
||||||
hatval_to_sdl(v) -
|
|
||||||
hitem.logical_minimum);
|
|
||||||
}
|
}
|
||||||
|
case HUP_BUTTON:
|
||||||
|
v = (Sint32) hid_get_data(REP_BUF_DATA(rep), &hitem);
|
||||||
|
if (joy->buttons[nbutton] != v) {
|
||||||
|
SDL_PrivateJoystickButton(joy, nbutton, v);
|
||||||
|
}
|
||||||
|
nbutton++;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
case HUP_BUTTON:
|
|
||||||
v = (Sint32) hid_get_data(REP_BUF_DATA(rep), &hitem);
|
|
||||||
if (joy->buttons[nbutton] != v) {
|
|
||||||
SDL_PrivateJoystickButton(joy, nbutton, v);
|
|
||||||
}
|
|
||||||
nbutton++;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
continue;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
hid_end_parse(hdata);
|
||||||
}
|
}
|
||||||
hid_end_parse(hdata);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Function to close a joystick after use */
|
/* Function to close a joystick after use */
|
||||||
|
Loading…
Reference in New Issue
Block a user