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" 39 #include "android/keycodes.h" 42 #ifndef AKEYCODE_BUTTON_1 43 #define AKEYCODE_BUTTON_1 188 44 #define AKEYCODE_BUTTON_2 189 45 #define AKEYCODE_BUTTON_3 190 46 #define AKEYCODE_BUTTON_4 191 47 #define AKEYCODE_BUTTON_5 192 48 #define AKEYCODE_BUTTON_6 193 49 #define AKEYCODE_BUTTON_7 194 50 #define AKEYCODE_BUTTON_8 195 51 #define AKEYCODE_BUTTON_9 196 52 #define AKEYCODE_BUTTON_10 197 53 #define AKEYCODE_BUTTON_11 198 54 #define AKEYCODE_BUTTON_12 199 55 #define AKEYCODE_BUTTON_13 200 56 #define AKEYCODE_BUTTON_14 201 57 #define AKEYCODE_BUTTON_15 202 58 #define AKEYCODE_BUTTON_16 203 61 #define ANDROID_ACCELEROMETER_NAME "Android Accelerometer" 62 #define ANDROID_ACCELEROMETER_DEVICE_ID INT_MIN 63 #define ANDROID_MAX_NBUTTONS 36 65 static SDL_joylist_item * JoystickByDeviceId(
int device_id);
67 static SDL_joylist_item *SDL_joylist =
NULL;
68 static SDL_joylist_item *SDL_joylist_tail =
NULL;
70 static int instance_counter = 0;
78 keycode_to_SDL(
int keycode)
85 case AKEYCODE_BUTTON_A:
88 case AKEYCODE_BUTTON_B:
91 case AKEYCODE_BUTTON_X:
94 case AKEYCODE_BUTTON_Y:
97 case AKEYCODE_BUTTON_L1:
100 case AKEYCODE_BUTTON_R1:
103 case AKEYCODE_BUTTON_THUMBL:
106 case AKEYCODE_BUTTON_THUMBR:
109 case AKEYCODE_BUTTON_START:
112 case AKEYCODE_BUTTON_SELECT:
115 case AKEYCODE_BUTTON_MODE:
118 case AKEYCODE_BUTTON_L2:
121 case AKEYCODE_BUTTON_R2:
124 case AKEYCODE_BUTTON_C:
127 case AKEYCODE_BUTTON_Z:
132 case AKEYCODE_DPAD_UP:
135 case AKEYCODE_DPAD_DOWN:
138 case AKEYCODE_DPAD_LEFT:
141 case AKEYCODE_DPAD_RIGHT:
144 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:
182 Android_OnPadDown(
int device_id,
int keycode)
184 SDL_joylist_item *item;
185 int button = keycode_to_SDL(keycode);
187 item = JoystickByDeviceId(device_id);
188 if (item && item->joystick) {
198 Android_OnPadUp(
int device_id,
int keycode)
200 SDL_joylist_item *item;
201 int button = keycode_to_SDL(keycode);
203 item = JoystickByDeviceId(device_id);
204 if (item && item->joystick) {
214 Android_OnJoy(
int device_id,
int axis,
float value)
217 SDL_joylist_item *item = JoystickByDeviceId(device_id);
218 if (item && item->joystick) {
226 Android_OnHat(
int device_id,
int hat_id,
int x,
int y)
228 const Uint8 position_map[3][3] = {
235 SDL_joylist_item *item = JoystickByDeviceId(device_id);
236 if (item && item->joystick) {
247 Android_AddJoystick(
int device_id,
const char *
name,
SDL_bool is_accelerometer,
int nbuttons,
int naxes,
int nhats,
int nballs)
250 SDL_joylist_item *item;
252 if(JoystickByDeviceId(device_id) !=
NULL || name ==
NULL) {
260 item = (SDL_joylist_item *)
SDL_malloc(
sizeof (SDL_joylist_item));
267 item->device_id = device_id;
269 if ( item->name ==
NULL ) {
274 item->is_accelerometer = is_accelerometer;
276 item->nbuttons = nbuttons;
279 item->nbuttons = ANDROID_MAX_NBUTTONS;
283 item->nballs = nballs;
284 item->device_instance = instance_counter++;
285 if (SDL_joylist_tail ==
NULL) {
286 SDL_joylist = SDL_joylist_tail = item;
288 SDL_joylist_tail->next = item;
289 SDL_joylist_tail = item;
297 #ifdef DEBUG_JOYSTICK 298 SDL_Log(
"Added joystick %s with device_id %d", name, device_id);
305 Android_RemoveJoystick(
int device_id)
307 SDL_joylist_item *item = SDL_joylist;
308 SDL_joylist_item *prev =
NULL;
311 while (item !=
NULL) {
312 if (item->device_id == device_id) {
323 if (item->joystick) {
324 item->joystick->hwdata =
NULL;
328 prev->next = item->next;
331 SDL_joylist = item->next;
333 if (item == SDL_joylist_tail) {
334 SDL_joylist_tail = prev;
342 #ifdef DEBUG_JOYSTICK 343 SDL_Log(
"Removed joystick with device_id %d", device_id);
359 Android_AddJoystick(ANDROID_ACCELEROMETER_DEVICE_ID, ANDROID_ACCELEROMETER_NAME,
SDL_TRUE, 0, 3, 0, 0);
384 static SDL_joylist_item *
385 JoystickByDevIndex(
int device_index)
387 SDL_joylist_item *item = SDL_joylist;
389 if ((device_index < 0) || (device_index >=
numjoysticks)) {
393 while (device_index > 0) {
402 static SDL_joylist_item *
403 JoystickByDeviceId(
int device_id)
405 SDL_joylist_item *item = SDL_joylist;
407 while (item !=
NULL) {
408 if (item->device_id == device_id) {
417 while (item !=
NULL) {
418 if (item->device_id == device_id) {
431 return JoystickByDevIndex(device_index)->name;
437 return JoystickByDevIndex(device_index)->device_instance;
448 SDL_joylist_item *item = JoystickByDevIndex(device_index);
454 if (item->joystick !=
NULL) {
458 joystick->instance_id = item->device_instance;
461 joystick->nhats = item->nhats;
462 joystick->nballs = item->nballs;
463 joystick->nbuttons = item->nbuttons;
464 joystick->naxes = item->naxes;
472 return joystick->hwdata !=
NULL;
481 SDL_joylist_item *item = SDL_joylist;
484 if (item->is_accelerometer) {
485 if (item->joystick) {
487 for ( i = 0; i < 3; i++ ) {
488 if (values[i] > 1.0
f) {
490 }
else if (values[i] < -1.0
f) {
494 value = (
Sint16)(values[i] * 32767.0
f);
509 SDL_joylist_item *item = (SDL_joylist_item *) joystick->hwdata;
511 item->joystick =
NULL;
519 SDL_joylist_item *item =
NULL;
522 for (item = SDL_joylist;
item; item =
next) {
528 SDL_joylist = SDL_joylist_tail =
NULL;
531 instance_counter = 0;
536 return JoystickByDevIndex(device_index)->guid;
543 if (joystick->hwdata !=
NULL) {
544 return ((SDL_joylist_item*)joystick->hwdata)->guid;
void SDL_PrivateJoystickRemoved(SDL_JoystickID device_instance)
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)
uint32_t Uint32
An unsigned 32-bit integer type.
int SDL_PrivateJoystickAxis(SDL_Joystick *joystick, Uint8 axis, Sint16 value)
#define SDL_GetHintBoolean
#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
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)
void SDL_SYS_JoystickDetect()
GLenum GLsizei GLsizei GLint * values
void SDL_PrivateJoystickAdded(int device_index)
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.