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 20:37:13 +02: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 "config.h"
2019-08-30 20:19:03 +02:00
# include "keymap.h" // to get keymaps[][][]
2018-09-28 06:09:14 +02:00
# include "tmk_core/common/eeprom.h"
2019-08-30 20:19:03 +02:00
# include "progmem.h" // to read default from flash
# include "quantum.h" // for send_string()
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 20:37:13 +02:00
# include "dynamic_keymap.h"
2020-01-19 17:30:34 +01:00
# include "via.h" // for default VIA_EEPROM_ADDR_END
2020-01-03 21:52:00 +01:00
2020-12-27 14:03:10 +01:00
# ifdef VIAL_ENABLE
# include "vial.h"
# endif
2020-01-03 21:52:00 +01:00
# ifndef DYNAMIC_KEYMAP_MACRO_COUNT
2020-01-19 17:30:34 +01:00
# define DYNAMIC_KEYMAP_MACRO_COUNT 16
2020-01-03 21:52:00 +01:00
# endif
2020-02-18 02:54:13 +01:00
// This is the default EEPROM max address to use for dynamic keymaps.
// The default is the ATmega32u4 EEPROM max address.
2020-03-14 15:08:48 +01:00
// Explicitly override it if the keyboard uses a microcontroller with
2020-02-18 02:54:13 +01:00
// more EEPROM *and* it makes sense to increase it.
# ifndef DYNAMIC_KEYMAP_EEPROM_MAX_ADDR
2021-05-11 00:37:36 +02:00
# if defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__)
2020-07-28 07:34:18 +02:00
# define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR 2047
2021-05-11 00:37:36 +02:00
# elif defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__)
# define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR 4095
# elif defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega16U4__) || defined(__AVR_AT90USB162__) || defined(__AVR_ATtiny85__)
2021-01-30 04:53:56 +01:00
# define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR 511
2020-07-28 07:34:18 +02:00
# else
# define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR 1023
# endif
2020-02-18 02:54:13 +01:00
# endif
2020-09-16 08:16:01 +02:00
// Due to usage of uint16_t check for max 65535
# if DYNAMIC_KEYMAP_EEPROM_MAX_ADDR > 65535
# error DYNAMIC_KEYMAP_EEPROM_MAX_ADDR must be less than 65536
# endif
2020-01-03 21:52:00 +01:00
// If DYNAMIC_KEYMAP_EEPROM_ADDR not explicitly defined in config.h,
// default it start after VIA_EEPROM_CUSTOM_ADDR+VIA_EEPROM_CUSTOM_SIZE
# ifndef DYNAMIC_KEYMAP_EEPROM_ADDR
2020-01-19 17:30:34 +01:00
# ifdef VIA_EEPROM_CUSTOM_CONFIG_ADDR
# define DYNAMIC_KEYMAP_EEPROM_ADDR (VIA_EEPROM_CUSTOM_CONFIG_ADDR + VIA_EEPROM_CUSTOM_CONFIG_SIZE)
# else
# error DYNAMIC_KEYMAP_EEPROM_ADDR not defined
# endif
2020-01-03 21:52:00 +01:00
# endif
2020-12-07 01:23:57 +01:00
// Encoders are located right after the dynamic keymap
# define VIAL_ENCODERS_EEPROM_ADDR (DYNAMIC_KEYMAP_EEPROM_ADDR + (DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2))
# ifdef VIAL_ENCODERS_ENABLE
2021-01-14 17:35:03 +01:00
# ifdef SPLIT_KEYBOARD
# define NUMBER_OF_ENCODERS (2 * sizeof(encoders_pad_a) / sizeof(pin_t))
# else
2020-12-07 01:23:57 +01:00
# define NUMBER_OF_ENCODERS (sizeof(encoders_pad_a) / sizeof(pin_t))
2021-01-14 17:35:03 +01:00
# endif
2020-12-07 01:23:57 +01:00
static pin_t encoders_pad_a [ ] = ENCODERS_PAD_A ;
# define VIAL_ENCODERS_SIZE (NUMBER_OF_ENCODERS * DYNAMIC_KEYMAP_LAYER_COUNT * 2 * 2)
# else
# define VIAL_ENCODERS_SIZE 0
# endif
// Dynamic macro starts after encoders, or dynamic keymaps if encoders aren't enabled
2020-01-03 21:52:00 +01:00
# ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
2020-12-07 01:23:57 +01:00
# define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR (VIAL_ENCODERS_EEPROM_ADDR + VIAL_ENCODERS_SIZE)
2020-01-03 21:52:00 +01:00
# endif
2020-02-18 02:54:13 +01: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.
2020-12-07 01:23:57 +01: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 02:54:13 +01: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 21:52:00 +01:00
# ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE
2020-02-18 02:54:13 +01:00
# define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE (DYNAMIC_KEYMAP_EEPROM_MAX_ADDR - DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + 1)
2020-01-03 21:52:00 +01:00
# endif
2018-11-30 17:43:34 +01:00
2019-08-30 20:19:03 +02:00
uint8_t dynamic_keymap_get_layer_count ( void ) { return DYNAMIC_KEYMAP_LAYER_COUNT ; }
2018-11-30 17:43:34 +01:00
2019-08-30 20:19:03 +02: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 20:37:13 +02:00
}
2019-08-30 20:19:03 +02:00
uint16_t dynamic_keymap_get_keycode ( uint8_t layer , uint8_t row , uint8_t column ) {
2021-01-01 10:58:02 +01:00
if ( layer > = DYNAMIC_KEYMAP_LAYER_COUNT | | row > = MATRIX_ROWS | | column > = MATRIX_COLS )
return KC_NO ;
2019-08-30 20:19:03 +02: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 20:37:13 +02:00
}
2019-08-30 20:19:03 +02:00
void dynamic_keymap_set_keycode ( uint8_t layer , uint8_t row , uint8_t column , uint16_t keycode ) {
2021-01-01 10:58:02 +01:00
if ( layer > = DYNAMIC_KEYMAP_LAYER_COUNT | | row > = MATRIX_ROWS | | column > = MATRIX_COLS )
return ;
2021-01-17 02:23:58 +01:00
# ifdef VIAL_ENABLE
if ( keycode = = RESET & & ! vial_unlocked )
return ;
# endif
2019-08-30 20:19:03 +02: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 20:37:13 +02:00
}
2020-12-07 01:23:57 +01:00
# ifdef VIAL_ENCODERS_ENABLE
static void * dynamic_keymap_encoder_to_eeprom_address ( uint8_t layer , uint8_t idx , uint8_t dir ) {
return ( ( void * ) VIAL_ENCODERS_EEPROM_ADDR ) + ( layer * NUMBER_OF_ENCODERS * 2 * 2 ) + ( idx * 2 * 2 ) + dir * 2 ;
}
uint16_t dynamic_keymap_get_encoder ( uint8_t layer , uint8_t idx , uint8_t dir ) {
if ( layer > = DYNAMIC_KEYMAP_LAYER_COUNT | | idx > = NUMBER_OF_ENCODERS | | dir > 1 )
return 0 ;
void * address = dynamic_keymap_encoder_to_eeprom_address ( layer , idx , dir ) ;
uint16_t keycode = eeprom_read_byte ( address ) < < 8 ;
keycode | = eeprom_read_byte ( address + 1 ) ;
return keycode ;
}
void dynamic_keymap_set_encoder ( uint8_t layer , uint8_t idx , uint8_t dir , uint16_t keycode ) {
if ( layer > = DYNAMIC_KEYMAP_LAYER_COUNT | | idx > = NUMBER_OF_ENCODERS | | dir > 1 )
return ;
2021-01-17 02:23:58 +01:00
# ifdef VIAL_ENABLE
if ( keycode = = RESET & & ! vial_unlocked )
return ;
# endif
2020-12-07 01:23:57 +01:00
void * address = dynamic_keymap_encoder_to_eeprom_address ( layer , idx , dir ) ;
eeprom_update_byte ( address , ( uint8_t ) ( keycode > > 8 ) ) ;
eeprom_update_byte ( address + 1 , ( uint8_t ) ( keycode & 0xFF ) ) ;
}
# endif
2021-02-15 20:05:44 +01:00
# if defined(VIAL_ENCODERS_ENABLE) && defined(VIAL_ENCODER_DEFAULT)
static const uint16_t PROGMEM vial_encoder_default [ ] = VIAL_ENCODER_DEFAULT ;
_Static_assert ( sizeof ( vial_encoder_default ) / sizeof ( * vial_encoder_default ) = = 2 * DYNAMIC_KEYMAP_LAYER_COUNT * NUMBER_OF_ENCODERS ,
" There should be DYNAMIC_KEYMAP_LAYER_COUNT * NUMBER_OF_ENCODERS * 2 entries in the VIAL_ENCODER_DEFAULT array. " ) ;
# endif
2019-08-30 20:19:03 +02:00
void dynamic_keymap_reset ( void ) {
2021-01-17 02:23:58 +01:00
# ifdef VIAL_ENABLE
/* temporarily unlock the keyboard so we can set hardcoded RESET keycode */
int vial_unlocked_prev = vial_unlocked ;
vial_unlocked = 1 ;
# endif
2019-08-30 20:19:03 +02:00
// Reset the keymaps in EEPROM to what is in flash.
// All keyboards using dynamic keymaps should define a layout
// for the same number of layers as DYNAMIC_KEYMAP_LAYER_COUNT.
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 ] ) ) ;
}
}
2020-12-07 01:23:57 +01:00
# ifdef VIAL_ENCODERS_ENABLE
for ( int idx = 0 ; idx < NUMBER_OF_ENCODERS ; + + idx ) {
2021-02-15 20:05:44 +01:00
# ifdef VIAL_ENCODER_DEFAULT
dynamic_keymap_set_encoder ( layer , idx , 0 , pgm_read_word ( & vial_encoder_default [ 2 * ( layer * NUMBER_OF_ENCODERS + idx ) ] ) ) ;
dynamic_keymap_set_encoder ( layer , idx , 1 , pgm_read_word ( & vial_encoder_default [ 2 * ( layer * NUMBER_OF_ENCODERS + idx ) + 1 ] ) ) ;
# else
2020-12-07 01:23:57 +01:00
dynamic_keymap_set_encoder ( layer , idx , 0 , KC_TRNS ) ;
dynamic_keymap_set_encoder ( layer , idx , 1 , KC_TRNS ) ;
2021-02-15 20:05:44 +01:00
# endif
2020-12-07 01:23:57 +01:00
}
# endif
2019-08-30 20:19:03 +02:00
}
2021-01-17 02:23:58 +01:00
# ifdef VIAL_ENABLE
/* re-lock the keyboard */
vial_unlocked = vial_unlocked_prev ;
# endif
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 20:37:13 +02:00
}
2019-08-30 20:19:03 +02: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 17:43:34 +01:00
}
2019-08-30 20:19:03 +02: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 ;
2021-01-17 02:23:58 +01:00
# ifdef VIAL_ENABLE
/* ensure the writes are bounded */
if ( offset > = dynamic_keymap_eeprom_size | | dynamic_keymap_eeprom_size - offset < size )
return ;
2021-02-09 00:05:30 +01:00
# ifndef VIAL_INSECURE
2021-01-17 02:23:58 +01:00
/* Check whether it is trying to send a RESET keycode; only allow setting these if unlocked */
if ( ! vial_unlocked ) {
/* how much of the input array we'll have to check in the loop */
uint16_t chk_offset = 0 ;
uint16_t chk_sz = size ;
/* initial byte misaligned -- this means the first keycode will be a combination of existing and new data */
if ( offset % 2 ! = 0 ) {
uint16_t kc = ( eeprom_read_byte ( ( uint8_t * ) target - 1 ) < < 8 ) | data [ 0 ] ;
if ( kc = = RESET )
data [ 0 ] = 0xFF ;
/* no longer have to check the first byte */
chk_offset + = 1 ;
}
/* final byte misaligned -- this means the last keycode will be a combination of new and existing data */
if ( ( offset + size ) % 2 ! = 0 ) {
uint16_t kc = ( data [ size - 1 ] < < 8 ) | eeprom_read_byte ( ( uint8_t * ) target + size ) ;
if ( kc = = RESET )
data [ size - 1 ] = 0xFF ;
/* no longer have to check the last byte */
chk_sz - = 1 ;
}
/* check the entire array, replace any instances of RESET with invalid keycode 0xFFFF */
for ( uint16_t i = chk_offset ; i < chk_sz ; i + = 2 ) {
uint16_t kc = ( data [ i ] < < 8 ) | data [ i + 1 ] ;
if ( kc = = RESET ) {
data [ i ] = 0xFF ;
data [ i + 1 ] = 0xFF ;
}
}
}
# endif
2021-02-09 00:05:30 +01:00
# endif
2021-01-17 02:23:58 +01:00
2019-08-30 20:19:03 +02:00
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 17:43:34 +01:00
}
2020-12-25 21:26:14 +01:00
# ifdef VIAL_ENCODERS_ENABLE
extern uint16_t g_vial_magic_keycode_override ;
# endif
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 20:37:13 +02:00
// This overrides the one in quantum/keymap_common.c
2019-08-30 20:19:03 +02:00
uint16_t keymap_key_to_keycode ( uint8_t layer , keypos_t key ) {
2020-12-27 14:03:10 +01:00
# ifdef VIAL_ENABLE
/* Disable any keycode processing while unlocking */
if ( vial_unlock_in_progress )
return KC_NO ;
# endif
2020-12-25 21:26:14 +01:00
# ifdef VIAL_ENCODERS_ENABLE
2021-01-03 15:12:16 +01:00
if ( key . row = = VIAL_ENCODER_MATRIX_MAGIC & & key . col = = VIAL_ENCODER_MATRIX_MAGIC )
2020-12-25 21:26:14 +01:00
return g_vial_magic_keycode_override ;
# endif
2019-08-30 20:19:03 +02:00
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 ;
}
2018-11-30 17:43:34 +01:00
}
2019-08-30 20:19:03 +02:00
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 + + ;
}
2018-11-30 17:43:34 +01:00
}
2019-08-30 20:19:03 +02: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 17:43:34 +01:00
}
2019-08-30 20:19:03 +02: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 17:43:34 +01:00
}
2019-08-30 20:19:03 +02: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 ) {
// 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 ;
}
if ( eeprom_read_byte ( p ) = = 0 ) {
- - id ;
}
+ + p ;
}
2020-03-14 14:35:12 +01:00
// Send the macro string one or three chars at a time
// by making temporary 1 or 3 char strings
char data [ 4 ] = { 0 , 0 , 0 , 0 } ;
2019-08-30 20:19:03 +02: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 ;
}
2021-03-06 20:05:32 +01:00
if ( data [ 0 ] = = SS_QMK_PREFIX ) {
// If the char is magic, process it as indicated by the next character
// (tap, down, up, delay)
data [ 1 ] = eeprom_read_byte ( p + + ) ;
if ( data [ 1 ] = = 0 )
2019-08-30 20:19:03 +02:00
break ;
2021-03-06 20:05:32 +01:00
if ( data [ 1 ] = = SS_TAP_CODE | | data [ 1 ] = = SS_DOWN_CODE | | data [ 1 ] = = SS_UP_CODE ) {
// For tap, down, up, just stuff it into the array and send_string it
data [ 2 ] = eeprom_read_byte ( p + + ) ;
if ( data [ 2 ] ! = 0 )
send_string ( data ) ;
} else if ( data [ 1 ] = = SS_DELAY_CODE ) {
// For delay, decode the delay and wait_ms for that amount
uint8_t d0 = eeprom_read_byte ( p + + ) ;
uint8_t d1 = eeprom_read_byte ( p + + ) ;
if ( d0 = = 0 | | d1 = = 0 )
break ;
// we cannot use 0 for these, need to subtract 1 and use 255 instead of 256 for delay calculation
int ms = ( d0 - 1 ) + ( d1 - 1 ) * 255 ;
while ( ms - - ) wait_ms ( 1 ) ;
2019-08-30 20:19:03 +02:00
}
2021-03-06 20:05:32 +01:00
} else {
// If the char wasn't magic, just send it
send_string ( data ) ;
2019-08-30 20:19:03 +02:00
}
}
2018-11-30 17:43:34 +01:00
}