RGB parameters per layer

This commit is contained in:
Jeremy Soller 2021-03-04 10:44:42 -07:00 committed by Jeremy Soller
parent 93528f9426
commit 78caf11c82
2 changed files with 121 additions and 29 deletions

View File

@ -118,6 +118,14 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
return process_record_user(keycode, record); return process_record_user(keycode, record);
} }
void system76_ec_rgb_layer(layer_state_t layer_state);
layer_state_t layer_state_set_kb(layer_state_t layer_state) {
system76_ec_rgb_layer(layer_state);
return layer_state_set_user(layer_state);
}
void suspend_power_down_kb(void) { void suspend_power_down_kb(void) {
rgb_matrix_set_suspend_state(true); rgb_matrix_set_suspend_state(true);
suspend_power_down_user(); suspend_power_down_user();

View File

@ -107,6 +107,62 @@ static enum rgb_matrix_effects mode_map[] = {
_Static_assert(sizeof(mode_map) == MODE_LAST, "mode_map_length"); _Static_assert(sizeof(mode_map) == MODE_LAST, "mode_map_length");
RGB raw_rgb_data[DRIVER_LED_TOTAL]; RGB raw_rgb_data[DRIVER_LED_TOTAL];
rgb_config_t layer_rgb[DYNAMIC_KEYMAP_LAYER_COUNT] = {
// Layer 1
{
.enable = 1,
.mode = RGB_MATRIX_STARTUP_MODE,
.hsv = {
.h = RGB_MATRIX_STARTUP_HUE,
.s = RGB_MATRIX_STARTUP_SAT,
.v = RGB_MATRIX_STARTUP_VAL,
},
.speed = RGB_MATRIX_STARTUP_SPD,
},
// Layer 2
{
.enable = 1,
.mode = RGB_MATRIX_CUSTOM_active_keys,
.hsv = {
.h = RGB_MATRIX_STARTUP_HUE,
.s = RGB_MATRIX_STARTUP_SAT,
.v = RGB_MATRIX_STARTUP_VAL,
},
.speed = RGB_MATRIX_STARTUP_SPD,
},
// Layer 3
{
.enable = 1,
.mode = RGB_MATRIX_CUSTOM_active_keys,
.hsv = {
.h = RGB_MATRIX_STARTUP_HUE,
.s = RGB_MATRIX_STARTUP_SAT,
.v = RGB_MATRIX_STARTUP_VAL,
},
.speed = RGB_MATRIX_STARTUP_SPD,
},
// Layer 4
{
.enable = 1,
.mode = RGB_MATRIX_CUSTOM_active_keys,
.hsv = {
.h = RGB_MATRIX_STARTUP_HUE,
.s = RGB_MATRIX_STARTUP_SAT,
.v = RGB_MATRIX_STARTUP_VAL,
},
.speed = RGB_MATRIX_STARTUP_SPD,
},
};
void system76_ec_rgb_layer(layer_state_t layer_state) {
if (!bootloader_unlocked) {
uint8_t layer = get_highest_layer(layer_state);
if (layer < DYNAMIC_KEYMAP_LAYER_COUNT) {
rgb_matrix_config = layer_rgb[layer];
}
}
}
#endif // defined(RGB_MATRIX_CUSTOM_KB) #endif // defined(RGB_MATRIX_CUSTOM_KB)
void raw_hid_receive(uint8_t *data, uint8_t length) { void raw_hid_receive(uint8_t *data, uint8_t length) {
@ -159,22 +215,31 @@ void raw_hid_receive(uint8_t *data, uint8_t length) {
#if defined(RGB_MATRIX_CUSTOM_KB) #if defined(RGB_MATRIX_CUSTOM_KB)
case CMD_LED_GET_VALUE: case CMD_LED_GET_VALUE:
if (!bootloader_unlocked) { if (!bootloader_unlocked) {
if (data[2] == CMD_LED_INDEX_ALL) { uint8_t index = data[2];
data[3] = rgb_matrix_config.hsv.v; for(uint8_t layer = 0; layer < DYNAMIC_KEYMAP_LAYER_COUNT; layer++) {
data[4] = RGB_MATRIX_MAXIMUM_BRIGHTNESS; if (index == (0xF0 | layer)) {
data[1] = 0; data[3] = layer_rgb[layer].hsv.v;
data[4] = RGB_MATRIX_MAXIMUM_BRIGHTNESS;
data[1] = 0;
break;
}
} }
} }
break; break;
case CMD_LED_SET_VALUE: case CMD_LED_SET_VALUE:
if (!bootloader_unlocked) { if (!bootloader_unlocked) {
if (data[2] == CMD_LED_INDEX_ALL) { uint8_t index = data[2];
rgb_matrix_sethsv_noeeprom( uint8_t value = data[3];
rgb_matrix_config.hsv.h, if (value >= RGB_MATRIX_MAXIMUM_BRIGHTNESS) {
rgb_matrix_config.hsv.s, value = RGB_MATRIX_MAXIMUM_BRIGHTNESS;
data[3] }
); for(uint8_t layer = 0; layer < DYNAMIC_KEYMAP_LAYER_COUNT; layer++) {
data[1] = 0; if (index == (0xF0 | layer)) {
layer_rgb[layer].hsv.v = value;
data[1] = 0;
system76_ec_rgb_layer(layer_state);
break;
}
} }
} }
break; break;
@ -186,11 +251,16 @@ void raw_hid_receive(uint8_t *data, uint8_t length) {
data[4] = raw_rgb_data[index].g; data[4] = raw_rgb_data[index].g;
data[5] = raw_rgb_data[index].b; data[5] = raw_rgb_data[index].b;
data[1] = 0; data[1] = 0;
} else if (index == CMD_LED_INDEX_ALL) { } else {
data[3] = rgb_matrix_config.hsv.h; for(uint8_t layer = 0; layer < DYNAMIC_KEYMAP_LAYER_COUNT; layer++) {
data[4] = rgb_matrix_config.hsv.s; if (index == (0xF0 | layer)) {
data[5] = 255; data[3] = layer_rgb[layer].hsv.h;
data[1] = 0; data[4] = layer_rgb[layer].hsv.s;
data[5] = 0;
data[1] = 0;
break;
}
}
} }
} }
break; break;
@ -205,30 +275,44 @@ void raw_hid_receive(uint8_t *data, uint8_t length) {
if (index < DRIVER_LED_TOTAL) { if (index < DRIVER_LED_TOTAL) {
raw_rgb_data[index] = rgb; raw_rgb_data[index] = rgb;
data[1] = 0; data[1] = 0;
} else if (index == CMD_LED_INDEX_ALL) { } else {
rgb_matrix_sethsv_noeeprom(rgb.r, rgb.g, rgb_matrix_config.hsv.v); for(uint8_t layer = 0; layer < DYNAMIC_KEYMAP_LAYER_COUNT; layer++) {
data[1] = 0; if (index == (0xF0 | layer)) {
layer_rgb[layer].hsv.h = rgb.r;
layer_rgb[layer].hsv.s = rgb.g;
// Ignore rgb.b
data[1] = 0;
system76_ec_rgb_layer(layer_state);
break;
}
}
} }
} }
break; break;
case CMD_LED_GET_MODE: case CMD_LED_GET_MODE:
if (!bootloader_unlocked) { if (!bootloader_unlocked) {
enum rgb_matrix_effects mode = rgb_matrix_get_mode(); uint8_t layer = data[2];
for (uint8_t i = 0; i < MODE_LAST; i++) { if (layer < DYNAMIC_KEYMAP_LAYER_COUNT) {
if (mode_map[i] == mode) { enum rgb_matrix_effects mode = layer_rgb[layer].mode;
data[2] = i; for (uint8_t i = 0; i < MODE_LAST; i++) {
data[3] = rgb_matrix_config.speed; if (mode_map[i] == mode) {
data[1] = 0; data[3] = i;
break; data[4] = layer_rgb[layer].speed;
data[1] = 0;
break;
}
} }
} }
} }
break; break;
case CMD_LED_SET_MODE: case CMD_LED_SET_MODE:
if (!bootloader_unlocked) { if (!bootloader_unlocked) {
if (data[2] < MODE_LAST) { uint8_t layer = data[2];
rgb_matrix_mode_noeeprom(mode_map[data[2]]); uint8_t mode = data[3];
rgb_matrix_config.speed = data[3]; uint8_t speed = data[4];
if (layer < DYNAMIC_KEYMAP_LAYER_COUNT && mode < MODE_LAST) {
layer_rgb[layer].mode = mode_map[mode];
layer_rgb[layer].speed = speed;
data[1] = 0; data[1] = 0;
} }
} }