int XinputDevice::UpdateState(InputState &input_state) { if (!s_pXInputDLL) return 0; if (this->check_delay-- > 0) return -1; XINPUT_STATE state; ZeroMemory( &state, sizeof(XINPUT_STATE) ); DWORD dwResult; if (this->gamepad_idx >= 0) { dwResult = PPSSPP_XInputGetState( this->gamepad_idx, &state ); } else { // use the first gamepad that responds for (int i = 0; i < XUSER_MAX_COUNT; i++) { dwResult = PPSSPP_XInputGetState( i, &state ); if (dwResult == ERROR_SUCCESS) { this->gamepad_idx = i; break; } } } if ( dwResult == ERROR_SUCCESS ) { static bool notified = false; if (!notified) { notified = true; KeyMap::NotifyPadConnected("Xbox 360 Pad"); } ApplyButtons(state, input_state); const float STICK_DEADZONE = g_Config.fXInputAnalogDeadzone; const int STICK_INV_MODE = g_Config.iXInputAnalogInverseMode; const float STICK_INV_DEADZONE = g_Config.fXInputAnalogInverseDeadzone; const float STICK_SENSITIVITY = g_Config.fXInputAnalogSensitivity; if (NormalizedDeadzoneDiffers(prevState.Gamepad.sThumbLX, prevState.Gamepad.sThumbLY, state.Gamepad.sThumbLX, state.Gamepad.sThumbLY, STICK_DEADZONE)) { Stick left = NormalizedDeadzoneFilter(state.Gamepad.sThumbLX, state.Gamepad.sThumbLY, STICK_DEADZONE, STICK_INV_MODE, STICK_INV_DEADZONE, STICK_SENSITIVITY); AxisInput axis; axis.deviceId = DEVICE_ID_X360_0; axis.axisId = JOYSTICK_AXIS_X; axis.value = left.x; if (prevState.Gamepad.sThumbLX != state.Gamepad.sThumbLX) { NativeAxis(axis); } axis.axisId = JOYSTICK_AXIS_Y; axis.value = left.y; if (prevState.Gamepad.sThumbLY != state.Gamepad.sThumbLY) { NativeAxis(axis); } } if (NormalizedDeadzoneDiffers(prevState.Gamepad.sThumbRX, prevState.Gamepad.sThumbRY, state.Gamepad.sThumbRX, state.Gamepad.sThumbRY, STICK_DEADZONE)) { Stick right = NormalizedDeadzoneFilter(state.Gamepad.sThumbRX, state.Gamepad.sThumbRY, STICK_DEADZONE, STICK_INV_MODE, STICK_INV_DEADZONE, STICK_SENSITIVITY); AxisInput axis; axis.deviceId = DEVICE_ID_X360_0; axis.axisId = JOYSTICK_AXIS_Z; axis.value = right.x; if (prevState.Gamepad.sThumbRX != state.Gamepad.sThumbRX) { NativeAxis(axis); } axis.axisId = JOYSTICK_AXIS_RZ; axis.value = right.y; if (prevState.Gamepad.sThumbRY != state.Gamepad.sThumbRY) { NativeAxis(axis); } } if (NormalizedDeadzoneDiffers(prevState.Gamepad.bLeftTrigger, state.Gamepad.bLeftTrigger, XINPUT_GAMEPAD_TRIGGER_THRESHOLD)) { AxisInput axis; axis.deviceId = DEVICE_ID_X360_0; axis.axisId = JOYSTICK_AXIS_LTRIGGER; axis.value = (float)state.Gamepad.bLeftTrigger / 255.0f; NativeAxis(axis); } if (NormalizedDeadzoneDiffers(prevState.Gamepad.bRightTrigger, state.Gamepad.bRightTrigger, XINPUT_GAMEPAD_TRIGGER_THRESHOLD)) { AxisInput axis; axis.deviceId = DEVICE_ID_X360_0; axis.axisId = JOYSTICK_AXIS_RTRIGGER; axis.value = (float)state.Gamepad.bRightTrigger / 255.0f; NativeAxis(axis); } this->prevState = state; this->check_delay = 0; // If there's an XInput pad, skip following pads. This prevents DInput and XInput // from colliding. return UPDATESTATE_SKIP_PAD; } else { // wait check_delay frames before polling the controller again this->gamepad_idx = -1; this->check_delay = 100; return -1; } }
void XinputDevice::UpdatePad(int pad, const XINPUT_STATE &state, InputState &input_state) { static bool notified = false; if (!notified) { notified = true; KeyMap::NotifyPadConnected("Xbox 360 Pad"); } ApplyButtons(pad, state, input_state); const float STICK_DEADZONE = g_Config.fXInputAnalogDeadzone; const int STICK_INV_MODE = g_Config.iXInputAnalogInverseMode; const float STICK_INV_DEADZONE = g_Config.fXInputAnalogInverseDeadzone; const float STICK_SENSITIVITY = g_Config.fXInputAnalogSensitivity; if (NormalizedDeadzoneDiffers(prevState[pad].Gamepad.sThumbLX, prevState[pad].Gamepad.sThumbLY, state.Gamepad.sThumbLX, state.Gamepad.sThumbLY, STICK_DEADZONE)) { Stick left = NormalizedDeadzoneFilter(state.Gamepad.sThumbLX, state.Gamepad.sThumbLY, STICK_DEADZONE, STICK_INV_MODE, STICK_INV_DEADZONE, STICK_SENSITIVITY); AxisInput axis; axis.deviceId = DEVICE_ID_X360_0 + pad; axis.axisId = JOYSTICK_AXIS_X; axis.value = left.x; if (prevState[pad].Gamepad.sThumbLX != state.Gamepad.sThumbLX) { NativeAxis(axis); } axis.axisId = JOYSTICK_AXIS_Y; axis.value = left.y; if (prevState[pad].Gamepad.sThumbLY != state.Gamepad.sThumbLY) { NativeAxis(axis); } } if (NormalizedDeadzoneDiffers(prevState[pad].Gamepad.sThumbRX, prevState[pad].Gamepad.sThumbRY, state.Gamepad.sThumbRX, state.Gamepad.sThumbRY, STICK_DEADZONE)) { Stick right = NormalizedDeadzoneFilter(state.Gamepad.sThumbRX, state.Gamepad.sThumbRY, STICK_DEADZONE, STICK_INV_MODE, STICK_INV_DEADZONE, STICK_SENSITIVITY); AxisInput axis; axis.deviceId = DEVICE_ID_X360_0 + pad; axis.axisId = JOYSTICK_AXIS_Z; axis.value = right.x; if (prevState[pad].Gamepad.sThumbRX != state.Gamepad.sThumbRX) { NativeAxis(axis); } axis.axisId = JOYSTICK_AXIS_RZ; axis.value = right.y; if (prevState[pad].Gamepad.sThumbRY != state.Gamepad.sThumbRY) { NativeAxis(axis); } } if (NormalizedDeadzoneDiffers(prevState[pad].Gamepad.bLeftTrigger, state.Gamepad.bLeftTrigger, XINPUT_GAMEPAD_TRIGGER_THRESHOLD)) { AxisInput axis; axis.deviceId = DEVICE_ID_X360_0 + pad; axis.axisId = JOYSTICK_AXIS_LTRIGGER; axis.value = (float)state.Gamepad.bLeftTrigger / 255.0f; NativeAxis(axis); } if (NormalizedDeadzoneDiffers(prevState[pad].Gamepad.bRightTrigger, state.Gamepad.bRightTrigger, XINPUT_GAMEPAD_TRIGGER_THRESHOLD)) { AxisInput axis; axis.deviceId = DEVICE_ID_X360_0 + pad; axis.axisId = JOYSTICK_AXIS_RTRIGGER; axis.value = (float)state.Gamepad.bRightTrigger / 255.0f; NativeAxis(axis); } this->prevState[pad] = state; this->check_delay[pad] = 0; }