cadMousePro-daemon/src/HID.h
branchv_0
changeset 8 465572518625
parent 6 975f38eb1e12
child 11 bb42abd9f510
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#pragma once
+
+#include <array>
+#include <vector>
+#include <memory>
+#include <unistd.h>
+#include <cassert>
+
+#include <hidapi/hidapi.h>
+
+using Packet = std::vector<uint8_t>;
+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<hid_device> 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<wchar_t, 200 > 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<wchar_t, 200 > 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<wchar_t, 200 > 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.");
+	}
+
+};