22 #include "../../SDL_internal.h" 24 #ifdef SDL_JOYSTICK_ANDROID 35 #include "SDL_sysjoystick_c.h" 36 #include "../SDL_joystick_c.h" 37 #include "../../core/android/SDL_android.h" 38 #include "../steam/SDL_steamcontroller.h" 40 #include "android/keycodes.h" 43 #ifndef AKEYCODE_BUTTON_1 44 #define AKEYCODE_BUTTON_1 188 45 #define AKEYCODE_BUTTON_2 189 46 #define AKEYCODE_BUTTON_3 190 47 #define AKEYCODE_BUTTON_4 191 48 #define AKEYCODE_BUTTON_5 192 49 #define AKEYCODE_BUTTON_6 193 50 #define AKEYCODE_BUTTON_7 194 51 #define AKEYCODE_BUTTON_8 195 52 #define AKEYCODE_BUTTON_9 196 53 #define AKEYCODE_BUTTON_10 197 54 #define AKEYCODE_BUTTON_11 198 55 #define AKEYCODE_BUTTON_12 199 56 #define AKEYCODE_BUTTON_13 200 57 #define AKEYCODE_BUTTON_14 201 58 #define AKEYCODE_BUTTON_15 202 59 #define AKEYCODE_BUTTON_16 203 62 #define ANDROID_ACCELEROMETER_NAME "Android Accelerometer" 63 #define ANDROID_ACCELEROMETER_DEVICE_ID INT_MIN 64 #define ANDROID_MAX_NBUTTONS 36 66 static SDL_joylist_item * JoystickByDeviceId(
int device_id);
68 static SDL_joylist_item *SDL_joylist =
NULL;
69 static SDL_joylist_item *SDL_joylist_tail =
NULL;
71 static int instance_counter = 0;
79 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:
113 case AKEYCODE_BUTTON_SELECT:
116 case AKEYCODE_BUTTON_MODE:
119 case AKEYCODE_BUTTON_L2:
122 case AKEYCODE_BUTTON_R2:
125 case AKEYCODE_BUTTON_C:
128 case AKEYCODE_BUTTON_Z:
133 case AKEYCODE_DPAD_UP:
136 case AKEYCODE_DPAD_DOWN:
139 case AKEYCODE_DPAD_LEFT:
142 case AKEYCODE_DPAD_RIGHT:
145 case AKEYCODE_DPAD_CENTER:
150 case AKEYCODE_BUTTON_1:
151 case AKEYCODE_BUTTON_2:
152 case AKEYCODE_BUTTON_3:
153 case AKEYCODE_BUTTON_4:
154 case AKEYCODE_BUTTON_5:
155 case AKEYCODE_BUTTON_6:
156 case AKEYCODE_BUTTON_7:
157 case AKEYCODE_BUTTON_8:
158 case AKEYCODE_BUTTON_9:
159 case AKEYCODE_BUTTON_10:
160 case AKEYCODE_BUTTON_11:
161 case AKEYCODE_BUTTON_12:
162 case AKEYCODE_BUTTON_13:
163 case AKEYCODE_BUTTON_14:
164 case AKEYCODE_BUTTON_15:
165 case AKEYCODE_BUTTON_16:
183 Android_OnPadDown(
int device_id,
int keycode)
185 SDL_joylist_item *item;
186 int button = keycode_to_SDL(keycode);
188 item = JoystickByDeviceId(device_id);
189 if (item && item->joystick) {
199 Android_OnPadUp(
int device_id,
int keycode)
201 SDL_joylist_item *item;
202 int button = keycode_to_SDL(keycode);
204 item = JoystickByDeviceId(device_id);
205 if (item && item->joystick) {
215 Android_OnJoy(
int device_id,
int axis,
float value)
218 SDL_joylist_item *item = JoystickByDeviceId(device_id);
219 if (item && item->joystick) {
227 Android_OnHat(
int device_id,
int hat_id,
int x,
int y)
229 const Uint8 position_map[3][3] = {
236 SDL_joylist_item *item = JoystickByDeviceId(device_id);
237 if (item && item->joystick) {
248 Android_AddJoystick(
int device_id,
const char *
name,
const char *desc,
SDL_bool is_accelerometer,
int nbuttons,
int naxes,
int nhats,
int nballs)
251 SDL_joylist_item *item;
253 if(JoystickByDeviceId(device_id) !=
NULL || name ==
NULL) {
261 item = (SDL_joylist_item *)
SDL_malloc(
sizeof (SDL_joylist_item));
268 item->device_id = device_id;
270 if (item->name ==
NULL) {
275 item->is_accelerometer = is_accelerometer;
277 item->nbuttons = nbuttons;
280 item->nbuttons = ANDROID_MAX_NBUTTONS;
284 item->nballs = nballs;
285 item->device_instance = instance_counter++;
286 if (SDL_joylist_tail ==
NULL) {
287 SDL_joylist = SDL_joylist_tail = item;
289 SDL_joylist_tail->next = item;
290 SDL_joylist_tail = item;
298 #ifdef DEBUG_JOYSTICK 299 SDL_Log(
"Added joystick %s with device_id %d", name, device_id);
306 Android_RemoveJoystick(
int device_id)
308 SDL_joylist_item *item = SDL_joylist;
309 SDL_joylist_item *prev =
NULL;
312 while (item !=
NULL) {
313 if (item->device_id == device_id) {
324 if (item->joystick) {
325 item->joystick->hwdata =
NULL;
329 prev->next = item->next;
332 SDL_joylist = item->next;
334 if (item == SDL_joylist_tail) {
335 SDL_joylist_tail = prev;
343 #ifdef DEBUG_JOYSTICK 344 SDL_Log(
"Removed joystick with device_id %d", device_id);
355 SDL_joylist_item *item;
357 item = (SDL_joylist_item *)
SDL_calloc(1,
sizeof (SDL_joylist_item));
362 *device_instance = item->device_instance = instance_counter++;
363 item->device_id = -1;
369 item->m_bSteamController =
SDL_TRUE;
371 if (SDL_joylist_tail ==
NULL) {
372 SDL_joylist = SDL_joylist_tail = item;
374 SDL_joylist_tail->next = item;
375 SDL_joylist_tail = item;
388 SDL_joylist_item *item = SDL_joylist;
389 SDL_joylist_item *prev =
NULL;
391 while (item !=
NULL) {
392 if (item->device_instance == device_instance) {
403 if (item->joystick) {
404 item->joystick->hwdata =
NULL;
408 prev->next = item->next;
411 SDL_joylist = item->next;
413 if (item == SDL_joylist_tail) {
414 SDL_joylist_tail = prev;
433 Android_AddJoystick(ANDROID_ACCELEROMETER_DEVICE_ID, ANDROID_ACCELEROMETER_NAME, ANDROID_ACCELEROMETER_NAME,
SDL_TRUE, 0, 3, 0, 0);
465 static SDL_joylist_item *
466 JoystickByDevIndex(
int device_index)
468 SDL_joylist_item *item = SDL_joylist;
470 if ((device_index < 0) || (device_index >=
numjoysticks)) {
474 while (device_index > 0) {
483 static SDL_joylist_item *
484 JoystickByDeviceId(
int device_id)
486 SDL_joylist_item *item = SDL_joylist;
488 while (item !=
NULL) {
489 if (item->device_id == device_id) {
498 while (item !=
NULL) {
499 if (item->device_id == device_id) {
512 return JoystickByDevIndex(device_index)->name;
518 return JoystickByDevIndex(device_index)->device_instance;
529 SDL_joylist_item *item = JoystickByDevIndex(device_index);
535 if (item->joystick !=
NULL) {
539 joystick->instance_id = item->device_instance;
542 joystick->nhats = item->nhats;
543 joystick->nballs = item->nballs;
544 joystick->nbuttons = item->nbuttons;
545 joystick->naxes = item->naxes;
553 return joystick->hwdata !=
NULL;
559 SDL_joylist_item *item = (SDL_joylist_item *) joystick->hwdata;
565 if (item->m_bSteamController) {
570 if (item->is_accelerometer) {
576 for (i = 0; i < 3; i++) {
577 if (values[i] > 1.0
f) {
579 }
else if (values[i] < -1.0
f) {
583 value = (
Sint16)(values[i] * 32767.0
f);
594 SDL_joylist_item *item = (SDL_joylist_item *) joystick->hwdata;
596 item->joystick =
NULL;
608 SDL_joylist_item *item =
NULL;
611 for (item = SDL_joylist;
item; item =
next) {
617 SDL_joylist = SDL_joylist_tail =
NULL;
620 instance_counter = 0;
628 return JoystickByDevIndex(device_index)->guid;
635 if (joystick->hwdata !=
NULL) {
636 return ((SDL_joylist_item*)joystick->hwdata)->guid;
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
#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_JoystickGUID SDL_SYS_JoystickGetDeviceGUID(int device_index)
void SDL_SYS_JoystickDetect(void)