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;
83 return r ^ (
Uint32)0xFF000000L;
90 for(i = 0; i <
count; ++
i) {
91 crc = crc32_for_byte((
Uint8)crc ^ ((
const Uint8*)data)[i]) ^ crc >> 8;
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;
618 joystick->nhats = item->nhats;
619 joystick->nballs = item->nballs;
620 joystick->nbuttons = item->nbuttons;
621 joystick->naxes = item->naxes;
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++) {
648 if (values[i] > 1.0
f) {
650 }
else if (values[i] < -1.0
f) {
654 value = (
Sint16)(values[i] * 32767.0
f);
662 ANDROID_JoystickClose(SDL_Joystick * joystick)
664 SDL_joylist_item *item = (SDL_joylist_item *) joystick->hwdata;
666 item->joystick =
NULL;
671 ANDROID_JoystickQuit(
void)
677 SDL_joylist_item *item =
NULL;
680 for (item = SDL_joylist;
item; item =
next) {
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,
#define SDL_HINT_TV_REMOTE_AS_JOYSTICK
A variable controlling whether the Android / tvOS remotes should be listed as joystick devices...
GLdouble GLdouble GLdouble r
void SDL_PrivateJoystickRemoved(SDL_JoystickID device_instance)
GLint GLint GLint GLint GLint x
GLuint GLuint GLsizei count
SDL_bool Android_JNI_GetAccelerometerValues(float values[3])
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 local skip1(dst_w_bpp<=(lowbit *8)) &&((lowbit *8)<(pixblock_size *dst_w_bpp)) .if lowbit< 16 tst DST_R
int SDL_PrivateJoystickButton(SDL_Joystick *joystick, Uint8 button, Uint8 state)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
struct joystick_hwdata * next
int SDL_PrivateJoystickAxis(SDL_Joystick *joystick, Uint8 axis, Sint16 value)
GLuint const GLchar * name
int SDL_SendKeyboardKey(Uint8 state, SDL_Scancode scancode)
#define SDL_GetHintBoolean
#define SDL_HARDWARE_BUS_BLUETOOTH
GLenum GLsizei GLsizei GLint * values
#define SDL_HINT_ACCELEROMETER_AS_JOYSTICK
A variable controlling whether the Android / iOS built-in accelerometer should be listed as a joystic...
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
GLsizei const GLfloat * value
GLint GLint GLint GLint GLint GLint y
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_ANDROID_JoystickDriver
SDL_JoystickID SDL_GetNextJoystickInstanceID()
GLbitfield GLuint64 timeout
struct SDL_joylist_item * item
void Android_JNI_PollInputDevices(void)
#define SDL_TICKS_PASSED(A, B)
Compare SDL ticks values, and return true if A has passed B.
SDL_bool HIDAPI_IsDevicePresent(Uint16 vendor_id, Uint16 product_id, Uint16 version)
SDL_Scancode
The SDL keyboard scancode representation.
#define SDL_Unsupported()