(Android) Refactor axis functions

This commit is contained in:
twinaphex 2020-07-18 22:38:23 +02:00
parent f8d6cea02a
commit cb5b22b6ac
24 changed files with 88 additions and 115 deletions

View File

@ -1315,8 +1315,6 @@ static void android_input_poll_memcpy(android_input_t *android)
static bool android_input_key_pressed(android_input_t *android, int key) static bool android_input_key_pressed(android_input_t *android, int key)
{ {
uint64_t joykey;
uint32_t joyaxis;
rarch_joypad_info_t joypad_info; rarch_joypad_info_t joypad_info;
joypad_info.joy_idx = 0; joypad_info.joy_idx = 0;
joypad_info.auto_binds = input_autoconf_binds[0]; joypad_info.auto_binds = input_autoconf_binds[0];
@ -1327,21 +1325,12 @@ static bool android_input_key_pressed(android_input_t *android, int key)
&& android_keyboard_port_input_pressed(input_config_binds[0], && android_keyboard_port_input_pressed(input_config_binds[0],
key)) key))
return true; return true;
return button_is_pressed(
joykey = android->joypad,
(input_config_binds[0][key].joykey != NO_BTN) &joypad_info,
? input_config_binds[0][key].joykey &input_config_binds[0],
: joypad_info.auto_binds[key].joykey; joypad_info.joy_idx,
joyaxis = key);
(input_config_binds[0][key].joyaxis != AXIS_NONE)
? input_config_binds[0][key].joyaxis
: joypad_info.auto_binds[key].joyaxis;
if ((uint16_t)joykey != NO_BTN && android->joypad->button(joypad_info.joy_idx, (uint16_t)joykey))
return true;
if (((float)abs(android->joypad->axis(joypad_info.joy_idx, joyaxis)) / 0x8000) > joypad_info.axis_threshold)
return true;
return false;
} }
/* Handle all events. If our activity is in pause state, /* Handle all events. If our activity is in pause state,

View File

@ -1399,9 +1399,6 @@ static int16_t btstack_hid_joypad_axis(void *data, unsigned port, uint32_t joyax
btstack_hid_t *hid = (btstack_hid_t*)data; btstack_hid_t *hid = (btstack_hid_t*)data;
int16_t val = 0; int16_t val = 0;
if (joyaxis == AXIS_NONE)
return 0;
if (AXIS_NEG_GET(joyaxis) < 4) if (AXIS_NEG_GET(joyaxis) < 4)
{ {
val += pad_connection_get_axis(&hid->slots[port], port, AXIS_NEG_GET(joyaxis)); val += pad_connection_get_axis(&hid->slots[port], port, AXIS_NEG_GET(joyaxis));

View File

@ -218,9 +218,6 @@ static int16_t iohidmanager_hid_joypad_axis(void *data,
iohidmanager_hid_t *hid = (iohidmanager_hid_t*)data; iohidmanager_hid_t *hid = (iohidmanager_hid_t*)data;
int16_t val = 0; int16_t val = 0;
if (joyaxis == AXIS_NONE)
return 0;
if (AXIS_NEG_GET(joyaxis) < 11) if (AXIS_NEG_GET(joyaxis) < 11)
{ {
val += hid->axes[port][AXIS_NEG_GET(joyaxis)]; val += hid->axes[port][AXIS_NEG_GET(joyaxis)];

View File

@ -493,9 +493,6 @@ static int16_t libusb_hid_joypad_axis(void *data,
libusb_hid_t *hid = (libusb_hid_t*)data; libusb_hid_t *hid = (libusb_hid_t*)data;
int16_t val = 0; int16_t val = 0;
if (joyaxis == AXIS_NONE)
return 0;
if (AXIS_NEG_GET(joyaxis) < 4) if (AXIS_NEG_GET(joyaxis) < 4)
{ {
val = pad_connection_get_axis(&hid->slots[port], val = pad_connection_get_axis(&hid->slots[port],

View File

@ -581,9 +581,6 @@ static int16_t wiiusb_hid_joypad_axis(void *data,
int16_t val = 0; int16_t val = 0;
wiiusb_hid_t *hid = (wiiusb_hid_t*)data; wiiusb_hid_t *hid = (wiiusb_hid_t*)data;
if (joyaxis == AXIS_NONE)
return 0;
if (AXIS_NEG_GET(joyaxis) < 4) if (AXIS_NEG_GET(joyaxis) < 4)
{ {
val = pad_connection_get_axis(&hid->connections[port], val = pad_connection_get_axis(&hid->connections[port],

View File

@ -75,7 +75,7 @@ static int16_t android_joypad_button(unsigned port, uint16_t joykey)
} }
else if (i < LAST_KEYCODE) else if (i < LAST_KEYCODE)
if (BIT_GET(buf, i)) if (BIT_GET(buf, i))
ret |= (1 << i): ret |= (1 << i);
} }
return ret; return ret;
@ -86,9 +86,6 @@ static int16_t android_joypad_axis(unsigned port, uint32_t joyaxis)
int val = 0; int val = 0;
struct android_app *android_app = (struct android_app*)g_android; struct android_app *android_app = (struct android_app*)g_android;
if (joyaxis == AXIS_NONE)
return 0;
if (AXIS_NEG_GET(joyaxis) < MAX_AXIS) if (AXIS_NEG_GET(joyaxis) < MAX_AXIS)
{ {
val = android_app->analog_state[port][AXIS_NEG_GET(joyaxis)]; val = android_app->analog_state[port][AXIS_NEG_GET(joyaxis)];

View File

@ -88,7 +88,7 @@ static int16_t ctr_joypad_axis(unsigned port_num, uint32_t joyaxis)
bool is_neg = false; bool is_neg = false;
bool is_pos = false; bool is_pos = false;
if (joyaxis == AXIS_NONE || port_num >= DEFAULT_MAX_PADS) if (port_num >= DEFAULT_MAX_PADS)
return 0; return 0;
if (AXIS_NEG_GET(joyaxis) < 4) if (AXIS_NEG_GET(joyaxis) < 4)

View File

@ -531,16 +531,12 @@ static int16_t dinput_joypad_button(unsigned port_num, uint16_t joykey)
static int16_t dinput_joypad_axis(unsigned port_num, uint32_t joyaxis) static int16_t dinput_joypad_axis(unsigned port_num, uint32_t joyaxis)
{ {
const struct dinput_joypad_data *pad = NULL;
int val = 0; int val = 0;
int axis = -1; int axis = -1;
bool is_neg = false; bool is_neg = false;
bool is_pos = false; bool is_pos = false;
const struct dinput_joypad_data *pad = &g_pads[port_num];
if (joyaxis == AXIS_NONE)
return 0;
pad = &g_pads[port_num];
if (!pad->joypad) if (!pad->joypad)
return 0; return 0;

View File

@ -188,7 +188,7 @@ static int16_t dos_joypad_button(unsigned port_num, uint16_t joykey)
break; break;
case RETRO_DEVICE_ID_JOYPAD_X: case RETRO_DEVICE_ID_JOYPAD_X:
if (buf[DOSKEY_s]) if (buf[DOSKEY_s])
ret |= (1 << i): ret |= (1 << i);
break; break;
case RETRO_DEVICE_ID_JOYPAD_Y: case RETRO_DEVICE_ID_JOYPAD_Y:
if (buf[DOSKEY_a]) if (buf[DOSKEY_a])
@ -204,7 +204,7 @@ static int16_t dos_joypad_button(unsigned port_num, uint16_t joykey)
break; break;
case RETRO_DEVICE_ID_JOYPAD_UP: case RETRO_DEVICE_ID_JOYPAD_UP:
if (buf[DOSKEY_UP]) if (buf[DOSKEY_UP])
ret |= (1 << i): ret |= (1 << i);
break; break;
case RETRO_DEVICE_ID_JOYPAD_DOWN: case RETRO_DEVICE_ID_JOYPAD_DOWN:
if (buf[DOSKEY_DOWN]) if (buf[DOSKEY_DOWN])

View File

@ -275,7 +275,7 @@ static int16_t gx_joypad_axis(unsigned port, uint32_t joyaxis)
bool is_neg = false; bool is_neg = false;
bool is_pos = false; bool is_pos = false;
if (joyaxis == AXIS_NONE || port >= DEFAULT_MAX_PADS) if (port >= DEFAULT_MAX_PADS)
return 0; return 0;
if (AXIS_NEG_GET(joyaxis) < 4) if (AXIS_NEG_GET(joyaxis) < 4)

View File

@ -335,12 +335,8 @@ static void linuxraw_joypad_get_buttons(unsigned port, input_bits_t *state)
static int16_t linuxraw_joypad_axis(unsigned port, uint32_t joyaxis) static int16_t linuxraw_joypad_axis(unsigned port, uint32_t joyaxis)
{ {
int16_t val = 0; int16_t val = 0;
const struct linuxraw_joypad *pad = NULL; const struct linuxraw_joypad *pad = (const struct linuxraw_joypad*)
&linuxraw_pads[port];
if (joyaxis == AXIS_NONE)
return 0;
pad = (const struct linuxraw_joypad*)&linuxraw_pads[port];
if (AXIS_NEG_GET(joyaxis) < NUM_AXES) if (AXIS_NEG_GET(joyaxis) < NUM_AXES)
{ {

View File

@ -361,47 +361,45 @@ static void apple_gamecontroller_joypad_get_buttons(unsigned port,
BITS_COPY16_PTR(state, mfi_buttons[port]); BITS_COPY16_PTR(state, mfi_buttons[port]);
} }
static int16_t apple_gamecontroller_joypad_axis(unsigned port, uint32_t joyaxis) static int16_t apple_gamecontroller_joypad_axis(
unsigned port, uint32_t joyaxis)
{ {
int16_t val = 0; int16_t val = 0;
int16_t axis = -1; int16_t axis = -1;
bool is_neg = false; bool is_neg = false;
bool is_pos = false; bool is_pos = false;
if (joyaxis == AXIS_NONE)
return 0;
if (AXIS_NEG_GET(joyaxis) < 4) if (AXIS_NEG_GET(joyaxis) < 4)
{ {
axis = AXIS_NEG_GET(joyaxis); axis = AXIS_NEG_GET(joyaxis);
is_neg = true; is_neg = true;
} }
else if(AXIS_POS_GET(joyaxis) < 4) else if(AXIS_POS_GET(joyaxis) < 4)
{ {
axis = AXIS_POS_GET(joyaxis); axis = AXIS_POS_GET(joyaxis);
is_pos = true; is_pos = true;
} }
switch (axis) switch (axis)
{ {
case 0: case 0:
val = mfi_axes[port][0]; val = mfi_axes[port][0];
break; break;
case 1: case 1:
val = mfi_axes[port][1]; val = mfi_axes[port][1];
break; break;
case 2: case 2:
val = mfi_axes[port][2]; val = mfi_axes[port][2];
break; break;
case 3: case 3:
val = mfi_axes[port][3]; val = mfi_axes[port][3];
break; break;
} }
if (is_neg && val > 0) if (is_neg && val > 0)
val = 0; val = 0;
else if (is_pos && val < 0) else if (is_pos && val < 0)
val = 0; val = 0;
return val; return val;
} }

View File

@ -111,7 +111,7 @@ static int16_t ps2_joypad_axis(unsigned port_num, uint32_t joyaxis)
bool is_neg = false; bool is_neg = false;
bool is_pos = false; bool is_pos = false;
if (joyaxis == AXIS_NONE || port_num >= DEFAULT_MAX_PADS) if (port_num >= DEFAULT_MAX_PADS)
return 0; return 0;
if (AXIS_NEG_GET(joyaxis) < 4) if (AXIS_NEG_GET(joyaxis) < 4)

View File

@ -93,7 +93,7 @@ static int16_t ps3_joypad_axis(unsigned port_num, uint32_t joyaxis)
bool is_neg = false; bool is_neg = false;
bool is_pos = false; bool is_pos = false;
if (joyaxis == AXIS_NONE || port_num >= DEFAULT_MAX_PADS) if (port_num >= DEFAULT_MAX_PADS)
return 0; return 0;
if (AXIS_NEG_GET(joyaxis) < 4) if (AXIS_NEG_GET(joyaxis) < 4)

View File

@ -151,7 +151,7 @@ static int16_t psp_joypad_axis(unsigned port_num, uint32_t joyaxis)
bool is_neg = false; bool is_neg = false;
bool is_pos = false; bool is_pos = false;
if (joyaxis == AXIS_NONE || port_num >= DEFAULT_MAX_PADS) if (port_num >= DEFAULT_MAX_PADS)
return 0; return 0;
if (AXIS_NEG_GET(joyaxis) < 4) if (AXIS_NEG_GET(joyaxis) < 4)

View File

@ -74,7 +74,7 @@ static int16_t qnx_joypad_axis(unsigned port_num, uint32_t joyaxis)
bool is_pos = false; bool is_pos = false;
qnx_input_t *qnx = (qnx_input_t*)input_driver_get_data(); qnx_input_t *qnx = (qnx_input_t*)input_driver_get_data();
if (!qnx || joyaxis == AXIS_NONE || port_num >= DEFAULT_MAX_PADS) if (!qnx || port_num >= DEFAULT_MAX_PADS)
return 0; return 0;
if (AXIS_NEG_GET(joyaxis) < 4) if (AXIS_NEG_GET(joyaxis) < 4)

View File

@ -144,13 +144,8 @@ static void rwebpad_joypad_get_buttons(unsigned port_num, input_bits_t *state)
static int16_t rwebpad_joypad_axis(unsigned port_num, uint32_t joyaxis) static int16_t rwebpad_joypad_axis(unsigned port_num, uint32_t joyaxis)
{ {
EmscriptenGamepadEvent gamepad_state; EmscriptenGamepadEvent gamepad_state;
EMSCRIPTEN_RESULT r; int16_t val = 0;
int16_t val = 0; EMSCRIPTEN_RESULT r = emscripten_get_gamepad_status(port_num, &gamepad_state);
if (joyaxis == 0xFFFFFFFF)
return 0;
r = emscripten_get_gamepad_status(port_num, &gamepad_state);
if (r == EMSCRIPTEN_RESULT_SUCCESS) if (r == EMSCRIPTEN_RESULT_SUCCESS)
{ {

View File

@ -353,13 +353,8 @@ static int16_t sdl_joypad_button(unsigned port, uint16_t joykey)
static int16_t sdl_joypad_axis(unsigned port, uint32_t joyaxis) static int16_t sdl_joypad_axis(unsigned port, uint32_t joyaxis)
{ {
sdl_joypad_t *pad;
int16_t val = 0; int16_t val = 0;
sdl_joypad_t *pad = (sdl_joypad_t*)&sdl_pads[port];
if (joyaxis == AXIS_NONE)
return 0;
pad = (sdl_joypad_t*)&sdl_pads[port];
if (!pad->joypad) if (!pad->joypad)
return false; return false;

View File

@ -119,7 +119,7 @@ static int16_t switch_joypad_axis(unsigned port_num, uint32_t joyaxis)
#if 0 #if 0
/* TODO/FIXME - implement */ /* TODO/FIXME - implement */
if (joyaxis == AXIS_NONE || port_num >= DEFAULT_MAX_PADS) { } if (port_num >= DEFAULT_MAX_PADS) { }
#endif #endif
if (AXIS_NEG_GET(joyaxis) < 4) if (AXIS_NEG_GET(joyaxis) < 4)

