Skip to content

Commit

Permalink
Fixed issue where the throttle and other axes on racing wheels don't …
Browse files Browse the repository at this point in the history
…start at zero and show up as immediate input when the wheel is turned for the first time. Wait until they are actually moved before generating input from them.
  • Loading branch information
slouken committed Dec 23, 2016
1 parent b2f6c4c commit ca019da
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 35 deletions.
8 changes: 4 additions & 4 deletions src/joystick/SDL_gamecontroller.c
Expand Up @@ -1132,12 +1132,12 @@ SDL_GameControllerOpen(int device_index)
int leftTriggerMapping = gamecontroller->mapping.axes[SDL_CONTROLLER_AXIS_TRIGGERLEFT];
int rightTriggerMapping = gamecontroller->mapping.axes[SDL_CONTROLLER_AXIS_TRIGGERRIGHT];
if (leftTriggerMapping >= 0) {
gamecontroller->joystick->axes[leftTriggerMapping] =
gamecontroller->joystick->axes_zero[leftTriggerMapping] = (Sint16)-32768;
gamecontroller->joystick->axes[leftTriggerMapping].value =
gamecontroller->joystick->axes[leftTriggerMapping].zero = (Sint16)-32768;
}
if (rightTriggerMapping >= 0) {
gamecontroller->joystick->axes[rightTriggerMapping] =
gamecontroller->joystick->axes_zero[rightTriggerMapping] = (Sint16)-32768;
gamecontroller->joystick->axes[rightTriggerMapping].value =
gamecontroller->joystick->axes[rightTriggerMapping].zero = (Sint16)-32768;
}
}

Expand Down
51 changes: 22 additions & 29 deletions src/joystick/SDL_joystick.c
Expand Up @@ -170,20 +170,16 @@ SDL_JoystickOpen(int device_index)
joystick->name = NULL;

if (joystick->naxes > 0) {
joystick->axes = (Sint16 *) SDL_malloc(joystick->naxes * sizeof(Sint16));
joystick->axes_zero = (Sint16 *) SDL_malloc(joystick->naxes * sizeof(Sint16));
joystick->axes = (SDL_JoystickAxisInfo *) SDL_calloc(joystick->naxes, sizeof(SDL_JoystickAxisInfo));
}
if (joystick->nhats > 0) {
joystick->hats = (Uint8 *) SDL_malloc
(joystick->nhats * sizeof(Uint8));
joystick->hats = (Uint8 *) SDL_calloc(joystick->nhats, sizeof(Uint8));
}
if (joystick->nballs > 0) {
joystick->balls = (struct balldelta *) SDL_malloc
(joystick->nballs * sizeof(*joystick->balls));
joystick->balls = (struct balldelta *) SDL_calloc(joystick->nballs, sizeof(*joystick->balls));
}
if (joystick->nbuttons > 0) {
joystick->buttons = (Uint8 *) SDL_malloc
(joystick->nbuttons * sizeof(Uint8));
joystick->buttons = (Uint8 *) SDL_calloc(joystick->nbuttons, sizeof(Uint8));
}
if (((joystick->naxes > 0) && !joystick->axes)
|| ((joystick->nhats > 0) && !joystick->hats)
Expand All @@ -194,20 +190,6 @@ SDL_JoystickOpen(int device_index)
SDL_UnlockJoystickList();
return NULL;
}
if (joystick->axes) {
SDL_memset(joystick->axes, 0, joystick->naxes * sizeof(Sint16));
SDL_memset(joystick->axes_zero, 0, joystick->naxes * sizeof(Sint16));
}
if (joystick->hats) {
SDL_memset(joystick->hats, 0, joystick->nhats * sizeof(Uint8));
}
if (joystick->balls) {
SDL_memset(joystick->balls, 0,
joystick->nballs * sizeof(*joystick->balls));
}
if (joystick->buttons) {
SDL_memset(joystick->buttons, 0, joystick->nbuttons * sizeof(Uint8));
}
joystick->epowerlevel = SDL_JOYSTICK_POWER_UNKNOWN;

