nuclear@1: /************************************************************************************ nuclear@1: Filename : OVR_Linux_HIDDevice.h nuclear@1: Content : Linux HID device implementation. nuclear@1: Created : June 13, 2013 nuclear@1: Authors : Brant Lewis 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_LINUX_HIDDevice_h nuclear@1: #define OVR_LINUX_HIDDevice_h nuclear@1: nuclear@1: #include "OVR_HIDDevice.h" nuclear@1: #include "OVR_Linux_DeviceManager.h" nuclear@1: #include nuclear@1: nuclear@1: namespace OVR { namespace Linux { nuclear@1: nuclear@1: class HIDDeviceManager; nuclear@1: nuclear@1: //------------------------------------------------------------------------------------- nuclear@1: // ***** Linux 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, int device_handle); 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: // DeviceManagerThread::Notifier nuclear@1: void OnEvent(int i, int fd); nuclear@1: UInt64 OnTicks(UInt64 ticksMks); nuclear@1: nuclear@1: bool OnDeviceNotification(MessageType messageType, nuclear@1: HIDDeviceDesc* device_info, nuclear@1: bool* error); nuclear@1: nuclear@1: private: nuclear@1: bool initInfo(); nuclear@1: bool openDevice(const char* dev_path); nuclear@1: void closeDevice(bool wasUnplugged); nuclear@1: void closeDeviceOnIOError(); nuclear@1: bool setupDevicePluggedInNotification(); nuclear@1: nuclear@1: bool InMinimalMode; nuclear@1: HIDDeviceManager* HIDManager; nuclear@1: int DeviceHandle; // file handle to the 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: nuclear@1: nuclear@1: //------------------------------------------------------------------------------------- nuclear@1: // ***** Linux HIDDeviceManager nuclear@1: nuclear@1: class HIDDeviceManager : public OVR::HIDDeviceManager, public DeviceManagerThread::Notifier nuclear@1: { nuclear@1: friend class HIDDevice; nuclear@1: nuclear@1: public: nuclear@1: HIDDeviceManager(Linux::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: void OnEvent(int i, int fd); nuclear@1: nuclear@1: private: nuclear@1: bool initializeManager(); nuclear@1: bool initVendorProductVersion(udev_device* device, HIDDeviceDesc* pDevDesc); nuclear@1: bool getPath(udev_device* device, String* pPath); nuclear@1: bool getIntProperty(udev_device* device, const char* key, int32_t* pResult); nuclear@1: bool getStringProperty(udev_device* device, nuclear@1: const char* propertyName, nuclear@1: OVR::String* pResult); nuclear@1: bool getFullDesc(udev_device* device, HIDDeviceDesc* desc); nuclear@1: bool GetDescriptorFromPath(const char* dev_path, HIDDeviceDesc* desc); nuclear@1: nuclear@1: bool AddNotificationDevice(HIDDevice* device); nuclear@1: bool RemoveNotificationDevice(HIDDevice* device); nuclear@1: nuclear@1: DeviceManager* DevManager; nuclear@1: nuclear@1: udev* UdevInstance; // a handle to the udev library instance nuclear@1: udev_monitor* HIDMonitor; nuclear@1: int HIDMonHandle; // the udev_monitor file handle nuclear@1: nuclear@1: Array NotificationDevices; nuclear@1: }; nuclear@1: nuclear@1: }} // namespace OVR::Linux nuclear@1: nuclear@1: #endif // OVR_Linux_HIDDevice_h