cadMousePro-daemon/src/HID.h
branchv_0
changeset 33 0dc4e2942840
parent 26 fff8e9a86e85
--- 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;
+	}
+};