diff options
Diffstat (limited to 'Samples/CommonSrc/Platform/Win32_Gamepad.cpp')
-rw-r--r-- | Samples/CommonSrc/Platform/Win32_Gamepad.cpp | 68 |
1 files changed, 46 insertions, 22 deletions
diff --git a/Samples/CommonSrc/Platform/Win32_Gamepad.cpp b/Samples/CommonSrc/Platform/Win32_Gamepad.cpp index 5186773..d10c4b1 100644 --- a/Samples/CommonSrc/Platform/Win32_Gamepad.cpp +++ b/Samples/CommonSrc/Platform/Win32_Gamepad.cpp @@ -5,7 +5,7 @@ Content : Win32 implementation of Platform app infrastructure Created : May 6, 2013 Authors : Lee Cooper -Copyright : Copyright 2012 Oculus VR, Inc. All Rights reserved. +Copyright : Copyright 2012 Oculus VR, LLC All Rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -23,9 +23,17 @@ limitations under the License. #include "Win32_Gamepad.h" + +OVR_DISABLE_MSVC_WARNING(28159) // C28159: GetTickCount: consider using another function instead. + + namespace OVR { namespace OvrPlatform { namespace Win32 { -GamepadManager::GamepadManager() +GamepadManager::GamepadManager() : + //hXInputModule(NULL), + pXInputGetState(NULL), + LastPadPacketNo(0xffffffff), + NextTryTime(0) { hXInputModule = ::LoadLibraryA("Xinput9_1_0.dll"); if (hXInputModule) @@ -73,29 +81,45 @@ bool GamepadManager::GetGamepadState(uint32_t index, GamepadState* pState) if (pXInputGetState) { - XINPUT_STATE xis; - - if (pXInputGetState(0, &xis)) - return false; - - if (xis.dwPacketNumber == LastPadPacketNo) - return false; - - // State changed. - pState->Buttons = xis.Gamepad.wButtons; // Currently matches Xinput - pState->LT = GamepadTrigger(xis.Gamepad.bLeftTrigger); - pState->RT = GamepadTrigger(xis.Gamepad.bRightTrigger); - pState->LX = GamepadStick(xis.Gamepad.sThumbLX); - pState->LY = GamepadStick(xis.Gamepad.sThumbLY); - pState->RX = GamepadStick(xis.Gamepad.sThumbRX); - pState->RY = GamepadStick(xis.Gamepad.sThumbRY); - - LastPadPacketNo = xis.dwPacketNumber; - - return true; + if((NextTryTime == 0) || (GetTickCount() >= NextTryTime)) // If the device is known to be present or if it's time to try testing for it again... + { + XINPUT_STATE xis; + DWORD dwResult = pXInputGetState(0, &xis); // This function is expensive, including if there is no connected device. + + if(dwResult == ERROR_SUCCESS) + { + if (xis.dwPacketNumber != LastPadPacketNo) + { + // State changed. + pState->Buttons = xis.Gamepad.wButtons; // Currently matches Xinput + pState->LT = GamepadTrigger(xis.Gamepad.bLeftTrigger); + pState->RT = GamepadTrigger(xis.Gamepad.bRightTrigger); + pState->LX = GamepadStick(xis.Gamepad.sThumbLX); + pState->LY = GamepadStick(xis.Gamepad.sThumbLY); + pState->RX = GamepadStick(xis.Gamepad.sThumbRX); + pState->RY = GamepadStick(xis.Gamepad.sThumbRY); + + LastPadPacketNo = xis.dwPacketNumber; + NextTryTime = 0; + + return true; + } + } + else if(dwResult == ERROR_DEVICE_NOT_CONNECTED) + { + // Don't bother wasting time on XInputGetState if one isn't connected, as it's very slow when one isn't connected. + // GetTickCount64 is available with Windows Vista+ and doesn't wrap around. + // GetTickCount wraps around every 49.7 days since the system started, but we don't need absolute time and it's OK + // if we have a false positive which would occur if NextTryTime is set to a value that has wrapped around to zero. + NextTryTime = GetTickCount() + 5000; + } + } } return false; } }}} // OVR::OvrPlatform::Win32 + +OVR_RESTORE_MSVC_WARNING() + |