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."); + } + +};