123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- #include "config.h"
- #include "keymap.h"
- #include "tmk_core/common/eeprom.h"
- #include "progmem.h"
- #include "quantum.h"
- #include "dynamic_keymap.h"
- #ifdef DYNAMIC_KEYMAP_ENABLE
- #ifndef DYNAMIC_KEYMAP_EEPROM_ADDR
- #error DYNAMIC_KEYMAP_EEPROM_ADDR not defined
- #endif
- #ifndef DYNAMIC_KEYMAP_LAYER_COUNT
- #error DYNAMIC_KEYMAP_LAYER_COUNT not defined
- #endif
- #ifndef DYNAMIC_KEYMAP_MACRO_COUNT
- #error DYNAMIC_KEYMAP_MACRO_COUNT not defined
- #endif
- #ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
- #error DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR not defined
- #endif
- #ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE
- #error DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE not defined
- #endif
- uint8_t dynamic_keymap_get_layer_count(void)
- {
- return DYNAMIC_KEYMAP_LAYER_COUNT;
- }
- void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column)
- {
-
- return ((void*)DYNAMIC_KEYMAP_EEPROM_ADDR) + ( layer * MATRIX_ROWS * MATRIX_COLS * 2 ) +
- ( row * MATRIX_COLS * 2 ) + ( column * 2 );
- }
- uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column)
- {
- void *address = dynamic_keymap_key_to_eeprom_address(layer, row, column);
-
- uint16_t keycode = eeprom_read_byte(address) << 8;
- keycode |= eeprom_read_byte(address + 1);
- return keycode;
- }
- void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode)
- {
- void *address = dynamic_keymap_key_to_eeprom_address(layer, row, column);
-
- eeprom_update_byte(address, (uint8_t)(keycode >> 8));
- eeprom_update_byte(address+1, (uint8_t)(keycode & 0xFF));
- }
- void dynamic_keymap_reset(void)
- {
-
-
-
- for ( int layer = 0; layer < DYNAMIC_KEYMAP_LAYER_COUNT; layer++ ) {
- for ( int row = 0; row < MATRIX_ROWS; row++ ) {
- for ( int column = 0; column < MATRIX_COLS; column++ ) {
- dynamic_keymap_set_keycode(layer, row, column, pgm_read_word(&keymaps[layer][row][column]));
- }
- }
- }
- }
- void dynamic_keymap_get_buffer( uint16_t offset, uint16_t size, uint8_t *data )
- {
- uint16_t dynamic_keymap_eeprom_size = DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2;
- void *source = (void*)(DYNAMIC_KEYMAP_EEPROM_ADDR+offset);
- uint8_t *target = data;
- for ( uint16_t i = 0; i < size; i++ ) {
- if ( offset + i < dynamic_keymap_eeprom_size ) {
- *target = eeprom_read_byte(source);
- } else {
- *target = 0x00;
- }
- source++;
- target++;
- }
- }
- void dynamic_keymap_set_buffer( uint16_t offset, uint16_t size, uint8_t *data )
- {
- uint16_t dynamic_keymap_eeprom_size = DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2;
- void *target = (void*)(DYNAMIC_KEYMAP_EEPROM_ADDR+offset);
- uint8_t *source = data;
- for ( uint16_t i = 0; i < size; i++ ) {
- if ( offset + i < dynamic_keymap_eeprom_size ) {
- eeprom_update_byte(target, *source);
- }
- source++;
- target++;
- }
- }
- uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
- {
- if ( layer < DYNAMIC_KEYMAP_LAYER_COUNT &&
- 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;
- }
-
-
-
-
- void *p = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE-1);
- if ( eeprom_read_byte(p) != 0 ) {
- return;
- }
-
-
- p = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR);
- void *end = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE);
- while ( id > 0 ) {
-
-
-
- if ( p == end ) {
- return;
- }
- if ( eeprom_read_byte(p) == 0 ) {
- --id;
- }
- ++p;
- }
-
-
- char data[2] = { 0, 0 };
-
-
- while ( 1 ) {
- data[0] = eeprom_read_byte(p);
-
- if ( data[0] == 0 ) {
- break;
- }
- send_string(data);
- ++p;
- }
- }
- #endif
|