View File

@ -655,11 +655,8 @@ static void udev_joypad_get_buttons(unsigned port, input_bits_t *state)
static int16_t udev_joypad_axis(unsigned port, uint32_t joyaxis) static int16_t udev_joypad_axis(unsigned port, uint32_t joyaxis)
{ {
int16_t val = 0; int16_t val = 0;
const struct udev_joypad *pad; const struct udev_joypad *pad = (const struct udev_joypad*)
if (joyaxis == AXIS_NONE) &udev_pads[port];
return 0;
pad = (const struct udev_joypad*)&udev_pads[port];
if (AXIS_NEG_GET(joyaxis) < NUM_AXES) if (AXIS_NEG_GET(joyaxis) < NUM_AXES)
{ {

View File

@ -325,7 +325,7 @@ static int16_t wpad_axis(unsigned pad, uint32_t axis)
axis_data data; axis_data data;
VPADChan channel; VPADChan channel;
if (!wpad_query_pad(pad) || axis == AXIS_NONE) if (!wpad_query_pad(pad))
return 0; return 0;
channel = to_gamepad_channel(pad); channel = to_gamepad_channel(pad);

View File

@ -203,7 +203,7 @@ static int16_t xdk_joypad_axis(unsigned port_num, uint32_t joyaxis)
bool is_pos = false; bool is_pos = false;
XINPUT_GAMEPAD *pad = NULL; XINPUT_GAMEPAD *pad = NULL;
if (joyaxis == AXIS_NONE || port_num >= DEFAULT_MAX_PADS) if (port_num >= DEFAULT_MAX_PADS)
return 0; return 0;
if (AXIS_NEG_GET(joyaxis) <= 3) if (AXIS_NEG_GET(joyaxis) <= 3)

View File

@ -479,17 +479,12 @@ static int16_t xinput_joypad_button(unsigned port_num, uint16_t joykey)
static int16_t xinput_joypad_axis (unsigned port_num, uint32_t joyaxis) static int16_t xinput_joypad_axis (unsigned port_num, uint32_t joyaxis)
{ {
int xuser;
int16_t val = 0; int16_t val = 0;
int axis = -1; int axis = -1;
bool is_neg = false; bool is_neg = false;
bool is_pos = false; bool is_pos = false;
XINPUT_GAMEPAD* pad = NULL; XINPUT_GAMEPAD* pad = NULL;
int xuser = pad_index_to_xuser_index(port_num);
if (joyaxis == AXIS_NONE)
return 0;
xuser = pad_index_to_xuser_index(port_num);
#ifdef HAVE_DINPUT #ifdef HAVE_DINPUT
if (xuser == -1) if (xuser == -1)

View File

@ -3539,17 +3539,26 @@ static void menu_input_key_bind_poll_bind_get_rested_axes(
/* poll only the relevant port */ /* poll only the relevant port */
for (a = 0; a < MENU_MAX_AXES; a++) for (a = 0; a < MENU_MAX_AXES; a++)
state->axis_state[port].rested_axes[a] = {
joypad->axis(port, AXIS_POS(a)) + if (AXIS_POS(a) != AXIS_NONE)
joypad->axis(port, AXIS_NEG(a)); state->axis_state[port].rested_axes[a] =
joypad->axis(port, AXIS_POS(a));
if (AXIS_NEG(a) != AXIS_NONE)
state->axis_state[port].rested_axes[a] +=
joypad->axis(port, AXIS_NEG(a));
}
if (sec_joypad) if (sec_joypad)
{ {
/* poll only the relevant port */ /* poll only the relevant port */
for (a = 0; a < MENU_MAX_AXES; a++) for (a = 0; a < MENU_MAX_AXES; a++)
state->axis_state[port].rested_axes[a] = {
sec_joypad->axis(port, AXIS_POS(a)) + if (AXIS_POS(a) != AXIS_NONE)
sec_joypad->axis(port, AXIS_NEG(a)); state->axis_state[port].rested_axes[a] = sec_joypad->axis(port, AXIS_POS(a));
if (AXIS_NEG(a) != AXIS_NONE)
state->axis_state[port].rested_axes[a] += sec_joypad->axis(port, AXIS_NEG(a));
}
} }
} }
@ -3571,9 +3580,13 @@ static void menu_input_key_bind_poll_bind_state_internal(
state->state[port].buttons[b] = joypad->button(port, b); state->state[port].buttons[b] = joypad->button(port, b);
for (a = 0; a < MENU_MAX_AXES; a++) for (a = 0; a < MENU_MAX_AXES; a++)
state->state[port].axes[a] = {
joypad->axis(port, AXIS_POS(a)) + if (AXIS_POS(a) != AXIS_NONE)
joypad->axis(port, AXIS_NEG(a)); state->state[port].axes[a] = joypad->axis(port, AXIS_POS(a));
if (AXIS_NEG(a) != AXIS_NONE)
state->state[port].axes[a] += joypad->axis(port, AXIS_NEG(a));
}
for (h = 0; h < MENU_MAX_HATS; h++) for (h = 0; h < MENU_MAX_HATS; h++)
{ {
@ -24111,7 +24124,7 @@ static int16_t input_joypad_axis(
settings_t *settings = p_rarch->configuration_settings; settings_t *settings = p_rarch->configuration_settings;
float input_analog_deadzone = settings->floats.input_analog_deadzone; float input_analog_deadzone = settings->floats.input_analog_deadzone;
float input_analog_sensitivity = settings->floats.input_analog_sensitivity; float input_analog_sensitivity = settings->floats.input_analog_sensitivity;
int16_t val = drv->axis(port, joyaxis); int16_t val = (joyaxis != AXIS_NONE) ? drv->axis(port, joyaxis) : 0;
if (input_analog_deadzone) if (input_analog_deadzone)
{ {
@ -26117,8 +26130,9 @@ int16_t button_is_pressed(
if ((uint16_t)joykey != NO_BTN && joypad->button( if ((uint16_t)joykey != NO_BTN && joypad->button(
joypad_info->joy_idx, (uint16_t)joykey)) joypad_info->joy_idx, (uint16_t)joykey))
return 1; return 1;
if (((float)abs(joypad->axis(joypad_info->joy_idx, joyaxis)) if (joyaxis != AXIS_NONE &&
/ 0x8000) > joypad_info->axis_threshold) ((float)abs(joypad->axis(joypad_info->joy_idx, joyaxis))
/ 0x8000) > joypad_info->axis_threshold)
return 1; return 1;
return 0; return 0;
} }
@ -26165,8 +26179,13 @@ static int16_t input_joypad_analog_button(
/* Analog button. */ /* Analog button. */
if (input_analog_deadzone) if (input_analog_deadzone)
normal_mag = fabs((1.0f / 0x7fff) * drv->axis( {
joypad_info->joy_idx, axis)); int16_t mult = 0;
if (axis != AXIS_NONE)
mult = drv->axis(
joypad_info->joy_idx, axis);
normal_mag = fabs((1.0f / 0x7fff) * mult);
}
res = abs(input_joypad_axis(p_rarch, drv, res = abs(input_joypad_axis(p_rarch, drv,
joypad_info->joy_idx, axis, normal_mag)); joypad_info->joy_idx, axis, normal_mag));
@ -26251,6 +26270,8 @@ static int16_t input_joypad_analog_axis(
* radial deadzone */ * radial deadzone */
if (input_analog_deadzone) if (input_analog_deadzone)
{ {
float x = 0.0f;
float y = 0.0f;
uint32_t x_axis_minus = (bind_x_minus->joyaxis == AXIS_NONE) uint32_t x_axis_minus = (bind_x_minus->joyaxis == AXIS_NONE)
? joypad_info->auto_binds[ident_x_minus].joyaxis ? joypad_info->auto_binds[ident_x_minus].joyaxis
: bind_x_minus->joyaxis; : bind_x_minus->joyaxis;
@ -26264,13 +26285,19 @@ static int16_t input_joypad_analog_axis(
? joypad_info->auto_binds[ident_y_plus].joyaxis ? joypad_info->auto_binds[ident_y_plus].joyaxis
: bind_y_plus->joyaxis; : bind_y_plus->joyaxis;
/* normalized magnitude for radial scaled analog deadzone */ /* normalized magnitude for radial scaled analog deadzone */
float x = drv->axis( if (x_axis_plus != AXIS_NONE)
joypad_info->joy_idx, x_axis_plus) x = drv->axis(
+ drv->axis(joypad_info->joy_idx, x_axis_minus); joypad_info->joy_idx, x_axis_plus);
float y = drv->axis( if (x_axis_minus != AXIS_NONE)
joypad_info->joy_idx, y_axis_plus) x += drv->axis(joypad_info->joy_idx,
+ drv->axis(joypad_info->joy_idx, y_axis_minus); x_axis_minus);
normal_mag = (1.0f / 0x7fff) * sqrt(x * x + y * y); if (y_axis_plus != AXIS_NONE)
y = drv->axis(
joypad_info->joy_idx, y_axis_plus);
if (y_axis_minus != AXIS_NONE)
y += drv->axis(
joypad_info->joy_idx, y_axis_minus);
normal_mag = (1.0f / 0x7fff) * sqrt(x * x + y * y);
} }
pressed_minus = abs( pressed_minus = abs(