From 1e52ee2f0fbae4a8a91b2c952719a519cbfcb56c Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 26 Dec 2013 22:17:31 +0100 Subject: [PATCH] (XDK) Refactor input driver - now goes through joypad driver --- ps3/ps3_input.c | 9 +- xdk/xdk_xinput_input.c | 372 ++++++++++++++++++++++++++++++++--------- 2 files changed, 295 insertions(+), 86 deletions(-) diff --git a/ps3/ps3_input.c b/ps3/ps3_input.c index be526da50d..917060ac1c 100644 --- a/ps3/ps3_input.c +++ b/ps3/ps3_input.c @@ -180,6 +180,11 @@ static void ps3_input_poll(void *data) CellPadInfo2 pad_info; ps3_input_t *ps3 = (ps3_input_t*)data; + ps3->analog_state[0][0][0] = ps3->analog_state[0][0][1] = ps3->analog_state[0][1][0] = ps3->analog_state[0][1][1] = 0; + ps3->analog_state[1][0][0] = ps3->analog_state[1][0][1] = ps3->analog_state[1][1][0] = ps3->analog_state[1][1][1] = 0; + ps3->analog_state[2][0][0] = ps3->analog_state[2][0][1] = ps3->analog_state[2][1][0] = ps3->analog_state[2][1][1] = 0; + ps3->analog_state[3][0][0] = ps3->analog_state[3][0][1] = ps3->analog_state[3][1][0] = ps3->analog_state[3][1][1] = 0; + for (unsigned port = 0; port < MAX_PADS; port++) { static CellPadData state_tmp; @@ -189,10 +194,6 @@ static void ps3_input_poll(void *data) { uint64_t *state_cur = &ps3->pad_state[port]; *state_cur = 0; - ps3->analog_state[0][0][0] = ps3->analog_state[0][0][1] = ps3->analog_state[0][1][0] = ps3->analog_state[0][1][1] = 0; - ps3->analog_state[1][0][0] = ps3->analog_state[1][0][1] = ps3->analog_state[1][1][0] = ps3->analog_state[1][1][1] = 0; - ps3->analog_state[2][0][0] = ps3->analog_state[2][0][1] = ps3->analog_state[2][1][0] = ps3->analog_state[2][1][1] = 0; - ps3->analog_state[3][0][0] = ps3->analog_state[3][0][1] = ps3->analog_state[3][1][0] = ps3->analog_state[3][1][1] = 0; #ifdef __PSL1GHT__ *state_cur |= (state_tmp.BTN_LEFT) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0; *state_cur |= (state_tmp.BTN_DOWN) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0; diff --git a/xdk/xdk_xinput_input.c b/xdk/xdk_xinput_input.c index 58556ea335..a1f6300e55 100644 --- a/xdk/xdk_xinput_input.c +++ b/xdk/xdk_xinput_input.c @@ -30,7 +30,8 @@ typedef struct xdk_input { - uint64_t state[MAX_PADS]; + uint64_t pad_state[MAX_PADS]; + int16_t analog_state[MAX_PADS][2][2]; #ifdef _XBOX1 HANDLE gamepads[MAX_PADS]; DWORD dwDeviceMask; @@ -41,29 +42,125 @@ typedef struct xdk_input const struct platform_bind platform_keys[] = { - { (1ULL << RETRO_DEVICE_ID_JOYPAD_B), "A button" }, - { (1ULL << RETRO_DEVICE_ID_JOYPAD_Y), "X button" }, - { (1ULL << RETRO_DEVICE_ID_JOYPAD_SELECT), "Back button" }, - { (1ULL << RETRO_DEVICE_ID_JOYPAD_START), "Start button" }, - { (1ULL << RETRO_DEVICE_ID_JOYPAD_UP), "D-Pad Up" }, - { (1ULL << RETRO_DEVICE_ID_JOYPAD_DOWN), "D-Pad Down" }, - { (1ULL << RETRO_DEVICE_ID_JOYPAD_LEFT), "D-Pad Left" }, - { (1ULL << RETRO_DEVICE_ID_JOYPAD_RIGHT), "D-Pad Right" }, - { (1ULL << RETRO_DEVICE_ID_JOYPAD_A), "B button" }, - { (1ULL << RETRO_DEVICE_ID_JOYPAD_X), "Y button" }, - { (1ULL << RETRO_DEVICE_ID_JOYPAD_L), "Left trigger" }, - { (1ULL << RETRO_DEVICE_ID_JOYPAD_R), "Right trigger" }, + { (RETRO_DEVICE_ID_JOYPAD_B), "A button" }, + { (RETRO_DEVICE_ID_JOYPAD_Y), "X button" }, + { (RETRO_DEVICE_ID_JOYPAD_SELECT), "Back button" }, + { (RETRO_DEVICE_ID_JOYPAD_START), "Start button" }, + { (RETRO_DEVICE_ID_JOYPAD_UP), "D-Pad Up" }, + { (RETRO_DEVICE_ID_JOYPAD_DOWN), "D-Pad Down" }, + { (RETRO_DEVICE_ID_JOYPAD_LEFT), "D-Pad Left" }, + { (RETRO_DEVICE_ID_JOYPAD_RIGHT), "D-Pad Right" }, + { (RETRO_DEVICE_ID_JOYPAD_A), "B button" }, + { (RETRO_DEVICE_ID_JOYPAD_X), "Y button" }, + { (RETRO_DEVICE_ID_JOYPAD_L), "Left trigger" }, + { (RETRO_DEVICE_ID_JOYPAD_R), "Right trigger" }, #if defined(_XBOX360) - { (1ULL << RETRO_DEVICE_ID_JOYPAD_L2), "Left shoulder" }, - { (1ULL << RETRO_DEVICE_ID_JOYPAD_R2), "Right shoulder" }, + { (RETRO_DEVICE_ID_JOYPAD_L2), "Left shoulder" }, + { (RETRO_DEVICE_ID_JOYPAD_R2), "Right shoulder" }, #elif defined(_XBOX1) - { (1ULL << RETRO_DEVICE_ID_JOYPAD_L2), "Black button" }, - { (1ULL << RETRO_DEVICE_ID_JOYPAD_R2), "White button" }, + { (RETRO_DEVICE_ID_JOYPAD_L2), "Black button" }, + { (RETRO_DEVICE_ID_JOYPAD_R2), "White button" }, #endif - { (1ULL << RETRO_DEVICE_ID_JOYPAD_L3), "Left thumb" }, - { (1ULL << RETRO_DEVICE_ID_JOYPAD_R3), "Right thumb" }, + { (RETRO_DEVICE_ID_JOYPAD_L3), "Left thumb" }, + { (RETRO_DEVICE_ID_JOYPAD_R3), "Right thumb" }, }; +extern const rarch_joypad_driver_t xdk_joypad; + +static void xdk_input_set_keybinds(void *data, unsigned device, + unsigned port, unsigned id, unsigned keybind_action) +{ + uint64_t *key = &g_settings.input.binds[port][id].joykey; + uint64_t joykey = *key; + size_t arr_size = sizeof(platform_keys) / sizeof(platform_keys[0]); + + (void)device; + + if (keybind_action & (1ULL << KEYBINDS_ACTION_SET_DEFAULT_BIND)) + *key = g_settings.input.binds[port][id].def_joykey; + + if (keybind_action & (1ULL << KEYBINDS_ACTION_SET_DEFAULT_BINDS)) + { + strlcpy(g_settings.input.device_names[port], "Xbox", sizeof(g_settings.input.device_names[port])); + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_B].def_joykey = (RETRO_DEVICE_ID_JOYPAD_B); + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_Y].def_joykey = (RETRO_DEVICE_ID_JOYPAD_Y); + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_SELECT].def_joykey = (RETRO_DEVICE_ID_JOYPAD_SELECT); + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_START].def_joykey = (RETRO_DEVICE_ID_JOYPAD_START); + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_UP].def_joykey = (RETRO_DEVICE_ID_JOYPAD_UP); + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_DOWN].def_joykey = (RETRO_DEVICE_ID_JOYPAD_DOWN); + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_LEFT].def_joykey = (RETRO_DEVICE_ID_JOYPAD_LEFT); + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_RIGHT].def_joykey = (RETRO_DEVICE_ID_JOYPAD_RIGHT); + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_A].def_joykey = (RETRO_DEVICE_ID_JOYPAD_A); + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_X].def_joykey = (RETRO_DEVICE_ID_JOYPAD_X); + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_L].def_joykey = (RETRO_DEVICE_ID_JOYPAD_L); + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_R].def_joykey = (RETRO_DEVICE_ID_JOYPAD_R); + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_L2].def_joykey = (RETRO_DEVICE_ID_JOYPAD_L2); + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_R2].def_joykey = (RETRO_DEVICE_ID_JOYPAD_R2); + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_L3].def_joykey = (RETRO_DEVICE_ID_JOYPAD_L3); + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_R3].def_joykey = (RETRO_DEVICE_ID_JOYPAD_R3); + g_settings.input.binds[port][RARCH_ANALOG_LEFT_X_PLUS].def_joykey = NO_BTN; + g_settings.input.binds[port][RARCH_ANALOG_LEFT_X_MINUS].def_joykey = NO_BTN; + g_settings.input.binds[port][RARCH_ANALOG_LEFT_Y_PLUS].def_joykey = NO_BTN; + g_settings.input.binds[port][RARCH_ANALOG_LEFT_Y_MINUS].def_joykey = NO_BTN; + g_settings.input.binds[port][RARCH_ANALOG_RIGHT_X_PLUS].def_joykey = NO_BTN; + g_settings.input.binds[port][RARCH_ANALOG_RIGHT_X_MINUS].def_joykey = NO_BTN; + g_settings.input.binds[port][RARCH_ANALOG_RIGHT_Y_PLUS].def_joykey = NO_BTN; + g_settings.input.binds[port][RARCH_ANALOG_RIGHT_Y_MINUS].def_joykey = NO_BTN; + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_B].def_joyaxis = AXIS_NONE; + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_Y].def_joyaxis = AXIS_NONE; + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_SELECT].def_joyaxis = AXIS_NONE; + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_START].def_joyaxis = AXIS_NONE; + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_UP].def_joyaxis = AXIS_NONE; + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_DOWN].def_joyaxis = AXIS_NONE; + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_LEFT].def_joyaxis = AXIS_NONE; + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_RIGHT].def_joyaxis = AXIS_NONE; + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_A].def_joyaxis = AXIS_NONE; + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_X].def_joyaxis = AXIS_NONE; + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_L].def_joyaxis = AXIS_NONE; + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_R].def_joyaxis = AXIS_NONE; + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_L2].def_joyaxis = AXIS_NONE; + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_R2].def_joyaxis = AXIS_NONE; + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_L3].def_joyaxis = AXIS_NONE; + g_settings.input.binds[port][RETRO_DEVICE_ID_JOYPAD_R3].def_joyaxis = AXIS_NONE; + g_settings.input.binds[port][RARCH_ANALOG_LEFT_X_PLUS].def_joyaxis = AXIS_POS(0); + g_settings.input.binds[port][RARCH_ANALOG_LEFT_X_MINUS].def_joyaxis = AXIS_NEG(0); + g_settings.input.binds[port][RARCH_ANALOG_LEFT_Y_PLUS].def_joyaxis = AXIS_POS(1); + g_settings.input.binds[port][RARCH_ANALOG_LEFT_Y_MINUS].def_joyaxis = AXIS_NEG(1); + g_settings.input.binds[port][RARCH_ANALOG_RIGHT_X_PLUS].def_joyaxis = AXIS_POS(2); + g_settings.input.binds[port][RARCH_ANALOG_RIGHT_X_MINUS].def_joyaxis = AXIS_NEG(2); + g_settings.input.binds[port][RARCH_ANALOG_RIGHT_Y_PLUS].def_joyaxis = AXIS_POS(3); + g_settings.input.binds[port][RARCH_ANALOG_RIGHT_Y_MINUS].def_joyaxis = AXIS_NEG(3); + + for (int i = 0; i < RARCH_CUSTOM_BIND_LIST_END; i++) + { + g_settings.input.binds[port][i].id = i; + g_settings.input.binds[port][i].joykey = g_settings.input.binds[port][i].def_joykey; + g_settings.input.binds[port][i].joyaxis = g_settings.input.binds[port][i].def_joyaxis; + } + + } + + if (keybind_action & (1ULL << KEYBINDS_ACTION_GET_BIND_LABEL)) + { + struct platform_bind *ret = (struct platform_bind*)data; + + if (ret->joykey == NO_BTN) + strlcpy(ret->desc, "No button", sizeof(ret->desc)); + else + { + for (size_t i = 0; i < arr_size; i++) + { + if (platform_keys[i].joykey == ret->joykey) + { + strlcpy(ret->desc, platform_keys[i].desc, sizeof(ret->desc)); + return; + } + } + strlcpy(ret->desc, "Unknown", sizeof(ret->desc)); + } + } +} + static void xdk_input_poll(void *data) { xdk_input_t *xdk = (xdk_input_t*)data; @@ -72,40 +169,44 @@ static void xdk_input_poll(void *data) unsigned int dwInsertions, dwRemovals; XGetDeviceChanges(XDEVICE_TYPE_GAMEPAD, reinterpret_cast(&dwInsertions), reinterpret_cast(&dwRemovals)); #endif + xdk->analog_state[0][0][0] = xdk->analog_state[0][0][1] = xdk->analog_state[0][1][0] = xdk->analog_state[0][1][1] = 0; + xdk->analog_state[1][0][0] = xdk->analog_state[1][0][1] = xdk->analog_state[1][1][0] = xdk->analog_state[1][1][1] = 0; + xdk->analog_state[2][0][0] = xdk->analog_state[2][0][1] = xdk->analog_state[2][1][0] = xdk->analog_state[2][1][1] = 0; + xdk->analog_state[3][0][0] = xdk->analog_state[3][0][1] = xdk->analog_state[3][1][0] = xdk->analog_state[3][1][1] = 0; - for (unsigned i = 0; i < MAX_PADS; i++) + for (unsigned port = 0; port < MAX_PADS; port++) { #ifdef _XBOX1 XINPUT_CAPABILITIES caps[MAX_PADS]; (void)caps; // handle removed devices - xdk->bRemoved[i] = (dwRemovals & (1<bRemoved[port] = (dwRemovals & (1 << port)) ? true : false; - if(xdk->bRemoved[i]) + if(xdk->bRemoved[port]) { // if the controller was removed after XGetDeviceChanges but before // XInputOpen, the device handle will be NULL - if(xdk->gamepads[i]) - XInputClose(xdk->gamepads[i]); + if(xdk->gamepads[port]) + XInputClose(xdk->gamepads[port]); - xdk->gamepads[i] = NULL; - xdk->state[i] = 0; + xdk->gamepads[port] = 0; + xdk->pad_state[port] = 0; } // handle inserted devices - xdk->bInserted[i] = (dwInsertions & (1<bInserted[port] = (dwInsertions & (1 << port)) ? true : false; - if(xdk->bInserted[i]) + if(xdk->bInserted[port]) { XINPUT_POLLING_PARAMETERS m_pollingParameters; m_pollingParameters.fAutoPoll = FALSE; m_pollingParameters.fInterruptOut = TRUE; m_pollingParameters.bInputInterval = 8; m_pollingParameters.bOutputInterval = 8; - xdk->gamepads[i] = XInputOpen(XDEVICE_TYPE_GAMEPAD, i, XDEVICE_NO_SLOT, NULL); + xdk->gamepads[port] = XInputOpen(XDEVICE_TYPE_GAMEPAD, port, XDEVICE_NO_SLOT, NULL); } - if (!xdk->gamepads[i]) + if (!xdk->gamepads[port]) continue; // if the controller is removed after XGetDeviceChanges but before @@ -115,17 +216,17 @@ static void xdk_input_poll(void *data) XINPUT_STATE state_tmp; #if defined(_XBOX1) - if (XInputPoll(xdk->gamepads[i]) != ERROR_SUCCESS) + if (XInputPoll(xdk->gamepads[port]) != ERROR_SUCCESS) continue; - if (XInputGetState(xdk->gamepads[i], &state_tmp) != ERROR_SUCCESS) + if (XInputGetState(xdk->gamepads[port], &state_tmp) != ERROR_SUCCESS) continue; #elif defined(_XBOX360) - if (XInputGetState(i, &state_tmp) == ERROR_DEVICE_NOT_CONNECTED) + if (XInputGetState(port, &state_tmp) == ERROR_DEVICE_NOT_CONNECTED) continue; #endif - uint64_t *state_cur = &xdk->state[i]; + uint64_t *state_cur = &xdk->pad_state[port]; *state_cur = 0; *state_cur |= ((state_tmp.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0); @@ -156,9 +257,15 @@ static void xdk_input_poll(void *data) #endif *state_cur |= ((state_tmp.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_L3) : 0); *state_cur |= ((state_tmp.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_R3) : 0); + + if (g_settings.input.autodetect_enable) + { + if (strcmp(g_settings.input.device_names[port], "Xbox") != 0) + xdk_input_set_keybinds(NULL, DEVICE_XBOX_PAD, port, 0, (1ULL << KEYBINDS_ACTION_SET_DEFAULT_BINDS)); + } } - uint64_t *state_p1 = &xdk->state[0]; + uint64_t *state_p1 = &xdk->pad_state[0]; uint64_t *lifecycle_state = &g_extern.lifecycle_state; *lifecycle_state &= ~((1ULL << RARCH_MENU_TOGGLE)); @@ -167,15 +274,68 @@ static void xdk_input_poll(void *data) *lifecycle_state |= (1ULL << RARCH_MENU_TOGGLE); } +static bool xdk_menu_input_state(uint64_t joykey, uint64_t state) +{ + switch (joykey) + { + case CONSOLE_MENU_A: + return state & (1ULL << RETRO_DEVICE_ID_JOYPAD_A); + case CONSOLE_MENU_B: + return state & (1ULL << RETRO_DEVICE_ID_JOYPAD_B); + case CONSOLE_MENU_X: + return state & (1ULL << RETRO_DEVICE_ID_JOYPAD_X); + case CONSOLE_MENU_Y: + return state & (1ULL << RETRO_DEVICE_ID_JOYPAD_Y); + case CONSOLE_MENU_START: + return state & (1ULL << RETRO_DEVICE_ID_JOYPAD_START); + case CONSOLE_MENU_SELECT: + return state & (1ULL << RETRO_DEVICE_ID_JOYPAD_SELECT); + case CONSOLE_MENU_UP: + return state & (1ULL << RETRO_DEVICE_ID_JOYPAD_UP); + case CONSOLE_MENU_DOWN: + return state & (1ULL << RETRO_DEVICE_ID_JOYPAD_DOWN); + case CONSOLE_MENU_LEFT: + return state & (1ULL << RETRO_DEVICE_ID_JOYPAD_LEFT); + case CONSOLE_MENU_RIGHT: + return state & (1ULL << RETRO_DEVICE_ID_JOYPAD_RIGHT); + case CONSOLE_MENU_L: + return state & (1ULL << RETRO_DEVICE_ID_JOYPAD_L); + case CONSOLE_MENU_R: + return state & (1ULL << RETRO_DEVICE_ID_JOYPAD_R); + case CONSOLE_MENU_HOME: + return (state & (1ULL << RETRO_DEVICE_ID_JOYPAD_L3)) && (state & (1ULL << RETRO_DEVICE_ID_JOYPAD_R3)); + case CONSOLE_MENU_L2: + return state & (1ULL << RETRO_DEVICE_ID_JOYPAD_L2); + case CONSOLE_MENU_R2: + return state & (1ULL << RETRO_DEVICE_ID_JOYPAD_R2); + case CONSOLE_MENU_L3: + return state & (1ULL << RETRO_DEVICE_ID_JOYPAD_L3); + case CONSOLE_MENU_R3: + return state & (1ULL << RETRO_DEVICE_ID_JOYPAD_R3); + default: + return false; + } +} + static int16_t xdk_input_state(void *data, const struct retro_keybind **binds, unsigned port, unsigned device, unsigned index, unsigned id) { xdk_input_t *xdk = (xdk_input_t*)data; - unsigned player = port; - uint64_t button = binds[player][id].joykey; - return (xdk->state[player] & button) ? 1 : 0; + if (port >= MAX_PADS) + return 0; + + switch (device) + { + case RETRO_DEVICE_JOYPAD: + if (binds[port][id].joykey >= CONSOLE_MENU_FIRST && binds[port][id].joykey <= CONSOLE_MENU_LAST) + return xdk_menu_input_state(binds[port][id].joykey, xdk->pad_state[port]) ? 1 : 0; + else + return input_joypad_pressed(&xdk_joypad, port, binds[port], id); + default: + return 0; + } } static void xdk_input_free_input(void *data) @@ -183,49 +343,6 @@ static void xdk_input_free_input(void *data) (void)data; } -static void xdk_input_set_keybinds(void *data, unsigned device, - unsigned port, unsigned id, unsigned keybind_action) -{ - uint64_t *key = &g_settings.input.binds[port][id].joykey; - uint64_t joykey = *key; - size_t arr_size = sizeof(platform_keys) / sizeof(platform_keys[0]); - - (void)device; - - if (keybind_action & (1ULL << KEYBINDS_ACTION_SET_DEFAULT_BIND)) - *key = g_settings.input.binds[port][id].def_joykey; - - if (keybind_action & (1ULL << KEYBINDS_ACTION_SET_DEFAULT_BINDS)) - { - for (int i = 0; i < RARCH_CUSTOM_BIND_LIST_END; i++) - { - g_settings.input.binds[port][i].id = i; - g_settings.input.binds[port][i].def_joykey = platform_keys[i].joykey; - g_settings.input.binds[port][i].joykey = g_settings.input.binds[port][i].def_joykey; - } - } - - if (keybind_action & (1ULL << KEYBINDS_ACTION_GET_BIND_LABEL)) - { - struct platform_bind *ret = (struct platform_bind*)data; - - if (ret->joykey == NO_BTN) - strlcpy(ret->desc, "No button", sizeof(ret->desc)); - else - { - for (size_t i = 0; i < arr_size; i++) - { - if (platform_keys[i].joykey == ret->joykey) - { - strlcpy(ret->desc, platform_keys[i].desc, sizeof(ret->desc)); - return; - } - } - strlcpy(ret->desc, "Unknown", sizeof(ret->desc)); - } - } -} - static void *xdk_input_init(void) { xdk_input_t *xdk = (xdk_input_t*)calloc(1, sizeof(*xdk)); @@ -299,6 +416,11 @@ static bool xdk_input_set_rumble(void *data, unsigned port, enum retro_rumble_ef return val; } +static const rarch_joypad_driver_t *xdk_input_get_joypad_driver(void *data) +{ + return &xdk_joypad; +} + const input_driver_t input_xinput = { xdk_input_init, @@ -313,5 +435,91 @@ const input_driver_t input_xinput = NULL, xdk_input_set_rumble, - NULL, + xdk_input_get_joypad_driver, }; + +static bool xdk_joypad_init(void) +{ + return true; +} + +static bool xdk_joypad_button(unsigned port_num, uint16_t joykey) +{ + xdk_input_t *xdk = (xdk_input_t*)driver.input_data; + + if (port_num >= MAX_PADS) + return false; + + return xdk->pad_state[port_num] & (1ULL << joykey); +} + +static int16_t xdk_joypad_axis(unsigned port_num, uint32_t joyaxis) +{ + xdk_input_t *xdk = (xdk_input_t*)driver.input_data; + if (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 = xdk->analog_state[port_num][0][0]; break; + case 1: val = xdk->analog_state[port_num][0][1]; break; + case 2: val = xdk->analog_state[port_num][1][0]; break; + case 3: val = xdk->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 void xdk_joypad_poll(void) +{ +} + +static bool xdk_joypad_query_pad(unsigned pad) +{ + xdk_input_t *xdk = (xdk_input_t*)driver.input_data; + return pad < MAX_PLAYERS && xdk->pad_state[pad]; +} + +static const char *xdk_joypad_name(unsigned pad) +{ + return NULL; +} + +static void xdk_joypad_destroy(void) +{ +} + +const rarch_joypad_driver_t xdk_joypad = { + xdk_joypad_init, + xdk_joypad_query_pad, + xdk_joypad_destroy, + xdk_joypad_button, + xdk_joypad_axis, + xdk_joypad_poll, + NULL, + xdk_joypad_name, + "xdk", +}; \ No newline at end of file