22 #include "../../SDL_internal.h"
24 #ifdef SDL_JOYSTICK_ANDROID
35 #include "SDL_sysjoystick_c.h"
36 #include "../SDL_joystick_c.h"
37 #include "../../events/SDL_keyboard_c.h"
38 #include "../../core/android/SDL_android.h"
39 #include "../hidapi/SDL_hidapijoystick_c.h"
41 #include "android/keycodes.h"
44 #ifndef AKEYCODE_BUTTON_1
45 #define AKEYCODE_BUTTON_1 188
46 #define AKEYCODE_BUTTON_2 189
47 #define AKEYCODE_BUTTON_3 190
48 #define AKEYCODE_BUTTON_4 191
49 #define AKEYCODE_BUTTON_5 192
50 #define AKEYCODE_BUTTON_6 193
51 #define AKEYCODE_BUTTON_7 194
52 #define AKEYCODE_BUTTON_8 195
53 #define AKEYCODE_BUTTON_9 196
54 #define AKEYCODE_BUTTON_10 197
55 #define AKEYCODE_BUTTON_11 198
56 #define AKEYCODE_BUTTON_12 199
57 #define AKEYCODE_BUTTON_13 200
58 #define AKEYCODE_BUTTON_14 201
59 #define AKEYCODE_BUTTON_15 202
60 #define AKEYCODE_BUTTON_16 203
63 #define ANDROID_ACCELEROMETER_NAME "Android Accelerometer"
64 #define ANDROID_ACCELEROMETER_DEVICE_ID INT_MIN
65 #define ANDROID_MAX_NBUTTONS 36
67 static SDL_joylist_item * JoystickByDeviceId(
int device_id);
69 static SDL_joylist_item *SDL_joylist =
NULL;
70 static SDL_joylist_item *SDL_joylist_tail =
NULL;
80 for(
i = 0;
i < 8; ++
i) {
81 r = (
r & 1? 0: (
Uint32)0xEDB88320L) ^
r >> 1;
101 keycode_to_SDL(
int keycode)
107 case AKEYCODE_BUTTON_A:
110 case AKEYCODE_BUTTON_B:
113 case AKEYCODE_BUTTON_X:
116 case AKEYCODE_BUTTON_Y:
119 case AKEYCODE_BUTTON_L1:
122 case AKEYCODE_BUTTON_R1:
125 case AKEYCODE_BUTTON_THUMBL:
128 case AKEYCODE_BUTTON_THUMBR:
131 case AKEYCODE_BUTTON_START:
135 case AKEYCODE_BUTTON_SELECT:
138 case AKEYCODE_BUTTON_MODE:
141 case AKEYCODE_BUTTON_L2:
144 case AKEYCODE_BUTTON_R2:
147 case AKEYCODE_BUTTON_C:
150 case AKEYCODE_BUTTON_Z:
155 case AKEYCODE_DPAD_UP:
158 case AKEYCODE_DPAD_DOWN:
161 case AKEYCODE_DPAD_LEFT:
164 case AKEYCODE_DPAD_RIGHT:
167 case AKEYCODE_DPAD_CENTER:
174 case AKEYCODE_BUTTON_1:
175 case AKEYCODE_BUTTON_2:
176 case AKEYCODE_BUTTON_3:
177 case AKEYCODE_BUTTON_4:
178 case AKEYCODE_BUTTON_5:
179 case AKEYCODE_BUTTON_6:
180 case AKEYCODE_BUTTON_7:
181 case AKEYCODE_BUTTON_8:
182 case AKEYCODE_BUTTON_9:
183 case AKEYCODE_BUTTON_10:
184 case AKEYCODE_BUTTON_11:
185 case AKEYCODE_BUTTON_12:
186 case AKEYCODE_BUTTON_13:
187 case AKEYCODE_BUTTON_14:
188 case AKEYCODE_BUTTON_15:
189 case AKEYCODE_BUTTON_16:
206 button_to_scancode(
int button)
230 Android_OnPadDown(
int device_id,
int keycode)
232 SDL_joylist_item *item;
233 int button = keycode_to_SDL(keycode);
235 item = JoystickByDeviceId(device_id);
236 if (item && item->joystick) {
248 Android_OnPadUp(
int device_id,
int keycode)
250 SDL_joylist_item *item;
251 int button = keycode_to_SDL(keycode);
253 item = JoystickByDeviceId(device_id);
254 if (item && item->joystick) {
266 Android_OnJoy(
int device_id,
int axis,
float value)
269 SDL_joylist_item *item = JoystickByDeviceId(device_id);
270 if (item && item->joystick) {
278 Android_OnHat(
int device_id,
int hat_id,
int x,
int y)
286 SDL_joylist_item *item = JoystickByDeviceId(device_id);
287 if (item && item->joystick) {
291 dpad_state |= DPAD_LEFT_MASK;
293 dpad_state |= DPAD_RIGHT_MASK;
296 dpad_state |= DPAD_UP_MASK;
298 dpad_state |= DPAD_DOWN_MASK;
301 dpad_delta = (dpad_state ^ item->dpad_state);
303 if (dpad_delta & DPAD_UP_MASK) {
306 if (dpad_delta & DPAD_DOWN_MASK) {
309 if (dpad_delta & DPAD_LEFT_MASK) {
312 if (dpad_delta & DPAD_RIGHT_MASK) {
315 item->dpad_state = dpad_state;
326 Android_AddJoystick(
int device_id,
const char *
name,
const char *desc,
int vendor_id,
int product_id,
SDL_bool is_accelerometer,
int button_mask,
int naxes,
int nhats,
int nballs)
328 SDL_joylist_item *item;
337 if (naxes < 2 && nhats < 1) {
342 if (JoystickByDeviceId(device_id) !=
NULL ||
name ==
NULL) {
346 #ifdef SDL_JOYSTICK_HIDAPI
353 #ifdef DEBUG_JOYSTICK
354 SDL_Log(
"Joystick: %s, descriptor %s, vendor = 0x%.4x, product = 0x%.4x, %d axes, %d hats\n",
name, desc, vendor_id, product_id, naxes, nhats);
361 if (!is_accelerometer) {
389 if (vendor_id && product_id) {
405 item = (SDL_joylist_item *)
SDL_malloc(
sizeof (SDL_joylist_item));
412 item->device_id = device_id;
414 if (item->name ==
NULL) {
419 item->is_accelerometer = is_accelerometer;
420 if (button_mask == 0xFFFFFFFF) {
421 item->nbuttons = ANDROID_MAX_NBUTTONS;
423 for (
i = 0;
i <
sizeof(button_mask)*8; ++
i) {
424 if (button_mask & (1 <<
i)) {
425 item->nbuttons =
i+1;
431 item->nballs = nballs;
433 if (SDL_joylist_tail ==
NULL) {
434 SDL_joylist = SDL_joylist_tail = item;
436 SDL_joylist_tail->next = item;
437 SDL_joylist_tail = item;
445 #ifdef DEBUG_JOYSTICK
446 SDL_Log(
"Added joystick %s with device_id %d",
name, device_id);
453 Android_RemoveJoystick(
int device_id)
455 SDL_joylist_item *item = SDL_joylist;
456 SDL_joylist_item *prev =
NULL;
459 while (item !=
NULL) {
460 if (item->device_id == device_id) {
471 if (item->joystick) {
472 item->joystick->hwdata =
NULL;
476 prev->next = item->next;
479 SDL_joylist = item->next;
481 if (item == SDL_joylist_tail) {
482 SDL_joylist_tail = prev;
490 #ifdef DEBUG_JOYSTICK
491 SDL_Log(
"Removed joystick with device_id %d", device_id);
500 static void ANDROID_JoystickDetect();
503 ANDROID_JoystickInit(
void)
505 ANDROID_JoystickDetect();
509 Android_AddJoystick(ANDROID_ACCELEROMETER_DEVICE_ID, ANDROID_ACCELEROMETER_NAME, ANDROID_ACCELEROMETER_NAME, 0, 0,
SDL_TRUE, 0, 3, 0, 0);
516 ANDROID_JoystickGetCount(
void)
522 ANDROID_JoystickDetect(
void)
535 static SDL_joylist_item *
536 JoystickByDevIndex(
int device_index)
538 SDL_joylist_item *item = SDL_joylist;
540 if ((device_index < 0) || (device_index >=
numjoysticks)) {
544 while (device_index > 0) {
553 static SDL_joylist_item *
554 JoystickByDeviceId(
int device_id)
556 SDL_joylist_item *item = SDL_joylist;
558 while (item !=
NULL) {
559 if (item->device_id == device_id) {
566 ANDROID_JoystickDetect();
568 while (item !=
NULL) {
569 if (item->device_id == device_id) {
579 ANDROID_JoystickGetDeviceName(
int device_index)
581 return JoystickByDevIndex(device_index)->name;
585 ANDROID_JoystickGetDevicePlayerIndex(
int device_index)
591 ANDROID_JoystickGetDeviceGUID(
int device_index)
593 return JoystickByDevIndex(device_index)->guid;
597 ANDROID_JoystickGetDeviceInstanceID(
int device_index)
599 return JoystickByDevIndex(device_index)->device_instance;
603 ANDROID_JoystickOpen(SDL_Joystick * joystick,
int device_index)
605 SDL_joylist_item *item = JoystickByDevIndex(device_index);
611 if (item->joystick !=
NULL) {
615 joystick->instance_id = item->device_instance;
627 ANDROID_JoystickRumble(SDL_Joystick *
joystick,
Uint16 low_frequency_rumble,
Uint16 high_frequency_rumble,
Uint32 duration_ms)
633 ANDROID_JoystickUpdate(SDL_Joystick *
joystick)
635 SDL_joylist_item *
item = (SDL_joylist_item *)
joystick->hwdata;
641 if (
item->is_accelerometer) {
647 for (
i = 0;
i < 3;
i++) {
662 ANDROID_JoystickClose(SDL_Joystick *
joystick)
664 SDL_joylist_item *
item = (SDL_joylist_item *)
joystick->hwdata;
671 ANDROID_JoystickQuit(
void)
686 SDL_joylist = SDL_joylist_tail =
NULL;
694 ANDROID_JoystickInit,
695 ANDROID_JoystickGetCount,
696 ANDROID_JoystickDetect,
697 ANDROID_JoystickGetDeviceName,
698 ANDROID_JoystickGetDevicePlayerIndex,
699 ANDROID_JoystickGetDeviceGUID,
700 ANDROID_JoystickGetDeviceInstanceID,
701 ANDROID_JoystickOpen,
702 ANDROID_JoystickRumble,
703 ANDROID_JoystickUpdate,
704 ANDROID_JoystickClose,
705 ANDROID_JoystickQuit,