--- a/cadMousePro-daemon/src/HID.h Tue Jun 09 22:13:44 2020 +0200
+++ b/cadMousePro-daemon/src/HID.h Sat Apr 03 17:39:35 2021 +0200
@@ -21,6 +21,8 @@
#include <memory>
#include <unistd.h>
#include <cassert>
+#include <string>
+#include <vector>
#include <hidapi/hidapi.h>
@@ -88,3 +90,49 @@
}
};
+
+class HIDDeviceInfo {
+private:
+ unsigned short vendorId;
+ unsigned short productId;
+ std::wstring serialNumber;
+public:
+
+ HIDDeviceInfo(unsigned short vendorId, unsigned short productId, std::wstring serialNumber) : vendorId(vendorId), productId(productId), serialNumber(serialNumber) {
+ }
+
+ virtual ~HIDDeviceInfo() {
+ }
+
+ HIDDevice open() {
+ return HIDDevice(vendorId, productId, serialNumber.size() ? serialNumber.c_str() : nullptr);
+ }
+
+ bool matches(unsigned short vendorId, unsigned short productId) {
+ return vendorId == this->vendorId && productId == this->productId;
+ }
+
+ bool matches(unsigned short vendorId, unsigned short productId, std::wstring serialNumber) {
+ return matches(vendorId, productId) && serialNumber == this->serialNumber;
+ }
+
+ unsigned short getProductId() const {
+ return productId;
+ }
+
+ std::wstring getSerialNumber() const {
+ return serialNumber;
+ }
+
+ unsigned short getVendorId() const {
+ return vendorId;
+ }
+
+ static std::vector<HIDDeviceInfo> enumerate(unsigned short vendorId = 0, unsigned short productId = 0) {
+ std::vector<HIDDeviceInfo> result;
+ std::shared_ptr<hid_device_info> rawList(hid_enumerate(vendorId, productId), hid_free_enumeration);
+ // n.b. for single USB device there might be multiple HID devices different just in di->path
+ for (hid_device_info* di = rawList.get(); di; di = di->next) result.push_back({di->vendor_id, di->product_id, di->serial_number});
+ return result;
+ }
+};