/* Add joystick to list */
Expand Down Expand Up @@ -302,7 +284,7 @@ SDL_JoystickGetAxis(SDL_Joystick * joystick, int axis)
return (0);
}
if (axis < joystick->naxes) {
state = joystick->axes[axis];
state = joystick->axes[axis].value;
} else {
SDL_SetError("Joystick only has %d axes", joystick->naxes);
state = 0;
Expand Down Expand Up @@ -486,7 +468,6 @@ SDL_JoystickClose(SDL_Joystick * joystick)

/* Free the data associated with this joystick */
SDL_free(joystick->axes);
SDL_free(joystick->axes_zero);
SDL_free(joystick->hats);
SDL_free(joystick->balls);
SDL_free(joystick->buttons);
Expand Down Expand Up @@ -621,22 +602,34 @@ SDL_PrivateJoystickAxis(SDL_Joystick * joystick, Uint8 axis, Sint16 value)
if (axis >= joystick->naxes) {
return 0;
}
if (value == joystick->axes[axis]) {
if (value == joystick->axes[axis].value) {
return 0;
}
if (!joystick->axes[axis].moved) {
if (joystick->axes[axis].intial_value == 0) {
joystick->axes[axis].intial_value = value;
return 0;
}
if (value == joystick->axes[axis].intial_value) {
return 0;
}

/* We got more than 0 and the initial value from the joystick, consider it as having actually moved */
joystick->axes[axis].moved = SDL_TRUE;
}

/* We ignore events if we don't have keyboard focus, except for centering
* events.
*/
if (SDL_PrivateJoystickShouldIgnoreEvent()) {
if ((value > joystick->axes_zero[axis] && value >= joystick->axes[axis]) ||
(value < joystick->axes_zero[axis] && value <= joystick->axes[axis])) {
if ((value > joystick->axes[axis].zero && value >= joystick->axes[axis].value) ||
(value < joystick->axes[axis].zero && value <= joystick->axes[axis].value)) {
return 0;
}
}

/* Update internal joystick state */
joystick->axes[axis] = value;
joystick->axes[axis].value = value;

/* Post the event, if desired */
posted = 0;
Expand Down Expand Up @@ -807,7 +800,7 @@ SDL_JoystickUpdate(void)

/* Tell the app that everything is centered/unpressed... */
for (i = 0; i < joystick->naxes; i++) {
SDL_PrivateJoystickAxis(joystick, i, joystick->axes_zero[i]);
SDL_PrivateJoystickAxis(joystick, i, joystick->axes[i].zero);
}

for (i = 0; i < joystick->nbuttons; i++) {
Expand Down
11 changes: 9 additions & 2 deletions src/joystick/SDL_sysjoystick.h
Expand Up @@ -29,14 +29,21 @@
#include "SDL_joystick_c.h"

/* The SDL joystick structure */
typedef struct _SDL_JoystickAxisInfo
{
Sint16 value; /* Current axis states */
Sint16 zero; /* Zero point on the axis (-32768 for triggers) */
Sint16 intial_value; /* The very first value we saw on this axis */
SDL_bool moved; /* Whether the axis has moved */
} SDL_JoystickAxisInfo;

struct _SDL_Joystick
{
SDL_JoystickID instance_id; /* Device instance, monotonically increasing from 0 */
char *name; /* Joystick name - system dependent */

int naxes; /* Number of axis controls on the joystick */
Sint16 *axes; /* Current axis states */
Sint16 *axes_zero; /* Zero point on the axis (-32768 for triggers) */
SDL_JoystickAxisInfo *axes;

int nhats; /* Number of hats on the joystick */
Uint8 *hats; /* Current hat states */
Expand Down

0 comments on commit ca019da

Please sign in to comment.