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 "../steam/SDL_steamcontroller.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;
72 static int instance_counter = 0;
80 keycode_to_SDL(
int keycode)
86 case AKEYCODE_BUTTON_A:
89 case AKEYCODE_BUTTON_B:
92 case AKEYCODE_BUTTON_X:
95 case AKEYCODE_BUTTON_Y:
98 case AKEYCODE_BUTTON_L1:
101 case AKEYCODE_BUTTON_R1:
104 case AKEYCODE_BUTTON_THUMBL:
107 case AKEYCODE_BUTTON_THUMBR:
110 case AKEYCODE_BUTTON_START:
114 case AKEYCODE_BUTTON_SELECT:
117 case AKEYCODE_BUTTON_MODE:
120 case AKEYCODE_BUTTON_L2:
123 case AKEYCODE_BUTTON_R2:
126 case AKEYCODE_BUTTON_C:
129 case AKEYCODE_BUTTON_Z:
134 case AKEYCODE_DPAD_UP:
137 case AKEYCODE_DPAD_DOWN:
140 case AKEYCODE_DPAD_LEFT:
143 case AKEYCODE_DPAD_RIGHT:
146 case AKEYCODE_DPAD_CENTER:
153 case AKEYCODE_BUTTON_1:
154 case AKEYCODE_BUTTON_2:
155 case AKEYCODE_BUTTON_3:
156 case AKEYCODE_BUTTON_4:
157 case AKEYCODE_BUTTON_5:
158 case AKEYCODE_BUTTON_6:
159 case AKEYCODE_BUTTON_7:
160 case AKEYCODE_BUTTON_8:
161 case AKEYCODE_BUTTON_9:
162 case AKEYCODE_BUTTON_10:
163 case AKEYCODE_BUTTON_11:
164 case AKEYCODE_BUTTON_12:
165 case AKEYCODE_BUTTON_13:
166 case AKEYCODE_BUTTON_14:
167 case AKEYCODE_BUTTON_15:
168 case AKEYCODE_BUTTON_16:
185 button_to_scancode(
int button)
209 Android_OnPadDown(
int device_id,
int keycode)
211 SDL_joylist_item *item;
212 int button = keycode_to_SDL(keycode);
214 item = JoystickByDeviceId(device_id);
215 if (item && item->joystick) {
227 Android_OnPadUp(
int device_id,
int keycode)
229 SDL_joylist_item *item;
230 int button = keycode_to_SDL(keycode);
232 item = JoystickByDeviceId(device_id);
233 if (item && item->joystick) {
245 Android_OnJoy(
int device_id,
int axis,
float value)
248 SDL_joylist_item *item = JoystickByDeviceId(device_id);
249 if (item && item->joystick) {
257 Android_OnHat(
int device_id,
int hat_id,
int x,
int y)
259 const Uint8 position_map[3][3] = {
266 SDL_joylist_item *item = JoystickByDeviceId(device_id);
267 if (item && item->joystick) {
278 Android_AddJoystick(
int device_id,
const char *
name,
const char *desc,
SDL_bool is_accelerometer,
int nbuttons,
int naxes,
int nhats,
int nballs)
281 SDL_joylist_item *item;
285 if (naxes < 2 && nhats < 1) {
290 if (JoystickByDeviceId(device_id) !=
NULL || name ==
NULL) {
298 item = (SDL_joylist_item *)
SDL_malloc(
sizeof (SDL_joylist_item));
305 item->device_id = device_id;
307 if (item->name ==
NULL) {
312 item->is_accelerometer = is_accelerometer;
314 item->nbuttons = nbuttons;
317 item->nbuttons = ANDROID_MAX_NBUTTONS;
321 item->nballs = nballs;
322 item->device_instance = instance_counter++;
323 if (SDL_joylist_tail ==
NULL) {
324 SDL_joylist = SDL_joylist_tail = item;
326 SDL_joylist_tail->next = item;
327 SDL_joylist_tail = item;
335 #ifdef DEBUG_JOYSTICK 336 SDL_Log(
"Added joystick %s with device_id %d", name, device_id);
343 Android_RemoveJoystick(
int device_id)
345 SDL_joylist_item *item = SDL_joylist;
346 SDL_joylist_item *prev =
NULL;
349 while (item !=
NULL) {
350 if (item->device_id == device_id) {
361 if (item->joystick) {
362 item->joystick->hwdata =
NULL;
366 prev->next = item->next;
369 SDL_joylist = item->next;
371 if (item == SDL_joylist_tail) {
372 SDL_joylist_tail = prev;
380 #ifdef DEBUG_JOYSTICK 381 SDL_Log(
"Removed joystick with device_id %d", device_id);
392 SDL_joylist_item *item;
394 item = (SDL_joylist_item *)
SDL_calloc(1,
sizeof (SDL_joylist_item));
399 *device_instance = item->device_instance = instance_counter++;
400 item->device_id = -1;
406 item->m_bSteamController =
SDL_TRUE;
408 if (SDL_joylist_tail ==
NULL) {
409 SDL_joylist = SDL_joylist_tail = item;
411 SDL_joylist_tail->next = item;
412 SDL_joylist_tail = item;
425 SDL_joylist_item *item = SDL_joylist;
426 SDL_joylist_item *prev =
NULL;
428 while (item !=
NULL) {
429 if (item->device_instance == device_instance) {
440 if (item->joystick) {
441 item->joystick->hwdata =
NULL;
445 prev->next = item->next;
448 SDL_joylist = item->next;
450 if (item == SDL_joylist_tail) {
451 SDL_joylist_tail = prev;
470 Android_AddJoystick(ANDROID_ACCELEROMETER_DEVICE_ID, ANDROID_ACCELEROMETER_NAME, ANDROID_ACCELEROMETER_NAME,
SDL_TRUE, 0, 3, 0, 0);
502 static SDL_joylist_item *
503 JoystickByDevIndex(
int device_index)
505 SDL_joylist_item *item = SDL_joylist;
507 if ((device_index < 0) || (device_index >=
numjoysticks)) {
511 while (device_index > 0) {
520 static SDL_joylist_item *
521 JoystickByDeviceId(
int device_id)
523 SDL_joylist_item *item = SDL_joylist;
525 while (item !=
NULL) {
526 if (item->device_id == device_id) {
535 while (item !=
NULL) {
536 if (item->device_id == device_id) {
549 return JoystickByDevIndex(device_index)->name;
555 return JoystickByDevIndex(device_index)->device_instance;
566 SDL_joylist_item *item = JoystickByDevIndex(device_index);
572 if (item->joystick !=
NULL) {
576 joystick->instance_id = item->device_instance;
579 joystick->nhats = item->nhats;
580 joystick->nballs = item->nballs;
581 joystick->nbuttons = item->nbuttons;
582 joystick->naxes = item->naxes;
590 return joystick->hwdata !=
NULL;
596 SDL_joylist_item *item = (SDL_joylist_item *) joystick->hwdata;
602 if (item->m_bSteamController) {
607 if (item->is_accelerometer) {
613 for (i = 0; i < 3; i++) {
614 if (values[i] > 1.0
f) {
616 }
else if (values[i] < -1.0
f) {
620 value = (
Sint16)(values[i] * 32767.0
f);
631 SDL_joylist_item *item = (SDL_joylist_item *) joystick->hwdata;
633 item->joystick =
NULL;
645 SDL_joylist_item *item =
NULL;
648 for (item = SDL_joylist;
item; item =
next) {
654 SDL_joylist = SDL_joylist_tail =
NULL;
657 instance_counter = 0;
665 return JoystickByDevIndex(device_index)->guid;
672 if (joystick->hwdata !=
NULL) {
673 return ((SDL_joylist_item*)joystick->hwdata)->guid;
680 SDL_bool SDL_SYS_IsDPAD_DeviceIndex(
int device_index)
682 return JoystickByDevIndex(device_index)->naxes == 0;
#define SDL_HINT_TV_REMOTE_AS_JOYSTICK
A variable controlling whether the Android / tvOS remotes should be listed as joystick devices...
void SDL_UpdateSteamControllers(void)
void SDL_PrivateJoystickRemoved(SDL_JoystickID device_instance)
int SDL_PrivateJoystickHat(SDL_Joystick *joystick, Uint8 hat, Uint8 value)
GLint GLint GLint GLint GLint x
void SDL_InitSteamControllers(SteamControllerConnectedCallback_t connectedCallback, SteamControllerDisconnectedCallback_t disconnectedCallback)
static void SteamControllerDisconnectedCallback(int device_instance)
void SDL_QuitSteamControllers(void)
SDL_bool Android_JNI_GetAccelerometerValues(float values[3])
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
int SDL_SendKeyboardKey(Uint8 state, SDL_Scancode scancode)
#define SDL_GetHintBoolean
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...
#define SDL_HAT_RIGHTDOWN
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
SDL_bool SDL_SYS_JoystickAttached(SDL_Joystick *joystick)
GLsizei const GLfloat * value
void SDL_PrivateJoystickAdded(int device_index)
const char * SDL_SYS_JoystickNameForDeviceIndex(int device_index)
GLint GLint GLint GLint GLint GLint y
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)
static SDL_bool SteamControllerConnectedCallback(const char *name, SDL_JoystickGUID guid, int *device_instance)
#define SDL_assert(condition)
int SDL_SYS_JoystickInit(void)
void SDL_UpdateSteamController(SDL_Joystick *joystick)
int SDL_SYS_NumJoysticks(void)
GLbitfield GLuint64 timeout
struct SDL_joylist_item * item
SDL_JoystickID SDL_SYS_GetInstanceIdOfDeviceIndex(int device_index)
void SDL_GetSteamControllerInputs(int *nbuttons, int *naxes, int *nhats)
int SDL_SYS_JoystickOpen(SDL_Joystick *joystick, int device_index)
void Android_JNI_PollInputDevices(void)
void SDL_SYS_JoystickClose(SDL_Joystick *joystick)
#define SDL_TICKS_PASSED(A, B)
Compare SDL ticks values, and return true if A has passed B.
SDL_Scancode
The SDL keyboard scancode representation.
SDL_JoystickGUID SDL_SYS_JoystickGetDeviceGUID(int device_index)
void SDL_SYS_JoystickDetect(void)