22 #include "../../SDL_internal.h" 24 #ifdef SDL_JOYSTICK_ANDROID 30 #if !SDL_EVENTS_DISABLED 31 #include "../../events/SDL_events_c.h" 39 #include "SDL_sysjoystick_c.h" 40 #include "../SDL_joystick_c.h" 41 #include "../../core/android/SDL_android.h" 43 #include "android/keycodes.h" 46 #ifndef AKEYCODE_BUTTON_1 47 #define AKEYCODE_BUTTON_1 188 48 #define AKEYCODE_BUTTON_2 189 49 #define AKEYCODE_BUTTON_3 190 50 #define AKEYCODE_BUTTON_4 191 51 #define AKEYCODE_BUTTON_5 192 52 #define AKEYCODE_BUTTON_6 193 53 #define AKEYCODE_BUTTON_7 194 54 #define AKEYCODE_BUTTON_8 195 55 #define AKEYCODE_BUTTON_9 196 56 #define AKEYCODE_BUTTON_10 197 57 #define AKEYCODE_BUTTON_11 198 58 #define AKEYCODE_BUTTON_12 199 59 #define AKEYCODE_BUTTON_13 200 60 #define AKEYCODE_BUTTON_14 201 61 #define AKEYCODE_BUTTON_15 202 62 #define AKEYCODE_BUTTON_16 203 65 #define ANDROID_ACCELEROMETER_NAME "Android Accelerometer" 66 #define ANDROID_ACCELEROMETER_DEVICE_ID INT_MIN 67 #define ANDROID_MAX_NBUTTONS 36 69 static SDL_joylist_item * JoystickByDeviceId(
int device_id);
71 static SDL_joylist_item *SDL_joylist =
NULL;
72 static SDL_joylist_item *SDL_joylist_tail =
NULL;
74 static int instance_counter = 0;
82 keycode_to_SDL(
int keycode)
89 case AKEYCODE_BUTTON_A:
92 case AKEYCODE_BUTTON_B:
95 case AKEYCODE_BUTTON_X:
98 case AKEYCODE_BUTTON_Y:
101 case AKEYCODE_BUTTON_L1:
104 case AKEYCODE_BUTTON_R1:
107 case AKEYCODE_BUTTON_THUMBL:
110 case AKEYCODE_BUTTON_THUMBR:
113 case AKEYCODE_BUTTON_START:
116 case AKEYCODE_BUTTON_SELECT:
119 case AKEYCODE_BUTTON_MODE:
122 case AKEYCODE_BUTTON_L2:
125 case AKEYCODE_BUTTON_R2:
128 case AKEYCODE_BUTTON_C:
131 case AKEYCODE_BUTTON_Z:
136 case AKEYCODE_DPAD_UP:
139 case AKEYCODE_DPAD_DOWN:
142 case AKEYCODE_DPAD_LEFT:
145 case AKEYCODE_DPAD_RIGHT:
148 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:
186 Android_OnPadDown(
int device_id,
int keycode)
188 SDL_joylist_item *item;
189 int button = keycode_to_SDL(keycode);
191 item = JoystickByDeviceId(device_id);
192 if (item && item->joystick) {
202 Android_OnPadUp(
int device_id,
int keycode)
204 SDL_joylist_item *item;
205 int button = keycode_to_SDL(keycode);
207 item = JoystickByDeviceId(device_id);
208 if (item && item->joystick) {
218 Android_OnJoy(
int device_id,
int axis,
float value)
221 SDL_joylist_item *item = JoystickByDeviceId(device_id);
222 if (item && item->joystick) {
230 Android_OnHat(
int device_id,
int hat_id,
int x,
int y)
232 const Uint8 position_map[3][3] = {
239 SDL_joylist_item *item = JoystickByDeviceId(device_id);
240 if (item && item->joystick) {
251 Android_AddJoystick(
int device_id,
const char *
name,
SDL_bool is_accelerometer,
int nbuttons,
int naxes,
int nhats,
int nballs)
254 SDL_joylist_item *item;
255 #if !SDL_EVENTS_DISABLED 259 if(JoystickByDeviceId(device_id) !=
NULL || name ==
NULL) {
267 item = (SDL_joylist_item *)
SDL_malloc(
sizeof (SDL_joylist_item));
274 item->device_id = device_id;
276 if ( item->name ==
NULL ) {
281 item->is_accelerometer = is_accelerometer;
283 item->nbuttons = nbuttons;
286 item->nbuttons = ANDROID_MAX_NBUTTONS;
290 item->nballs = nballs;
291 item->device_instance = instance_counter++;
292 if (SDL_joylist_tail ==
NULL) {
293 SDL_joylist = SDL_joylist_tail = item;
295 SDL_joylist_tail->next = item;
296 SDL_joylist_tail = item;
302 #if !SDL_EVENTS_DISABLED 314 #ifdef DEBUG_JOYSTICK 315 SDL_Log(
"Added joystick %s with device_id %d", name, device_id);
322 Android_RemoveJoystick(
int device_id)
324 SDL_joylist_item *item = SDL_joylist;
325 SDL_joylist_item *prev =
NULL;
326 #if !SDL_EVENTS_DISABLED 331 while (item !=
NULL) {
332 if (item->device_id == device_id) {
343 const int retval = item->device_instance;
344 if (item->joystick) {
345 item->joystick->hwdata =
NULL;
349 prev->next = item->next;
352 SDL_joylist = item->next;
354 if (item == SDL_joylist_tail) {
355 SDL_joylist_tail = prev;
361 #if !SDL_EVENTS_DISABLED 365 event.jdevice.which = item->device_instance;
373 #ifdef DEBUG_JOYSTICK 374 SDL_Log(
"Removed joystick with device_id %d", device_id);
392 Android_AddJoystick(ANDROID_ACCELEROMETER_DEVICE_ID, ANDROID_ACCELEROMETER_NAME,
SDL_TRUE, 0, 3, 0, 0);
417 static SDL_joylist_item *
418 JoystickByDevIndex(
int device_index)
420 SDL_joylist_item *item = SDL_joylist;
422 if ((device_index < 0) || (device_index >=
numjoysticks)) {
426 while (device_index > 0) {
435 static SDL_joylist_item *
436 JoystickByDeviceId(
int device_id)
438 SDL_joylist_item *item = SDL_joylist;
440 while (item !=
NULL) {
441 if (item->device_id == device_id) {
450 while (item !=
NULL) {
451 if (item->device_id == device_id) {
464 return JoystickByDevIndex(device_index)->name;
470 return JoystickByDevIndex(device_index)->device_instance;
481 SDL_joylist_item *item = JoystickByDevIndex(device_index);
487 if (item->joystick !=
NULL) {
491 joystick->instance_id = item->device_instance;
494 joystick->nhats = item->nhats;
495 joystick->nballs = item->nballs;
496 joystick->nbuttons = item->nbuttons;
497 joystick->naxes = item->naxes;
505 return joystick->hwdata !=
NULL;
514 SDL_joylist_item *item = SDL_joylist;
517 if (item->is_accelerometer) {
518 if (item->joystick) {
520 for ( i = 0; i < 3; i++ ) {
521 if (values[i] > 1.0
f) {
523 }
else if (values[i] < -1.0
f) {
527 value = (
Sint16)(values[i] * 32767.0
f);
548 SDL_joylist_item *item =
NULL;
551 for (item = SDL_joylist;
item; item =
next) {
557 SDL_joylist = SDL_joylist_tail =
NULL;
560 instance_counter = 0;
565 return JoystickByDevIndex(device_index)->guid;
572 if (joystick->hwdata !=
NULL) {
573 return ((SDL_joylist_item*)joystick->hwdata)->guid;
uint32_t Uint32
An unsigned 32-bit integer type.
int SDL_PrivateJoystickHat(SDL_Joystick *joystick, Uint8 hat, Uint8 value)
int SDL_SYS_NumJoysticks()
GLint GLint GLint GLint GLint x
SDL_bool Android_JNI_GetAccelerometerValues(float values[3])
int SDL_PrivateJoystickButton(SDL_Joystick *joystick, Uint8 button, Uint8 state)
struct joystick_hwdata * next
GLuint const GLchar * name
void SDL_SYS_JoystickQuit(void)
int SDL_PrivateJoystickAxis(SDL_Joystick *joystick, Uint8 axis, Sint16 value)
#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
#define SDL_GetEventState(type)
GLint GLint GLint GLint GLint GLint y
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
GLsizei const GLfloat * value
uint8_t Uint8
An unsigned 8-bit integer type.
SDL_bool SDL_SYS_JoystickAttached(SDL_Joystick *joystick)
SDL_EventFilter SDL_EventOK
void SDL_SYS_JoystickDetect()
GLenum GLsizei GLsizei GLint * values
const char * SDL_SYS_JoystickNameForDeviceIndex(int device_index)
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)
#define SDL_assert(condition)
int SDL_SYS_JoystickInit(void)
GLbitfield GLuint64 timeout
struct SDL_joylist_item * item
SDL_JoystickID SDL_SYS_GetInstanceIdOfDeviceIndex(int device_index)
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)
int16_t Sint16
A signed 16-bit integer type.