- key.row < MATRIX_ROWS && // possibly redundant
- key.col < MATRIX_COLS ) // possibly redundant
- {
- uint16_t keycode = dynamic_keymap_get_keycode(layer, key.row, key.col);
-
- // If keycode is not "empty", return it, otherwise
- // drop down to return the one in flash
- if ( keycode != KC_EENULL)
- {
- return keycode;
+ key.row < MATRIX_ROWS &&
+ key.col < MATRIX_COLS ) {
+ return dynamic_keymap_get_keycode(layer, key.row, key.col);
+ } else {
+ return KC_NO;
+ }
+}
+
+
+
+uint8_t dynamic_keymap_macro_get_count(void)
+{
+ return DYNAMIC_KEYMAP_MACRO_COUNT;
+}
+
+uint16_t dynamic_keymap_macro_get_buffer_size(void)
+{
+ return DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE;
+}
+
+void dynamic_keymap_macro_get_buffer( uint16_t offset, uint16_t size, uint8_t *data )
+{
+ void *source = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+offset);
+ uint8_t *target = data;
+ for ( uint16_t i = 0; i < size; i++ ) {
+ if ( offset + i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE ) {
+ *target = eeprom_read_byte(source);
+ } else {
+ *target = 0x00;
+ }
+ source++;
+ target++;
+ }
+}
+
+void dynamic_keymap_macro_set_buffer( uint16_t offset, uint16_t size, uint8_t *data )
+{
+ void *target = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+offset);
+ uint8_t *source = data;
+ for ( uint16_t i = 0; i < size; i++ ) {
+ if ( offset + i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE ) {
+ eeprom_update_byte(target, *source);
+ }
+ source++;
+ target++;
+ }
+}
+
+void dynamic_keymap_macro_reset(void)
+{
+ void *p = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR);
+ void *end = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE);
+ while ( p != end ) {
+ eeprom_update_byte(p, 0);
+ ++p;
+ }
+}
+
+void dynamic_keymap_macro_send( uint8_t id )
+{
+ if ( id >= DYNAMIC_KEYMAP_MACRO_COUNT ) {
+ return;
+ }
+
+ // Check the last byte of the buffer.
+ // If it's not zero, then we are in the middle
+ // of buffer writing, possibly an aborted buffer
+ // write. So do nothing.
+ void *p = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE-1);
+ if ( eeprom_read_byte(p) != 0 ) {
+ return;
+ }
+
+ // Skip N null characters
+ // p will then point to the Nth macro
+ 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 ( p == end ) {
+ return;