rev |
line source |
nuclear@1
|
1 /************************************************************************************
|
nuclear@1
|
2
|
nuclear@1
|
3 Filename : OVR_HIDDevice.h
|
nuclear@1
|
4 Content : Cross platform HID device interface.
|
nuclear@1
|
5 Created : February 22, 2013
|
nuclear@1
|
6 Authors : Lee Cooper
|
nuclear@1
|
7
|
nuclear@1
|
8 Copyright : Copyright 2013 Oculus VR, Inc. All Rights reserved.
|
nuclear@1
|
9
|
nuclear@1
|
10 Use of this software is subject to the terms of the Oculus license
|
nuclear@1
|
11 agreement provided at the time of installation or download, or which
|
nuclear@1
|
12 otherwise accompanies this software in either electronic or hard copy form.
|
nuclear@1
|
13
|
nuclear@1
|
14 *************************************************************************************/
|
nuclear@1
|
15
|
nuclear@1
|
16 #ifndef OVR_HIDDevice_h
|
nuclear@1
|
17 #define OVR_HIDDevice_h
|
nuclear@1
|
18
|
nuclear@1
|
19 #include "OVR_HIDDeviceBase.h"
|
nuclear@1
|
20
|
nuclear@1
|
21 #include "Kernel/OVR_RefCount.h"
|
nuclear@1
|
22 #include "Kernel/OVR_String.h"
|
nuclear@1
|
23 #include "Kernel/OVR_Timer.h"
|
nuclear@1
|
24
|
nuclear@1
|
25 namespace OVR {
|
nuclear@1
|
26
|
nuclear@1
|
27 class HIDDevice;
|
nuclear@1
|
28 class DeviceManager;
|
nuclear@1
|
29
|
nuclear@1
|
30 // HIDDeviceDesc contains interesting attributes of a HID device, including a Path
|
nuclear@1
|
31 // that can be used to create it.
|
nuclear@1
|
32 struct HIDDeviceDesc
|
nuclear@1
|
33 {
|
nuclear@1
|
34 UInt16 VendorId;
|
nuclear@1
|
35 UInt16 ProductId;
|
nuclear@1
|
36 UInt16 VersionNumber;
|
nuclear@1
|
37 UInt16 Usage;
|
nuclear@1
|
38 UInt16 UsagePage;
|
nuclear@1
|
39 String Path; // Platform specific.
|
nuclear@1
|
40 String Manufacturer;
|
nuclear@1
|
41 String Product;
|
nuclear@1
|
42 String SerialNumber;
|
nuclear@1
|
43 };
|
nuclear@1
|
44
|
nuclear@1
|
45 // HIDEnumerateVisitor exposes a Visit interface called for every detected device
|
nuclear@1
|
46 // by HIDDeviceManager::Enumerate.
|
nuclear@1
|
47 class HIDEnumerateVisitor
|
nuclear@1
|
48 {
|
nuclear@1
|
49 public:
|
nuclear@1
|
50
|
nuclear@1
|
51 // Should return true if we are interested in supporting
|
nuclear@1
|
52 // this HID VendorId and ProductId pair.
|
nuclear@1
|
53 virtual bool MatchVendorProduct(UInt16 vendorId, UInt16 productId)
|
nuclear@1
|
54 { OVR_UNUSED2(vendorId, productId); return true; }
|
nuclear@1
|
55
|
nuclear@1
|
56 // Override to get notified about available device. Will only be called for
|
nuclear@1
|
57 // devices that matched MatchVendorProduct.
|
nuclear@1
|
58 virtual void Visit(HIDDevice&, const HIDDeviceDesc&) { }
|
nuclear@1
|
59 };
|
nuclear@1
|
60
|
nuclear@1
|
61
|
nuclear@1
|
62 //-------------------------------------------------------------------------------------
|
nuclear@1
|
63 // ***** HIDDeviceManager
|
nuclear@1
|
64
|
nuclear@1
|
65 // Internal manager for enumerating and opening HID devices.
|
nuclear@1
|
66 // If an OVR::DeviceManager is created then an OVR::HIDDeviceManager will automatically be created and can be accessed from the
|
nuclear@1
|
67 // DeviceManager by calling 'GetHIDDeviceManager()'. When using HIDDeviceManager in standalone mode, the client must call
|
nuclear@1
|
68 // 'Create' below.
|
nuclear@1
|
69 class HIDDeviceManager : public RefCountBase<HIDDeviceManager>
|
nuclear@1
|
70 {
|
nuclear@1
|
71 public:
|
nuclear@1
|
72
|
nuclear@1
|
73 // Creates a new HIDDeviceManager. Only one instance of HIDDeviceManager should be created at a time.
|
nuclear@1
|
74 static HIDDeviceManager* Create();
|
nuclear@1
|
75
|
nuclear@1
|
76 // Enumerate HID devices using a HIDEnumerateVisitor derived visitor class.
|
nuclear@1
|
77 virtual bool Enumerate(HIDEnumerateVisitor* enumVisitor) = 0;
|
nuclear@1
|
78
|
nuclear@1
|
79 // Open a HID device with the specified path.
|
nuclear@1
|
80 virtual HIDDevice* Open(const String& path) = 0;
|
nuclear@1
|
81
|
nuclear@1
|
82 protected:
|
nuclear@1
|
83 HIDDeviceManager()
|
nuclear@1
|
84 { }
|
nuclear@1
|
85 };
|
nuclear@1
|
86
|
nuclear@1
|
87 //-------------------------------------------------------------------------------------
|
nuclear@1
|
88 // ***** HIDDevice
|
nuclear@1
|
89
|
nuclear@1
|
90 // HID device object. This is designed to be operated in synchronous
|
nuclear@1
|
91 // and asynchronous modes. With no handler set, input messages will be
|
nuclear@1
|
92 // stored and can be retrieved by calling 'Read' or 'ReadBlocking'.
|
nuclear@1
|
93 class HIDDevice : public RefCountBase<HIDDevice>, public HIDDeviceBase
|
nuclear@1
|
94 {
|
nuclear@1
|
95 public:
|
nuclear@1
|
96
|
nuclear@1
|
97 HIDDevice()
|
nuclear@1
|
98 : Handler(NULL)
|
nuclear@1
|
99 {
|
nuclear@1
|
100 }
|
nuclear@1
|
101
|
nuclear@1
|
102 virtual ~HIDDevice() {}
|
nuclear@1
|
103
|
nuclear@1
|
104 virtual bool SetFeatureReport(UByte* data, UInt32 length) = 0;
|
nuclear@1
|
105 virtual bool GetFeatureReport(UByte* data, UInt32 length) = 0;
|
nuclear@1
|
106
|
nuclear@1
|
107 // Not yet implemented.
|
nuclear@1
|
108 /*
|
nuclear@1
|
109 virtual bool Write(UByte* data, UInt32 length) = 0;
|
nuclear@1
|
110
|
nuclear@1
|
111 virtual bool Read(UByte* pData, UInt32 length, UInt32 timeoutMilliS) = 0;
|
nuclear@1
|
112 virtual bool ReadBlocking(UByte* pData, UInt32 length) = 0;
|
nuclear@1
|
113 */
|
nuclear@1
|
114
|
nuclear@1
|
115 class HIDHandler
|
nuclear@1
|
116 {
|
nuclear@1
|
117 public:
|
nuclear@1
|
118 virtual void OnInputReport(UByte* pData, UInt32 length)
|
nuclear@1
|
119 { OVR_UNUSED2(pData, length); }
|
nuclear@1
|
120
|
nuclear@1
|
121 virtual UInt64 OnTicks(UInt64 ticksMks)
|
nuclear@1
|
122 { OVR_UNUSED1(ticksMks); return Timer::MksPerSecond * 1000; ; }
|
nuclear@1
|
123
|
nuclear@1
|
124 enum HIDDeviceMessageType
|
nuclear@1
|
125 {
|
nuclear@1
|
126 HIDDeviceMessage_DeviceAdded = 0,
|
nuclear@1
|
127 HIDDeviceMessage_DeviceRemoved = 1
|
nuclear@1
|
128 };
|
nuclear@1
|
129
|
nuclear@1
|
130 virtual void OnDeviceMessage(HIDDeviceMessageType messageType)
|
nuclear@1
|
131 { OVR_UNUSED1(messageType); }
|
nuclear@1
|
132 };
|
nuclear@1
|
133
|
nuclear@1
|
134 void SetHandler(HIDHandler* handler)
|
nuclear@1
|
135 { Handler = handler; }
|
nuclear@1
|
136
|
nuclear@1
|
137 protected:
|
nuclear@1
|
138 HIDHandler* Handler;
|
nuclear@1
|
139 };
|
nuclear@1
|
140
|
nuclear@1
|
141 } // namespace OVR
|
nuclear@1
|
142
|
nuclear@1
|
143 #endif
|