(Xbox 1) Working controls - hardcoded binds - will be done

properly later
This commit is contained in:
twinaphex 2012-07-14 17:47:30 +02:00
parent 3913697cd2
commit c480c6a3d1

View File

@ -27,7 +27,7 @@
#include "../input/rarch_xinput2.h" #include "../input/rarch_xinput2.h"
#include "xinput_xbox_input.h" #include "xinput_xbox_input.h"
static uint64_t state[4]; static XINPUT_STATE state[4];
HANDLE gamepads[4]; HANDLE gamepads[4];
DWORD dwDeviceMask; DWORD dwDeviceMask;
bool bInserted[4]; bool bInserted[4];
@ -75,77 +75,13 @@ static void xinput_input_poll(void *data)
if (gamepads[i]) if (gamepads[i])
{ {
XINPUT_STATE state_tmp;
unsigned long retval; unsigned long retval;
// if the controller is removed after XGetDeviceChanges but before // if the controller is removed after XGetDeviceChanges but before
// XInputOpen, the device handle will be NULL // XInputOpen, the device handle will be NULL
retval = XInputGetState(gamepads[i], &state_tmp); retval = XInputGetState(gamepads[i], &state[i]);
pads_connected += (retval != ERROR_SUCCESS) ? 0 : 1; pads_connected += (retval != ERROR_SUCCESS) ? 0 : 1;
state[i] = 0;
//GBA Button B
state[i] |= (state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_B] ? 1 : 0) << XINPUT1_GAMEPAD_B;
// Unknown button (probably not mapped in VBA)
state[i] |= (state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_A] ? 1 : 0) << XINPUT1_GAMEPAD_A;
// Up (D-Pad)
state[i] |= (state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_Y] ? 1 : 0) << XINPUT1_GAMEPAD_Y;
// Unknown button (probably not mapped in VBA)
state[i] |= (state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_X] ? 1 : 0) << XINPUT1_GAMEPAD_X;
// Unknown button (probably not mapped in VBA)
state[i] |= (state_tmp.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP) << XINPUT1_GAMEPAD_DPAD_UP;
// Unknown button (probably not mapped in VBA)
state[i] |= (state_tmp.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN) << XINPUT1_GAMEPAD_DPAD_DOWN;
// Unknown button (probably not mapped in VBA)
state[i] |= (state_tmp.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT) << XINPUT1_GAMEPAD_DPAD_LEFT;
// Unknown button (probably not mapped in VBA)
state[i] |= (state_tmp.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT) << XINPUT1_GAMEPAD_DPAD_RIGHT;
// Down
state[i] |= (state_tmp.Gamepad.wButtons & XINPUT_GAMEPAD_BACK) << XINPUT1_GAMEPAD_BACK;
// Up (D-Pad)
state[i] |= (state_tmp.Gamepad.wButtons & XINPUT_GAMEPAD_START) << XINPUT1_GAMEPAD_START;
// Analog buttons seem to all report the same thing - GBA Button A
// GBA Button A
state[i] |= (state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_WHITE] ? 1 : 0) << XINPUT1_GAMEPAD_WHITE;
// GBA Button A
state[i] |= (state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_LEFT_TRIGGER] ? 1 : 0) << XINPUT1_GAMEPAD_LEFT_TRIGGER;
// Left
state[i] |= (state_tmp.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) << XINPUT1_GAMEPAD_LEFT_THUMB;
// GBA Button A
state[i] |= (state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_BLACK] ? 1 : 0) << XINPUT1_GAMEPAD_BLACK;
// Right
state[i] |= (state_tmp.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) << XINPUT1_GAMEPAD_RIGHT_THUMB;
//state[i] |= ((state_tmp.Gamepad.sThumbLX < -DEADZONE)) << 16;
//state[i] |= ((state_tmp.Gamepad.sThumbLX > DEADZONE)) << 17;
//state[i] |= ((state_tmp.Gamepad.sThumbLY > DEADZONE)) << 18;
//state[i] |= ((state_tmp.Gamepad.sThumbLY < -DEADZONE)) << 19;
//state[i] |= ((state_tmp.Gamepad.sThumbRX < -DEADZONE)) << 20;
//state[i] |= ((state_tmp.Gamepad.sThumbRX > DEADZONE)) << 21;
//state[i] |= ((state_tmp.Gamepad.sThumbRY > DEADZONE)) << 22;
//state[i] |= ((state_tmp.Gamepad.sThumbRY < -DEADZONE)) << 23;
// GBA Button A
state[i] |= ((state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_LEFT_TRIGGER] ? 1 : 0)) << XINPUT1_GAMEPAD_LEFT_TRIGGER;
// GBA Button A
state[i] |= ((state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_RIGHT_TRIGGER] ? 1 : 0)) << XINPUT1_GAMEPAD_RIGHT_TRIGGER;
} }
} }
} }
@ -156,9 +92,65 @@ static int16_t xinput_input_state(void *data, const struct retro_keybind **binds
{ {
(void)data; (void)data;
unsigned player = port; unsigned player = port;
uint64_t button = binds[player][id].joykey; DWORD button = binds[player][id].joykey;
int16_t retval = 0;
return (state[player] & button) ? 1 : 0; //Hardcoded binds (WIP)
switch(id)
{
case RETRO_DEVICE_ID_JOYPAD_A:
retval = (state[player].Gamepad.bAnalogButtons[XINPUT_GAMEPAD_B]) ? 1 : 0;
break;
case RETRO_DEVICE_ID_JOYPAD_B:
retval = (state[player].Gamepad.bAnalogButtons[XINPUT_GAMEPAD_A]) ? 1 : 0;
break;
case RETRO_DEVICE_ID_JOYPAD_X:
retval = (state[player].Gamepad.bAnalogButtons[XINPUT_GAMEPAD_Y]) ? 1 : 0;
break;
case RETRO_DEVICE_ID_JOYPAD_Y:
retval = (state[player].Gamepad.bAnalogButtons[XINPUT_GAMEPAD_X]) ? 1 : 0;
break;
case RETRO_DEVICE_ID_JOYPAD_LEFT:
retval = (state[player].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT) ? 1 : 0;
break;
case RETRO_DEVICE_ID_JOYPAD_RIGHT:
retval = (state[player].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT) ? 1 : 0;
break;
case RETRO_DEVICE_ID_JOYPAD_UP:
retval = (state[player].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP) ? 1 : 0;
break;
case RETRO_DEVICE_ID_JOYPAD_DOWN:
retval = (state[player].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN) ? 1 : 0;
break;
case RETRO_DEVICE_ID_JOYPAD_START:
retval = (state[player].Gamepad.wButtons & XINPUT_GAMEPAD_START) ? 1 : 0;
break;
case RETRO_DEVICE_ID_JOYPAD_SELECT:
retval = (state[player].Gamepad.wButtons & XINPUT_GAMEPAD_BACK) ? 1 : 0;
break;
case RETRO_DEVICE_ID_JOYPAD_L:
retval = (state[player].Gamepad.bAnalogButtons[XINPUT_GAMEPAD_LEFT_TRIGGER]) ? 1 : 0;
break;
case RETRO_DEVICE_ID_JOYPAD_R:
retval = (state[player].Gamepad.bAnalogButtons[XINPUT_GAMEPAD_RIGHT_TRIGGER]) ? 1 : 0;
break;
case RETRO_DEVICE_ID_JOYPAD_L2:
retval = (state[player].Gamepad.bAnalogButtons[XINPUT_GAMEPAD_WHITE]) ? 1 : 0;
break;
case RETRO_DEVICE_ID_JOYPAD_R2:
retval = (state[player].Gamepad.bAnalogButtons[XINPUT_GAMEPAD_BLACK]) ? 1 : 0;
break;
case RETRO_DEVICE_ID_JOYPAD_L3:
retval = (state[player].Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) ? 1 : 0;
break;
case RETRO_DEVICE_ID_JOYPAD_R3:
retval = (state[player].Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) ? 1 : 0;
break;
default:
break;
}
return retval;
} }
static void xinput_input_free_input(void *data) static void xinput_input_free_input(void *data)
@ -176,16 +168,14 @@ static void* xinput_input_init(void)
switch(XGetDeviceEnumerationStatus()) switch(XGetDeviceEnumerationStatus())
{ {
case XDEVICE_ENUMERATION_IDLE: case XDEVICE_ENUMERATION_IDLE:
RARCH_LOG("XDEVICE_ENUMERATION_IDLE\n"); RARCH_LOG("Input state status: XDEVICE_ENUMERATION_IDLE\n");
break; break;
case XDEVICE_ENUMERATION_BUSY: case XDEVICE_ENUMERATION_BUSY:
RARCH_LOG("XDEVICE_ENUMERATION_BUSY\n"); RARCH_LOG("Input state status: XDEVICE_ENUMERATION_BUSY\n");
break; break;
} }
while(XGetDeviceEnumerationStatus() == XDEVICE_ENUMERATION_BUSY) while(XGetDeviceEnumerationStatus() == XDEVICE_ENUMERATION_BUSY) {}
{
}
return (void*)-1; return (void*)-1;
} }