summary refs log tree commit diff
path: root/quantum/dynamic_keymap.c
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/dynamic_keymap.c')
-rw-r--r--quantum/dynamic_keymap.c56
1 files changed, 42 insertions, 14 deletions
diff --git a/quantum/dynamic_keymap.c b/quantum/dynamic_keymap.c
index e9529ed14e..c406be4585 100644
--- a/quantum/dynamic_keymap.c
+++ b/quantum/dynamic_keymap.c
@@ -279,9 +279,8 @@ void dynamic_keymap_macro_send(uint8_t id) {
     p         = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR);
     void *end = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE);
     while (id > 0) {
-        // If we are past the end of the buffer, then the buffer
-        // contents are garbage, i.e. there were not DYNAMIC_KEYMAP_MACRO_COUNT
-        // nulls in the buffer.
+        // If we are past the end of the buffer, then there is
+        // no Nth macro in the buffer.
         if (p == end) {
             return;
         }
@@ -291,9 +290,8 @@ void dynamic_keymap_macro_send(uint8_t id) {
         ++p;
     }
 
-    // Send the macro string one or three chars at a time
-    // by making temporary 1 or 3 char strings
-    char data[4] = {0, 0, 0, 0};
+    // Send the macro string by making a temporary string.
+    char data[8] = {0};
     // We already checked there was a null at the end of
     // the buffer, so this cannot go past the end
     while (1) {
@@ -303,14 +301,44 @@ void dynamic_keymap_macro_send(uint8_t id) {
         if (data[0] == 0) {
             break;
         }
-        // If the char is magic (tap, down, up),
-        // add the next char (key to use) and send a 3 char string.
-        if (data[0] == SS_TAP_CODE || data[0] == SS_DOWN_CODE || data[0] == SS_UP_CODE) {
-            data[1] = data[0];
-            data[0] = SS_QMK_PREFIX;
-            data[2] = eeprom_read_byte(p++);
-            if (data[2] == 0) {
-                break;
+        if (data[0] == SS_QMK_PREFIX) {
+            // Get the code
+            data[1] = eeprom_read_byte(p++);
+            // Unexpected null, abort.
+            if (data[1] == 0) {
+                return;
+            }
+            if (data[1] == SS_TAP_CODE || data[1] == SS_DOWN_CODE || data[1] == SS_UP_CODE) {
+                // Get the keycode
+                data[2] = eeprom_read_byte(p++);
+                // Unexpected null, abort.
+                if (data[2] == 0) {
+                    return;
+                }
+                // Null terminate
+                data[3] = 0;
+            } else if (data[1] == SS_DELAY_CODE) {
+                // Get the number and '|'
+                // At most this is 4 digits plus '|'
+                uint8_t i = 2;
+                while (1) {
+                    data[i] = eeprom_read_byte(p++);
+                    // Unexpected null, abort
+                    if (data[i] == 0) {
+                        return;
+                    }
+                    // Found '|', send it
+                    if (data[i] == '|') {
+                        data[i + 1] = 0;
+                        break;
+                    }
+                    // If haven't found '|' by i==6 then
+                    // number too big, abort
+                    if (i == 6) {
+                        return;
+                    }
+                    ++i;
+                }
             }
         }
         send_string_with_delay(data, DYNAMIC_KEYMAP_MACRO_DELAY);