Improved dynamic keymaps (#3972)

* Improved dynamic keymaps

* K&R sucks
This commit is contained in:
Wilba6582 2018-09-28 14:09:14 +10:00 committed by Jack Humbert
parent b382076ad1
commit a173eda6d2
4 changed files with 22 additions and 38 deletions

View file

@ -81,9 +81,9 @@ void raw_hid_receive( uint8_t *data, uint8_t length )
dynamic_keymap_set_keycode( command_data[0], command_data[1], command_data[2], ( command_data[3] << 8 ) | command_data[4] ); dynamic_keymap_set_keycode( command_data[0], command_data[1], command_data[2], ( command_data[3] << 8 ) | command_data[4] );
break; break;
} }
case id_dynamic_keymap_clear_all: case id_dynamic_keymap_reset:
{ {
dynamic_keymap_clear_all(); dynamic_keymap_reset();
break; break;
} }
#endif // DYNAMIC_KEYMAP_ENABLE #endif // DYNAMIC_KEYMAP_ENABLE
@ -171,9 +171,8 @@ void matrix_init_kb(void)
#endif // RGB_BACKLIGHT_ENABLED #endif // RGB_BACKLIGHT_ENABLED
#ifdef DYNAMIC_KEYMAP_ENABLE #ifdef DYNAMIC_KEYMAP_ENABLE
// This saves "empty" keymaps so it falls back to the keymaps // This resets the keymaps in EEPROM to what is in flash.
// in the firmware (aka. progmem/flash) dynamic_keymap_reset();
dynamic_keymap_clear_all();
#endif #endif
// Save the magic number last, in case saving was interrupted // Save the magic number last, in case saving was interrupted

View file

@ -24,7 +24,7 @@ enum zeal60_command_id
id_set_keyboard_value, id_set_keyboard_value,
id_dynamic_keymap_get_keycode, id_dynamic_keymap_get_keycode,
id_dynamic_keymap_set_keycode, id_dynamic_keymap_set_keycode,
id_dynamic_keymap_clear_all, id_dynamic_keymap_reset,
id_backlight_config_set_value, id_backlight_config_set_value,
id_backlight_config_get_value, id_backlight_config_get_value,
id_backlight_config_save, id_backlight_config_save,

View file

@ -16,6 +16,8 @@
#include "config.h" #include "config.h"
#include "keymap.h" // to get keymaps[][][] #include "keymap.h" // to get keymaps[][][]
#include "tmk_core/common/eeprom.h"
#include "progmem.h"// to read default from flash
#include "dynamic_keymap.h" #include "dynamic_keymap.h"
@ -29,8 +31,6 @@
#error DYNAMIC_KEYMAP_LAYER_COUNT not defined #error DYNAMIC_KEYMAP_LAYER_COUNT not defined
#endif #endif
#define KC_EENULL 0xFFFF // TODO: move to enum quantum_keycodes
void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column) void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column)
{ {
// TODO: optimize this with some left shifts // TODO: optimize this with some left shifts
@ -55,16 +55,15 @@ void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint
eeprom_update_byte(address+1, (uint8_t)(keycode & 0xFF)); eeprom_update_byte(address+1, (uint8_t)(keycode & 0xFF));
} }
void dynamic_keymap_clear_all(void) void dynamic_keymap_reset(void)
{ {
// Save "empty" keymaps. // Reset the keymaps in EEPROM to what is in flash.
for ( int layer = 0; layer < DYNAMIC_KEYMAP_LAYER_COUNT; layer++ ) // All keyboards using dynamic keymaps should define a layout
{ // for the same number of layers as DYNAMIC_KEYMAP_LAYER_COUNT.
for ( int row = 0; row < MATRIX_ROWS; row++ ) 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++ ) for ( int column = 0; column < MATRIX_COLS; column++ ) {
{ dynamic_keymap_set_keycode(layer, row, column, pgm_read_word(&keymaps[layer][row][column]));
dynamic_keymap_set_keycode(layer, row, column, KC_EENULL);
} }
} }
} }
@ -73,25 +72,14 @@ void dynamic_keymap_clear_all(void)
// This overrides the one in quantum/keymap_common.c // This overrides the one in quantum/keymap_common.c
uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
{ {
// This used to test EEPROM for magic bytes, but it was redundant.
// Test for EEPROM usage change (fresh install, address change, etc.)
// externally and call dynamic_keymap_default_save()
if ( layer < DYNAMIC_KEYMAP_LAYER_COUNT && if ( layer < DYNAMIC_KEYMAP_LAYER_COUNT &&
key.row < MATRIX_ROWS && // possibly redundant key.row < MATRIX_ROWS &&
key.col < MATRIX_COLS ) // possibly redundant key.col < MATRIX_COLS ) {
{ return dynamic_keymap_get_keycode(layer, key.row, key.col);
uint16_t keycode = dynamic_keymap_get_keycode(layer, key.row, key.col); } else {
return KC_NO;
// If keycode is not "empty", return it, otherwise
// drop down to return the one in flash
if ( keycode != KC_EENULL)
{
return keycode;
} }
} }
return pgm_read_word(&keymaps[layer][key.row][key.col]);
}
#endif // DYNAMIC_KEYMAP_ENABLE #endif // DYNAMIC_KEYMAP_ENABLE

View file

@ -13,9 +13,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#pragma once
#ifndef DYNAMIC_KEYMAP_H
#define DYNAMIC_KEYMAP_H
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
@ -23,9 +21,8 @@
void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column); void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column);
uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column); uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column);
void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode); void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode);
void dynamic_keymap_clear_all(void); void dynamic_keymap_reset(void);
// This overrides the one in quantum/keymap_common.c // This overrides the one in quantum/keymap_common.c
// uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key); // uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key);
#endif //DYNAMIC_KEYMAP_H