# HG changeset patch # User František Kučera # Date 1566162021 -7200 # Node ID 405aa9de65d2951b2b14961d883ef34fe6049845 # Parent 1197b42e8b2ef3e19d17f0499291b4b41373678b CadMouseConfig class, frequency, lift-off detection, smart scrolling diff -r 1197b42e8b2e -r 405aa9de65d2 src/cadMousePro.cpp --- a/src/cadMousePro.cpp Sun Aug 18 00:10:30 2019 +0200 +++ b/src/cadMousePro.cpp Sun Aug 18 23:00:21 2019 +0200 @@ -1,9 +1,15 @@ #include #include #include +#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: @@ -60,13 +66,90 @@ return buffer.data(); } - void sendFeatureReport(std::vector 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."); } }; +enum class Frequency : uint8_t { + Hz_0125 = 8, + Hz_0250 = 4, + Hz_0500 = 2, + Hz_1000 = 1 +}; + +using FrequencyType = std::underlying_type::type; + +class CadMouseConfig { +private: + bool liftOffDetection = true; + bool smartScrolling = false; + Frequency frequency = Frequency::Hz_1000; +public: + + void setFrequency(Frequency frequency) { + this->frequency = frequency; + } + + void setLiftOffDetection(bool liftOffDetection) { + this->liftOffDetection = liftOffDetection; + } + + void setSmartScrolling(bool smartScrolling) { + this->smartScrolling = smartScrolling; + } + + Packet serialize() { + Packet data; + data.reserve(32); + + data.push_back(0x10); // report ID + data.push_back(0x00); // option + + data.push_back(0x1c); // speed + + data.push_back(liftOffDetection ? 0x00 : 0x1f); + + if (smartScrolling) { + data.push_back(0x00); + data.push_back(0x00); + data.push_back(0x00); + data.push_back(0x01); + } else { + data.push_back(0x01); + data.push_back(0xff); + data.push_back(0x00); + data.push_back(0x00); + } + + for (int i = 0; i < 8; i++) data.push_back(0x00); // constant padding or magic + + // magic constants or unknown fields + data.push_back(0x00); + data.push_back(0x03); + data.push_back(0x00); + data.push_back(0x0a); + data.push_back(0x0b); + data.push_back(0x0c); + data.push_back(0x0c); + data.push_back(0x0e); + data.push_back(0x0d); + data.push_back(0x2f); + data.push_back(0x00); + data.push_back(0x1e); + + data.push_back(0x00); + data.push_back(0x00); + data.push_back(0x00); + data.push_back(static_cast (frequency)); + + return data; + } + +}; + int main(int argc, char** argv) { try { @@ -77,18 +160,13 @@ std::wcout << L"product: " << mouse.getProductName() << std::endl; // std::wcout << L"serial number: " << mouse.getSerialNumber() << std::endl; // throws exception - std::vector enableFreeWheel{0x10, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0a, 0x0b, 0x0c, 0x0c, 0x0e, 0x0d, 0x2f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01}; - std::vector disableFreeWheel{0x10, 0x00, 0x1c, 0x00, 0x01, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0a, 0x0b, 0x0c, 0x0c, 0x0e, 0x0d, 0x2f, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01}; - // mouse.sendFeatureReport(enableFreeWheel); - mouse.sendFeatureReport(disableFreeWheel); + CadMouseConfig config; - // TODO: enable acceleration - // TODO: enable lift-off detection - // TODO: sensof polling rate – frequency - // TODO: wheel scrolling size – lines, page + mouse.sendFeatureReport(config.serialize()); + return 0; } catch (const HIDException& e) { std::wcout << L"HIDException: " << e.getMessage() << std::endl; - + return 1; } -} \ No newline at end of file +}