Last active
September 23, 2022 04:02
-
-
Save sekigon-gonnoc/3819c10ea58f2d22c96360609c61ace1 to your computer and use it in GitHub Desktop.
VIA LED configuration per layer, with RGB_MATRIX
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// VIA config | |
#define VIA_CUSTOM_LIGHTING_ENABLE | |
#define VIA_RGBLIGHT_USER_ADDR (EECONFIG_SIZE) | |
#define VIA_EEPROM_MAGIC_ADDR (VIA_RGBLIGHT_USER_ADDR + DYNAMIC_KEYMAP_LAYER_COUNT * 4) // Layer * 4bytes(RGB Light config) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#if defined(RGBLIGHT_ENABLE) | |
#define LIGHTING_GET_VAL rgblight_get_val | |
#define LIGHTING_GET_MODE rgblight_get_mode | |
#define LIGHTING_GET_SPEED rgblight_get_speed | |
#define LIGHTING_GET_HUE rgblight_get_hue | |
#define LIGHTING_GET_SAT rgblight_get_sat | |
#define LIGHTING_SETHSV_NOEEPROM(h, s, v) rgblight_sethsv_noeeprom(h, s, v) | |
#define LIGHTING_SETMODE_NOEEPROM(mode) rgblight_mode_noeeprom(mode) | |
#define LIGHTING_DISABLE_NOEEPROM(b) rgblight_disable_noeeprom(b) | |
#define LIGHTING_ENABLE_NOEEPROM(b) rgblight_enable_noeeprom(b) | |
#define LIGHTING_SETSPEED_NOEEPROM(speed) rgblight_set_speed_noeeprom(speed) | |
#define LIGHTING_UPDATE_EECONFIG() eeconfig_update_rgblight_current() | |
#define LIGHTING_CONFIG rgblight_config | |
extern rgblight_config_t rgblight_config; | |
#elif defined(RGB_MATRIX_ENABLE) | |
#define LIGHTING_GET_VAL rgb_matrix_get_val | |
#define LIGHTING_GET_MODE rgb_matrix_get_mode | |
#define LIGHTING_GET_SPEED rgb_matrix_get_speed | |
#define LIGHTING_GET_HUE rgb_matrix_get_hue | |
#define LIGHTING_GET_SAT rgb_matrix_get_sat | |
#define LIGHTING_SETHSV_NOEEPROM(h, s, v) rgb_matrix_sethsv_noeeprom(h, s, v) | |
#define LIGHTING_SETMODE_NOEEPROM(mode) rgb_matrix_mode_noeeprom(mode) | |
#define LIGHTING_DISABLE_NOEEPROM(b) rgb_matrix_disable_noeeprom(b) | |
#define LIGHTING_ENABLE_NOEEPROM(b) rgb_matrix_enable_noeeprom(b) | |
#define LIGHTING_SETSPEED_NOEEPROM(speed) rgb_matrix_set_speed_noeeprom(speed) | |
#define LIGHTING_UPDATE_EECONFIG() eeconfig_update_rgb_matrix() | |
#define LIGHTING_CONFIG rgb_matrix_config | |
#else | |
#define LIGHTING_GET_VAL(...) 0 | |
#define LIGHTING_GET_MODE(...) 0 | |
#define LIGHTING_GET_SPEED(...) 0 | |
#define LIGHTING_GET_HUE(...) 0 | |
#define LIGHTING_GET_SAT(...) 0 | |
#define LIGHTING_SETHSV_NOEEPROM(h, s, v) | |
#define LIGHTING_SETMODE_NOEEPROM(mode) | |
#define LIGHTING_DISABLE_NOEEPROM(b) | |
#define LIGHTING_ENABLE_NOEEPROM(b) | |
#define LIGHTING_SETSPEED_NOEEPROM(b) | |
#define LIGHTING_UPDATE_EECONFIG() | |
#endif | |
static void via_custom_lighting_get_value(uint8_t *data) { | |
uint8_t *value_id = &(data[0]); | |
uint8_t *value_data = &(data[1]); | |
switch (*value_id) { | |
case id_qmk_rgblight_brightness: { | |
value_data[0] = LIGHTING_GET_VAL(); | |
break; | |
} | |
case id_qmk_rgblight_effect: { | |
value_data[0] = LIGHTING_GET_MODE(); | |
break; | |
} | |
case id_qmk_rgblight_effect_speed: { | |
value_data[0] = LIGHTING_GET_SPEED(); | |
break; | |
} | |
case id_qmk_rgblight_color: { | |
value_data[0] = LIGHTING_GET_HUE(); | |
value_data[1] = LIGHTING_GET_SAT(); | |
break; | |
} | |
} | |
} | |
static void via_custom_lighting_set_value(uint8_t *data) { | |
uint8_t *value_id = &(data[0]); | |
uint8_t *value_data = &(data[1]); | |
switch (*value_id) { | |
case id_qmk_rgblight_brightness: { | |
LIGHTING_SETHSV_NOEEPROM(LIGHTING_GET_HUE(), LIGHTING_GET_SAT(), value_data[0]); | |
break; | |
} | |
case id_qmk_rgblight_effect: { | |
LIGHTING_SETMODE_NOEEPROM(value_data[0]); | |
if (value_data[0] == 0) { | |
LIGHTING_DISABLE_NOEEPROM(); | |
} else { | |
LIGHTING_ENABLE_NOEEPROM(); | |
} | |
break; | |
} | |
case id_qmk_rgblight_effect_speed: { | |
LIGHTING_SETSPEED_NOEEPROM(value_data[0]); | |
break; | |
} | |
case id_qmk_rgblight_color: { | |
LIGHTING_SETHSV_NOEEPROM(value_data[0], value_data[1], | |
LIGHTING_GET_VAL()); | |
break; | |
} | |
} | |
} | |
void raw_hid_receive_kb(uint8_t *data, uint8_t length) { | |
uint8_t *command_id = &(data[0]); | |
uint8_t *value_data = &(data[1]); | |
uint8_t layer = get_highest_layer(layer_state); | |
switch (*command_id) { | |
case id_lighting_set_value: | |
via_custom_lighting_set_value(value_data); | |
break; | |
case id_lighting_get_value: | |
via_custom_lighting_get_value(value_data); | |
break; | |
case id_lighting_save: | |
// Save rgblight config per layer | |
eeprom_update_dword((uint32_t *)(VIA_RGBLIGHT_USER_ADDR + 4 * layer), LIGHTING_CONFIG.raw); | |
LIGHTING_UPDATE_EECONFIG(); | |
break; | |
default: | |
break; | |
} | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#if defined(RGBLIGHT_ENABLE) | |
#include "rgblight.h" | |
#elif defined(RGB_MATRIX_ENABLE) | |
#include "rgb_matrix.h" | |
extern rgb_config_t rgb_matrix_config; | |
#endif | |
layer_state_t layer_state_set_user(layer_state_t state) { | |
uint8_t layer = get_highest_layer(state); | |
if (layer < DYNAMIC_KEYMAP_LAYER_COUNT) { | |
#if defined(RGBLIGHT_ENABLE) | |
rgblight_update_dword(eeprom_read_dword((const uint32_t *)(VIA_RGBLIGHT_USER_ADDR + 4 * layer))); | |
#elif defined(RGB_MATRIX_ENABLE) | |
rgb_matrix_config.raw = eeprom_read_dword((const uint32_t *)(VIA_RGBLIGHT_USER_ADDR + 4 * layer)); | |
#endif | |
} | |
return state; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
After flashing this, is there anything special you need to do to via to save it per layer?