Added macros to Dynamic Keymaps, Zeal60 RGB backlight improvements (#4520)
* Refactored M6-B to use Zeal60 RGB backlight code * Fixed M6-B LED co-ordinates * Minor changes to RGB config for Zeal65 * Added dynamic keymaps to WT80-A, WT60-A, WT-80A, U80-A * Macro implementation * Implemented macros, API protocol version 8, RGB backlight fixes * Improved radial effects for M6-B * Fixed undefined references when building an RGB keyboard after M6-A
This commit is contained in:
parent
b10aad45b6
commit
d7f1e072a8
22 changed files with 569 additions and 114 deletions
|
@ -18,7 +18,7 @@
|
|||
#include "keymap.h" // to get keymaps[][][]
|
||||
#include "tmk_core/common/eeprom.h"
|
||||
#include "progmem.h" // to read default from flash
|
||||
|
||||
#include "quantum.h" // for send_string()
|
||||
#include "dynamic_keymap.h"
|
||||
|
||||
#ifdef DYNAMIC_KEYMAP_ENABLE
|
||||
|
@ -31,6 +31,23 @@
|
|||
#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)
|
||||
{
|
||||
// TODO: optimize this with some left shifts
|
||||
|
@ -69,6 +86,36 @@ void dynamic_keymap_reset(void)
|
|||
}
|
||||
}
|
||||
|
||||
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++;
|
||||
}
|
||||
}
|
||||
|
||||
// This overrides the one in quantum/keymap_common.c
|
||||
uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
|
||||
{
|
||||
|
@ -81,5 +128,103 @@ uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
// Send the macro string one char at a time
|
||||
// by making temporary 1 char strings
|
||||
char data[2] = { 0, 0 };
|
||||
// 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);
|
||||
// Stop at the null terminator of this macro string
|
||||
if ( data[0] == 0 ) {
|
||||
break;
|
||||
}
|
||||
send_string(data);
|
||||
++p;
|
||||
}
|
||||
}
|
||||
|
||||
#endif // DYNAMIC_KEYMAP_ENABLE
|
||||
|
||||
|
|
|
@ -18,11 +18,46 @@
|
|||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
uint8_t dynamic_keymap_get_layer_count(void);
|
||||
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);
|
||||
void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode);
|
||||
void dynamic_keymap_reset(void);
|
||||
// These get/set the keycodes as stored in the EEPROM buffer
|
||||
// Data is big-endian 16-bit values (the keycodes)
|
||||
// Order is by layer/row/column
|
||||
// Thus offset 0 = 0,0,0, offset MATRIX_COLS*2 = 0,1,0, offset MATRIX_ROWS*MATRIX_COLS*2 = 1,0,0
|
||||
// Note the *2, because offset is in bytes and keycodes are two bytes
|
||||
// This is only really useful for host applications that want to get a whole keymap fast,
|
||||
// by reading 14 keycodes (28 bytes) at a time, reducing the number of raw HID transfers by
|
||||
// a factor of 14.
|
||||
void dynamic_keymap_get_buffer( uint16_t offset, uint16_t size, uint8_t *data );
|
||||
void dynamic_keymap_set_buffer( uint16_t offset, uint16_t size, uint8_t *data );
|
||||
|
||||
// This overrides the one in quantum/keymap_common.c
|
||||
// uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key);
|
||||
|
||||
|
||||
|
||||
// Note regarding dynamic_keymap_macro_set_buffer():
|
||||
// The last byte of the buffer is used as a valid flag,
|
||||
// so macro sending is disabled during writing a new buffer,
|
||||
// should it happen during, or after an interrupted transfer.
|
||||
//
|
||||
// Users writing to the buffer must first set the last byte of the buffer
|
||||
// to non-zero (i.e. 0xFF). After (or during) the final write, set the
|
||||
// last byte of the buffer to zero.
|
||||
//
|
||||
// Since the contents of the buffer must be a list of null terminated
|
||||
// strings, the last byte must be a null when at maximum capacity,
|
||||
// and it not being null means the buffer can be considered in an
|
||||
// invalid state.
|
||||
|
||||
uint8_t dynamic_keymap_macro_get_count(void);
|
||||
uint16_t dynamic_keymap_macro_get_buffer_size(void);
|
||||
void dynamic_keymap_macro_get_buffer( uint16_t offset, uint16_t size, uint8_t *data );
|
||||
void dynamic_keymap_macro_set_buffer( uint16_t offset, uint16_t size, uint8_t *data );
|
||||
void dynamic_keymap_macro_reset(void);
|
||||
|
||||
void dynamic_keymap_macro_send( uint8_t id );
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue