diff -r 09d20a946a01 -r 0dc4e2942840 cadMousePro-daemon/src/HID.h --- 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 #include #include +#include +#include #include @@ -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 enumerate(unsigned short vendorId = 0, unsigned short productId = 0) { + std::vector result; + std::shared_ptr 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; + } +};