Fixed issue where the throttle and other axes on racing wheels don't 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
diff --git a/src/joystick/SDL_gamecontroller.c b/src/joystick/SDL_gamecontroller.c
index e41bae6..a9c8e82 100644
--- a/src/joystick/SDL_gamecontroller.c
+++ b/src/joystick/SDL_gamecontroller.c
@@ -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;
}
}
diff --git a/src/joystick/SDL_joystick.c b/src/joystick/SDL_joystick.c
index 4224570..663f449 100644
--- a/src/joystick/SDL_joystick.c
+++ b/src/joystick/SDL_joystick.c
@@ -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)
@@ -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 */
@@ -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;
@@ -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);
@@ -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;
@@ -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++) {
diff --git a/src/joystick/SDL_sysjoystick.h b/src/joystick/SDL_sysjoystick.h
index 4c7ba04..c24dc24 100644
--- a/src/joystick/SDL_sysjoystick.h
+++ b/src/joystick/SDL_sysjoystick.h
@@ -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 */