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);
161 EMSCRIPTEN_JoystickQuit(
void)
163 SDL_joylist_item *item =
NULL;
164 SDL_joylist_item *next =
NULL;
166 for (item = SDL_joylist; item; item = next) {
173 SDL_joylist = SDL_joylist_tail =
NULL;
176 instance_counter = 0;
178 emscripten_set_gamepadconnected_callback(
NULL, 0,
NULL);
179 emscripten_set_gamepaddisconnected_callback(
NULL, 0,
NULL);
186 EMSCRIPTEN_JoystickInit(
void)
189 EmscriptenGamepadEvent gamepadState;
193 retval = emscripten_sample_gamepad_data();
196 if (retval == EMSCRIPTEN_RESULT_NOT_SUPPORTED) {
200 numjs = emscripten_get_num_gamepads();
204 for(i = 0; i < numjs; i++) {
205 retval = emscripten_get_gamepad_status(i, &gamepadState);
206 if (retval == EMSCRIPTEN_RESULT_SUCCESS) {
207 Emscripten_JoyStickConnected(EMSCRIPTEN_EVENT_GAMEPADCONNECTED,
214 retval = emscripten_set_gamepadconnected_callback(
NULL,
216 Emscripten_JoyStickConnected);
218 if(retval != EMSCRIPTEN_RESULT_SUCCESS) {
219 EMSCRIPTEN_JoystickQuit();
220 return SDL_SetError(
"Could not set gamepad connect callback");
223 retval = emscripten_set_gamepaddisconnected_callback(
NULL,
225 Emscripten_JoyStickDisconnected);
226 if(retval != EMSCRIPTEN_RESULT_SUCCESS) {
227 EMSCRIPTEN_JoystickQuit();
228 return SDL_SetError(
"Could not set gamepad disconnect callback");
235 static SDL_joylist_item *
236 JoystickByDeviceIndex(
int device_index)
238 SDL_joylist_item *item = SDL_joylist;
240 while (0 < device_index) {
249 static SDL_joylist_item *
250 JoystickByIndex(
int index)
252 SDL_joylist_item *item = SDL_joylist;
258 while (item !=
NULL) {
259 if (item->index == index) {
269 EMSCRIPTEN_JoystickGetCount(
void)
275 EMSCRIPTEN_JoystickDetect(
void)
280 EMSCRIPTEN_JoystickGetDeviceName(
int device_index)
282 return JoystickByDeviceIndex(device_index)->name;
286 EMSCRIPTEN_JoystickGetDevicePlayerIndex(
int device_index)
292 EMSCRIPTEN_JoystickGetDeviceInstanceID(
int device_index)
294 return JoystickByDeviceIndex(device_index)->device_instance;
303 EMSCRIPTEN_JoystickOpen(SDL_Joystick * joystick,
int device_index)
305 SDL_joylist_item *item = JoystickByDeviceIndex(device_index);
311 if (item->joystick !=
NULL) {
315 joystick->instance_id = item->device_instance;
321 joystick->nballs = 0;
323 joystick->nbuttons = item->nbuttons;
324 joystick->naxes = item->naxes;
335 EMSCRIPTEN_JoystickUpdate(SDL_Joystick * joystick)
337 EmscriptenGamepadEvent gamepadState;
338 SDL_joylist_item *item = (SDL_joylist_item *) joystick->hwdata;
339 int i,
result, buttonState;
341 emscripten_sample_gamepad_data();
344 result = emscripten_get_gamepad_status(item->index, &gamepadState);
345 if(
result == EMSCRIPTEN_RESULT_SUCCESS) {
346 if(gamepadState.timestamp == 0 || gamepadState.timestamp != item->timestamp) {
347 for(i = 0; i < item->nbuttons; i++) {
348 if(item->digitalButton[i] != gamepadState.digitalButton[i]) {
354 item->analogButton[
i] = gamepadState.analogButton[
i];
355 item->digitalButton[
i] = gamepadState.digitalButton[
i];
358 for(i = 0; i < item->naxes; i++) {
359 if(item->axis[i] != gamepadState.axis[i]) {
362 (
Sint16) (32767.*gamepadState.axis[i]));
366 item->axis[
i] = gamepadState.axis[
i];
369 item->timestamp = gamepadState.timestamp;
377 EMSCRIPTEN_JoystickClose(SDL_Joystick * joystick)
379 SDL_joylist_item *item = (SDL_joylist_item *) joystick->hwdata;
381 item->joystick =
NULL;
386 EMSCRIPTEN_JoystickGetDeviceGUID(
int device_index)
390 const char *
name = EMSCRIPTEN_JoystickGetDeviceName(device_index);
397 EMSCRIPTEN_JoystickRumble(SDL_Joystick * joystick,
Uint16 low_frequency_rumble,
Uint16 high_frequency_rumble,
Uint32 duration_ms)
404 EMSCRIPTEN_JoystickInit,
405 EMSCRIPTEN_JoystickGetCount,
406 EMSCRIPTEN_JoystickDetect,
407 EMSCRIPTEN_JoystickGetDeviceName,
408 EMSCRIPTEN_JoystickGetDevicePlayerIndex,
409 EMSCRIPTEN_JoystickGetDeviceGUID,
410 EMSCRIPTEN_JoystickGetDeviceInstanceID,
411 EMSCRIPTEN_JoystickOpen,
412 EMSCRIPTEN_JoystickRumble,
413 EMSCRIPTEN_JoystickUpdate,
414 EMSCRIPTEN_JoystickClose,
415 EMSCRIPTEN_JoystickQuit,
void SDL_PrivateJoystickRemoved(SDL_JoystickID device_instance)
int SDL_PrivateJoystickButton(SDL_Joystick *joystick, Uint8 button, Uint8 state)
int SDL_PrivateJoystickAxis(SDL_Joystick *joystick, Uint8 axis, Sint16 value)
GLuint const GLchar * name
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)
void SDL_PrivateJoystickAdded(SDL_JoystickID device_instance)
SDL_JoystickDriver SDL_EMSCRIPTEN_JoystickDriver
#define SDL_Unsupported()