示例#1
0
   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);
            }
         }
      }
   }
示例#2
0
bool Kernel::sendTrigger(int32 triggerNum) {
	return handleTrigger(createTrigger(triggerNum));
}