From e50e566f20e4078532e424dbc14039b4e42a9ea7 Mon Sep 17 00:00:00 2001 From: pixl Date: Sat, 29 Apr 2023 19:34:22 -0400 Subject: [PATCH] Add Logi Bolt support --- src/logid/backend/hidpp10/Receiver.cpp | 57 +++++++++++++++++++++----- src/logid/backend/hidpp10/Receiver.h | 3 ++ 2 files changed, 49 insertions(+), 11 deletions(-) diff --git a/src/logid/backend/hidpp10/Receiver.cpp b/src/logid/backend/hidpp10/Receiver.cpp index 6e2da12..667e050 100644 --- a/src/logid/backend/hidpp10/Receiver.cpp +++ b/src/logid/backend/hidpp10/Receiver.cpp @@ -17,7 +17,6 @@ */ #include -#include #include using namespace logid::backend::hidpp10; @@ -36,6 +35,9 @@ Receiver::Receiver(const std::string& path, const std::shared_ptr request(1); request[0] = index; - request[0] += 0x1f; + if (!_is_bolt) + request[0] += 0x1f; auto response = getRegister(PairingInfo, request, hidpp::ReportType::Long); @@ -136,7 +139,10 @@ struct Receiver::ExtendedPairingInfo Receiver::getExtendedPairingInfo(hidpp::DeviceIndex index) { std::vector request(1); request[0] = index; - request[0] += 0x2f; + if (_is_bolt) + request[0] += 0x50; + else + request[0] += 0x2f; auto response = getRegister(PairingInfo, request, hidpp::ReportType::Long); @@ -159,18 +165,47 @@ Receiver::getExtendedPairingInfo(hidpp::DeviceIndex index) { } std::string Receiver::getDeviceName(hidpp::DeviceIndex index) { - std::vector request(1); + std::vector request(2); + std::string name; request[0] = index; - request[0] += 0x3f; + if (_is_bolt) { + /* Undocumented, deduced the following + * param 1 refers to part of string, 1-indexed + * + * response at 0x01 is [reg] [param 1] [size] [str...] + * response at 0x02-... is [next part of str...] + */ + request[1] = 0x01; - auto response = getRegister(PairingInfo, request, hidpp::ReportType::Long); + auto resp = getRegister(PairingInfo, request, hidpp::ReportType::Long); + const uint8_t size = resp[2]; + const uint8_t chunk_size = resp.size() - 3; + const uint8_t chunks = size/chunk_size + (size % chunk_size ? 1 : 0); - uint8_t size = response[1]; - assert(size <= 14); + name.resize(size, ' '); + for (int i = 0; i < chunks; ++i) { + for (int j = 0; j < chunk_size; ++j) { + name[i*chunk_size + j] = (char)resp[j + 3]; + } - std::string name(size, ' '); - for (std::size_t i = 0; i < size; i++) - name[i] = (char) (response[i + 2]); + if (i < chunks - 1) { + request[1] = i+1; + resp = getRegister(PairingInfo, request, hidpp::ReportType::Long); + } + } + + } else { + request[0] += 0x3f; + + auto response = getRegister(PairingInfo, request, hidpp::ReportType::Long); + + const uint8_t size = response[1]; + + name.resize(size, ' '); + for (std::size_t i = 0; i < size && i + 2 < response.size(); i++) + name[i] = (char) (response[i + 2]); + + } return name; } diff --git a/src/logid/backend/hidpp10/Receiver.h b/src/logid/backend/hidpp10/Receiver.h index f376620..764f334 100644 --- a/src/logid/backend/hidpp10/Receiver.h +++ b/src/logid/backend/hidpp10/Receiver.h @@ -140,6 +140,9 @@ namespace logid::backend::hidpp10 { static hidpp::DeviceIndex deviceDisconnectionEvent(const hidpp::Report& report); static hidpp::DeviceConnectionEvent deviceConnectionEvent(const hidpp::Report& report); + + private: + bool _is_bolt = false; }; }