22 #include "../../SDL_internal.h" 24 #ifdef SDL_JOYSTICK_EMSCRIPTEN 34 #include "SDL_sysjoystick_c.h" 35 #include "../SDL_joystick_c.h" 37 static SDL_joylist_item * JoystickByIndex(
int index);
39 static SDL_joylist_item *SDL_joylist =
NULL;
40 static SDL_joylist_item *SDL_joylist_tail =
NULL;
42 static int instance_counter = 0;
45 Emscripten_JoyStickConnected(
int eventType,
const EmscriptenGamepadEvent *gamepadEvent,
void *userData)
49 SDL_joylist_item *item;
51 if (JoystickByIndex(gamepadEvent->index) !=
NULL) {
55 item = (SDL_joylist_item *)
SDL_malloc(
sizeof (SDL_joylist_item));
61 item->index = gamepadEvent->index;
64 if ( item->name ==
NULL ) {
69 item->mapping =
SDL_strdup(gamepadEvent->mapping);
70 if ( item->mapping ==
NULL ) {
76 item->naxes = gamepadEvent->numAxes;
77 item->nbuttons = gamepadEvent->numButtons;
78 item->device_instance = instance_counter++;
80 item->timestamp = gamepadEvent->timestamp;
82 for( i = 0; i < item->naxes; i++) {
83 item->axis[
i] = gamepadEvent->axis[
i];
86 for( i = 0; i < item->nbuttons; i++) {
87 item->analogButton[
i] = gamepadEvent->analogButton[
i];
88 item->digitalButton[
i] = gamepadEvent->digitalButton[
i];
91 if (SDL_joylist_tail ==
NULL) {
92 SDL_joylist = SDL_joylist_tail = item;
94 SDL_joylist_tail->next = item;
95 SDL_joylist_tail = item;
102 #ifdef DEBUG_JOYSTICK 106 #ifdef DEBUG_JOYSTICK 107 SDL_Log(
"Added joystick with index %d", item->index);
114 Emscripten_JoyStickDisconnected(
int eventType,
const EmscriptenGamepadEvent *gamepadEvent,
void *userData)
116 SDL_joylist_item *item = SDL_joylist;
117 SDL_joylist_item *prev =
NULL;
119 while (item !=
NULL) {
120 if (item->index == gamepadEvent->index) {
131 if (item->joystick) {
132 item->joystick->hwdata =
NULL;
136 prev->next = item->next;
139 SDL_joylist = item->next;
141 if (item == SDL_joylist_tail) {
142 SDL_joylist_tail = prev;
150 #ifdef DEBUG_JOYSTICK 151 SDL_Log(
"Removed joystick with id %d", item->device_instance);
166 EmscriptenGamepadEvent gamepadState;
169 numjs = emscripten_get_num_gamepads();
172 if (numjs == EMSCRIPTEN_RESULT_NOT_SUPPORTED) {
178 for(i = 0; i < numjs; i++) {
179 retval = emscripten_get_gamepad_status(i, &gamepadState);
180 if (retval == EMSCRIPTEN_RESULT_SUCCESS) {
181 Emscripten_JoyStickConnected(EMSCRIPTEN_EVENT_GAMEPADCONNECTED,
188 retval = emscripten_set_gamepadconnected_callback(
NULL,
190 Emscripten_JoyStickConnected);
192 if(retval != EMSCRIPTEN_RESULT_SUCCESS) {
194 return SDL_SetError(
"Could not set gamepad connect callback");
197 retval = emscripten_set_gamepaddisconnected_callback(
NULL,
199 Emscripten_JoyStickDisconnected);
200 if(retval != EMSCRIPTEN_RESULT_SUCCESS) {
202 return SDL_SetError(
"Could not set gamepad disconnect callback");
209 static SDL_joylist_item *
210 JoystickByDeviceIndex(
int device_index)
212 SDL_joylist_item *item = SDL_joylist;
214 while (0 < device_index) {
223 static SDL_joylist_item *
224 JoystickByIndex(
int index)
226 SDL_joylist_item *item = SDL_joylist;
232 while (item !=
NULL) {
233 if (item->index == index) {
257 return JoystickByDeviceIndex(device_index)->name;
263 return JoystickByDeviceIndex(device_index)->device_instance;
274 SDL_joylist_item *item = JoystickByDeviceIndex(device_index);
280 if (item->joystick !=
NULL) {
284 joystick->instance_id = item->device_instance;
290 joystick->nballs = 0;
292 joystick->nbuttons = item->nbuttons;
293 joystick->naxes = item->naxes;
301 return joystick->hwdata !=
NULL;
312 EmscriptenGamepadEvent gamepadState;
313 SDL_joylist_item *item = (SDL_joylist_item *) joystick->hwdata;
314 int i,
result, buttonState;
317 result = emscripten_get_gamepad_status(item->index, &gamepadState);
318 if(
result == EMSCRIPTEN_RESULT_SUCCESS) {
319 if(gamepadState.timestamp == 0 || gamepadState.timestamp != item->timestamp) {
320 for(i = 0; i < item->nbuttons; i++) {
321 if(item->digitalButton[i] != gamepadState.digitalButton[i]) {
327 item->analogButton[
i] = gamepadState.analogButton[
i];
328 item->digitalButton[
i] = gamepadState.digitalButton[
i];
331 for(i = 0; i < item->naxes; i++) {
332 if(item->axis[i] != gamepadState.axis[i]) {
335 (
Sint16) (32767.*gamepadState.axis[i]));
339 item->axis[
i] = gamepadState.axis[
i];
342 item->timestamp = gamepadState.timestamp;
352 SDL_joylist_item *item = (SDL_joylist_item *) joystick->hwdata;
354 item->joystick =
NULL;
362 SDL_joylist_item *item =
NULL;
365 for (item = SDL_joylist;
item; item =
next) {
372 SDL_joylist = SDL_joylist_tail =
NULL;
375 instance_counter = 0;
377 emscripten_set_gamepadconnected_callback(
NULL, 0,
NULL);
378 emscripten_set_gamepaddisconnected_callback(
NULL, 0,
NULL);
397 const char *name = joystick->name;
void SDL_PrivateJoystickRemoved(SDL_JoystickID device_instance)
int SDL_PrivateJoystickButton(SDL_Joystick *joystick, Uint8 button, Uint8 state)
struct joystick_hwdata * next
void SDL_SYS_JoystickQuit(void)
int SDL_PrivateJoystickAxis(SDL_Joystick *joystick, Uint8 axis, Sint16 value)
GLuint const GLchar * name
SDL_bool SDL_SYS_JoystickAttached(SDL_Joystick *joystick)
void SDL_PrivateJoystickAdded(int device_index)
const char * SDL_SYS_JoystickNameForDeviceIndex(int device_index)
void SDL_SYS_JoystickUpdate(SDL_Joystick *joystick)
SDL_JoystickGUID SDL_SYS_JoystickGetGUID(SDL_Joystick *joystick)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
#define SDL_assert(condition)
int SDL_SYS_JoystickInit(void)
int SDL_SYS_NumJoysticks(void)
struct SDL_joylist_item * item
SDL_JoystickID SDL_SYS_GetInstanceIdOfDeviceIndex(int device_index)
int SDL_SYS_JoystickOpen(SDL_Joystick *joystick, int device_index)
void SDL_SYS_JoystickClose(SDL_Joystick *joystick)
SDL_JoystickGUID SDL_SYS_JoystickGetDeviceGUID(int device_index)
void SDL_SYS_JoystickDetect(void)