static int16_t sdl_joypad_axis(unsigned port, uint32_t joyaxis) { if (joyaxis == AXIS_NONE) return 0; const struct sdl_joypad *pad = &g_pads[port]; if (!pad->joypad) return false; Sint16 val = 0; if (AXIS_NEG_GET(joyaxis) < pad->num_axes) { val = SDL_JoystickGetAxis(pad->joypad, AXIS_NEG_GET(joyaxis)); if (val > 0) val = 0; else if (val < -0x7fff) // -0x8000 can cause trouble if we later abs() it. val = -0x7fff; } else if (AXIS_POS_GET(joyaxis) < pad->num_axes) { val = SDL_JoystickGetAxis(pad->joypad, AXIS_POS_GET(joyaxis)); if (val < 0) val = 0; } return val; }
static int16_t libusb_hid_joypad_axis(void *data, unsigned port, uint32_t joyaxis) { libusb_hid_t *hid = (libusb_hid_t*)data; int16_t val = 0; if (joyaxis == AXIS_NONE) return 0; if (AXIS_NEG_GET(joyaxis) < 4) { val = pad_connection_get_axis(&hid->slots[port], port, AXIS_NEG_GET(joyaxis)); if (val >= 0) val = 0; } else if(AXIS_POS_GET(joyaxis) < 4) { val = pad_connection_get_axis(&hid->slots[port], port, AXIS_POS_GET(joyaxis)); if (val <= 0) val = 0; } return val; }
static int16_t iohidmanager_hid_joypad_axis(void *data, unsigned port, uint32_t joyaxis) { iohidmanager_hid_t *hid = (iohidmanager_hid_t*)data; int16_t val = 0; if (joyaxis == AXIS_NONE) return 0; if (AXIS_NEG_GET(joyaxis) < 6) { val += hid->axes[port][AXIS_NEG_GET(joyaxis)]; val += pad_connection_get_axis(&hid->slots[port], port, AXIS_NEG_GET(joyaxis)); if (val >= 0) val = 0; } else if(AXIS_POS_GET(joyaxis) < 6) { val += hid->axes[port][AXIS_POS_GET(joyaxis)]; val += pad_connection_get_axis(&hid->slots[port], port, AXIS_POS_GET(joyaxis)); if (val <= 0) val = 0; } return val; }
static int16_t sdl_joypad_axis(unsigned port, uint32_t joyaxis) { sdl_joypad_t *pad; int16_t val = 0; if (joyaxis == AXIS_NONE) return 0; pad = (sdl_joypad_t*)&sdl_pads[port]; if (!pad->joypad) return false; if (AXIS_NEG_GET(joyaxis) < pad->num_axes) { val = sdl_pad_get_axis(pad, AXIS_NEG_GET(joyaxis)); if (val > 0) val = 0; else if (val < -0x7fff) /* -0x8000 can cause trouble if we later abs() it. */ val = -0x7fff; } else if (AXIS_POS_GET(joyaxis) < pad->num_axes) { val = sdl_pad_get_axis(pad, AXIS_POS_GET(joyaxis)); if (val < 0) val = 0; } return val; }
static int16_t android_joypad_axis(unsigned port, uint32_t joyaxis) { int val = 0; int axis = -1; bool is_neg = false; bool is_pos = false; driver_t *driver = driver_get_ptr(); android_input_t *android = (android_input_t*)driver->input_data; if (!android || joyaxis == AXIS_NONE || port >= MAX_PADS) return 0; if (AXIS_NEG_GET(joyaxis) < MAX_AXIS) { axis = AXIS_NEG_GET(joyaxis); is_neg = true; } else if (AXIS_POS_GET(joyaxis) < MAX_AXIS) { axis = AXIS_POS_GET(joyaxis); is_pos = true; } val = android->analog_state[port][axis]; if (is_neg && val > 0) val = 0; else if (is_pos && val < 0) val = 0; return val; }
static int16_t sdl_axis_analog(sdl_input_t *sdl, unsigned port_num, uint32_t joyaxis) { if (joyaxis == AXIS_NONE) return 0; Sint16 val = 0; if (AXIS_NEG_GET(joyaxis) < sdl->num_axes[port_num]) { val = SDL_JoystickGetAxis(sdl->joysticks[port_num], AXIS_NEG_GET(joyaxis)); if (val > 0) val = 0; else if (val < -0x8000) // -0x8000 can cause trouble if we later abs() it. val = -0x7fff; } else if (AXIS_POS_GET(joyaxis) < sdl->num_axes[port_num]) { val = SDL_JoystickGetAxis(sdl->joysticks[port_num], AXIS_POS_GET(joyaxis)); if (val < 0) val = 0; } return val; }
static int16_t rwebpad_joypad_axis(unsigned port_num, uint32_t joyaxis) { EmscriptenGamepadEvent gamepad_state; EMSCRIPTEN_RESULT r; int16_t val = 0; if (joyaxis == 0xFFFFFFFF) return 0; r = emscripten_get_gamepad_status(port_num, &gamepad_state); if (r == EMSCRIPTEN_RESULT_SUCCESS) { if (AXIS_NEG_GET(joyaxis) < gamepad_state.numAxes) { val = CLAMPDOUBLE(gamepad_state.axis[AXIS_NEG_GET(joyaxis)]) * 0x7FFF; if (val > 0) val = 0; } else if (AXIS_POS_GET(joyaxis) < gamepad_state.numAxes) { val = CLAMPDOUBLE(gamepad_state.axis[AXIS_POS_GET(joyaxis)]) * 0x7FFF; if (val < 0) val = 0; } } return val; }
static int16_t linuxraw_joypad_axis(unsigned port, uint32_t joyaxis) { int16_t val = 0; const struct linuxraw_joypad *pad = NULL; if (joyaxis == AXIS_NONE) return 0; pad = (const struct linuxraw_joypad*)&linuxraw_pads[port]; if (AXIS_NEG_GET(joyaxis) < NUM_AXES) { val = pad->axes[AXIS_NEG_GET(joyaxis)]; if (val > 0) val = 0; /* Kernel returns values in range [-0x7fff, 0x7fff]. */ } else if (AXIS_POS_GET(joyaxis) < NUM_AXES) { val = pad->axes[AXIS_POS_GET(joyaxis)]; if (val < 0) val = 0; } return val; }
static int16_t apple_joypad_axis(unsigned port, uint32_t joyaxis) { apple_input_data_t *apple = (apple_input_data_t*)driver.input_data; int16_t val = 0; if (!apple || joyaxis == AXIS_NONE) return 0; if (AXIS_NEG_GET(joyaxis) < 4) { val = apple->axes[port][AXIS_NEG_GET(joyaxis)]; val += pad_connection_get_axis(&slots[port], port, AXIS_NEG_GET(joyaxis)); if (val >= 0) val = 0; } else if(AXIS_POS_GET(joyaxis) < 4) { val = apple->axes[port][AXIS_POS_GET(joyaxis)]; val += pad_connection_get_axis(&slots[port], port, AXIS_POS_GET(joyaxis)); if (val <= 0) val = 0; } return val; }
void input_get_bind_string(char *buf, const struct retro_keybind *bind, size_t size) { *buf = '\0'; if (bind->joykey != NO_BTN) { if (driver.input->set_keybinds) { struct platform_bind key_label; strlcpy(key_label.desc, "Unknown", sizeof(key_label.desc)); key_label.joykey = bind->joykey; driver.input->set_keybinds(&key_label, 0, 0, 0, (1ULL << KEYBINDS_ACTION_GET_BIND_LABEL)); snprintf(buf, size, "%s (btn) ", key_label.desc); } else if (GET_HAT_DIR(bind->joykey)) { const char *dir; switch (GET_HAT_DIR(bind->joykey)) { case HAT_UP_MASK: dir = "up"; break; case HAT_DOWN_MASK: dir = "down"; break; case HAT_LEFT_MASK: dir = "left"; break; case HAT_RIGHT_MASK: dir = "right"; break; default: dir = "?"; break; } snprintf(buf, size, "Hat #%u %s ", (unsigned)GET_HAT(bind->joykey), dir); } else snprintf(buf, size, "%u (btn) ", (unsigned)bind->joykey); } else if (bind->joyaxis != AXIS_NONE) { unsigned axis = 0; char dir = '\0'; if (AXIS_NEG_GET(bind->joyaxis) != AXIS_DIR_NONE) { dir = '-'; axis = AXIS_NEG_GET(bind->joyaxis); } else if (AXIS_POS_GET(bind->joyaxis) != AXIS_DIR_NONE) { dir = '+'; axis = AXIS_POS_GET(bind->joyaxis); } snprintf(buf, size, "%c%u (axis) ", dir, axis); } #ifndef RARCH_CONSOLE char key[64]; input_translate_rk_to_str(bind->key, key, sizeof(key)); if (!strcmp(key, "nul")) *key = '\0'; char keybuf[64]; snprintf(keybuf, sizeof(keybuf), "(Key: %s)", key); strlcat(buf, keybuf, size); #endif }
static int16_t dinput_joypad_axis(unsigned port_num, uint32_t joyaxis) { const struct dinput_joypad *pad = NULL; int val = 0; int axis = -1; bool is_neg = false; bool is_pos = false; if (joyaxis == AXIS_NONE) return 0; pad = &g_pads[port_num]; if (!pad->joypad) return 0; if (AXIS_NEG_GET(joyaxis) <= 5) { axis = AXIS_NEG_GET(joyaxis); is_neg = true; } else if (AXIS_POS_GET(joyaxis) <= 5) { axis = AXIS_POS_GET(joyaxis); is_pos = true; } switch (axis) { case 0: val = pad->joy_state.lX; break; case 1: val = pad->joy_state.lY; break; case 2: val = pad->joy_state.lZ; break; case 3: val = pad->joy_state.lRx; break; case 4: val = pad->joy_state.lRy; break; case 5: val = pad->joy_state.lRz; break; } if (is_neg && val > 0) val = 0; else if (is_pos && val < 0) val = 0; return val; }
static int16_t winxinput_joypad_axis (unsigned port_num, uint32_t joyaxis) { if (joyaxis == AXIS_NONE) return 0; int xplayer = pad_index_to_xplayer_index(port_num); if (xplayer == -1) return dinput_joypad.axis(port_num, joyaxis); if (!(g_winxinput_states[xplayer].connected)) return false; int16_t val = 0; int axis = -1; bool is_neg = false; bool is_pos = false; if (AXIS_NEG_GET(joyaxis) <= 3) // triggers (axes 4,5) cannot be negative { axis = AXIS_NEG_GET(joyaxis); is_neg = true; } else if (AXIS_POS_GET(joyaxis) <= 5) { axis = AXIS_POS_GET(joyaxis); is_pos = true; } XINPUT_GAMEPAD* pad = &(g_winxinput_states[xplayer].xstate.Gamepad); switch (axis) { case 0: val = pad->sThumbLX; break; case 1: val = pad->sThumbLY; break; case 2: val = pad->sThumbRX; break; case 3: val = pad->sThumbRY; break; case 4: val = pad->bLeftTrigger * 32767 / 255; break; // map 0..255 to 0..32767 case 5: val = pad->bRightTrigger * 32767 / 255; break; } if (is_neg && val > 0) val = 0; else if (is_pos && val < 0) val = 0; // Clamp to avoid overflow error if (val == -32768) val = -32767; return val; }
static void input_get_bind_string_joyaxis(char *buf, const char *prefix, const struct retro_keybind *bind, size_t size) { unsigned axis = 0; char dir = '\0'; if (AXIS_NEG_GET(bind->joyaxis) != AXIS_DIR_NONE) { dir = '-'; axis = AXIS_NEG_GET(bind->joyaxis); } else if (AXIS_POS_GET(bind->joyaxis) != AXIS_DIR_NONE) { dir = '+'; axis = AXIS_POS_GET(bind->joyaxis); } snprintf(buf, size, "%s%c%u (axis) ", prefix, dir, axis); }
void input_get_bind_string(char *buf, const struct retro_keybind *bind, size_t size) { *buf = '\0'; if (bind->joykey != NO_BTN) { if (GET_HAT_DIR(bind->joykey)) { const char *dir; switch (GET_HAT_DIR(bind->joykey)) { case HAT_UP_MASK: dir = "up"; break; case HAT_DOWN_MASK: dir = "down"; break; case HAT_LEFT_MASK: dir = "left"; break; case HAT_RIGHT_MASK: dir = "right"; break; default: dir = "?"; break; } snprintf(buf, size, "Hat #%u %s ", (unsigned)GET_HAT(bind->joykey), dir); } else snprintf(buf, size, "%u (btn) ", (unsigned)bind->joykey); } else if (bind->joyaxis != AXIS_NONE) { unsigned axis = 0; char dir = '\0'; if (AXIS_NEG_GET(bind->joyaxis) != AXIS_DIR_NONE) { dir = '-'; axis = AXIS_NEG_GET(bind->joyaxis); } else if (AXIS_POS_GET(bind->joyaxis) != AXIS_DIR_NONE) { dir = '+'; axis = AXIS_POS_GET(bind->joyaxis); } snprintf(buf, size, "%c%u (axis) ", dir, axis); } char key[64]; input_translate_rk_to_str(bind->key, key, sizeof(key)); if (!strcmp(key, "nul")) *key = '\0'; char keybuf[64]; snprintf(keybuf, sizeof(keybuf), "(Key: %s)", key); strlcat(buf, keybuf, size); }
static int16_t ps3_joypad_axis(unsigned port_num, uint32_t joyaxis) { ps3_input_t *ps3 = (ps3_input_t*)driver.input_data; if (!ps3 || joyaxis == AXIS_NONE || port_num >= MAX_PADS) return 0; int val = 0; int axis = -1; bool is_neg = false; bool is_pos = false; if (AXIS_NEG_GET(joyaxis) < 4) { axis = AXIS_NEG_GET(joyaxis); is_neg = true; } else if (AXIS_POS_GET(joyaxis) < 4) { axis = AXIS_POS_GET(joyaxis); is_pos = true; } switch (axis) { case 0: val = ps3->analog_state[port_num][0][0]; break; case 1: val = ps3->analog_state[port_num][0][1]; break; case 2: val = ps3->analog_state[port_num][1][0]; break; case 3: val = ps3->analog_state[port_num][1][1]; break; } if (is_neg && val > 0) val = 0; else if (is_pos && val < 0) val = 0; return val; }
static int16_t switch_joypad_axis(unsigned port_num, uint32_t joyaxis) { int val = 0; int axis = -1; bool is_neg = false; bool is_pos = false; if(joyaxis == AXIS_NONE || port_num >= MAX_PADS) { /* TODO/FIXME - implement */ } if(AXIS_NEG_GET(joyaxis) < 4) { axis = AXIS_NEG_GET(joyaxis); is_neg = true; } else if(AXIS_POS_GET(joyaxis) < 4) { axis = AXIS_POS_GET(joyaxis); is_pos = true; } switch(axis) { case 0: val = analog_state[port_num][0][0]; break; case 1: val = analog_state[port_num][0][1]; break; case 2: val = analog_state[port_num][1][0]; break; case 3: val = analog_state[port_num][1][1]; break; } if(is_neg && val > 0) val = 0; else if(is_pos && val < 0) val = 0; return val; }
static int16_t qnx_joypad_axis(unsigned port_num, uint32_t joyaxis) { int val = 0; int axis = -1; bool is_neg = false; bool is_pos = false; driver_t *driver = driver_get_ptr(); qnx_input_t *qnx = (qnx_input_t*)driver->input_data; if (!qnx || joyaxis == AXIS_NONE || port_num >= MAX_PADS) return 0; if (AXIS_NEG_GET(joyaxis) < 4) { axis = AXIS_NEG_GET(joyaxis); is_neg = true; } else if (AXIS_POS_GET(joyaxis) < 4) { axis = AXIS_POS_GET(joyaxis); is_pos = true; } switch (axis) { case 0: val = qnx->analog_state[port_num][0][0]; break; case 1: val = qnx->analog_state[port_num][0][1]; break; case 2: val = qnx->analog_state[port_num][1][0]; break; case 3: val = qnx->analog_state[port_num][1][1]; break; } if (is_neg && val > 0) val = 0; else if (is_pos && val < 0) val = 0; return val; }
static int16_t apple_joypad_axis(unsigned port, uint32_t joyaxis) { if (joyaxis == AXIS_NONE) return 0; int16_t val = 0; if (AXIS_NEG_GET(joyaxis) < 4) { val = g_polled_input_data.pad_axis[port][AXIS_NEG_GET(joyaxis)]; val = (val < 0) ? val : 0; } else if(AXIS_POS_GET(joyaxis) < 4) { val = g_polled_input_data.pad_axis[port][AXIS_POS_GET(joyaxis)]; val = (val > 0) ? val : 0; } return val; }
static void input_config_get_bind_string_joyaxis(char *buf, const char *prefix, const struct retro_keybind *bind, size_t size) { unsigned axis = 0; char dir = '\0'; settings_t *settings = config_get_ptr(); if (AXIS_NEG_GET(bind->joyaxis) != AXIS_DIR_NONE) { dir = '-'; axis = AXIS_NEG_GET(bind->joyaxis); } else if (AXIS_POS_GET(bind->joyaxis) != AXIS_DIR_NONE) { dir = '+'; axis = AXIS_POS_GET(bind->joyaxis); } if (!string_is_empty(bind->joyaxis_label) && settings->input.input_descriptor_label_show) snprintf(buf, size, "%s%s (axis) ", prefix, bind->joyaxis_label); else snprintf(buf, size, "%s%c%u (axis) ", prefix, dir, axis); }
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 = android_app->analog_state[port][AXIS_NEG_GET(joyaxis)]; if (val > 0) val = 0; } else if (AXIS_POS_GET(joyaxis) < MAX_AXIS) { val = android_app->analog_state[port][AXIS_POS_GET(joyaxis)]; if (val < 0) val = 0; } return val; }