Skip to content

Instantly share code, notes, and snippets.

@sekigon-gonnoc
Last active September 23, 2022 04:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sekigon-gonnoc/3819c10ea58f2d22c96360609c61ace1 to your computer and use it in GitHub Desktop.
Save sekigon-gonnoc/3819c10ea58f2d22c96360609c61ace1 to your computer and use it in GitHub Desktop.
VIA LED configuration per layer, with RGB_MATRIX
// 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)
#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;
}
}
#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;
}
@n3fariox
Copy link

After flashing this, is there anything special you need to do to via to save it per layer?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment