summary refs log tree commit diff stats
path: root/src/keymaps/soispha/hid/hid.c
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2024-12-30 18:22:41 +0100
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2024-12-30 18:22:41 +0100
commitba9f12810f7dc4969ac175f6e959d5fe6407747d (patch)
treef4039e46985d56bac471bd8568f96b159a92b2ae /src/keymaps/soispha/hid/hid.c
parentfeat(src): Make usable (diff)
downloadqmk_layout-ba9f12810f7dc4969ac175f6e959d5fe6407747d.zip
feat(treewide): Migrate the Unicode handling to a custom c program, that works via rawhid
Diffstat (limited to '')
-rw-r--r--src/keymaps/soispha/hid/hid.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/keymaps/soispha/hid/hid.c b/src/keymaps/soispha/hid/hid.c
new file mode 100644
index 0000000..73b7370
--- /dev/null
+++ b/src/keymaps/soispha/hid/hid.c
@@ -0,0 +1,47 @@
+#include "hid.h"
+#include "raw_hid.h"
+#include <stdint.h>
+#include <string.h>
+
+void hid_send(uint32_t hex) {
+  uint8_t length = 32;
+
+  uint8_t response[length];
+  memset(response, 0, length);
+
+  uint8_t first, second, third, fourth;
+
+  uint8_t n = 1;
+  if (*(char *)&n == 1) {
+    // Little endian
+    first = (uint8_t)hex;
+    second = (uint8_t)(hex >> 8);
+    third = (uint8_t)(hex >> 16);
+    fourth = (uint8_t)(hex >> 24);
+  } else {
+    // Big endian
+    fourth = (uint8_t)hex;
+    third = (uint8_t)(hex << 8);
+    second = (uint8_t)(hex << 16);
+    first = (uint8_t)(hex << 24);
+  }
+
+  response[0] = first;
+  response[1] = second;
+  response[2] = third;
+  response[3] = fourth;
+
+  raw_hid_send(response, length);
+}
+
+// `data` is a pointer to the buffer containing the received HID report
+// `length` is the length of the report - always `RAW_EPSIZE`
+void raw_hid_receive(uint8_t *data, uint8_t length) {
+  uint8_t response[length];
+  memset(response, 0, length);
+  response[0] = 'B';
+
+  if (data[0] == 'A') {
+    raw_hid_send(response, length);
+  }
+}