nuclear@1: /************************************************************************************ nuclear@1: Filename : OVR_OSX_HIDDevice.h nuclear@1: Content : OSX HID device implementation. nuclear@1: Created : February 26, 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_OSX_HIDDevice_h nuclear@1: #define OVR_OSX_HIDDevice_h nuclear@1: nuclear@1: #include "OVR_HIDDevice.h" nuclear@1: nuclear@1: #include "OVR_OSX_DeviceManager.h" nuclear@1: nuclear@1: #include nuclear@1: nuclear@1: namespace OVR { namespace OSX { nuclear@1: nuclear@1: class HIDDeviceManager; nuclear@1: nuclear@1: //------------------------------------------------------------------------------------- nuclear@1: // ***** OSX HIDDevice nuclear@1: nuclear@1: class HIDDevice : public OVR::HIDDevice, public DeviceManagerThread::Notifier nuclear@1: { nuclear@1: private: nuclear@1: friend class HIDDeviceManager; nuclear@1: nuclear@1: public: nuclear@1: HIDDevice(HIDDeviceManager* manager); nuclear@1: nuclear@1: // This is a minimal constructor used during enumeration for us to pass nuclear@1: // a HIDDevice to the visit function (so that it can query feature reports). nuclear@1: HIDDevice(HIDDeviceManager* manager, IOHIDDeviceRef device); nuclear@1: nuclear@1: virtual ~HIDDevice(); nuclear@1: nuclear@1: bool HIDInitialize(const String& path); nuclear@1: void HIDShutdown(); nuclear@1: nuclear@1: virtual bool SetFeatureReport(UByte* data, UInt32 length); nuclear@1: virtual bool GetFeatureReport(UByte* data, UInt32 length); nuclear@1: nuclear@1: bool Write(UByte* data, UInt32 length); nuclear@1: nuclear@1: bool Read(UByte* pData, UInt32 length, UInt32 timeoutMilliS); nuclear@1: bool ReadBlocking(UByte* pData, UInt32 length); nuclear@1: nuclear@1: nuclear@1: // DeviceManagerThread::Notifier nuclear@1: UInt64 OnTicks(UInt64 ticksMks); nuclear@1: nuclear@1: private: nuclear@1: bool initInfo(); nuclear@1: bool openDevice(); nuclear@1: void closeDevice(bool wasUnplugged); nuclear@1: bool setupDevicePluggedInNotification(); nuclear@1: CFStringRef generateRunLoopModeString(IOHIDDeviceRef device); nuclear@1: nuclear@1: static void staticHIDReportCallback(void* pContext, nuclear@1: IOReturn result, nuclear@1: void* pSender, nuclear@1: IOHIDReportType reportType, nuclear@1: uint32_t reportId, nuclear@1: uint8_t* pReport, nuclear@1: CFIndex reportLength); nuclear@1: void hidReportCallback(UByte* pData, UInt32 length); nuclear@1: nuclear@1: static void staticDeviceRemovedCallback(void* pContext, nuclear@1: IOReturn result, nuclear@1: void* pSender); nuclear@1: void deviceRemovedCallback(); nuclear@1: nuclear@1: static void staticDeviceAddedCallback(void* pContext, nuclear@1: io_iterator_t iterator); nuclear@1: void deviceAddedCallback(io_iterator_t iterator); nuclear@1: nuclear@1: bool InMinimalMode; nuclear@1: HIDDeviceManager* HIDManager; nuclear@1: IOHIDDeviceRef Device; nuclear@1: HIDDeviceDesc DevDesc; nuclear@1: nuclear@1: enum { ReadBufferSize = 96 }; nuclear@1: UByte ReadBuffer[ReadBufferSize]; nuclear@1: nuclear@1: UInt16 InputReportBufferLength; nuclear@1: UInt16 OutputReportBufferLength; nuclear@1: UInt16 FeatureReportBufferLength; nuclear@1: nuclear@1: IONotificationPortRef RepluggedNotificationPort; nuclear@1: io_iterator_t RepluggedNotification; nuclear@1: }; nuclear@1: nuclear@1: nuclear@1: //------------------------------------------------------------------------------------- nuclear@1: // ***** OSX HIDDeviceManager nuclear@1: nuclear@1: class HIDDeviceManager : public OVR::HIDDeviceManager nuclear@1: { nuclear@1: friend class HIDDevice; nuclear@1: nuclear@1: public: nuclear@1: HIDDeviceManager(OSX::DeviceManager* Manager); nuclear@1: virtual ~HIDDeviceManager(); nuclear@1: nuclear@1: virtual bool Initialize(); nuclear@1: virtual void Shutdown(); nuclear@1: nuclear@1: virtual bool Enumerate(HIDEnumerateVisitor* enumVisitor); nuclear@1: virtual OVR::HIDDevice* Open(const String& path); nuclear@1: nuclear@1: static HIDDeviceManager* CreateInternal(DeviceManager* manager); nuclear@1: nuclear@1: private: nuclear@1: CFRunLoopRef getRunLoop(); nuclear@1: bool initializeManager(); nuclear@1: bool initVendorProductVersion(IOHIDDeviceRef device, HIDDeviceDesc* pDevDesc); nuclear@1: bool initUsage(IOHIDDeviceRef device, HIDDeviceDesc* pDevDesc); nuclear@1: bool initStrings(IOHIDDeviceRef device, HIDDeviceDesc* pDevDesc); nuclear@1: bool initSerialNumber(IOHIDDeviceRef device, HIDDeviceDesc* pDevDesc); nuclear@1: bool getVendorId(IOHIDDeviceRef device, UInt16* pResult); nuclear@1: bool getProductId(IOHIDDeviceRef device, UInt16* pResult); nuclear@1: bool getLocationId(IOHIDDeviceRef device, SInt32* pResult); nuclear@1: bool getSerialNumberString(IOHIDDeviceRef device, String* pResult); nuclear@1: bool getPath(IOHIDDeviceRef device, String* pPath); nuclear@1: bool getIntProperty(IOHIDDeviceRef device, CFStringRef key, int32_t* pResult); nuclear@1: bool getStringProperty(IOHIDDeviceRef device, CFStringRef propertyName, String* pResult); nuclear@1: bool getFullDesc(IOHIDDeviceRef device, HIDDeviceDesc* desc); nuclear@1: nuclear@1: static void staticDeviceMatchingCallback(void *inContext, nuclear@1: IOReturn inResult, nuclear@1: void *inSender, nuclear@1: IOHIDDeviceRef inIOHIDDeviceRef); nuclear@1: nuclear@1: DeviceManager* DevManager; nuclear@1: nuclear@1: IOHIDManagerRef HIDManager; nuclear@1: }; nuclear@1: nuclear@1: }} // namespace OVR::OSX nuclear@1: nuclear@1: #endif // OVR_OSX_HIDDevice_h