CadMouseConfig class, frequency, lift-off detection, smart scrolling v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Sun, 18 Aug 2019 23:00:21 +0200
branchv_0
changeset 4 405aa9de65d2
parent 3 1197b42e8b2e
child 5 6799cec5c2f8
CadMouseConfig class, frequency, lift-off detection, smart scrolling
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 <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
+}