nuclear@1: /************************************************************************************ nuclear@1: nuclear@1: Filename : OVR_HIDDevice.h nuclear@1: Content : Cross platform HID device interface. nuclear@1: Created : February 22, 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_HIDDevice_h nuclear@1: #define OVR_HIDDevice_h nuclear@1: nuclear@1: #include "OVR_HIDDeviceBase.h" nuclear@1: nuclear@1: #include "Kernel/OVR_RefCount.h" nuclear@1: #include "Kernel/OVR_String.h" nuclear@1: #include "Kernel/OVR_Timer.h" nuclear@1: nuclear@1: namespace OVR { nuclear@1: nuclear@1: class HIDDevice; nuclear@1: class DeviceManager; nuclear@1: nuclear@1: // HIDDeviceDesc contains interesting attributes of a HID device, including a Path nuclear@1: // that can be used to create it. nuclear@1: struct HIDDeviceDesc nuclear@1: { nuclear@1: UInt16 VendorId; nuclear@1: UInt16 ProductId; nuclear@1: UInt16 VersionNumber; nuclear@1: UInt16 Usage; nuclear@1: UInt16 UsagePage; nuclear@1: String Path; // Platform specific. nuclear@1: String Manufacturer; nuclear@1: String Product; nuclear@1: String SerialNumber; nuclear@1: }; nuclear@1: nuclear@1: // HIDEnumerateVisitor exposes a Visit interface called for every detected device nuclear@1: // by HIDDeviceManager::Enumerate. nuclear@1: class HIDEnumerateVisitor nuclear@1: { nuclear@1: public: nuclear@1: nuclear@1: // Should return true if we are interested in supporting nuclear@1: // this HID VendorId and ProductId pair. nuclear@1: virtual bool MatchVendorProduct(UInt16 vendorId, UInt16 productId) nuclear@1: { OVR_UNUSED2(vendorId, productId); return true; } nuclear@1: nuclear@1: // Override to get notified about available device. Will only be called for nuclear@1: // devices that matched MatchVendorProduct. nuclear@1: virtual void Visit(HIDDevice&, const HIDDeviceDesc&) { } nuclear@1: }; nuclear@1: nuclear@1: nuclear@1: //------------------------------------------------------------------------------------- nuclear@1: // ***** HIDDeviceManager nuclear@1: nuclear@1: // Internal manager for enumerating and opening HID devices. nuclear@1: // If an OVR::DeviceManager is created then an OVR::HIDDeviceManager will automatically be created and can be accessed from the nuclear@1: // DeviceManager by calling 'GetHIDDeviceManager()'. When using HIDDeviceManager in standalone mode, the client must call nuclear@1: // 'Create' below. nuclear@1: class HIDDeviceManager : public RefCountBase nuclear@1: { nuclear@1: public: nuclear@1: nuclear@1: // Creates a new HIDDeviceManager. Only one instance of HIDDeviceManager should be created at a time. nuclear@1: static HIDDeviceManager* Create(); nuclear@1: nuclear@1: // Enumerate HID devices using a HIDEnumerateVisitor derived visitor class. nuclear@1: virtual bool Enumerate(HIDEnumerateVisitor* enumVisitor) = 0; nuclear@1: nuclear@1: // Open a HID device with the specified path. nuclear@1: virtual HIDDevice* Open(const String& path) = 0; nuclear@1: nuclear@1: protected: nuclear@1: HIDDeviceManager() nuclear@1: { } nuclear@1: }; nuclear@1: nuclear@1: //------------------------------------------------------------------------------------- nuclear@1: // ***** HIDDevice nuclear@1: nuclear@1: // HID device object. This is designed to be operated in synchronous nuclear@1: // and asynchronous modes. With no handler set, input messages will be nuclear@1: // stored and can be retrieved by calling 'Read' or 'ReadBlocking'. nuclear@1: class HIDDevice : public RefCountBase, public HIDDeviceBase nuclear@1: { nuclear@1: public: nuclear@1: nuclear@1: HIDDevice() nuclear@1: : Handler(NULL) nuclear@1: { nuclear@1: } nuclear@1: nuclear@1: virtual ~HIDDevice() {} nuclear@1: nuclear@1: virtual bool SetFeatureReport(UByte* data, UInt32 length) = 0; nuclear@1: virtual bool GetFeatureReport(UByte* data, UInt32 length) = 0; nuclear@1: nuclear@1: // Not yet implemented. nuclear@1: /* nuclear@1: virtual bool Write(UByte* data, UInt32 length) = 0; nuclear@1: nuclear@1: virtual bool Read(UByte* pData, UInt32 length, UInt32 timeoutMilliS) = 0; nuclear@1: virtual bool ReadBlocking(UByte* pData, UInt32 length) = 0; nuclear@1: */ nuclear@1: nuclear@1: class HIDHandler nuclear@1: { nuclear@1: public: nuclear@1: virtual void OnInputReport(UByte* pData, UInt32 length) nuclear@1: { OVR_UNUSED2(pData, length); } nuclear@1: nuclear@1: virtual UInt64 OnTicks(UInt64 ticksMks) nuclear@1: { OVR_UNUSED1(ticksMks); return Timer::MksPerSecond * 1000; ; } nuclear@1: nuclear@1: enum HIDDeviceMessageType nuclear@1: { nuclear@1: HIDDeviceMessage_DeviceAdded = 0, nuclear@1: HIDDeviceMessage_DeviceRemoved = 1 nuclear@1: }; nuclear@1: nuclear@1: virtual void OnDeviceMessage(HIDDeviceMessageType messageType) nuclear@1: { OVR_UNUSED1(messageType); } nuclear@1: }; nuclear@1: nuclear@1: void SetHandler(HIDHandler* handler) nuclear@1: { Handler = handler; } nuclear@1: nuclear@1: protected: nuclear@1: HIDHandler* Handler; nuclear@1: }; nuclear@1: nuclear@1: } // namespace OVR nuclear@1: nuclear@1: #endif