int DinputDevice::UpdateState(InputState &input_state) { if (!pJoystick) return -1; DIJOYSTATE2 js; if (FAILED(pJoystick->Poll())) { if(pJoystick->Acquire() == DIERR_INPUTLOST) return -1; } if(FAILED(pJoystick->GetDeviceState(sizeof(DIJOYSTATE2), &js))) return -1; ApplyButtons(js, input_state); if (analog) { AxisInput axis; axis.deviceId = DEVICE_ID_PAD_0; SendNativeAxis(DEVICE_ID_PAD_0, js.lX, last_lX_, JOYSTICK_AXIS_X); SendNativeAxis(DEVICE_ID_PAD_0, js.lY, last_lY_, JOYSTICK_AXIS_Y); SendNativeAxis(DEVICE_ID_PAD_0, js.lZ, last_lZ_, JOYSTICK_AXIS_Z); SendNativeAxis(DEVICE_ID_PAD_0, js.lRx, last_lRx_, JOYSTICK_AXIS_RX); SendNativeAxis(DEVICE_ID_PAD_0, js.lRy, last_lRy_, JOYSTICK_AXIS_RY); SendNativeAxis(DEVICE_ID_PAD_0, js.lRz, last_lRz_, JOYSTICK_AXIS_RZ); } return UPDATESTATE_SKIP_PAD; }
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 ) { ApplyButtons(state, input_state); if (prevState.Gamepad.sThumbLX != state.Gamepad.sThumbLX || prevState.Gamepad.sThumbLY != state.Gamepad.sThumbLY) { Stick left = NormalizedDeadzoneFilter(state.Gamepad.sThumbLX, state.Gamepad.sThumbLY); AxisInput axis; axis.deviceId = DEVICE_ID_X360_0; axis.axisId = JOYSTICK_AXIS_X; axis.value = left.x; NativeAxis(axis); axis.axisId = JOYSTICK_AXIS_Y; axis.value = left.y; NativeAxis(axis); } if (prevState.Gamepad.sThumbRX != state.Gamepad.sThumbRX || prevState.Gamepad.sThumbRY != state.Gamepad.sThumbRY) { Stick right = NormalizedDeadzoneFilter(state.Gamepad.sThumbRX, state.Gamepad.sThumbRY); AxisInput axis; axis.deviceId = DEVICE_ID_X360_0; axis.axisId = JOYSTICK_AXIS_Z; axis.value = right.x; NativeAxis(axis); axis.axisId = JOYSTICK_AXIS_RZ; axis.value = right.y; NativeAxis(axis); } if (prevState.Gamepad.bLeftTrigger != state.Gamepad.bLeftTrigger) { AxisInput axis; axis.deviceId = DEVICE_ID_X360_0; axis.axisId = JOYSTICK_AXIS_LTRIGGER; axis.value = (float)state.Gamepad.bLeftTrigger / 255.0f; NativeAxis(axis); } if (prevState.Gamepad.bRightTrigger != state.Gamepad.bRightTrigger) { 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; } }
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; }