void GamepadHandler::handle(CommunicationBuffer* buffer) { u64 currentTime = Clock::getRealTimeMicros(); for( u8 i = 0; i < MAX_GAMEPADS; ++i ) { if( m_gamepadConnected[i] || (currentTime >= m_gamepadLastUpdateTime[i] + m_unconnectedReadDelay) ) { XINPUT_STATE& state = m_gamepadState[i]; XINPUT_STATE oldState = state; auto result = XInputGetState(i, &state); m_gamepadLastUpdateTime[i] = currentTime; m_gamepadConnected[i] = handleConnection(buffer, i, result, m_gamepadConnected[i]); if( m_gamepadConnected[i] && state.dwPacketNumber != oldState.dwPacketNumber ) { handleButton(buffer, i, oldState, state, XINPUT_GAMEPAD_DPAD_UP, Gamepad::DPadUp); handleButton(buffer, i, oldState, state, XINPUT_GAMEPAD_DPAD_DOWN, Gamepad::DPadDown); handleButton(buffer, i, oldState, state, XINPUT_GAMEPAD_DPAD_LEFT, Gamepad::DPadLeft); handleButton(buffer, i, oldState, state, XINPUT_GAMEPAD_DPAD_RIGHT, Gamepad::DPadRight); handleButton(buffer, i, oldState, state, XINPUT_GAMEPAD_START, Gamepad::Start); handleButton(buffer, i, oldState, state, XINPUT_GAMEPAD_BACK, Gamepad::Back); handleButton(buffer, i, oldState, state, XINPUT_GAMEPAD_LEFT_THUMB, Gamepad::LeftThumb); handleButton(buffer, i, oldState, state, XINPUT_GAMEPAD_RIGHT_THUMB, Gamepad::RightThumb); handleButton(buffer, i, oldState, state, XINPUT_GAMEPAD_LEFT_SHOULDER, Gamepad::LeftShoulder); handleButton(buffer, i, oldState, state, XINPUT_GAMEPAD_RIGHT_SHOULDER, Gamepad::RightShoulder); handleButton(buffer, i, oldState, state, XINPUT_GAMEPAD_A, Gamepad::BottomButton); handleButton(buffer, i, oldState, state, XINPUT_GAMEPAD_B, Gamepad::RightButton); handleButton(buffer, i, oldState, state, XINPUT_GAMEPAD_X, Gamepad::LeftButton); handleButton(buffer, i, oldState, state, XINPUT_GAMEPAD_Y, Gamepad::TopButton); /*** TRIGGERS ***/ handleTrigger(buffer, i, oldState.Gamepad.bLeftTrigger, state.Gamepad.bLeftTrigger, XINPUT_GAMEPAD_TRIGGER_THRESHOLD, 0xff, Gamepad::LeftTrigger); handleTrigger(buffer, i, oldState.Gamepad.bRightTrigger, state.Gamepad.bRightTrigger, XINPUT_GAMEPAD_TRIGGER_THRESHOLD, 0xff, Gamepad::RightTrigger); /*** THUMB STICKS ***/ handleStick(buffer, i, {oldState.Gamepad.sThumbLX, oldState.Gamepad.sThumbLY}, {state.Gamepad.sThumbLX, state.Gamepad.sThumbLY}, XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, 0x7fff, Gamepad::LeftStick); handleStick(buffer, i, {oldState.Gamepad.sThumbRX, oldState.Gamepad.sThumbRY}, {state.Gamepad.sThumbRX, state.Gamepad.sThumbRY}, XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE, 0x7fff, Gamepad::RightStick); } } } }
bool Kernel::sendTrigger(int32 triggerNum) { return handleTrigger(createTrigger(triggerNum)); }