cadMousePro-daemon/src/HID.h
branchv_0
changeset 33 0dc4e2942840
parent 26 fff8e9a86e85
equal deleted inserted replaced
32:09d20a946a01 33:0dc4e2942840
    19 #include <array>
    19 #include <array>
    20 #include <vector>
    20 #include <vector>
    21 #include <memory>
    21 #include <memory>
    22 #include <unistd.h>
    22 #include <unistd.h>
    23 #include <cassert>
    23 #include <cassert>
       
    24 #include <string>
       
    25 #include <vector>
    24 
    26 
    25 #include <hidapi/hidapi.h>
    27 #include <hidapi/hidapi.h>
    26 
    28 
    27 using Packet = std::vector<uint8_t>;
    29 using Packet = std::vector<uint8_t>;
    28 static_assert(sizeof (uint8_t) == sizeof (unsigned char)); // unsigned char is used in the HID API library
    30 static_assert(sizeof (uint8_t) == sizeof (unsigned char)); // unsigned char is used in the HID API library
    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 };