21 #include "../../SDL_internal.h"
23 #ifdef SDL_JOYSTICK_ANDROID
32 #include "SDL_sysjoystick_c.h"
33 #include "../SDL_joystick_c.h"
34 #include "../../events/SDL_keyboard_c.h"
35 #include "../../core/android/SDL_android.h"
36 #include "../hidapi/SDL_hidapijoystick_c.h"
38 #include "android/keycodes.h"
41 #ifndef AKEYCODE_BUTTON_1
42 #define AKEYCODE_BUTTON_1 188
43 #define AKEYCODE_BUTTON_2 189
44 #define AKEYCODE_BUTTON_3 190
45 #define AKEYCODE_BUTTON_4 191
46 #define AKEYCODE_BUTTON_5 192
47 #define AKEYCODE_BUTTON_6 193
48 #define AKEYCODE_BUTTON_7 194
49 #define AKEYCODE_BUTTON_8 195
50 #define AKEYCODE_BUTTON_9 196
51 #define AKEYCODE_BUTTON_10 197
52 #define AKEYCODE_BUTTON_11 198
53 #define AKEYCODE_BUTTON_12 199
54 #define AKEYCODE_BUTTON_13 200
55 #define AKEYCODE_BUTTON_14 201
56 #define AKEYCODE_BUTTON_15 202
57 #define AKEYCODE_BUTTON_16 203
60 #define ANDROID_ACCELEROMETER_NAME "Android Accelerometer"
61 #define ANDROID_ACCELEROMETER_DEVICE_ID INT_MIN
62 #define ANDROID_MAX_NBUTTONS 36
64 static SDL_joylist_item * JoystickByDeviceId(
int device_id);
66 static SDL_joylist_item *SDL_joylist =
NULL;
67 static SDL_joylist_item *SDL_joylist_tail =
NULL;
76 keycode_to_SDL(
int keycode)
82 case AKEYCODE_BUTTON_A:
85 case AKEYCODE_BUTTON_B:
88 case AKEYCODE_BUTTON_X:
91 case AKEYCODE_BUTTON_Y:
94 case AKEYCODE_BUTTON_L1:
97 case AKEYCODE_BUTTON_R1:
100 case AKEYCODE_BUTTON_THUMBL:
103 case AKEYCODE_BUTTON_THUMBR:
106 case AKEYCODE_BUTTON_START:
110 case AKEYCODE_BUTTON_SELECT:
113 case AKEYCODE_BUTTON_MODE:
116 case AKEYCODE_BUTTON_L2:
119 case AKEYCODE_BUTTON_R2:
122 case AKEYCODE_BUTTON_C:
125 case AKEYCODE_BUTTON_Z:
130 case AKEYCODE_DPAD_UP:
133 case AKEYCODE_DPAD_DOWN:
136 case AKEYCODE_DPAD_LEFT:
139 case AKEYCODE_DPAD_RIGHT:
142 case AKEYCODE_DPAD_CENTER:
149 case AKEYCODE_BUTTON_1:
150 case AKEYCODE_BUTTON_2:
151 case AKEYCODE_BUTTON_3:
152 case AKEYCODE_BUTTON_4:
153 case AKEYCODE_BUTTON_5:
154 case AKEYCODE_BUTTON_6:
155 case AKEYCODE_BUTTON_7:
156 case AKEYCODE_BUTTON_8:
157 case AKEYCODE_BUTTON_9:
158 case AKEYCODE_BUTTON_10:
159 case AKEYCODE_BUTTON_11:
160 case AKEYCODE_BUTTON_12:
161 case AKEYCODE_BUTTON_13:
162 case AKEYCODE_BUTTON_14:
163 case AKEYCODE_BUTTON_15:
164 case AKEYCODE_BUTTON_16:
165 button = 20 + (keycode - AKEYCODE_BUTTON_1);
181 button_to_scancode(
int button)
205 Android_OnPadDown(
int device_id,
int keycode)
207 SDL_joylist_item *item;
208 int button = keycode_to_SDL(keycode);
210 item = JoystickByDeviceId(device_id);
211 if (item && item->joystick) {
223 Android_OnPadUp(
int device_id,
int keycode)
225 SDL_joylist_item *item;
226 int button = keycode_to_SDL(keycode);
228 item = JoystickByDeviceId(device_id);
229 if (item && item->joystick) {
241 Android_OnJoy(
int device_id,
int axis,
float value)
244 SDL_joylist_item *item = JoystickByDeviceId(device_id);
245 if (item && item->joystick) {
253 Android_OnHat(
int device_id,
int hat_id,
int x,
int y)
261 SDL_joylist_item *item = JoystickByDeviceId(device_id);
262 if (item && item->joystick) {
266 dpad_state |= DPAD_LEFT_MASK;
268 dpad_state |= DPAD_RIGHT_MASK;
271 dpad_state |= DPAD_UP_MASK;
273 dpad_state |= DPAD_DOWN_MASK;
276 dpad_delta = (dpad_state ^ item->dpad_state);
278 if (dpad_delta & DPAD_UP_MASK) {
281 if (dpad_delta & DPAD_DOWN_MASK) {
284 if (dpad_delta & DPAD_LEFT_MASK) {
287 if (dpad_delta & DPAD_RIGHT_MASK) {
290 item->dpad_state = dpad_state;
301 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)
303 SDL_joylist_item *item;
312 if (naxes < 2 && nhats < 1) {
317 if (JoystickByDeviceId(device_id) !=
NULL ||
name ==
NULL) {
321 #ifdef SDL_JOYSTICK_HIDAPI
328 #ifdef DEBUG_JOYSTICK
329 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);
336 if (!is_accelerometer) {
364 if (vendor_id && product_id) {
381 item = (SDL_joylist_item *)
SDL_malloc(
sizeof (SDL_joylist_item));
388 item->device_id = device_id;
390 if (item->name ==
NULL) {
395 item->is_accelerometer = is_accelerometer;
396 if (button_mask == 0xFFFFFFFF) {
397 item->nbuttons = ANDROID_MAX_NBUTTONS;
399 for (
i = 0;
i <
sizeof(button_mask)*8; ++
i) {
400 if (button_mask & (1 <<
i)) {
401 item->nbuttons =
i+1;
407 item->nballs = nballs;
409 if (SDL_joylist_tail ==
NULL) {
410 SDL_joylist = SDL_joylist_tail = item;
412 SDL_joylist_tail->next = item;
413 SDL_joylist_tail = item;
421 #ifdef DEBUG_JOYSTICK
422 SDL_Log(
"Added joystick %s with device_id %d", item->name, device_id);
429 Android_RemoveJoystick(
int device_id)
431 SDL_joylist_item *item = SDL_joylist;
432 SDL_joylist_item *prev =
NULL;
435 while (item !=
NULL) {
436 if (item->device_id == device_id) {
447 if (item->joystick) {
448 item->joystick->hwdata =
NULL;
452 prev->next = item->next;
455 SDL_joylist = item->next;
457 if (item == SDL_joylist_tail) {
458 SDL_joylist_tail = prev;
466 #ifdef DEBUG_JOYSTICK
467 SDL_Log(
"Removed joystick with device_id %d", device_id);
476 static void ANDROID_JoystickDetect(
void);
479 ANDROID_JoystickInit(
void)
481 ANDROID_JoystickDetect();
485 Android_AddJoystick(ANDROID_ACCELEROMETER_DEVICE_ID, ANDROID_ACCELEROMETER_NAME, ANDROID_ACCELEROMETER_NAME, 0, 0,
SDL_TRUE, 0, 3, 0, 0);
492 ANDROID_JoystickGetCount(
void)
498 ANDROID_JoystickDetect(
void)
511 static SDL_joylist_item *
512 JoystickByDevIndex(
int device_index)
514 SDL_joylist_item *item = SDL_joylist;
516 if ((device_index < 0) || (device_index >=
numjoysticks)) {
520 while (device_index > 0) {
529 static SDL_joylist_item *
530 JoystickByDeviceId(
int device_id)
532 SDL_joylist_item *item = SDL_joylist;
534 while (item !=
NULL) {
535 if (item->device_id == device_id) {
542 ANDROID_JoystickDetect();
544 while (item !=
NULL) {
545 if (item->device_id == device_id) {
555 ANDROID_JoystickGetDeviceName(
int device_index)
557 return JoystickByDevIndex(device_index)->name;
561 ANDROID_JoystickGetDevicePlayerIndex(
int device_index)
567 ANDROID_JoystickSetDevicePlayerIndex(
int device_index,
int player_index)
572 ANDROID_JoystickGetDeviceGUID(
int device_index)
574 return JoystickByDevIndex(device_index)->guid;
578 ANDROID_JoystickGetDeviceInstanceID(
int device_index)
580 return JoystickByDevIndex(device_index)->device_instance;
584 ANDROID_JoystickOpen(SDL_Joystick *
joystick,
int device_index)
586 SDL_joylist_item *item = JoystickByDevIndex(device_index);
592 if (item->joystick !=
NULL) {
596 joystick->instance_id = item->device_instance;
608 ANDROID_JoystickRumble(SDL_Joystick *
joystick,
Uint16 low_frequency_rumble,
Uint16 high_frequency_rumble)
614 ANDROID_JoystickRumbleTriggers(SDL_Joystick *
joystick,
Uint16 left_rumble,
Uint16 right_rumble)
620 ANDROID_JoystickHasLED(SDL_Joystick *
joystick)
638 ANDROID_JoystickUpdate(SDL_Joystick *
joystick)
640 SDL_joylist_item *
item = (SDL_joylist_item *)
joystick->hwdata;
646 if (
item->is_accelerometer) {
652 for (
i = 0;
i < 3;
i++) {
655 }
else if (
values[
i] < -1.0f) {
667 ANDROID_JoystickClose(SDL_Joystick *
joystick)
669 SDL_joylist_item *
item = (SDL_joylist_item *)
joystick->hwdata;
676 ANDROID_JoystickQuit(
void)
691 SDL_joylist = SDL_joylist_tail =
NULL;
705 ANDROID_JoystickInit,
706 ANDROID_JoystickGetCount,
707 ANDROID_JoystickDetect,
708 ANDROID_JoystickGetDeviceName,
709 ANDROID_JoystickGetDevicePlayerIndex,
710 ANDROID_JoystickSetDevicePlayerIndex,
711 ANDROID_JoystickGetDeviceGUID,
712 ANDROID_JoystickGetDeviceInstanceID,
713 ANDROID_JoystickOpen,
714 ANDROID_JoystickRumble,
715 ANDROID_JoystickRumbleTriggers,
716 ANDROID_JoystickHasLED,
717 ANDROID_JoystickSetLED,
718 ANDROID_JoystickSetSensorsEnabled,
719 ANDROID_JoystickUpdate,
720 ANDROID_JoystickClose,
721 ANDROID_JoystickQuit,
722 ANDROID_JoystickGetGamepadMapping
SDL_bool Android_JNI_GetAccelerometerValues(float values[3])
void Android_JNI_PollInputDevices(void)
#define SDL_assert(condition)
#define SDL_GetHintBoolean
#define SDL_Unsupported()
@ SDL_CONTROLLER_AXIS_LEFTX
@ SDL_CONTROLLER_AXIS_TRIGGERRIGHT
@ SDL_CONTROLLER_AXIS_RIGHTY
@ SDL_CONTROLLER_AXIS_RIGHTX
@ SDL_CONTROLLER_AXIS_TRIGGERLEFT
@ SDL_CONTROLLER_AXIS_LEFTY
@ SDL_CONTROLLER_BUTTON_B
@ SDL_CONTROLLER_BUTTON_BACK
@ SDL_CONTROLLER_BUTTON_LEFTSTICK
@ SDL_CONTROLLER_BUTTON_START
@ SDL_CONTROLLER_BUTTON_DPAD_LEFT
@ SDL_CONTROLLER_BUTTON_RIGHTSHOULDER
@ SDL_CONTROLLER_BUTTON_DPAD_DOWN
@ SDL_CONTROLLER_BUTTON_DPAD_UP
@ SDL_CONTROLLER_BUTTON_LEFTSHOULDER
@ SDL_CONTROLLER_BUTTON_GUIDE
@ SDL_CONTROLLER_BUTTON_DPAD_RIGHT
@ SDL_CONTROLLER_BUTTON_X
@ SDL_CONTROLLER_BUTTON_RIGHTSTICK
@ SDL_CONTROLLER_BUTTON_Y
@ SDL_CONTROLLER_BUTTON_A
SDL_bool HIDAPI_IsDevicePresent(Uint16 vendor_id, Uint16 product_id, Uint16 version, const char *name)
#define SDL_HINT_ACCELEROMETER_AS_JOYSTICK
A variable controlling whether the Android / iOS built-in accelerometer should be listed as a joystic...
#define SDL_HINT_TV_REMOTE_AS_JOYSTICK
A variable controlling whether the Android / tvOS remotes should be listed as joystick devices,...
void SDL_PrivateJoystickRemoved(SDL_JoystickID device_instance)
int SDL_PrivateJoystickAxis(SDL_Joystick *joystick, Uint8 axis, Sint16 value)
void SDL_PrivateJoystickAdded(SDL_JoystickID device_instance)
SDL_JoystickID SDL_GetNextJoystickInstanceID()
int SDL_PrivateJoystickButton(SDL_Joystick *joystick, Uint8 button, Uint8 state)
char * SDL_CreateJoystickName(Uint16 vendor, Uint16 product, const char *vendor_name, const char *product_name)
int SDL_SendKeyboardKey(Uint8 state, SDL_Scancode scancode)
GLint GLint GLint GLint GLint GLint y
GLint GLint GLint GLint GLint x
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLbitfield GLuint64 timeout
GLenum GLsizei GLsizei GLint * values
GLuint const GLchar * name
GLsizei const GLfloat * value
SDL_Scancode
The SDL keyboard scancode representation.
SDL_JoystickDriver SDL_ANDROID_JoystickDriver
#define SDL_HARDWARE_BUS_BLUETOOTH
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
#define SDL_TICKS_PASSED(A, B)
Compare SDL ticks values, and return true if A has passed B.
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)
set set set set set set set macro pixldst1 abits if abits op else op endif endm macro pixldst2 abits if abits op else op endif endm macro pixldst4 abits if abits op else op endif endm macro pixldst0 abits op endm macro pixldst3 mem_operand op endm macro pixldst30 mem_operand op endm macro pixldst abits if abits elseif abits elseif abits elseif abits elseif abits pixldst0 abits else pixldst0 abits pixldst0 abits pixldst0 abits pixldst0 abits endif elseif abits else pixldst0 abits pixldst0 abits endif elseif abits else error unsupported bpp *numpix else pixst endif endm macro pixld1_s mem_operand if asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl elseif asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl else error unsupported endif endm macro pixld2_s mem_operand if mov asr add asl add asl mov asr sub UNIT_X add asl mov asr add asl add asl mov asr add UNIT_X add asl else pixld1_s mem_operand pixld1_s mem_operand endif endm macro pixld0_s mem_operand if asr adds SRC_WIDTH_FIXED bpl add asl elseif asr adds SRC_WIDTH_FIXED bpl add asl endif endm macro pixld_s_internal mem_operand if mem_operand pixld2_s mem_operand pixdeinterleave basereg elseif mem_operand elseif mem_operand elseif mem_operand elseif mem_operand pixld0_s mem_operand else pixld0_s mem_operand pixld0_s mem_operand pixld0_s mem_operand pixld0_s mem_operand endif elseif mem_operand else pixld0_s mem_operand pixld0_s mem_operand endif elseif mem_operand else error unsupported mem_operand if bpp mem_operand endif endm macro vuzp8 reg2 vuzp d d ®2 endm macro vzip8 reg2 vzip d d ®2 endm macro pixdeinterleave basereg basereg basereg basereg basereg endif endm macro pixinterleave basereg basereg basereg basereg basereg endif endm macro PF boost_increment endif if endif PF tst PF addne PF subne PF cmp ORIG_W if endif if endif if endif PF subge ORIG_W PF subges if endif if endif if endif endif endm macro cache_preload_simple endif if dst_r_bpp pld[DST_R, #(PREFETCH_DISTANCE_SIMPLE *dst_r_bpp/8)] endif if mask_bpp pld if[MASK, #(PREFETCH_DISTANCE_SIMPLE *mask_bpp/8)] endif endif endm macro fetch_mask_pixblock pixld mask_basereg pixblock_size MASK endm macro ensure_destination_ptr_alignment process_pixblock_tail_head if beq irp skip1(dst_w_bpp<=(lowbit *8)) &&((lowbit *8)<(pixblock_size *dst_w_bpp)) .if lowbit< 16 tst DST_R
struct joystick_hwdata * next
struct SDL_joylist_item * item
static SDL_Joystick * joystick