86 int written = hid_send_feature_report(handle.get(), data.data(), data.size()); |
88 int written = hid_send_feature_report(handle.get(), data.data(), data.size()); |
87 if (written < 0) throw HIDException(L"Unable to send feature report."); |
89 if (written < 0) throw HIDException(L"Unable to send feature report."); |
88 } |
90 } |
89 |
91 |
90 }; |
92 }; |
|
93 |
|
94 class HIDDeviceInfo { |
|
95 private: |
|
96 unsigned short vendorId; |
|
97 unsigned short productId; |
|
98 std::wstring serialNumber; |
|
99 public: |
|
100 |
|
101 HIDDeviceInfo(unsigned short vendorId, unsigned short productId, std::wstring serialNumber) : vendorId(vendorId), productId(productId), serialNumber(serialNumber) { |
|
102 } |
|
103 |
|
104 virtual ~HIDDeviceInfo() { |
|
105 } |
|
106 |
|
107 HIDDevice open() { |
|
108 return HIDDevice(vendorId, productId, serialNumber.size() ? serialNumber.c_str() : nullptr); |
|
109 } |
|
110 |
|
111 bool matches(unsigned short vendorId, unsigned short productId) { |
|
112 return vendorId == this->vendorId && productId == this->productId; |
|
113 } |
|
114 |
|
115 bool matches(unsigned short vendorId, unsigned short productId, std::wstring serialNumber) { |
|
116 return matches(vendorId, productId) && serialNumber == this->serialNumber; |
|
117 } |
|
118 |
|
119 unsigned short getProductId() const { |
|
120 return productId; |
|
121 } |
|
122 |
|
123 std::wstring getSerialNumber() const { |
|
124 return serialNumber; |
|
125 } |
|
126 |
|
127 unsigned short getVendorId() const { |
|
128 return vendorId; |
|
129 } |
|
130 |
|
131 static std::vector<HIDDeviceInfo> enumerate(unsigned short vendorId = 0, unsigned short productId = 0) { |
|
132 std::vector<HIDDeviceInfo> result; |
|
133 std::shared_ptr<hid_device_info> rawList(hid_enumerate(vendorId, productId), hid_free_enumeration); |
|
134 // n.b. for single USB device there might be multiple HID devices different just in di->path |
|
135 for (hid_device_info* di = rawList.get(); di; di = di->next) result.push_back({di->vendor_id, di->product_id, di->serial_number}); |
|
136 return result; |
|
137 } |
|
138 }; |