Zeal60/Zeal65/M60-A implementation (#3879)
* Initial version of zeal60
* WIP
* Fixes issue #900
* Adding RGB underglow functionality.
Fixed a compile-time conflict caused by enabling RGB underglow functionality.
* Refactor RPC protocol
* Fix last merge
* README for RGB underglow updated.
* Additional README changes.
* Adding RGBW strip software-based current-limiting functionality.
* RGBW current-limiting functionality should be handled by RGBSTRIP_MAX_CURRENT_PER_LIGHT instead.
* Updated README to reflect implementation of built-in current limiting.
* Keymap readability improvements.
* Minor keymap improvements.
* Fixed LED driver init sequence, formatting
* Dimming implementation tested, working.
* Stab LEDs synced with spacebar hits in effects.
* RGB underglow tested and functional. Simplified README for RGB underglow.
* Undid accidental file deletion from previous merge conflict. Safer values for RGB underglow.
* Improved arrow key positions in keymap.
* Added functionality to correct uneven RGB underglow. Refactored related code.
* Reverted to safer values for underglow.
* Changes for v0.3
* Custom LED brightness scaling will take place after current adjustment in order to avoid being overridden.
* Create keymap.c
Added split backspace and split shift to ISO layout
* Create config.h
Turned on LEDs for new layout
* Fixed bug where left spacebar stabilizer LED (LC06) would adopt color of row above.
* Added hhkb_wilba keymap
* Update keymap.c
* Update keymap.c
* Update keymap.c
* Added indicators, full param setting via host
* Added "mousekey" layout
* Added Zeal65 support, factory test mode
* Keycode safe range changed, caused bugs
* Bumped EEPROM version due to change in QMK keycodes
* Disable HHKB "blocked" LEDs if KC_NO in keymap
* Added "disable_hhkb_blocker_leds"
* Required overridden function for keymaps in EEPROM
* Added polar coordinate mapping, effect speed
* Force Raw HID interface number to 1 always
* Fixed last merge from master
* Added effect speed to default keymaps
* add BACKLIGHT_ prefix to vars
* add BACKLIGHT_ prefix to vars
* Keymap speed effect; keymap improvements/fixes
Readme updated to match changes
* Refactored to use common IS31FL3731/I2C drivers
* Fixed make rules, backlight disabled feature
* Make split rightshift default for Zeal65
* Added M60-A as a "version" of Zeal60.
* Renamed IS31FL3731 driver functions
* Fix suspend_wakeup_init_kb() being defined twice
* First pass refactor dynamic keymaps
* Updated to changed I2C and ISSI drivers
* Refactor zeal_color.* usage to quantum/color.*
* Updated Zeal65, fixed dynamic_keymap
* Major refactoring of Zeal60 backlight and API
* Lots of little cleanups
* Added readme.md
* Added readme.md
* Added LAYOUT_60*() macros, refactored and cleaned up default keymaps
* Fix compile error in suspend.c
* Added Zeal65 LAYOUT macros, info.json
* Added rama/m60_a, deleted zeal60/keymaps/m60_a
* Fixed rama/m60_a/keymaps/proto
* Fixed compilation error for suspend.c
* Requested changes for PR
* Fixed readme.md images
* Another readme.md fix
* Added drashna's requested changes
2018-09-13 18:37:13 +00:00
/* Copyright 2017 Jason Williams (Wilba)
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
# include "dynamic_keymap.h"
2023-07-16 13:42:56 +00:00
# include "keymap_introspection.h"
# include "action.h"
# include "eeprom.h"
# include "progmem.h"
# include "send_string.h"
# include "keycodes.h"
2022-07-28 00:42:32 +00:00
# ifdef FNV_ENABLE
# include "fnv.h"
# endif
2022-07-15 00:45:58 +00:00
# ifdef VIA_ENABLE
2023-07-16 13:42:56 +00:00
# include "via.h"
2022-07-15 00:45:58 +00:00
# define DYNAMIC_KEYMAP_EEPROM_START (VIA_EEPROM_CONFIG_END)
# else
2022-11-04 19:20:11 +00:00
# define DYNAMIC_KEYMAP_EEPROM_START (EECONFIG_SIZE)
2022-07-15 00:45:58 +00:00
# endif
2020-01-03 20:52:00 +00:00
2022-03-09 10:06:33 +00:00
# ifdef ENCODER_ENABLE
# include "encoder.h"
# else
# define NUM_ENCODERS 0
# endif
2020-01-03 20:52:00 +00:00
# ifndef DYNAMIC_KEYMAP_LAYER_COUNT
2020-01-19 16:30:34 +00:00
# define DYNAMIC_KEYMAP_LAYER_COUNT 4
2020-01-03 20:52:00 +00:00
# endif
# ifndef DYNAMIC_KEYMAP_MACRO_COUNT
2020-01-19 16:30:34 +00:00
# define DYNAMIC_KEYMAP_MACRO_COUNT 16
2020-01-03 20:52:00 +00:00
# endif
2022-02-02 04:04:37 +00:00
# ifndef TOTAL_EEPROM_BYTE_COUNT
# error Unknown total EEPROM size. Cannot derive maximum for dynamic keymaps.
# endif
2020-02-18 01:54:13 +00:00
# ifndef DYNAMIC_KEYMAP_EEPROM_MAX_ADDR
2022-02-02 04:04:37 +00:00
# define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR (TOTAL_EEPROM_BYTE_COUNT - 1)
# endif
# if DYNAMIC_KEYMAP_EEPROM_MAX_ADDR > (TOTAL_EEPROM_BYTE_COUNT - 1)
# pragma message STR(DYNAMIC_KEYMAP_EEPROM_MAX_ADDR) " > " STR((TOTAL_EEPROM_BYTE_COUNT - 1))
# error DYNAMIC_KEYMAP_EEPROM_MAX_ADDR is configured to use more space than what is available for the selected EEPROM driver
2020-02-18 01:54:13 +00:00
# endif
2020-09-16 06:16:01 +00:00
// Due to usage of uint16_t check for max 65535
# if DYNAMIC_KEYMAP_EEPROM_MAX_ADDR > 65535
2022-02-02 04:04:37 +00:00
# pragma message STR(DYNAMIC_KEYMAP_EEPROM_MAX_ADDR) " > 65535"
2020-09-16 06:16:01 +00:00
# error DYNAMIC_KEYMAP_EEPROM_MAX_ADDR must be less than 65536
# endif
2020-01-03 20:52:00 +00:00
// If DYNAMIC_KEYMAP_EEPROM_ADDR not explicitly defined in config.h,
# ifndef DYNAMIC_KEYMAP_EEPROM_ADDR
2022-07-15 00:45:58 +00:00
# define DYNAMIC_KEYMAP_EEPROM_ADDR DYNAMIC_KEYMAP_EEPROM_START
2020-01-03 20:52:00 +00:00
# endif
2022-03-09 08:29:00 +00:00
// Dynamic encoders starts after dynamic keymaps
# ifndef DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR
# define DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR (DYNAMIC_KEYMAP_EEPROM_ADDR + (DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2))
# endif
2022-03-09 10:06:33 +00:00
// Dynamic macro starts after dynamic encoders, but only when using ENCODER_MAP
# ifdef ENCODER_MAP_ENABLE
# ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
# define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR (DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR + (DYNAMIC_KEYMAP_LAYER_COUNT * NUM_ENCODERS * 2 * 2))
# endif // DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
# else // ENCODER_MAP_ENABLE
# ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
# define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR (DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR)
# endif // DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
# endif // ENCODER_MAP_ENABLE
2020-01-03 20:52:00 +00:00
2020-02-18 01:54:13 +00:00
// Sanity check that dynamic keymaps fit in available EEPROM
// If there's not 100 bytes available for macros, then something is wrong.
// The keyboard should override DYNAMIC_KEYMAP_LAYER_COUNT to reduce it,
// or DYNAMIC_KEYMAP_EEPROM_MAX_ADDR to increase it, *only if* the microcontroller has
// more than the default.
2022-03-09 10:06:33 +00:00
_Static_assert ( ( DYNAMIC_KEYMAP_EEPROM_MAX_ADDR ) - ( DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR ) > = 100 , " Dynamic keymaps are configured to use more EEPROM than is available. " ) ;
2020-02-18 01:54:13 +00:00
// Dynamic macros are stored after the keymaps and use what is available
// up to and including DYNAMIC_KEYMAP_EEPROM_MAX_ADDR.
2020-01-03 20:52:00 +00:00
# ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE
2020-02-18 01:54:13 +00:00
# define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE (DYNAMIC_KEYMAP_EEPROM_MAX_ADDR - DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + 1)
2020-01-03 20:52:00 +00:00
# endif
2018-11-30 16:43:34 +00:00
2022-07-11 19:59:16 +00:00
# ifndef DYNAMIC_KEYMAP_MACRO_DELAY
# define DYNAMIC_KEYMAP_MACRO_DELAY TAP_CODE_DELAY
# endif
2022-02-12 18:29:31 +00:00
uint8_t dynamic_keymap_get_layer_count ( void ) {
return DYNAMIC_KEYMAP_LAYER_COUNT ;
}
2018-11-30 16:43:34 +00:00
2019-08-30 18:19:03 +00:00
void * dynamic_keymap_key_to_eeprom_address ( uint8_t layer , uint8_t row , uint8_t column ) {
// TODO: optimize this with some left shifts
return ( ( void * ) DYNAMIC_KEYMAP_EEPROM_ADDR ) + ( layer * MATRIX_ROWS * MATRIX_COLS * 2 ) + ( row * MATRIX_COLS * 2 ) + ( column * 2 ) ;
Zeal60/Zeal65/M60-A implementation (#3879)
* Initial version of zeal60
* WIP
* Fixes issue #900
* Adding RGB underglow functionality.
Fixed a compile-time conflict caused by enabling RGB underglow functionality.
* Refactor RPC protocol
* Fix last merge
* README for RGB underglow updated.
* Additional README changes.
* Adding RGBW strip software-based current-limiting functionality.
* RGBW current-limiting functionality should be handled by RGBSTRIP_MAX_CURRENT_PER_LIGHT instead.
* Updated README to reflect implementation of built-in current limiting.
* Keymap readability improvements.
* Minor keymap improvements.
* Fixed LED driver init sequence, formatting
* Dimming implementation tested, working.
* Stab LEDs synced with spacebar hits in effects.
* RGB underglow tested and functional. Simplified README for RGB underglow.
* Undid accidental file deletion from previous merge conflict. Safer values for RGB underglow.
* Improved arrow key positions in keymap.
* Added functionality to correct uneven RGB underglow. Refactored related code.
* Reverted to safer values for underglow.
* Changes for v0.3
* Custom LED brightness scaling will take place after current adjustment in order to avoid being overridden.
* Create keymap.c
Added split backspace and split shift to ISO layout
* Create config.h
Turned on LEDs for new layout
* Fixed bug where left spacebar stabilizer LED (LC06) would adopt color of row above.
* Added hhkb_wilba keymap
* Update keymap.c
* Update keymap.c
* Update keymap.c
* Added indicators, full param setting via host
* Added "mousekey" layout
* Added Zeal65 support, factory test mode
* Keycode safe range changed, caused bugs
* Bumped EEPROM version due to change in QMK keycodes
* Disable HHKB "blocked" LEDs if KC_NO in keymap
* Added "disable_hhkb_blocker_leds"
* Required overridden function for keymaps in EEPROM
* Added polar coordinate mapping, effect speed
* Force Raw HID interface number to 1 always
* Fixed last merge from master
* Added effect speed to default keymaps
* add BACKLIGHT_ prefix to vars
* add BACKLIGHT_ prefix to vars
* Keymap speed effect; keymap improvements/fixes
Readme updated to match changes
* Refactored to use common IS31FL3731/I2C drivers
* Fixed make rules, backlight disabled feature
* Make split rightshift default for Zeal65
* Added M60-A as a "version" of Zeal60.
* Renamed IS31FL3731 driver functions
* Fix suspend_wakeup_init_kb() being defined twice
* First pass refactor dynamic keymaps
* Updated to changed I2C and ISSI drivers
* Refactor zeal_color.* usage to quantum/color.*
* Updated Zeal65, fixed dynamic_keymap
* Major refactoring of Zeal60 backlight and API
* Lots of little cleanups
* Added readme.md
* Added readme.md
* Added LAYOUT_60*() macros, refactored and cleaned up default keymaps
* Fix compile error in suspend.c
* Added Zeal65 LAYOUT macros, info.json
* Added rama/m60_a, deleted zeal60/keymaps/m60_a
* Fixed rama/m60_a/keymaps/proto
* Fixed compilation error for suspend.c
* Requested changes for PR
* Fixed readme.md images
* Another readme.md fix
* Added drashna's requested changes
2018-09-13 18:37:13 +00:00
}
2019-08-30 18:19:03 +00:00
uint16_t dynamic_keymap_get_keycode ( uint8_t layer , uint8_t row , uint8_t column ) {
2022-03-09 08:29:00 +00:00
if ( layer > = DYNAMIC_KEYMAP_LAYER_COUNT | | row > = MATRIX_ROWS | | column > = MATRIX_COLS ) return KC_NO ;
2019-08-30 18:19:03 +00:00
void * address = dynamic_keymap_key_to_eeprom_address ( layer , row , column ) ;
// Big endian, so we can read/write EEPROM directly from host if we want
uint16_t keycode = eeprom_read_byte ( address ) < < 8 ;
keycode | = eeprom_read_byte ( address + 1 ) ;
return keycode ;
Zeal60/Zeal65/M60-A implementation (#3879)
* Initial version of zeal60
* WIP
* Fixes issue #900
* Adding RGB underglow functionality.
Fixed a compile-time conflict caused by enabling RGB underglow functionality.
* Refactor RPC protocol
* Fix last merge
* README for RGB underglow updated.
* Additional README changes.
* Adding RGBW strip software-based current-limiting functionality.
* RGBW current-limiting functionality should be handled by RGBSTRIP_MAX_CURRENT_PER_LIGHT instead.
* Updated README to reflect implementation of built-in current limiting.
* Keymap readability improvements.
* Minor keymap improvements.
* Fixed LED driver init sequence, formatting
* Dimming implementation tested, working.
* Stab LEDs synced with spacebar hits in effects.
* RGB underglow tested and functional. Simplified README for RGB underglow.
* Undid accidental file deletion from previous merge conflict. Safer values for RGB underglow.
* Improved arrow key positions in keymap.
* Added functionality to correct uneven RGB underglow. Refactored related code.
* Reverted to safer values for underglow.
* Changes for v0.3
* Custom LED brightness scaling will take place after current adjustment in order to avoid being overridden.
* Create keymap.c
Added split backspace and split shift to ISO layout
* Create config.h
Turned on LEDs for new layout
* Fixed bug where left spacebar stabilizer LED (LC06) would adopt color of row above.
* Added hhkb_wilba keymap
* Update keymap.c
* Update keymap.c
* Update keymap.c
* Added indicators, full param setting via host
* Added "mousekey" layout
* Added Zeal65 support, factory test mode
* Keycode safe range changed, caused bugs
* Bumped EEPROM version due to change in QMK keycodes
* Disable HHKB "blocked" LEDs if KC_NO in keymap
* Added "disable_hhkb_blocker_leds"
* Required overridden function for keymaps in EEPROM
* Added polar coordinate mapping, effect speed
* Force Raw HID interface number to 1 always
* Fixed last merge from master
* Added effect speed to default keymaps
* add BACKLIGHT_ prefix to vars
* add BACKLIGHT_ prefix to vars
* Keymap speed effect; keymap improvements/fixes
Readme updated to match changes
* Refactored to use common IS31FL3731/I2C drivers
* Fixed make rules, backlight disabled feature
* Make split rightshift default for Zeal65
* Added M60-A as a "version" of Zeal60.
* Renamed IS31FL3731 driver functions
* Fix suspend_wakeup_init_kb() being defined twice
* First pass refactor dynamic keymaps
* Updated to changed I2C and ISSI drivers
* Refactor zeal_color.* usage to quantum/color.*
* Updated Zeal65, fixed dynamic_keymap
* Major refactoring of Zeal60 backlight and API
* Lots of little cleanups
* Added readme.md
* Added readme.md
* Added LAYOUT_60*() macros, refactored and cleaned up default keymaps
* Fix compile error in suspend.c
* Added Zeal65 LAYOUT macros, info.json
* Added rama/m60_a, deleted zeal60/keymaps/m60_a
* Fixed rama/m60_a/keymaps/proto
* Fixed compilation error for suspend.c
* Requested changes for PR
* Fixed readme.md images
* Another readme.md fix
* Added drashna's requested changes
2018-09-13 18:37:13 +00:00
}
2019-08-30 18:19:03 +00:00
void dynamic_keymap_set_keycode ( uint8_t layer , uint8_t row , uint8_t column , uint16_t keycode ) {
2022-03-09 08:29:00 +00:00
if ( layer > = DYNAMIC_KEYMAP_LAYER_COUNT | | row > = MATRIX_ROWS | | column > = MATRIX_COLS ) return ;
2019-08-30 18:19:03 +00:00
void * address = dynamic_keymap_key_to_eeprom_address ( layer , row , column ) ;
// Big endian, so we can read/write EEPROM directly from host if we want
eeprom_update_byte ( address , ( uint8_t ) ( keycode > > 8 ) ) ;
eeprom_update_byte ( address + 1 , ( uint8_t ) ( keycode & 0xFF ) ) ;
Zeal60/Zeal65/M60-A implementation (#3879)
* Initial version of zeal60
* WIP
* Fixes issue #900
* Adding RGB underglow functionality.
Fixed a compile-time conflict caused by enabling RGB underglow functionality.
* Refactor RPC protocol
* Fix last merge
* README for RGB underglow updated.
* Additional README changes.
* Adding RGBW strip software-based current-limiting functionality.
* RGBW current-limiting functionality should be handled by RGBSTRIP_MAX_CURRENT_PER_LIGHT instead.
* Updated README to reflect implementation of built-in current limiting.
* Keymap readability improvements.
* Minor keymap improvements.
* Fixed LED driver init sequence, formatting
* Dimming implementation tested, working.
* Stab LEDs synced with spacebar hits in effects.
* RGB underglow tested and functional. Simplified README for RGB underglow.
* Undid accidental file deletion from previous merge conflict. Safer values for RGB underglow.
* Improved arrow key positions in keymap.
* Added functionality to correct uneven RGB underglow. Refactored related code.
* Reverted to safer values for underglow.
* Changes for v0.3
* Custom LED brightness scaling will take place after current adjustment in order to avoid being overridden.
* Create keymap.c
Added split backspace and split shift to ISO layout
* Create config.h
Turned on LEDs for new layout
* Fixed bug where left spacebar stabilizer LED (LC06) would adopt color of row above.
* Added hhkb_wilba keymap
* Update keymap.c
* Update keymap.c
* Update keymap.c
* Added indicators, full param setting via host
* Added "mousekey" layout
* Added Zeal65 support, factory test mode
* Keycode safe range changed, caused bugs
* Bumped EEPROM version due to change in QMK keycodes
* Disable HHKB "blocked" LEDs if KC_NO in keymap
* Added "disable_hhkb_blocker_leds"
* Required overridden function for keymaps in EEPROM
* Added polar coordinate mapping, effect speed
* Force Raw HID interface number to 1 always
* Fixed last merge from master
* Added effect speed to default keymaps
* add BACKLIGHT_ prefix to vars
* add BACKLIGHT_ prefix to vars
* Keymap speed effect; keymap improvements/fixes
Readme updated to match changes
* Refactored to use common IS31FL3731/I2C drivers
* Fixed make rules, backlight disabled feature
* Make split rightshift default for Zeal65
* Added M60-A as a "version" of Zeal60.
* Renamed IS31FL3731 driver functions
* Fix suspend_wakeup_init_kb() being defined twice
* First pass refactor dynamic keymaps
* Updated to changed I2C and ISSI drivers
* Refactor zeal_color.* usage to quantum/color.*
* Updated Zeal65, fixed dynamic_keymap
* Major refactoring of Zeal60 backlight and API
* Lots of little cleanups
* Added readme.md
* Added readme.md
* Added LAYOUT_60*() macros, refactored and cleaned up default keymaps
* Fix compile error in suspend.c
* Added Zeal65 LAYOUT macros, info.json
* Added rama/m60_a, deleted zeal60/keymaps/m60_a
* Fixed rama/m60_a/keymaps/proto
* Fixed compilation error for suspend.c
* Requested changes for PR
* Fixed readme.md images
* Another readme.md fix
* Added drashna's requested changes
2018-09-13 18:37:13 +00:00
}
2022-03-09 08:29:00 +00:00
# ifdef ENCODER_MAP_ENABLE
void * dynamic_keymap_encoder_to_eeprom_address ( uint8_t layer , uint8_t encoder_id ) {
return ( ( void * ) DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR ) + ( layer * NUM_ENCODERS * 2 * 2 ) + ( encoder_id * 2 * 2 ) ;
}
uint16_t dynamic_keymap_get_encoder ( uint8_t layer , uint8_t encoder_id , bool clockwise ) {
if ( layer > = DYNAMIC_KEYMAP_LAYER_COUNT | | encoder_id > = NUM_ENCODERS ) return KC_NO ;
void * address = dynamic_keymap_encoder_to_eeprom_address ( layer , encoder_id ) ;
// Big endian, so we can read/write EEPROM directly from host if we want
uint16_t keycode = ( ( uint16_t ) eeprom_read_byte ( address + ( clockwise ? 0 : 2 ) ) ) < < 8 ;
keycode | = eeprom_read_byte ( address + ( clockwise ? 0 : 2 ) + 1 ) ;
return keycode ;
}
void dynamic_keymap_set_encoder ( uint8_t layer , uint8_t encoder_id , bool clockwise , uint16_t keycode ) {
if ( layer > = DYNAMIC_KEYMAP_LAYER_COUNT | | encoder_id > = NUM_ENCODERS ) return ;
void * address = dynamic_keymap_encoder_to_eeprom_address ( layer , encoder_id ) ;
// Big endian, so we can read/write EEPROM directly from host if we want
eeprom_update_byte ( address + ( clockwise ? 0 : 2 ) , ( uint8_t ) ( keycode > > 8 ) ) ;
eeprom_update_byte ( address + ( clockwise ? 0 : 2 ) + 1 , ( uint8_t ) ( keycode & 0xFF ) ) ;
}
# endif // ENCODER_MAP_ENABLE
2022-07-15 02:33:34 +00:00
static uint32_t dynamic_keymap_compute_hash ( void ) {
2022-07-28 00:42:32 +00:00
# ifdef FNV_ENABLE
2022-07-15 02:33:34 +00:00
Fnv32_t hash = FNV1_32A_INIT ;
uint16_t keycode ;
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 + + ) {
2022-09-29 23:08:14 +00:00
keycode = keycode_at_keymap_location_raw ( layer , row , column ) ;
2022-07-15 02:33:34 +00:00
hash = fnv_32a_buf ( & keycode , sizeof ( keycode ) , hash ) ;
}
}
2022-07-28 00:42:32 +00:00
# ifdef ENCODER_MAP_ENABLE
2022-07-15 02:33:34 +00:00
for ( int encoder = 0 ; encoder < NUM_ENCODERS ; encoder + + ) {
2022-09-29 23:08:14 +00:00
keycode = keycode_at_encodermap_location_raw ( layer , encoder , true ) ;
2022-07-15 02:33:34 +00:00
hash = fnv_32a_buf ( & keycode , sizeof ( keycode ) , hash ) ;
2022-09-29 23:08:14 +00:00
keycode = keycode_at_encodermap_location_raw ( layer , encoder , false ) ;
2022-07-15 02:33:34 +00:00
hash = fnv_32a_buf ( & keycode , sizeof ( keycode ) , hash ) ;
}
2022-07-28 00:42:32 +00:00
# endif // ENCODER_MAP_ENABLE
2022-07-15 02:33:34 +00:00
}
return hash ;
2022-07-28 00:42:32 +00:00
# else
return 0 ;
# endif
2022-07-15 02:33:34 +00:00
}
static uint32_t dynamic_keymap_hash ( void ) {
static uint32_t hash = 0 ;
static uint8_t s_init = 0 ;
if ( ! s_init ) {
s_init = 1 ;
hash = dynamic_keymap_compute_hash ( ) ;
}
return hash ;
}
bool dynamic_keymap_is_valid ( void ) {
return eeprom_read_dword ( EECONFIG_KEYMAP_HASH ) = = dynamic_keymap_hash ( ) ;
}
2019-08-30 18:19:03 +00:00
void dynamic_keymap_reset ( void ) {
// Reset the keymaps in EEPROM to what is in flash.
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 + + ) {
2023-06-15 03:48:19 +00:00
dynamic_keymap_set_keycode ( layer , row , column , keycode_at_keymap_location_raw ( layer , row , column ) ) ;
2019-08-30 18:19:03 +00:00
}
}
2022-03-09 08:29:00 +00:00
# ifdef ENCODER_MAP_ENABLE
for ( int encoder = 0 ; encoder < NUM_ENCODERS ; encoder + + ) {
2023-06-15 03:48:19 +00:00
dynamic_keymap_set_encoder ( layer , encoder , true , keycode_at_encodermap_location_raw ( layer , encoder , true ) ) ;
dynamic_keymap_set_encoder ( layer , encoder , false , keycode_at_encodermap_location_raw ( layer , encoder , false ) ) ;
2022-03-09 08:29:00 +00:00
}
# endif // ENCODER_MAP_ENABLE
2019-08-30 18:19:03 +00:00
}
2022-07-15 02:33:34 +00:00
eeprom_update_dword ( EECONFIG_KEYMAP_HASH , dynamic_keymap_hash ( ) ) ;
Zeal60/Zeal65/M60-A implementation (#3879)
* Initial version of zeal60
* WIP
* Fixes issue #900
* Adding RGB underglow functionality.
Fixed a compile-time conflict caused by enabling RGB underglow functionality.
* Refactor RPC protocol
* Fix last merge
* README for RGB underglow updated.
* Additional README changes.
* Adding RGBW strip software-based current-limiting functionality.
* RGBW current-limiting functionality should be handled by RGBSTRIP_MAX_CURRENT_PER_LIGHT instead.
* Updated README to reflect implementation of built-in current limiting.
* Keymap readability improvements.
* Minor keymap improvements.
* Fixed LED driver init sequence, formatting
* Dimming implementation tested, working.
* Stab LEDs synced with spacebar hits in effects.
* RGB underglow tested and functional. Simplified README for RGB underglow.
* Undid accidental file deletion from previous merge conflict. Safer values for RGB underglow.
* Improved arrow key positions in keymap.
* Added functionality to correct uneven RGB underglow. Refactored related code.
* Reverted to safer values for underglow.
* Changes for v0.3
* Custom LED brightness scaling will take place after current adjustment in order to avoid being overridden.
* Create keymap.c
Added split backspace and split shift to ISO layout
* Create config.h
Turned on LEDs for new layout
* Fixed bug where left spacebar stabilizer LED (LC06) would adopt color of row above.
* Added hhkb_wilba keymap
* Update keymap.c
* Update keymap.c
* Update keymap.c
* Added indicators, full param setting via host
* Added "mousekey" layout
* Added Zeal65 support, factory test mode
* Keycode safe range changed, caused bugs
* Bumped EEPROM version due to change in QMK keycodes
* Disable HHKB "blocked" LEDs if KC_NO in keymap
* Added "disable_hhkb_blocker_leds"
* Required overridden function for keymaps in EEPROM
* Added polar coordinate mapping, effect speed
* Force Raw HID interface number to 1 always
* Fixed last merge from master
* Added effect speed to default keymaps
* add BACKLIGHT_ prefix to vars
* add BACKLIGHT_ prefix to vars
* Keymap speed effect; keymap improvements/fixes
Readme updated to match changes
* Refactored to use common IS31FL3731/I2C drivers
* Fixed make rules, backlight disabled feature
* Make split rightshift default for Zeal65
* Added M60-A as a "version" of Zeal60.
* Renamed IS31FL3731 driver functions
* Fix suspend_wakeup_init_kb() being defined twice
* First pass refactor dynamic keymaps
* Updated to changed I2C and ISSI drivers
* Refactor zeal_color.* usage to quantum/color.*
* Updated Zeal65, fixed dynamic_keymap
* Major refactoring of Zeal60 backlight and API
* Lots of little cleanups
* Added readme.md
* Added readme.md
* Added LAYOUT_60*() macros, refactored and cleaned up default keymaps
* Fix compile error in suspend.c
* Added Zeal65 LAYOUT macros, info.json
* Added rama/m60_a, deleted zeal60/keymaps/m60_a
* Fixed rama/m60_a/keymaps/proto
* Fixed compilation error for suspend.c
* Requested changes for PR
* Fixed readme.md images
* Another readme.md fix
* Added drashna's requested changes
2018-09-13 18:37:13 +00:00
}
2019-08-30 18:19:03 +00:00
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 + + ;
}
2018-11-30 16:43:34 +00:00
}
2019-08-30 18:19:03 +00:00
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 + + ;
}
2018-11-30 16:43:34 +00:00
}
2022-09-29 17:25:55 +00:00
uint16_t keycode_at_keymap_location ( uint8_t layer_num , uint8_t row , uint8_t column ) {
if ( layer_num < DYNAMIC_KEYMAP_LAYER_COUNT & & row < MATRIX_ROWS & & column < MATRIX_COLS ) {
return dynamic_keymap_get_keycode ( layer_num , row , column ) ;
2019-08-30 18:19:03 +00:00
}
2022-09-29 17:25:55 +00:00
return KC_NO ;
}
2022-03-09 08:29:00 +00:00
# ifdef ENCODER_MAP_ENABLE
2022-09-29 17:25:55 +00:00
uint16_t keycode_at_encodermap_location ( uint8_t layer_num , uint8_t encoder_idx , bool clockwise ) {
if ( layer_num < DYNAMIC_KEYMAP_LAYER_COUNT & & encoder_idx < NUM_ENCODERS ) {
return dynamic_keymap_get_encoder ( layer_num , encoder_idx , clockwise ) ;
2022-03-09 08:29:00 +00:00
}
return KC_NO ;
2018-11-30 16:43:34 +00:00
}
2022-09-29 17:25:55 +00:00
# endif // ENCODER_MAP_ENABLE
2018-11-30 16:43:34 +00:00
2022-02-12 18:29:31 +00:00
uint8_t dynamic_keymap_macro_get_count ( void ) {
return DYNAMIC_KEYMAP_MACRO_COUNT ;
}
2019-08-30 18:19:03 +00:00
2022-02-12 18:29:31 +00:00
uint16_t dynamic_keymap_macro_get_buffer_size ( void ) {
return DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE ;
}
2019-08-30 18:19:03 +00:00
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 + + ;
}
2018-11-30 16:43:34 +00:00
}
2019-08-30 18:19:03 +00:00
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 + + ;
}
2018-11-30 16:43:34 +00:00
}
2019-08-30 18:19:03 +00:00
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 ;
}
2018-11-30 16:43:34 +00:00
}
2019-08-30 18:19:03 +00:00
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 ) {
2022-11-09 20:46:44 +00:00
// If we are past the end of the buffer, then there is
// no Nth macro in the buffer.
2019-08-30 18:19:03 +00:00
if ( p = = end ) {
return ;
}
if ( eeprom_read_byte ( p ) = = 0 ) {
- - id ;
}
+ + p ;
}
2022-11-09 20:46:44 +00:00
// Send the macro string by making a temporary string.
char data [ 8 ] = { 0 } ;
2019-08-30 18:19:03 +00:00
// We already checked there was a null at the end of
// the buffer, so this cannot go past the end
while ( 1 ) {
data [ 0 ] = eeprom_read_byte ( p + + ) ;
data [ 1 ] = 0 ;
// Stop at the null terminator of this macro string
if ( data [ 0 ] = = 0 ) {
break ;
}
2022-11-09 20:46:44 +00:00
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 ;
}
2019-08-30 18:19:03 +00:00
}
}
2022-07-11 19:59:16 +00:00
send_string_with_delay ( data , DYNAMIC_KEYMAP_MACRO_DELAY ) ;
2019-08-30 18:19:03 +00:00
}
2018-11-30 16:43:34 +00:00
}