/**
* 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, version 3 of the License.
*
* 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(const 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.");
}
};