aboutsummaryrefslogtreecommitdiff
path: root/users/spidey3/layer_rgb.c
diff options
context:
space:
mode:
Diffstat (limited to 'users/spidey3/layer_rgb.c')
-rw-r--r--users/spidey3/layer_rgb.c397
1 files changed, 302 insertions, 95 deletions
diff --git a/users/spidey3/layer_rgb.c b/users/spidey3/layer_rgb.c
index 160cc4317..37e59579c 100644
--- a/users/spidey3/layer_rgb.c
+++ b/users/spidey3/layer_rgb.c
@@ -2,6 +2,7 @@
2 2
3#include "spidey3.h" 3#include "spidey3.h"
4#include "velocikey.h" 4#include "velocikey.h"
5#include <lib/lib8tion/lib8tion.h>
5 6
6uint32_t rgb_mode; 7uint32_t rgb_mode;
7uint16_t rgb_hue; 8uint16_t rgb_hue;
@@ -9,10 +10,17 @@ uint8_t rgb_sat;
9uint8_t rgb_val; 10uint8_t rgb_val;
10bool rgb_saved = 0; 11bool rgb_saved = 0;
11 12
13extern bool spi_gflock;
14extern uint16_t spi_replace_mode;
15
12void spidey_glow(void) { 16void spidey_glow(void) {
13 rgblight_enable(); 17 rgblight_enable();
14 rgblight_mode(RGBLIGHT_MODE_TWINKLE + 4);
15 rgblight_sethsv(213, 255, 128); 18 rgblight_sethsv(213, 255, 128);
19 if ((RGBLIGHT_MODE_TWINKLE <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_TWINKLE_end)) {
20 rgblight_step();
21 } else {
22 rgblight_mode(RGBLIGHT_MODE_TWINKLE);
23 }
16#ifdef VELOCIKEY_ENABLE 24#ifdef VELOCIKEY_ENABLE
17 if (velocikey_enabled()) velocikey_toggle(); 25 if (velocikey_enabled()) velocikey_toggle();
18#endif 26#endif
@@ -23,6 +31,7 @@ void eeconfig_init_user_rgb(void) { spidey_glow(); }
23// clang-format off 31// clang-format off
24 32
25// Convenience macros 33// Convenience macros
34#define NONE { RGBLIGHT_END_SEGMENTS }
26#define CORNER_BL(color) { 0, 1, color } 35#define CORNER_BL(color) { 0, 1, color }
27#define CORNER_BR(color) { RGBLED_NUM / 2 - 1, 1, color } 36#define CORNER_BR(color) { RGBLED_NUM / 2 - 1, 1, color }
28#define CORNER_FR(color) { RGBLED_NUM / 2, 1, color } 37#define CORNER_FR(color) { RGBLED_NUM / 2, 1, color }
@@ -31,10 +40,12 @@ void eeconfig_init_user_rgb(void) { spidey_glow(); }
31#define FRONT(inset, color) { RGBLED_NUM / 2 + inset, RGBLED_NUM / 2 - 2 * inset, color } 40#define FRONT(inset, color) { RGBLED_NUM / 2 + inset, RGBLED_NUM / 2 - 2 * inset, color }
32#define BACK(inset, color) { inset, RGBLED_NUM / 2 - 2 * inset, color } 41#define BACK(inset, color) { inset, RGBLED_NUM / 2 - 2 * inset, color }
33 42
43const rgblight_segment_t PROGMEM _none[] = NONE;
44
34#define LAYER_OFFSET 0 45#define LAYER_OFFSET 0
35const rgblight_segment_t PROGMEM _layer1_layer[] = RGBLIGHT_LAYER_SEGMENTS(CORNER_BR(HSV_PURPLE)); 46// No indicator for base layer
36const rgblight_segment_t PROGMEM _layer2_layer[] = RGBLIGHT_LAYER_SEGMENTS(CORNERS(HSV_MAGENTA)); 47const rgblight_segment_t PROGMEM _layer1_layer[] = RGBLIGHT_LAYER_SEGMENTS(CORNERS(HSV_MAGENTA)); // _NUMPAD
37const rgblight_segment_t PROGMEM _layer3_layer[] = RGBLIGHT_LAYER_SEGMENTS(CORNERS(HSV_GREEN)); 48const rgblight_segment_t PROGMEM _layer2_layer[] = RGBLIGHT_LAYER_SEGMENTS(CORNERS(HSV_GREEN)); // _FN
38 49
39#define LOCK_OFFSET 3 50#define LOCK_OFFSET 3
40const rgblight_segment_t PROGMEM _numlock_layer[] = RGBLIGHT_LAYER_SEGMENTS(FRONT(3, HSV_YELLOW)); 51const rgblight_segment_t PROGMEM _numlock_layer[] = RGBLIGHT_LAYER_SEGMENTS(FRONT(3, HSV_YELLOW));
@@ -49,12 +60,20 @@ const rgblight_segment_t PROGMEM _glyphreplace_layer[] = RGBLIGHT_LAYER_SEGMENTS
49const rgblight_segment_t PROGMEM _no_layer[] = RGBLIGHT_LAYER_SEGMENTS(FRONT(1, HSV_RED)); 60const rgblight_segment_t PROGMEM _no_layer[] = RGBLIGHT_LAYER_SEGMENTS(FRONT(1, HSV_RED));
50const rgblight_segment_t PROGMEM _yes_layer[] = RGBLIGHT_LAYER_SEGMENTS(FRONT(1, HSV_GREEN)); 61const rgblight_segment_t PROGMEM _yes_layer[] = RGBLIGHT_LAYER_SEGMENTS(FRONT(1, HSV_GREEN));
51const rgblight_segment_t PROGMEM _meh_layer[] = RGBLIGHT_LAYER_SEGMENTS(FRONT(1, HSV_YELLOW)); 62const rgblight_segment_t PROGMEM _meh_layer[] = RGBLIGHT_LAYER_SEGMENTS(FRONT(1, HSV_YELLOW));
63const rgblight_segment_t PROGMEM _huh_layer[] = RGBLIGHT_LAYER_SEGMENTS(CORNERS(HSV_YELLOW), FRONT(1, HSV_BLUE), BACK(1, HSV_BLUE));
64
65#define UNICODE_OFFSET 12
66const rgblight_segment_t PROGMEM _uc_mac_layer[] = RGBLIGHT_LAYER_SEGMENTS(CORNER_BR(HSV_PURPLE));
67// No indicator for UC_LNX
68// UC_WIN disabled in config.h
69// UC_BSD not implemented
70const rgblight_segment_t PROGMEM _uc_winc_layer[] = RGBLIGHT_LAYER_SEGMENTS(CORNER_BR(HSV_CYAN));
52 71
53// Now define the array of layers. Higher numbered layers take precedence. 72// Now define the array of layers. Higher numbered layers take precedence.
54const rgblight_segment_t *const PROGMEM _rgb_layers[] = { 73const rgblight_segment_t *const PROGMEM _rgb_layers[] = {
55 [LAYER_OFFSET + 0] = _layer1_layer, 74 [LAYER_OFFSET + _BASE] = _none,
56 [LAYER_OFFSET + 1] = _layer2_layer, 75 [LAYER_OFFSET + _NUMPAD] = _layer1_layer,
57 [LAYER_OFFSET + 2] = _layer3_layer, 76 [LAYER_OFFSET + _FN] = _layer2_layer,
58 77
59 [LOCK_OFFSET + USB_LED_NUM_LOCK] = _numlock_layer, 78 [LOCK_OFFSET + USB_LED_NUM_LOCK] = _numlock_layer,
60 [LOCK_OFFSET + USB_LED_CAPS_LOCK] = _capslock_layer, 79 [LOCK_OFFSET + USB_LED_CAPS_LOCK] = _capslock_layer,
@@ -66,11 +85,18 @@ const rgblight_segment_t *const PROGMEM _rgb_layers[] = {
66 [ACK_OFFSET + ACK_NO] = _no_layer, 85 [ACK_OFFSET + ACK_NO] = _no_layer,
67 [ACK_OFFSET + ACK_YES] = _yes_layer, 86 [ACK_OFFSET + ACK_YES] = _yes_layer,
68 [ACK_OFFSET + ACK_MEH] = _meh_layer, 87 [ACK_OFFSET + ACK_MEH] = _meh_layer,
88 [ACK_OFFSET + ACK_HUH] = _huh_layer,
89
90 [UNICODE_OFFSET + UC_MAC] = _uc_mac_layer,
91 [UNICODE_OFFSET + UC_LNX] = _none,
92 [UNICODE_OFFSET + UC_WIN] = _none,
93 [UNICODE_OFFSET + UC_BSD] = _none,
94 [UNICODE_OFFSET + UC_WINC] = _uc_winc_layer,
69 95
70 [ACK_OFFSET + ACK_MEH + 1] = NULL 96 [UNICODE_OFFSET + UC__COUNT] = NULL
71}; 97};
72 98
73// clang-format on 99// clang-format on
74 100
75const uint8_t PROGMEM _n_rgb_layers = sizeof(_rgb_layers) / sizeof(_rgb_layers[0]) - 1; 101const uint8_t PROGMEM _n_rgb_layers = sizeof(_rgb_layers) / sizeof(_rgb_layers[0]) - 1;
76 102
@@ -84,118 +110,259 @@ void clear_rgb_layers() {
84void do_rgb_layers(layer_state_t state, uint8_t start, uint8_t end) { 110void do_rgb_layers(layer_state_t state, uint8_t start, uint8_t end) {
85 for (uint8_t i = start; i < end; i++) { 111 for (uint8_t i = start; i < end; i++) {
86 bool is_on = layer_state_cmp(state, i); 112 bool is_on = layer_state_cmp(state, i);
87 dprintf("layer[%u]=%u\n", i, is_on); 113 dprintf("layer[%u]=rl[%u]=%u\n", i, LAYER_OFFSET + i, is_on);
88 rgblight_set_layer_state(LAYER_OFFSET + i - 1, is_on); 114 rgblight_set_layer_state(LAYER_OFFSET + i, is_on);
89 } 115 }
90} 116}
91 117
118void do_rgb_unicode(void) {
119 uint8_t uc_mode = get_unicode_input_mode();
120 for (uint8_t i = 0; i < UC__COUNT; i++) {
121 bool is_on = i == uc_mode;
122 dprintf("unicode[%u]=rl[%u]=%u\n", i, UNICODE_OFFSET + i, is_on);
123 rgblight_set_layer_state(UNICODE_OFFSET + i, is_on);
124 }
125}
126
127void do_rgb_all(void) {
128 do_rgb_layers(default_layer_state, LAYER_BASE_DEFAULT, LAYER_BASE_REGULAR);
129 do_rgb_layers(layer_state, LAYER_BASE_REGULAR, LAYER_BASE_END);
130 do_rgb_unicode();
131 rgblight_set_layer_state(MISC_OFFSET + 0, spi_gflock);
132 rgblight_set_layer_state(MISC_OFFSET + 1, spi_replace_mode != SPI_NORMAL);
133}
134
135// flags. 0 = no change, 1 = increment, -1 = decrement.
136int8_t change_hue = 0;
137int8_t change_sat = 0;
138int8_t change_val = 0;
139
140// timer to control color change speed
141uint16_t change_timer = 0;
142const uint16_t change_tick = 15;
143
92extern rgblight_config_t rgblight_config; 144extern rgblight_config_t rgblight_config;
93extern rgblight_status_t rgblight_status; 145extern rgblight_status_t rgblight_status;
94static bool startup_animation_done = false; 146
147#if defined(RGBLIGHT_STARTUP_ANIMATION)
148
149#define STARTUP_ANIMATION_SATURATION 200
150#define STARTUP_ANIMATION_VALUE 255
151#define STARTUP_ANIMATION_FADE_STEP 5
152#define STARTUP_ANIMATION_CYCLE_STEP 2
153#define STARTUP_ANIMATION_RAMP_TO_STEPS 70
154#define STARTUP_ANIMATION_STEP_TIME 10
155#define STARTUP_ANIMATION_INITIAL_DELAY 0 // milliseconds, must be < 255 * STEP_TIME
156
157typedef enum {
158 DISABLED,
159 WAITING,
160 RESTART,
161 START,
162 FADE_OLD,
163 FADE_IN,
164 CYCLE,
165 RAMP_DOWN,
166 RAMP_TO,
167 CLEAN_UP,
168 DONE
169} startup_animation_state_t;
170
171static rgblight_config_t old_config;
172static uint8_t old_base_mode;
173static startup_animation_state_t startup_animation_state = DISABLED;
174static uint16_t rgblight_startup_loop_timer;
175
176void startup_animation_init(void) {
177 old_config.raw = rgblight_config.raw;
178 old_base_mode = rgblight_status.base_mode;
179
180 if (!old_config.enable)
181 rgblight_enable_noeeprom();
182}
183#endif
95 184
96void keyboard_post_init_user_rgb(void) { 185void keyboard_post_init_user_rgb(void) {
97 // Enable the LED layers 186 // Enable the LED layers
98 rgblight_layers = _rgb_layers; 187 rgblight_layers = _rgb_layers;
99 do_rgb_layers(default_layer_state, LAYER_BASE_DEFAULT + 1, LAYER_BASE_REGULAR); 188 do_rgb_all();
100 do_rgb_layers(layer_state, LAYER_BASE_REGULAR, LAYER_BASE_END);
101 189
102 // Startup animation 190#if defined(RGBLIGHT_STARTUP_ANIMATION)
103 { 191 startup_animation_init();
104 bool is_enabled = rgblight_config.enable; 192 startup_animation_state = STARTUP_ANIMATION_INITIAL_DELAY ? WAITING : START;
105 uint8_t old_hue = rgblight_config.hue; 193#endif
106 uint8_t old_sat = rgblight_config.sat; 194}
107 uint8_t old_val = rgblight_config.val;
108 uint8_t old_mode = rgblight_config.mode;
109 195
110 bool ramp_down = 196void matrix_scan_user_rgb(void) {
197#if defined(RGBLIGHT_STARTUP_ANIMATION)
198 if (startup_animation_state != DONE && is_keyboard_master()) {
199 if (startup_animation_state == START || timer_elapsed(rgblight_startup_loop_timer) > STARTUP_ANIMATION_STEP_TIME) {
200 static uint8_t counter;
201 rgblight_startup_loop_timer = timer_read();
202
203 switch (startup_animation_state) {
204 case WAITING:
205#ifdef STARTUP_ANIMATION_DEBUG
206 dprintf("sua WAITING counter=%u\n", counter);
207#endif
208 if (counter < STARTUP_ANIMATION_INITIAL_DELAY / STARTUP_ANIMATION_STEP_TIME) {
209 counter++;
210 } else {
211 startup_animation_state = START;
212 }
213 break;
214
215 case RESTART:
216 dprintln("sua RESTART");
217 startup_animation_init();
218 case START:
219 dprintln("sua START");
220 startup_animation_state = FADE_OLD;
221 counter = old_config.val;
222 // No break! Just roll into FADE_OLD in the same iteration...
223
224 case FADE_OLD:
225#ifdef STARTUP_ANIMATION_DEBUG
226 dprintf("sua FADE_OLD counter=%u\n", counter);
227#endif
228 if (counter >= STARTUP_ANIMATION_FADE_STEP) {
229 rgblight_sethsv_noeeprom(old_config.hue, old_config.sat, counter);
230 counter -= STARTUP_ANIMATION_FADE_STEP;
231 } else {
232 counter = 0;
233 startup_animation_state = FADE_IN;
234 rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
235 }
236 break;
237
238 case FADE_IN:
239#ifdef STARTUP_ANIMATION_DEBUG
240 dprintf("sua FADE_IN counter=%u\n", counter);
241#endif
242 if (counter < STARTUP_ANIMATION_VALUE) {
243 rgblight_sethsv_noeeprom(old_config.hue, STARTUP_ANIMATION_SATURATION, counter);
244 counter += STARTUP_ANIMATION_FADE_STEP;
245 } else {
246 counter = 255;
247 startup_animation_state = CYCLE;
248 }
249 break;
250
251 case CYCLE:
252#ifdef STARTUP_ANIMATION_DEBUG
253 dprintf("sua CYCLE counter=%u\n", counter);
254#endif
255 if (counter >= STARTUP_ANIMATION_CYCLE_STEP) {
256 rgblight_sethsv_noeeprom((counter + old_config.hue) % 255, STARTUP_ANIMATION_SATURATION, STARTUP_ANIMATION_VALUE);
257 counter -= STARTUP_ANIMATION_CYCLE_STEP;
258 } else {
259 if (
111#ifdef RGBLIGHT_EFFECT_BREATHING 260#ifdef RGBLIGHT_EFFECT_BREATHING
112 (rgblight_status.base_mode == RGBLIGHT_MODE_BREATHING) || 261 (old_base_mode == RGBLIGHT_MODE_BREATHING) ||
113#endif 262#endif
114#ifdef RGBLIGHT_EFFECT_SNAKE 263#ifdef RGBLIGHT_EFFECT_SNAKE
115 (rgblight_status.base_mode == RGBLIGHT_MODE_SNAKE) || 264 (old_base_mode == RGBLIGHT_MODE_SNAKE) ||
116#endif 265#endif
117#ifdef RGBLIGHT_EFFECT_KNIGHT 266#ifdef RGBLIGHT_EFFECT_KNIGHT
118 (rgblight_status.base_mode == RGBLIGHT_MODE_KNIGHT) || 267 (old_base_mode == RGBLIGHT_MODE_KNIGHT) ||
119#endif 268#endif
120#ifdef RGBLIGHT_EFFECT_TWINKLE 269#ifdef RGBLIGHT_EFFECT_TWINKLE
121 (rgblight_status.base_mode == RGBLIGHT_MODE_TWINKLE) || 270 (old_base_mode == RGBLIGHT_MODE_TWINKLE) ||
122#endif 271#endif
123 !is_enabled; 272 !old_config.enable) {
124 273 counter = STARTUP_ANIMATION_VALUE;
125 bool ramp_to = 274 startup_animation_state = RAMP_DOWN;
275 } else if (
126#ifdef RGBLIGHT_EFFECT_STATIC_GRADIENT 276#ifdef RGBLIGHT_EFFECT_STATIC_GRADIENT
127 (rgblight_status.base_mode == RGBLIGHT_MODE_STATIC_GRADIENT) || 277 (old_base_mode == RGBLIGHT_MODE_STATIC_GRADIENT) ||
128#endif 278#endif
129#ifdef RGBLIGHT_EFFECT_RAINBOW_MOOD 279#ifdef RGBLIGHT_EFFECT_RAINBOW_MOOD
130 (rgblight_status.base_mode == RGBLIGHT_MODE_RAINBOW_MOOD) || 280 (old_base_mode == RGBLIGHT_MODE_RAINBOW_MOOD) ||
131#endif 281#endif
132#ifdef RGBLIGHT_EFFECT_RAINBOW_SWIRL 282#ifdef RGBLIGHT_EFFECT_RAINBOW_SWIRL
133 (rgblight_status.base_mode == RGBLIGHT_MODE_RAINBOW_SWIRL) || 283 (old_base_mode == RGBLIGHT_MODE_RAINBOW_SWIRL) ||
134#endif 284#endif
135#ifdef RGBLIGHT_EFFECT_RAINBOW_CHRISTMAS 285#ifdef RGBLIGHT_EFFECT_RAINBOW_CHRISTMAS
136 (rgblight_status.base_mode == RGBLIGHT_MODE_CHRISTMAS) || 286 (old_base_mode == RGBLIGHT_MODE_CHRISTMAS) ||
137#endif 287#endif
138#ifdef RGBLIGHT_EFFECT_RAINBOW_RGB_TEST_ 288#ifdef RGBLIGHT_EFFECT_RAINBOW_RGB_TEST_
139 (rgblight_status.base_mode == RGBLIGHT_MODE_RGB_TEST) || 289 (old_base_mode == RGBLIGHT_MODE_RGB_TEST) ||
140#endif 290#endif
141 (rgblight_status.base_mode == RGBLIGHT_MODE_STATIC_LIGHT); 291 (old_base_mode == RGBLIGHT_MODE_STATIC_LIGHT)) {
142 292 counter = 0;
143#define STARTUP_ANIMATION_SATURATION 200 293 startup_animation_state = RAMP_TO;
144#define STARTUP_ANIMATION_VALUE 255 294 } else {
145#define STARTUP_ANIMATION_STEP 5 295 startup_animation_state = CLEAN_UP;
146 296 }
147 rgblight_enable_noeeprom(); 297 }
148 if (rgblight_config.enable) { 298 break;
149 rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); 299
150 for (uint8_t i = 0; i < STARTUP_ANIMATION_VALUE; i += STARTUP_ANIMATION_STEP) { 300 case RAMP_DOWN:
151 rgblight_sethsv_noeeprom(old_hue, STARTUP_ANIMATION_SATURATION, i); 301#ifdef STARTUP_ANIMATION_DEBUG
152 matrix_scan(); 302 dprintf("sua RAMP_DOWN counter=%u\n", counter);
153 wait_ms(10); 303#endif
154 } 304 if (counter >= STARTUP_ANIMATION_FADE_STEP) {
155 for (uint8_t i = 255; i > 0; i -= STARTUP_ANIMATION_STEP) { 305 rgblight_sethsv_noeeprom(old_config.hue, STARTUP_ANIMATION_SATURATION, counter);
156 rgblight_sethsv_noeeprom((i + old_hue) % 255, STARTUP_ANIMATION_SATURATION, STARTUP_ANIMATION_VALUE); 306 counter -= STARTUP_ANIMATION_FADE_STEP;
157 matrix_scan(); 307 } else {
158 wait_ms(10); 308 startup_animation_state = CLEAN_UP;
159 } 309 }
160 310 break;
161 if (ramp_down) { 311
162 dprintln("ramp_down"); 312 case RAMP_TO:
163 for (uint8_t i = STARTUP_ANIMATION_VALUE; i > 0; i -= STARTUP_ANIMATION_STEP) { 313 {
164 rgblight_sethsv_noeeprom(old_hue, STARTUP_ANIMATION_SATURATION, i); 314#ifdef STARTUP_ANIMATION_DEBUG
165 matrix_scan(); 315 dprintf("sua RAMP_TO s=%u, v=%u, counter=%u\n", old_config.sat, old_config.val, counter);
166 wait_ms(10); 316#endif
167 } 317 uint8_t steps = STARTUP_ANIMATION_RAMP_TO_STEPS;
168 } else if (ramp_to) { 318 if (counter < steps) {
169 dprintf("ramp_to s=%u, v=%u\n", old_sat, old_val); 319 uint8_t s = STARTUP_ANIMATION_SATURATION + counter * (((float)old_config.sat - STARTUP_ANIMATION_SATURATION) / (float)steps);
170 uint8_t steps = 50; 320 uint8_t v = STARTUP_ANIMATION_VALUE + counter * (((float)old_config.val - STARTUP_ANIMATION_VALUE) / (float)steps);
171 for (uint8_t i = 0; i < steps; i++) { 321 rgblight_sethsv_noeeprom(old_config.hue, s, v);
172 uint8_t s = STARTUP_ANIMATION_SATURATION + i * (((float)old_sat - STARTUP_ANIMATION_SATURATION) / (float)steps); 322 counter++;
173 uint8_t v = STARTUP_ANIMATION_VALUE + i * (((float)old_val - STARTUP_ANIMATION_VALUE) / (float)steps); 323 } else {
174 rgblight_sethsv_noeeprom(old_hue, s, v); 324 startup_animation_state = CLEAN_UP;
175 matrix_scan(); 325 }
176 wait_ms(10); 326 }
177 } 327 break;
328
329 case CLEAN_UP:
330 dprintln("sua CLEAN_UP");
331 rgblight_reload_from_eeprom();
332 startup_animation_state = DONE;
333 dprintln("sua DONE");
334 break;
335
336 default:
337 break;
178 } 338 }
179 rgblight_mode_noeeprom(old_mode);
180 } 339 }
181 if (is_enabled) { 340 }
182 rgblight_sethsv_noeeprom(old_hue, old_sat, old_val); 341#endif
183 } else { 342
184 rgblight_disable_noeeprom(); 343 if (change_hue != 0 || change_val != 0 || change_sat != 0) {
185 // Hack! 344 if (timer_elapsed(change_timer) > change_tick) {
186 // rgblight_sethsv_noeeprom() doesn't update these if rgblight is disabled, 345 HSV hsv = rgblight_get_hsv();
187 // but if do it before disabling we get an ugly flash. 346 hsv.h += change_hue;
188 rgblight_config.hue = old_hue; 347 hsv.s = change_sat > 0 ? qadd8(hsv.s, (uint8_t) change_sat) : qsub8(hsv.s, (uint8_t) -change_sat);
189 rgblight_config.sat = old_sat; 348 hsv.v = change_val > 0 ? qadd8(hsv.v, (uint8_t) change_val) : qsub8(hsv.v, (uint8_t) -change_val);
190 rgblight_config.val = old_val; 349 rgblight_sethsv_noeeprom(hsv.h, hsv.s, hsv.v);
350 change_timer = timer_read();
191 } 351 }
192 dprint("done\n"); 352 }
193 startup_animation_done = true; 353}
354
355void shutdown_user_rgb(void) {
356 clear_rgb_layers();
357 rgblight_enable_noeeprom();
358 rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
359 for (int i = 0; i < RGBLED_NUM; i++) {
360 rgblight_setrgb_at(0xFF, 0x80 * (i % 2), 0, i);
194 } 361 }
195} 362}
196 363
197layer_state_t default_layer_state_set_user_rgb(layer_state_t state) { 364layer_state_t default_layer_state_set_user_rgb(layer_state_t state) {
198 do_rgb_layers(state, 1u, LAYER_BASE_REGULAR); 365 do_rgb_layers(state, LAYER_BASE_DEFAULT, LAYER_BASE_REGULAR);
199 return state; 366 return state;
200} 367}
201 368
@@ -225,15 +392,45 @@ void rgb_layer_ack(layer_ack_t n) {
225extern keymap_config_t keymap_config; 392extern keymap_config_t keymap_config;
226extern rgblight_config_t rgblight_config; 393extern rgblight_config_t rgblight_config;
227 394
228extern bool spi_gflock;
229extern uint16_t spi_replace_mode;
230
231bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { 395bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) {
232 if (record->event.pressed) { 396 if (record->event.pressed) {
233 switch (keycode) { 397 switch (keycode) {
234 case SPI_GLO: 398 case SPI_GLO:
235 spidey_glow(); 399 spidey_glow();
236 return false; 400 return false;
401
402 // clang-format off
403 case RGB_HUI: change_timer = timer_read(); change_hue = 1; return false;
404 case RGB_HUD: change_timer = timer_read(); change_hue = -1; return false;
405 case RGB_SAI: change_timer = timer_read(); change_sat = 1; return false;
406 case RGB_SAD: change_timer = timer_read(); change_sat = -1; return false;
407 case RGB_VAI: change_timer = timer_read(); change_val = 1; return false;
408 case RGB_VAD: change_timer = timer_read(); change_val = -1; return false;
409 // clang-format on
410 }
411 } else {
412 bool rgb_done = false;
413 switch (keycode) {
414 case RGB_HUI:
415 case RGB_HUD:
416 change_hue = 0;
417 rgb_done = true;
418 break;
419 case RGB_SAI:
420 case RGB_SAD:
421 change_sat = 0;
422 rgb_done = true;
423 break;
424 case RGB_VAI:
425 case RGB_VAD:
426 change_val = 0;
427 rgb_done = true;
428 break;
429 }
430
431 if (rgb_done) {
432 HSV final = rgblight_get_hsv();
433 rgblight_sethsv(final.h, final.s, final.v);
237 } 434 }
238 } 435 }
239 436
@@ -244,13 +441,12 @@ void post_process_record_user_rgb(uint16_t keycode, keyrecord_t *record) {
244 switch (keycode) { 441 switch (keycode) {
245 // Acks follow... 442 // Acks follow...
246 case DEBUG: 443 case DEBUG:
247 rgb_layer_ack_yn(debug_enable); 444 if (debug_matrix || debug_keyboard)
248 break; 445 rgb_layer_ack(ACK_HUH);
249 446 else if (debug_enable)
250 case SPI_LNX: 447 rgb_layer_ack(ACK_YES);
251 case SPI_OSX: 448 else
252 case SPI_WIN: 449 rgb_layer_ack(ACK_NO);
253 rgb_layer_ack(ACK_MEH);
254 break; 450 break;
255 451
256 case SPI_GFLOCK: 452 case SPI_GFLOCK:
@@ -280,5 +476,16 @@ void post_process_record_user_rgb(uint16_t keycode, keyrecord_t *record) {
280 rgb_layer_ack_yn(keymap_config.nkro); 476 rgb_layer_ack_yn(keymap_config.nkro);
281 break; 477 break;
282#endif 478#endif
479
480#if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)
481 case SPI_LNX:
482 case SPI_OSX:
483 case SPI_WIN:
484 case UC_MOD:
485 case UC_RMOD:
486 rgb_layer_ack(ACK_MEH);
487 do_rgb_unicode();
488 break;
489#endif
283 } 490 }
284} 491}