From 6919d477444b07386e0da1a63f67c6b1ea3a3f6c Mon Sep 17 00:00:00 2001 From: Kai Ryu Date: Mon, 18 Aug 2014 14:02:46 +0900 Subject: [PATCH] Some fix for reading keymap from eeprom --- keyboard/tentapad/keymap_common.c | 48 ++++++++++++++++++++++++++---- keyboard/tentapad/keymap_common.h | 8 +++-- keyboard/tentapad/keymap_default.c | 30 +++++++++---------- 3 files changed, 62 insertions(+), 24 deletions(-) diff --git a/keyboard/tentapad/keymap_common.c b/keyboard/tentapad/keymap_common.c index 9a016754..242e1361 100644 --- a/keyboard/tentapad/keymap_common.c +++ b/keyboard/tentapad/keymap_common.c @@ -22,22 +22,48 @@ along with this program. If not, see . #include "keymap_common.h" static uint8_t keymaps_cache[KEYMAPS_COUNT][MATRIX_ROWS][MATRIX_COLS]; +static uint8_t last_layer_number = 1; void keymaps_cache_init(void) { for (uint8_t layer = 0; layer < KEYMAPS_COUNT; layer++) { + uint8_t non_empty_key = 0; for (uint8_t row = 0; row < MATRIX_ROWS; row++) { for (uint8_t col = 0; col < MATRIX_COLS; col++) { + if (col == 3) { + keymaps_cache[layer][row][col] = KC_FN28; + } + else if (col == 4) { + keymaps_cache[layer][row][col] = KC_FN29; + } + else { + if (layer < CONFIG_LAYER) { #ifndef KEYMAP_IN_EEPROM_ENABLE - keymaps_cache[layer][row][col] = pgm_read_byte(&keymaps[layer][row][col]); + keymaps_cache[layer][row][col] = pgm_read_byte(&keymaps[layer][row][col]); #else - keymaps_cache[layer][row][col] = eeconfig_read_keymap_key(layer, row, col); + keymaps_cache[layer][row][col] = eeconfig_read_keymap_key(layer, row, col); #endif + if (keymaps_cache[layer][row][col] > KC_TRANSPARENT) { + non_empty_key++; + } + } + else { + keymaps_cache[layer][row][col] = pgm_read_byte(&keymaps[layer][row][col]); + } + } } } + if (non_empty_key) { + last_layer_number = layer; + } } } +uint8_t last_layer(void) +{ + return last_layer_number; +} + /* translates key to keycode */ uint8_t keymap_key_to_keycode(uint8_t layer, key_t key) { @@ -47,13 +73,23 @@ uint8_t keymap_key_to_keycode(uint8_t layer, key_t key) /* translates Fn keycode to action */ action_t keymap_fn_to_action(uint8_t keycode) { - return (action_t) { #ifndef KEYMAP_IN_EEPROM_ENABLE + return (action_t) { .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) -#else - .code = eeconfig_read_keymap_fn_action(FN_INDEX(keycode)) -#endif }; +#else + uint8_t index = FN_INDEX(keycode); + if (index < RESERVED_FN) { + return (action_t) { + .code = eeconfig_read_keymap_fn_action(index) + }; + } + else { + return (action_t) { + .code = pgm_read_word(&fn_actions[index]) + }; + } +#endif } #ifdef KEYMAP_IN_EEPROM_ENABLE diff --git a/keyboard/tentapad/keymap_common.h b/keyboard/tentapad/keymap_common.h index bfe7261c..5ccbff43 100644 --- a/keyboard/tentapad/keymap_common.h +++ b/keyboard/tentapad/keymap_common.h @@ -23,14 +23,18 @@ along with this program. If not, see . extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; extern const uint16_t fn_actions[]; +#define CONFIG_LAYER (KEYMAPS_COUNT - 1) +#define RESERVED_FN (FN_ACTIONS_COUNT - 4) + void keymaps_cache_init(void); +uint8_t last_layer(void); /* TentaPad keymap definition macro */ #define KEYMAP( \ - K1, K2, TT, TP, FN \ + K1, K2, TT \ ) { \ - { KC_##K1, KC_##K2, KC_##TT, KC_##TP, KC_##FN } \ + { KC_##K1, KC_##K2, KC_##TT } \ } #endif diff --git a/keyboard/tentapad/keymap_default.c b/keyboard/tentapad/keymap_default.c index 5f1a291d..b0862c4f 100644 --- a/keyboard/tentapad/keymap_default.c +++ b/keyboard/tentapad/keymap_default.c @@ -23,28 +23,25 @@ along with this program. If not, see . #include "keymap_common.h" enum function_id { - CONFIG_MODE = 0, + TOUCH_PROXIMITY = 0, + CONFIG_MODE, SWITCH_LAYOUT, SWITCH_BACKLIGHT }; -enum { - CONFIG_LAYER = 8, -}; - // Default #ifdef KEYMAP_SECTION_ENABLE const uint8_t keymaps[KEYMAPS_COUNT][MATRIX_ROWS][MATRIX_COLS] __attribute__ ((section (".keymap.keymaps"))) = { #else const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { #endif - [0] = KEYMAP( Z, X, ESC, NO, FN0 ), - [1] = KEYMAP( BTN1,BTN2,ESC, NO, FN0 ), - [2] = KEYMAP( LEFT,RGHT,ESC, NO, FN0 ), - [3] = KEYMAP( UP, DOWN,ESC, NO, FN0 ), - [4] = KEYMAP( PGUP,PGDN,ESC, NO, FN0 ), - [5] = KEYMAP( SPC, ESC, ESC, NO, FN0 ), - [CONFIG_LAYER] = KEYMAP( FN1, FN2, NO, NO, FN0 ), + [0] = KEYMAP( Z, X, ESC ), + [1] = KEYMAP( BTN1,BTN2,ESC ), + [2] = KEYMAP( LEFT,RGHT,ESC ), + [3] = KEYMAP( UP, DOWN,ESC ), + [4] = KEYMAP( PGUP,PGDN,ESC ), + [5] = KEYMAP( SPC, ESC, ESC ), + [CONFIG_LAYER] = KEYMAP( FN30, FN31, NO ) }; /* @@ -55,9 +52,10 @@ const uint16_t fn_actions[FN_ACTIONS_COUNT] __attribute__ ((section (".keymap.fn #else const uint16_t fn_actions[] PROGMEM = { #endif - [0] = ACTION_FUNCTION(CONFIG_MODE), - [1] = ACTION_FUNCTION(SWITCH_LAYOUT), - [2] = ACTION_FUNCTION(SWITCH_BACKLIGHT) + [28] = ACTION_FUNCTION(TOUCH_PROXIMITY), + [29] = ACTION_FUNCTION(CONFIG_MODE), + [30] = ACTION_FUNCTION(SWITCH_LAYOUT), + [31] = ACTION_FUNCTION(SWITCH_BACKLIGHT) }; #ifdef KEYMAP_IN_EEPROM_ENABLE @@ -95,7 +93,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) if (config_mode) { default_layer_set(1UL<