nuclear@1: /************************************************************************************ nuclear@1: nuclear@1: Filename : OVR_LatencyTestImpl.h nuclear@1: Content : Latency Tester specific implementation. nuclear@1: Created : March 7, 2013 nuclear@1: Authors : Lee Cooper nuclear@1: nuclear@1: Copyright : Copyright 2013 Oculus VR, Inc. All Rights reserved. nuclear@1: nuclear@1: Use of this software is subject to the terms of the Oculus license nuclear@1: agreement provided at the time of installation or download, or which nuclear@1: otherwise accompanies this software in either electronic or hard copy form. nuclear@1: nuclear@1: *************************************************************************************/ nuclear@1: nuclear@1: #ifndef OVR_LatencyTestImpl_h nuclear@1: #define OVR_LatencyTestImpl_h nuclear@1: nuclear@1: #include "OVR_HIDDeviceImpl.h" nuclear@1: nuclear@1: namespace OVR { nuclear@1: nuclear@1: struct LatencyTestSamplesMessage; nuclear@1: struct LatencyTestButtonMessage; nuclear@1: struct LatencyTestStartedMessage; nuclear@1: struct LatencyTestColorDetectedMessage; nuclear@1: nuclear@1: //------------------------------------------------------------------------------------- nuclear@1: // LatencyTestDeviceFactory enumerates Oculus Latency Tester devices. nuclear@1: class LatencyTestDeviceFactory : public DeviceFactory nuclear@1: { nuclear@1: public: nuclear@1: static LatencyTestDeviceFactory Instance; nuclear@1: nuclear@1: // Enumerates devices, creating and destroying relevant objects in manager. nuclear@1: virtual void EnumerateDevices(EnumerateVisitor& visitor); nuclear@1: nuclear@1: virtual bool MatchVendorProduct(UInt16 vendorId, UInt16 productId) const; nuclear@1: virtual bool DetectHIDDevice(DeviceManager* pdevMgr, const HIDDeviceDesc& desc); nuclear@1: nuclear@1: protected: nuclear@1: DeviceManager* getManager() const { return (DeviceManager*) pManager; } nuclear@1: }; nuclear@1: nuclear@1: nuclear@1: // Describes a single a Oculus Latency Tester device and supports creating its instance. nuclear@1: class LatencyTestDeviceCreateDesc : public HIDDeviceCreateDesc nuclear@1: { nuclear@1: public: nuclear@1: LatencyTestDeviceCreateDesc(DeviceFactory* factory, const HIDDeviceDesc& hidDesc) nuclear@1: : HIDDeviceCreateDesc(factory, Device_LatencyTester, hidDesc) { } nuclear@1: nuclear@1: virtual DeviceCreateDesc* Clone() const nuclear@1: { nuclear@1: return new LatencyTestDeviceCreateDesc(*this); nuclear@1: } nuclear@1: nuclear@1: virtual DeviceBase* NewDeviceInstance(); nuclear@1: nuclear@1: virtual MatchResult MatchDevice(const DeviceCreateDesc& other, nuclear@1: DeviceCreateDesc**) const nuclear@1: { nuclear@1: if ((other.Type == Device_LatencyTester) && (pFactory == other.pFactory)) nuclear@1: { nuclear@1: const LatencyTestDeviceCreateDesc& s2 = (const LatencyTestDeviceCreateDesc&) other; nuclear@1: if (MatchHIDDevice(s2.HIDDesc)) nuclear@1: return Match_Found; nuclear@1: } nuclear@1: return Match_None; nuclear@1: } nuclear@1: nuclear@1: virtual bool MatchHIDDevice(const HIDDeviceDesc& hidDesc) const nuclear@1: { nuclear@1: // should paths comparison be case insensitive? nuclear@1: return ((HIDDesc.Path.CompareNoCase(hidDesc.Path) == 0) && nuclear@1: (HIDDesc.SerialNumber == hidDesc.SerialNumber)); nuclear@1: } nuclear@1: virtual bool GetDeviceInfo(DeviceInfo* info) const; nuclear@1: }; nuclear@1: nuclear@1: nuclear@1: //------------------------------------------------------------------------------------- nuclear@1: // ***** OVR::LatencyTestDeviceImpl nuclear@1: nuclear@1: // Oculus Latency Tester interface. nuclear@1: nuclear@1: class LatencyTestDeviceImpl : public HIDDeviceImpl nuclear@1: { nuclear@1: public: nuclear@1: LatencyTestDeviceImpl(LatencyTestDeviceCreateDesc* createDesc); nuclear@1: ~LatencyTestDeviceImpl(); nuclear@1: nuclear@1: // DeviceCommon interface. nuclear@1: virtual bool Initialize(DeviceBase* parent); nuclear@1: virtual void Shutdown(); nuclear@1: nuclear@1: // DeviceManagerThread::Notifier interface. nuclear@1: virtual void OnInputReport(UByte* pData, UInt32 length); nuclear@1: nuclear@1: // LatencyTesterDevice interface nuclear@1: virtual bool SetConfiguration(const OVR::LatencyTestConfiguration& configuration, bool waitFlag = false); nuclear@1: virtual bool GetConfiguration(OVR::LatencyTestConfiguration* configuration); nuclear@1: nuclear@1: virtual bool SetCalibrate(const Color& calibrationColor, bool waitFlag = false); nuclear@1: nuclear@1: virtual bool SetStartTest(const Color& targetColor, bool waitFlag = false); nuclear@1: virtual bool SetDisplay(const LatencyTestDisplay& display, bool waitFlag = false); nuclear@1: nuclear@1: protected: nuclear@1: bool openDevice(const char** errorFormatString); nuclear@1: void closeDevice(); nuclear@1: void closeDeviceOnIOError(); nuclear@1: nuclear@1: bool initializeRead(); nuclear@1: bool processReadResult(); nuclear@1: nuclear@1: bool setConfiguration(const OVR::LatencyTestConfiguration& configuration); nuclear@1: bool getConfiguration(OVR::LatencyTestConfiguration* configuration); nuclear@1: bool setCalibrate(const Color& calibrationColor); nuclear@1: bool setStartTest(const Color& targetColor); nuclear@1: bool setDisplay(const OVR::LatencyTestDisplay& display); nuclear@1: nuclear@1: // Called for decoded messages nuclear@1: void onLatencyTestSamplesMessage(LatencyTestSamplesMessage* message); nuclear@1: void onLatencyTestButtonMessage(LatencyTestButtonMessage* message); nuclear@1: void onLatencyTestStartedMessage(LatencyTestStartedMessage* message); nuclear@1: void onLatencyTestColorDetectedMessage(LatencyTestColorDetectedMessage* message); nuclear@1: nuclear@1: }; nuclear@1: nuclear@1: } // namespace OVR nuclear@1: nuclear@1: #endif // OVR_LatencyTestImpl_h