diff options
Diffstat (limited to 'quantum/dynamic_keymap.c')
-rw-r--r-- | quantum/dynamic_keymap.c | 56 |
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); |