Add VIA support to MxSS, plus minor tweaks (#7809)
* Add VIA support to mxss and general cleanup * Add support for RGB test for FLEDs * Add LAYOUT_all to allow for more configuration * Remove blank layers * Updated readme * Improve use of EEPROM * Credit where its due * Use the latest iteration of rgblight code * Keep the RGB timer running if the front LED is in RGB mode * Fix RGB breathing animation * Better supported RGB animation Only thing not working is alternating, but that's not too important * Abstract front LED handlers from main kb code * Add support for indicator LED color changing * Remove debug statement * Persist indicator LED colors * Mark custom sections in rgblight.c * Light commenting * Fix up keymaps * Add/update comments * Remove bloat from default hex * Tidy a stray tab * Out with the old, in with the new * Out with the old, in with the new * Add LAYER_STATE_8BIT for VIA keymap
This commit is contained in:
parent
7f7b6b08e8
commit
645c5fabf2
14 changed files with 1678 additions and 956 deletions
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright 2018 Jumail Mundekkat / MxBlue
|
||||
/* Copyright 2020 Jumail Mundekkat / MxBlue
|
||||
*
|
||||
* 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
|
||||
|
|
@ -12,63 +12,29 @@
|
|||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* EEPROM management code from ../cannonkeys/stm32f072/keyboard.c
|
||||
*/
|
||||
|
||||
|
||||
#include QMK_KEYBOARD_H
|
||||
#include "tmk_core/common/eeprom.h"
|
||||
#include "tmk_core/common/action_layer.h"
|
||||
#include "rgblight.h"
|
||||
#include "via.h"
|
||||
#include "version.h" // for QMK_BUILDDATE used in EEPROM magic
|
||||
|
||||
// Variables for controlling front LED application
|
||||
uint8_t fled_mode; // Mode for front LEDs
|
||||
uint8_t fled_val; // Brightness for front leds (0 - 255)
|
||||
LED_TYPE fleds[2]; // Front LED rgb values for indicator mode use
|
||||
|
||||
// Predefined colors for layers
|
||||
// Format: {hue, saturation}
|
||||
// {0, 0} to turn off the LED
|
||||
// Add additional rows to handle more layers
|
||||
__attribute__ ((weak))
|
||||
const hs_set layer_colors[] = {
|
||||
[0] = {0, 0}, // Color for Layer 0
|
||||
[1] = {86, 255}, // Color for Layer 1
|
||||
[2] = {36, 255}, // Color for Layer 2
|
||||
[3] = {185, 255}, // Color for Layer 3
|
||||
};
|
||||
|
||||
__attribute__ ((weak))
|
||||
const size_t lc_size = sizeof(layer_colors) / sizeof(uint16_t);
|
||||
void via_init_kb(void) {
|
||||
fled_init();
|
||||
}
|
||||
|
||||
void matrix_init_kb(void) {
|
||||
// If EEPROM config exists, load it
|
||||
if (eeprom_is_valid()) {
|
||||
fled_config fled_conf;
|
||||
fled_conf.raw = eeprom_read_byte(EEPROM_FRONTLED_ADDR);
|
||||
fled_mode = fled_conf.mode;
|
||||
fled_val = fled_conf.val * FLED_VAL_STEP;
|
||||
// Else, default config
|
||||
} else {
|
||||
fled_mode = FLED_RGB;
|
||||
fled_val = 10 * FLED_VAL_STEP;
|
||||
eeprom_update_conf(); // Store default config to EEPROM
|
||||
}
|
||||
|
||||
// Set default values for leds
|
||||
setrgb(0, 0, 0, &fleds[0]);
|
||||
setrgb(0, 0, 0, &fleds[1]);
|
||||
|
||||
// Handle lighting for indicator mode
|
||||
if (fled_mode == FLED_INDI) {
|
||||
// Enable capslock led if enabled on host
|
||||
if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK))
|
||||
sethsv(FLED_CAPS_H, FLED_CAPS_S, fled_val, &fleds[0]);
|
||||
|
||||
// Determine and set colour of layer LED according to current layer
|
||||
// if hue = sat = 0, leave LED off
|
||||
uint8_t layer = biton32(layer_state);
|
||||
if (layer < lc_size && !(layer_colors[layer].hue == 0 && layer_colors[layer].hue == 0))
|
||||
sethsv(layer_colors[layer].hue, layer_colors[layer].sat, fled_val, &fleds[1]);
|
||||
}
|
||||
// If VIA is disabled, we still need to load settings
|
||||
// Call via_init_kb() the same way as via_init(), with setting
|
||||
// EEPROM valid afterwards.
|
||||
#ifndef VIA_ENABLE
|
||||
fled_init();
|
||||
via_eeprom_set_valid(true);
|
||||
#endif // VIA_ENABLE
|
||||
|
||||
matrix_init_user();
|
||||
}
|
||||
|
|
@ -82,132 +48,35 @@ void matrix_scan_kb(void) {
|
|||
|
||||
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
|
||||
// Handle custom keycodes for front LED operation
|
||||
switch (keycode) {
|
||||
case FLED_MOD: // Change between front LED operation modes (off, indicator, RGB)
|
||||
if (record->event.pressed)
|
||||
fled_mode_cycle();
|
||||
break;
|
||||
|
||||
case FLED_VAI: // Increase the brightness of the front LEDs by FLED_VAL_STEP
|
||||
if (record->event.pressed)
|
||||
fled_val_increase();
|
||||
break;
|
||||
|
||||
case FLED_VAD: // Decrease the brightness of the front LEDs by FLED_VAL_STEP
|
||||
if (record->event.pressed)
|
||||
fled_val_decrease();
|
||||
break;
|
||||
|
||||
default:
|
||||
break; // Process all other keycodes normally
|
||||
}
|
||||
|
||||
process_record_fled(keycode, record);
|
||||
return process_record_user(keycode, record);
|
||||
}
|
||||
|
||||
void led_set_kb(uint8_t usb_led) {
|
||||
// Set indicator LED appropriately, whether it is used or not
|
||||
if (usb_led & (1 << USB_LED_CAPS_LOCK)) {
|
||||
sethsv(FLED_CAPS_H, FLED_CAPS_S, fled_val, &fleds[0]);
|
||||
} else {
|
||||
setrgb(0, 0, 0, &fleds[0]);
|
||||
}
|
||||
|
||||
rgblight_set();
|
||||
led_set_user(usb_led);
|
||||
bool led_update_kb(led_t led_state) {
|
||||
fled_lock_update(led_state);
|
||||
return led_update_user(led_state);
|
||||
}
|
||||
|
||||
uint32_t layer_state_set_kb(uint32_t state) {
|
||||
// Determine and set colour of layer LED according to current layer
|
||||
// if hue = sat = 0, leave LED off
|
||||
uint8_t layer = biton32(state);
|
||||
|
||||
if (layer < lc_size && !(layer_colors[layer].hue == 0 && layer_colors[layer].hue == 0))
|
||||
sethsv(layer_colors[layer].hue, layer_colors[layer].sat, fled_val, &fleds[1]);
|
||||
else
|
||||
setrgb(0, 0, 0, &fleds[1]);
|
||||
|
||||
return state;
|
||||
layer_state_t layer_state_set_kb(layer_state_t state) {
|
||||
fled_layer_update(state);
|
||||
return layer_state_set_user(state);
|
||||
}
|
||||
|
||||
// EEPROM Management
|
||||
// Fallback eeprom functions if VIA is not enabled
|
||||
#ifndef VIA_ENABLE
|
||||
|
||||
// Test if magic value is present at expected location
|
||||
bool eeprom_is_valid(void)
|
||||
// Sets VIA/keyboard level usage of EEPROM to valid/invalid
|
||||
// Keyboard level code (eg. via_init_kb()) should not call this
|
||||
void via_eeprom_set_valid(bool valid)
|
||||
{
|
||||
return (eeprom_read_word(EEPROM_MAGIC_ADDR) == EEPROM_MAGIC);
|
||||
char *p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54"
|
||||
uint8_t magic0 = ( ( p[2] & 0x0F ) << 4 ) | ( p[3] & 0x0F );
|
||||
uint8_t magic1 = ( ( p[5] & 0x0F ) << 4 ) | ( p[6] & 0x0F );
|
||||
uint8_t magic2 = ( ( p[8] & 0x0F ) << 4 ) | ( p[9] & 0x0F );
|
||||
|
||||
eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+0, valid ? magic0 : 0xFF);
|
||||
eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+1, valid ? magic1 : 0xFF);
|
||||
eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+2, valid ? magic2 : 0xFF);
|
||||
}
|
||||
|
||||
// Set magic value at expected location
|
||||
void eeprom_set_valid(bool valid)
|
||||
{
|
||||
eeprom_update_word(EEPROM_MAGIC_ADDR, valid ? EEPROM_MAGIC : 0xFFFF);
|
||||
}
|
||||
|
||||
// Store current front led config in EEPROM
|
||||
void eeprom_update_conf(void)
|
||||
{
|
||||
// Create storage struct and set values
|
||||
fled_config conf;
|
||||
conf.mode = fled_mode;
|
||||
|
||||
// Small hack to ensure max value is stored correctly
|
||||
if (fled_val == 255)
|
||||
conf.val = 256 / FLED_VAL_STEP;
|
||||
else
|
||||
conf.val = fled_val / FLED_VAL_STEP;
|
||||
|
||||
// Set magic value and store config
|
||||
eeprom_set_valid(true);
|
||||
eeprom_update_byte(EEPROM_FRONTLED_ADDR, conf.raw);
|
||||
}
|
||||
|
||||
// Custom keycode functions
|
||||
|
||||
void fled_mode_cycle(void)
|
||||
{
|
||||
// FLED -> FLED_RGB -> FLED_INDI
|
||||
switch (fled_mode) {
|
||||
case FLED_OFF:
|
||||
fled_mode = FLED_RGB;
|
||||
break;
|
||||
|
||||
case FLED_RGB:
|
||||
fled_mode = FLED_INDI;
|
||||
break;
|
||||
|
||||
case FLED_INDI:
|
||||
fled_mode = FLED_OFF;
|
||||
break;
|
||||
}
|
||||
|
||||
// Update stored config
|
||||
eeprom_update_conf();
|
||||
rgblight_set();
|
||||
}
|
||||
|
||||
void fled_val_increase(void)
|
||||
{
|
||||
// Increase val by FLED_VAL_STEP, handling the upper edge case
|
||||
if (fled_val + FLED_VAL_STEP > 255)
|
||||
fled_val = 255;
|
||||
else
|
||||
fled_val += FLED_VAL_STEP;
|
||||
|
||||
// Update stored config
|
||||
eeprom_update_conf();
|
||||
rgblight_set();
|
||||
}
|
||||
|
||||
void fled_val_decrease(void)
|
||||
{
|
||||
// Decrease val by FLED_VAL_STEP, handling the lower edge case
|
||||
if (fled_val - FLED_VAL_STEP > 255)
|
||||
fled_val = 255;
|
||||
else
|
||||
fled_val -= FLED_VAL_STEP;
|
||||
|
||||
// Update stored config
|
||||
eeprom_update_conf();
|
||||
rgblight_set();
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue