--- 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 <iostream>
#include <array>
#include <vector>
+#include <memory>
+#include <unistd.h>
+#include <cassert>
+#include <type_traits>
#include <hidapi/hidapi.h>
-#include <memory>
+
+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:
@@ -60,13 +66,90 @@
return buffer.data();
}
- void sendFeatureReport(std::vector<unsigned char> 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<Frequency>::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<FrequencyType> (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<unsigned char> 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<unsigned char> 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
+}