mirror of
https://github.com/libretro/RetroArch
synced 2025-02-06 09:40:06 +00:00
Move engine_handle_dpad code to android_input.c - copy
hat and analog state to intermediary on android_app during poll time
This commit is contained in:
parent
69ee18cea6
commit
923433ead7
@ -48,6 +48,14 @@ enum
|
||||
CPU_X86_FEATURE_MOVBE = (1 << 2)
|
||||
};
|
||||
|
||||
#ifndef MAX_PADS
|
||||
#define MAX_PADS 8
|
||||
#endif
|
||||
|
||||
#ifndef MAX_AXIS
|
||||
#define MAX_AXIS 10
|
||||
#endif
|
||||
|
||||
cpu_family linux_get_cpu_family(void);
|
||||
|
||||
uint64_t linux_get_cpu_features(void);
|
||||
@ -165,6 +173,8 @@ struct android_app
|
||||
const ASensor* accelerometerSensor;
|
||||
uint64_t sensor_state_mask;
|
||||
char current_ime[PATH_MAX_LENGTH];
|
||||
int16_t analog_state[MAX_PADS][MAX_AXIS];
|
||||
int8_t hat_state[MAX_PADS][2];
|
||||
jmethodID getIntent;
|
||||
jmethodID onRetroArchExit;
|
||||
jmethodID getStringExtra;
|
||||
|
@ -17,6 +17,7 @@
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <dlfcn.h>
|
||||
|
||||
#include <android/keycodes.h>
|
||||
|
||||
@ -61,8 +62,6 @@ enum
|
||||
AXIS_BRAKE = 23
|
||||
};
|
||||
|
||||
#define MAX_AXIS 10
|
||||
|
||||
typedef struct state_device
|
||||
{
|
||||
int id;
|
||||
@ -73,6 +72,8 @@ typedef struct state_device
|
||||
typedef struct android_input_data
|
||||
{
|
||||
state_device_t pad_states[MAX_PADS];
|
||||
int16_t analog_state[MAX_PADS][MAX_AXIS];
|
||||
int8_t hat_state[MAX_PADS][2];
|
||||
|
||||
unsigned pads_connected;
|
||||
sensor_t accelerometer_state;
|
||||
@ -92,7 +93,7 @@ static void frontend_android_get_version_sdk(int32_t *sdk);
|
||||
bool (*engine_lookup_name)(char *buf,
|
||||
int *vendorId, int *productId, size_t size, int id);
|
||||
|
||||
void (*engine_handle_dpad)(AInputEvent*, int, int);
|
||||
void (*engine_handle_dpad)(android_input_data_t *, AInputEvent*, int, int);
|
||||
|
||||
static bool android_input_set_sensor_state(void *data, unsigned port,
|
||||
enum retro_sensor_action action, unsigned event_rate);
|
||||
@ -358,6 +359,53 @@ static void android_input_poll_main_cmd(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void engine_handle_dpad_default(android_input_data_t *android_data,
|
||||
AInputEvent *event, int port, int source)
|
||||
{
|
||||
size_t motion_ptr = AMotionEvent_getAction(event) >>
|
||||
AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
|
||||
float x = AMotionEvent_getX(event, motion_ptr);
|
||||
float y = AMotionEvent_getY(event, motion_ptr);
|
||||
|
||||
android_data->analog_state[port][0] = (int16_t)(x * 32767.0f);
|
||||
android_data->analog_state[port][1] = (int16_t)(y * 32767.0f);
|
||||
}
|
||||
|
||||
static void engine_handle_dpad_getaxisvalue(android_input_data_t *android_data,
|
||||
AInputEvent *event, int port, int source)
|
||||
{
|
||||
size_t motion_ptr = AMotionEvent_getAction(event) >>
|
||||
AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
|
||||
float x = AMotionEvent_getAxisValue(event, AXIS_X, motion_ptr);
|
||||
float y = AMotionEvent_getAxisValue(event, AXIS_Y, motion_ptr);
|
||||
float z = AMotionEvent_getAxisValue(event, AXIS_Z, motion_ptr);
|
||||
float rz = AMotionEvent_getAxisValue(event, AXIS_RZ, motion_ptr);
|
||||
float hatx = AMotionEvent_getAxisValue(event, AXIS_HAT_X, motion_ptr);
|
||||
float haty = AMotionEvent_getAxisValue(event, AXIS_HAT_Y, motion_ptr);
|
||||
float ltrig = AMotionEvent_getAxisValue(event, AXIS_LTRIGGER, motion_ptr);
|
||||
float rtrig = AMotionEvent_getAxisValue(event, AXIS_RTRIGGER, motion_ptr);
|
||||
float brake = AMotionEvent_getAxisValue(event, AXIS_BRAKE, motion_ptr);
|
||||
float gas = AMotionEvent_getAxisValue(event, AXIS_GAS, motion_ptr);
|
||||
|
||||
android_data->hat_state[port][0] = (int)hatx;
|
||||
android_data->hat_state[port][1] = (int)haty;
|
||||
|
||||
/* XXX: this could be a loop instead, but do we really want to
|
||||
* loop through every axis? */
|
||||
android_data->analog_state[port][0] = (int16_t)(x * 32767.0f);
|
||||
android_data->analog_state[port][1] = (int16_t)(y * 32767.0f);
|
||||
android_data->analog_state[port][2] = (int16_t)(z * 32767.0f);
|
||||
android_data->analog_state[port][3] = (int16_t)(rz * 32767.0f);
|
||||
#if 0
|
||||
android_data->analog_state[port][4] = (int16_t)(hatx * 32767.0f);
|
||||
android_data->analog_state[port][5] = (int16_t)(haty * 32767.0f);
|
||||
#endif
|
||||
android_data->analog_state[port][6] = (int16_t)(ltrig * 32767.0f);
|
||||
android_data->analog_state[port][7] = (int16_t)(rtrig * 32767.0f);
|
||||
android_data->analog_state[port][8] = (int16_t)(brake * 32767.0f);
|
||||
android_data->analog_state[port][9] = (int16_t)(gas * 32767.0f);
|
||||
}
|
||||
|
||||
static void *android_input_init(void)
|
||||
{
|
||||
int32_t sdk;
|
||||
@ -381,6 +429,22 @@ static void *android_input_init(void)
|
||||
else
|
||||
engine_lookup_name = android_input_lookup_name_prekitkat;
|
||||
|
||||
engine_handle_dpad = engine_handle_dpad_default;
|
||||
|
||||
if ((dlopen("/system/lib/libandroid.so", RTLD_LOCAL | RTLD_LAZY)) == 0)
|
||||
{
|
||||
RARCH_WARN("Unable to open libandroid.so\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
if ((p_AMotionEvent_getAxisValue = dlsym(RTLD_DEFAULT,
|
||||
"AMotionEvent_getAxisValue")))
|
||||
{
|
||||
RARCH_LOG("Set engine_handle_dpad to 'Get Axis Value' (for reading extra analog sticks)");
|
||||
engine_handle_dpad = engine_handle_dpad_getaxisvalue;
|
||||
}
|
||||
|
||||
end:
|
||||
return android;
|
||||
}
|
||||
|
||||
@ -749,7 +813,7 @@ static void android_input_poll_input(void *data)
|
||||
case AINPUT_EVENT_TYPE_MOTION:
|
||||
if (android_input_poll_event_type_motion(android, event,
|
||||
port, source))
|
||||
engine_handle_dpad(event, port, source);
|
||||
engine_handle_dpad(android_data, event, port, source);
|
||||
break;
|
||||
case AINPUT_EVENT_TYPE_KEY:
|
||||
{
|
||||
@ -787,6 +851,22 @@ static void android_input_poll_user(void *data)
|
||||
}
|
||||
}
|
||||
|
||||
static void android_input_poll_memcpy(void *data)
|
||||
{
|
||||
unsigned i, j;
|
||||
android_input_t *android = (android_input_t*)data;
|
||||
android_input_data_t *android_data = (android_input_data_t*)&android->copy;
|
||||
struct android_app *android_app = (struct android_app*)g_android;
|
||||
|
||||
for (i = 0; i < MAX_PADS; i++)
|
||||
{
|
||||
for (j = 0; j < 2; j++)
|
||||
android_app->hat_state[i][j] = android_data->hat_state[i][j];
|
||||
for (j = 0; j < MAX_AXIS; j++)
|
||||
android_app->analog_state[i][j] = android_data->analog_state[i][j];
|
||||
}
|
||||
}
|
||||
|
||||
/* Handle all events. If our activity is in pause state,
|
||||
* block until we're unpaused.
|
||||
*/
|
||||
@ -820,6 +900,8 @@ static void android_input_poll(void *data)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
android_input_poll_memcpy(data);
|
||||
}
|
||||
|
||||
bool android_run_events(void *data)
|
||||
|
@ -15,58 +15,8 @@
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <dlfcn.h>
|
||||
|
||||
#include "../drivers_keyboard/keyboard_event_android.h"
|
||||
|
||||
static int16_t analog_state[MAX_PADS][MAX_AXIS];
|
||||
static int8_t hat_state[MAX_PADS][2];
|
||||
|
||||
static void engine_handle_dpad_default(AInputEvent *event, int port, int source)
|
||||
{
|
||||
size_t motion_ptr = AMotionEvent_getAction(event) >>
|
||||
AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
|
||||
float x = AMotionEvent_getX(event, motion_ptr);
|
||||
float y = AMotionEvent_getY(event, motion_ptr);
|
||||
|
||||
analog_state[port][0] = (int16_t)(x * 32767.0f);
|
||||
analog_state[port][1] = (int16_t)(y * 32767.0f);
|
||||
}
|
||||
|
||||
static void engine_handle_dpad_getaxisvalue(AInputEvent *event, int port, int source)
|
||||
{
|
||||
size_t motion_ptr = AMotionEvent_getAction(event) >>
|
||||
AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
|
||||
float x = AMotionEvent_getAxisValue(event, AXIS_X, motion_ptr);
|
||||
float y = AMotionEvent_getAxisValue(event, AXIS_Y, motion_ptr);
|
||||
float z = AMotionEvent_getAxisValue(event, AXIS_Z, motion_ptr);
|
||||
float rz = AMotionEvent_getAxisValue(event, AXIS_RZ, motion_ptr);
|
||||
float hatx = AMotionEvent_getAxisValue(event, AXIS_HAT_X, motion_ptr);
|
||||
float haty = AMotionEvent_getAxisValue(event, AXIS_HAT_Y, motion_ptr);
|
||||
float ltrig = AMotionEvent_getAxisValue(event, AXIS_LTRIGGER, motion_ptr);
|
||||
float rtrig = AMotionEvent_getAxisValue(event, AXIS_RTRIGGER, motion_ptr);
|
||||
float brake = AMotionEvent_getAxisValue(event, AXIS_BRAKE, motion_ptr);
|
||||
float gas = AMotionEvent_getAxisValue(event, AXIS_GAS, motion_ptr);
|
||||
|
||||
hat_state[port][0] = (int)hatx;
|
||||
hat_state[port][1] = (int)haty;
|
||||
|
||||
/* XXX: this could be a loop instead, but do we really want to
|
||||
* loop through every axis? */
|
||||
analog_state[port][0] = (int16_t)(x * 32767.0f);
|
||||
analog_state[port][1] = (int16_t)(y * 32767.0f);
|
||||
analog_state[port][2] = (int16_t)(z * 32767.0f);
|
||||
analog_state[port][3] = (int16_t)(rz * 32767.0f);
|
||||
#if 0
|
||||
analog_state[port][4] = (int16_t)(hatx * 32767.0f);
|
||||
analog_state[port][5] = (int16_t)(haty * 32767.0f);
|
||||
#endif
|
||||
analog_state[port][6] = (int16_t)(ltrig * 32767.0f);
|
||||
analog_state[port][7] = (int16_t)(rtrig * 32767.0f);
|
||||
analog_state[port][8] = (int16_t)(brake * 32767.0f);
|
||||
analog_state[port][9] = (int16_t)(gas * 32767.0f);
|
||||
}
|
||||
|
||||
static const char *android_joypad_name(unsigned pad)
|
||||
{
|
||||
settings_t *settings = config_get_ptr();
|
||||
@ -75,27 +25,13 @@ static const char *android_joypad_name(unsigned pad)
|
||||
|
||||
static bool android_joypad_init(void *data)
|
||||
{
|
||||
engine_handle_dpad = engine_handle_dpad_default;
|
||||
|
||||
if ((dlopen("/system/lib/libandroid.so", RTLD_LOCAL | RTLD_LAZY)) == 0)
|
||||
{
|
||||
RARCH_WARN("Unable to open libandroid.so\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
if ((p_AMotionEvent_getAxisValue = dlsym(RTLD_DEFAULT,
|
||||
"AMotionEvent_getAxisValue")))
|
||||
{
|
||||
RARCH_LOG("Set engine_handle_dpad to 'Get Axis Value' (for reading extra analog sticks)");
|
||||
engine_handle_dpad = engine_handle_dpad_getaxisvalue;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool android_joypad_button(unsigned port, uint16_t joykey)
|
||||
{
|
||||
uint8_t *buf = android_keyboard_state_get(port);
|
||||
struct android_app *android_app = (struct android_app*)g_android;
|
||||
|
||||
if (port >= MAX_PADS)
|
||||
return false;
|
||||
@ -109,13 +45,13 @@ static bool android_joypad_button(unsigned port, uint16_t joykey)
|
||||
switch (GET_HAT_DIR(joykey))
|
||||
{
|
||||
case HAT_LEFT_MASK:
|
||||
return hat_state[port][0] == -1;
|
||||
return android_app->hat_state[port][0] == -1;
|
||||
case HAT_RIGHT_MASK:
|
||||
return hat_state[port][0] == 1;
|
||||
return android_app->hat_state[port][0] == 1;
|
||||
case HAT_UP_MASK:
|
||||
return hat_state[port][1] == -1;
|
||||
return android_app->hat_state[port][1] == -1;
|
||||
case HAT_DOWN_MASK:
|
||||
return hat_state[port][1] == 1;
|
||||
return android_app->hat_state[port][1] == 1;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
@ -127,19 +63,20 @@ static bool android_joypad_button(unsigned port, uint16_t joykey)
|
||||
static int16_t android_joypad_axis(unsigned port, uint32_t joyaxis)
|
||||
{
|
||||
int val = 0;
|
||||
struct android_app *android_app = (struct android_app*)g_android;
|
||||
|
||||
if (joyaxis == AXIS_NONE)
|
||||
return 0;
|
||||
|
||||
if (AXIS_NEG_GET(joyaxis) < MAX_AXIS)
|
||||
{
|
||||
val = analog_state[port][AXIS_NEG_GET(joyaxis)];
|
||||
val = android_app->analog_state[port][AXIS_NEG_GET(joyaxis)];
|
||||
if (val > 0)
|
||||
val = 0;
|
||||
}
|
||||
else if (AXIS_POS_GET(joyaxis) < MAX_AXIS)
|
||||
{
|
||||
val = analog_state[port][AXIS_POS_GET(joyaxis)];
|
||||
val = android_app->analog_state[port][AXIS_POS_GET(joyaxis)];
|
||||
if (val < 0)
|
||||
val = 0;
|
||||
}
|
||||
@ -160,13 +97,14 @@ static bool android_joypad_query_pad(unsigned pad)
|
||||
static void android_joypad_destroy(void)
|
||||
{
|
||||
unsigned i, j;
|
||||
struct android_app *android_app = (struct android_app*)g_android;
|
||||
|
||||
for (i = 0; i < MAX_PADS; i++)
|
||||
{
|
||||
for (j = 0; j < 2; j++)
|
||||
hat_state[i][j] = 0;
|
||||
android_app->hat_state[i][j] = 0;
|
||||
for (j = 0; j < MAX_AXIS; j++)
|
||||
analog_state[i][j] = 0;
|
||||
android_app->analog_state[i][j] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user