00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef OVR_Win32_HIDDevice_h
00017 #define OVR_Win32_HIDDevice_h
00018
00019 #include "OVR_HIDDevice.h"
00020 #include "OVR_Win32_DeviceManager.h"
00021
00022 #include <windows.h>
00023 #include <setupapi.h>
00024
00025
00026
00027
00028
00029 #ifndef _HIDSDI_H
00030 #define _HIDSDI_H
00031 #include <pshpack4.h>
00032
00033 #define HIDP_STATUS_SUCCESS (0x11 << 16)
00034 struct HIDP_PREPARSED_DATA;
00035
00036 struct HIDD_ATTRIBUTES
00037 {
00038 ULONG Size;
00039 USHORT VendorID;
00040 USHORT ProductID;
00041 USHORT VersionNumber;
00042 };
00043
00044 struct HIDP_CAPS
00045 {
00046 USHORT Usage;
00047 USHORT UsagePage;
00048 USHORT InputReportByteLength;
00049 USHORT OutputReportByteLength;
00050 USHORT FeatureReportByteLength;
00051 USHORT Reserved[17];
00052
00053 USHORT NumberLinkCollectionNodes;
00054 USHORT NumberInputButtonCaps;
00055 USHORT NumberInputValueCaps;
00056 USHORT NumberInputDataIndices;
00057 USHORT NumberOutputButtonCaps;
00058 USHORT NumberOutputValueCaps;
00059 USHORT NumberOutputDataIndices;
00060 USHORT NumberFeatureButtonCaps;
00061 USHORT NumberFeatureValueCaps;
00062 USHORT NumberFeatureDataIndices;
00063 };
00064
00065 #include <poppack.h>
00066 #endif
00067
00068
00069 namespace OVR { namespace Win32 {
00070
00071 class HIDDeviceManager;
00072 class DeviceManager;
00073
00074
00075
00076
00077 class HIDDevice : public OVR::HIDDevice, public DeviceManagerThread::Notifier
00078 {
00079 public:
00080
00081 HIDDevice(HIDDeviceManager* manager);
00082
00083
00084
00085 HIDDevice(HIDDeviceManager* manager, HANDLE device);
00086
00087 ~HIDDevice();
00088
00089 bool HIDInitialize(const String& path);
00090 void HIDShutdown();
00091
00092
00093 bool SetFeatureReport(UByte* data, UInt32 length);
00094 bool GetFeatureReport(UByte* data, UInt32 length);
00095
00096
00097
00098 void OnOverlappedEvent(HANDLE hevent);
00099 UInt64 OnTicks(UInt64 ticksMks);
00100 bool OnDeviceMessage(DeviceMessageType messageType, const String& devicePath, bool* error);
00101
00102 private:
00103 bool openDevice();
00104 bool initInfo();
00105 bool initializeRead();
00106 bool processReadResult();
00107 void closeDevice();
00108 void closeDeviceOnIOError();
00109
00110 bool inMinimalMode;
00111 HIDDeviceManager* HIDManager;
00112 HANDLE Device;
00113 HIDDeviceDesc DevDesc;
00114
00115 OVERLAPPED ReadOverlapped;
00116 bool ReadRequested;
00117
00118 enum { ReadBufferSize = 96 };
00119 UByte ReadBuffer[ReadBufferSize];
00120
00121 UInt16 InputReportBufferLength;
00122 UInt16 OutputReportBufferLength;
00123 UInt16 FeatureReportBufferLength;
00124 };
00125
00126
00127
00128
00129 class HIDDeviceManager : public OVR::HIDDeviceManager
00130 {
00131 friend class HIDDevice;
00132 public:
00133
00134 HIDDeviceManager(DeviceManager* manager);
00135 virtual ~HIDDeviceManager();
00136
00137 virtual bool Initialize();
00138 virtual void Shutdown();
00139
00140 virtual bool Enumerate(HIDEnumerateVisitor* enumVisitor);
00141 virtual OVR::HIDDevice* Open(const String& path);
00142
00143
00144
00145 bool GetHIDDeviceDesc(const String& path, HIDDeviceDesc* pdevDesc) const;
00146
00147 GUID GetHIDGuid() { return HidGuid; }
00148
00149 static HIDDeviceManager* CreateInternal(DeviceManager* manager);
00150
00151 private:
00152
00153 DeviceManager* Manager;
00154
00155 HMODULE hHidLib;
00156 GUID HidGuid;
00157
00158
00159 #define OVR_DECLARE_HIDFUNC(func, rettype, args) \
00160 typedef rettype (__stdcall *PFn_##func) args; \
00161 PFn_##func func;
00162 #define OVR_RESOLVE_HIDFUNC(func) \
00163 func = (PFn_##func)::GetProcAddress(hHidLib, #func)
00164
00165 OVR_DECLARE_HIDFUNC(HidD_GetHidGuid, void, (GUID *hidGuid));
00166 OVR_DECLARE_HIDFUNC(HidD_SetNumInputBuffers, BOOLEAN, (HANDLE hidDev, ULONG numberBuffers));
00167 OVR_DECLARE_HIDFUNC(HidD_GetFeature, BOOLEAN, (HANDLE hidDev, PVOID buffer, ULONG bufferLength));
00168 OVR_DECLARE_HIDFUNC(HidD_SetFeature, BOOLEAN, (HANDLE hidDev, PVOID buffer, ULONG bufferLength));
00169 OVR_DECLARE_HIDFUNC(HidD_GetAttributes, BOOLEAN, (HANDLE hidDev, HIDD_ATTRIBUTES *attributes));
00170 OVR_DECLARE_HIDFUNC(HidD_GetManufacturerString, BOOLEAN, (HANDLE hidDev, PVOID buffer, ULONG bufferLength));
00171 OVR_DECLARE_HIDFUNC(HidD_GetProductString, BOOLEAN, (HANDLE hidDev, PVOID buffer, ULONG bufferLength));
00172 OVR_DECLARE_HIDFUNC(HidD_GetSerialNumberString, BOOLEAN, (HANDLE hidDev, PVOID buffer, ULONG bufferLength));
00173 OVR_DECLARE_HIDFUNC(HidD_GetPreparsedData, BOOLEAN, (HANDLE hidDev, HIDP_PREPARSED_DATA **preparsedData));
00174 OVR_DECLARE_HIDFUNC(HidD_FreePreparsedData, BOOLEAN, (HIDP_PREPARSED_DATA *preparsedData));
00175 OVR_DECLARE_HIDFUNC(HidP_GetCaps, NTSTATUS,(HIDP_PREPARSED_DATA *preparsedData, HIDP_CAPS* caps));
00176
00177 HANDLE CreateHIDFile(const char* path, bool exclusiveAccess = true) const
00178 {
00179 return ::CreateFileA(path, GENERIC_WRITE|GENERIC_READ,
00180 (!exclusiveAccess) ? (FILE_SHARE_READ|FILE_SHARE_WRITE) : 0x0,
00181 NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
00182 }
00183
00184
00185 bool initVendorProductVersion(HANDLE hidDev, HIDDeviceDesc* desc) const;
00186 bool initUsage(HANDLE hidDev, HIDDeviceDesc* desc) const;
00187 void initStrings(HANDLE hidDev, HIDDeviceDesc* desc) const;
00188
00189 bool getFullDesc(HANDLE hidDev, HIDDeviceDesc* desc) const;
00190 };
00191
00192 }}
00193
00194 #endif // OVR_Win32_HIDDevice_h