Support getting version of HID++ 1.0 devices

This commit is contained in:
pixl
2020-06-18 04:47:04 -04:00
parent 7571be1f54
commit ecc5062e0f
8 changed files with 165 additions and 10 deletions

View File

@@ -2,6 +2,8 @@
#include "Device.h"
#include "Report.h"
#include "../hidpp20/features/Root.h"
#include "../hidpp20/Error.h"
#include "../hidpp10/Error.h"
using namespace logid::backend;
using namespace logid::backend::hidpp;
@@ -30,13 +32,24 @@ Device::Device(const std::string& path, DeviceIndex index):
if(!supported_reports)
throw InvalidDevice(InvalidDevice::NoHIDPPReport);
Report versionRequest(Report::Type::Short, index, hidpp20::FeatureID::ROOT,
hidpp20::Root::Ping, LOGID_HIDPP_SOFTWARE_ID);
try
{
Report versionRequest(Report::Type::Short, index, hidpp20::FeatureID::ROOT,
hidpp20::Root::Ping, LOGID_HIDPP_SOFTWARE_ID);
///TODO: Catch error
auto versionResponse = sendReport(versionRequest);
auto versionResponse_params = versionResponse.paramBegin();
_version = std::make_tuple(versionResponse_params[0], versionResponse_params[1]);
auto versionResponse = sendReport(versionRequest);
auto versionResponse_params = versionResponse.paramBegin();
_version = std::make_tuple(versionResponse_params[0], versionResponse_params[1]);
}
catch(hidpp10::Error &e)
{
// Valid HID++ 1.0 devices should send an InvalidSubID error
if(e.code() != hidpp10::Error::InvalidSubID)
throw;
// HID++ 2.0 is not supported, assume HID++ 1.0
_version = std::make_tuple(1, 0);
}
// Pass all HID++ events with device index to this device.
RawEventHandler rawEventHandler;
@@ -88,7 +101,18 @@ Report Device::sendReport(Report& report)
}
auto raw_response = raw_device->sendReport(report.rawReport());
return Report(raw_response);
Report response(raw_response);
Report::hidpp10_error hidpp10Error{};
if(response.isError10(&hidpp10Error))
throw hidpp10::Error(hidpp10Error.error_code);
Report::hidpp20_error hidpp20Error{};
if(response.isError20(&hidpp20Error))
throw hidpp10::Error(hidpp20Error.error_code);
return response;
}
void Device::listen()

View File

@@ -2,6 +2,8 @@
#include <algorithm>
#include <cassert>
#include "Report.h"
#include "../hidpp10/Error.h"
#include "../hidpp20/Error.h"
using namespace logid::backend::hidpp;
using namespace logid::backend;
@@ -159,9 +161,31 @@ void Report::setParams(const std::vector<uint8_t>& _params)
_data[Offset::Parameters + i] = _params[i];
}
bool Report::isError10(Report::hidpp10_error *error)
{
assert(error != nullptr);
if(_data[Offset::Type] != Type::Short ||
_data[Offset::SubID] != hidpp10::ErrorID)
return false;
error->sub_id = _data[3];
error->address = _data[4];
error->error_code = _data[5];
return true;
}
bool Report::isError20(Report::hidpp20_error* error)
{
if(_data[Offset::Type] != Type::Long ||
_data[Offset::Feature] != 0xff)
_data[Offset::Feature] != hidpp20::ErrorID)
return false;
error->feature_index= _data[3];
error->function = (_data[4] >> 4) & 0x0f;
error->software_id = _data[4] & 0x0f;
error->error_code = _data[5];
return true;
}

View File

@@ -18,6 +18,7 @@ namespace logid::backend::hidpp
{
static constexpr uint8_t Type = 0;
static constexpr uint8_t DeviceIndex = 1;
static constexpr uint8_t SubID = 2;
static constexpr uint8_t Feature = 2;
static constexpr uint8_t Function = 3;
static constexpr uint8_t Parameters = 4;
@@ -59,6 +60,13 @@ namespace logid::backend::hidpp
std::vector<uint8_t>::iterator paramEnd() { return _data.end(); }
void setParams(const std::vector<uint8_t>& _params);
struct hidpp10_error
{
uint8_t sub_id, address, error_code;
};
bool isError10(hidpp10_error* error);
struct hidpp20_error
{
uint8_t feature_index, function, software_id, error_code;

View File

@@ -1,7 +1,7 @@
#ifndef LOGID_HIDPP_DEFS_H
#define LOGID_HIDPP_DEFS_H
#define LOGID_HIDPP_SOFTWARE_ID 1
#define LOGID_HIDPP_SOFTWARE_ID 0
namespace logid::backend::hidpp
{