diff -r 148f8dd077e8 -r 465572518625 cadMousePro-daemon/src/HID.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cadMousePro-daemon/src/HID.h Mon Aug 19 17:27:19 2019 +0200
@@ -0,0 +1,91 @@
+/**
+ * cadMousePro
+ * Copyright © 2019 František Kučera (Frantovo.cz, GlobalCode.info)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+
+#include
+#include
+#include
+#include
+#include
+
+#include
+
+using Packet = std::vector;
+static_assert(sizeof (uint8_t) == sizeof (unsigned char)); // unsigned char is used in the HID API library
+
+class HIDException {
+private:
+ std::wstring message;
+public:
+
+ HIDException(std::wstring message) : message(message) {
+ }
+
+ virtual ~HIDException() {
+ }
+
+ const std::wstring getMessage() const {
+ return message;
+ }
+
+};
+
+class HIDDevice {
+private:
+ std::shared_ptr handle;
+
+public:
+
+ HIDDevice(unsigned short vendorId, unsigned short productId, const wchar_t *serialNumber) {
+ int initError = hid_init(); // TODO: move to HIDContext class?
+ if (initError) throw HIDException(L"Unable to init HID API.");
+ handle.reset(hid_open(vendorId, productId, serialNumber), hid_close);
+ if (handle == nullptr) throw HIDException(L"Unable to open HID device. Are you root? Is the device present?");
+ }
+
+ virtual ~HIDDevice() {
+ hid_exit(); // TODO: move to HIDContext class?
+ }
+
+ const std::wstring getManufacturerName() const {
+ std::array buffer;
+ int error = hid_get_manufacturer_string(handle.get(), buffer.data(), buffer.size());
+ if (error) throw HIDException(L"Unable to get manufacturer name.");
+ return buffer.data();
+ }
+
+ const std::wstring getProductName() const {
+ std::array buffer;
+ int error = hid_get_product_string(handle.get(), buffer.data(), buffer.size());
+ if (error) throw HIDException(L"Unable to get product name.");
+ return buffer.data();
+ }
+
+ const std::wstring getSerialNumber() const {
+ std::array buffer;
+ int error = hid_get_serial_number_string(handle.get(), buffer.data(), buffer.size());
+ if (error) throw HIDException(L"Unable to get serial number.");
+ return buffer.data();
+ }
+
+ void sendFeatureReport(Packet data) {
+ int written = hid_send_feature_report(handle.get(), data.data(), data.size());
+ if (written < 0) throw HIDException(L"Unable to send feature report.");
+ }
+
+};