diff options
Diffstat (limited to 'users/spidey3/layer_rgb.c')
| -rw-r--r-- | users/spidey3/layer_rgb.c | 397 |
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 | ||
| 6 | uint32_t rgb_mode; | 7 | uint32_t rgb_mode; |
| 7 | uint16_t rgb_hue; | 8 | uint16_t rgb_hue; |
| @@ -9,10 +10,17 @@ uint8_t rgb_sat; | |||
| 9 | uint8_t rgb_val; | 10 | uint8_t rgb_val; |
| 10 | bool rgb_saved = 0; | 11 | bool rgb_saved = 0; |
| 11 | 12 | ||
| 13 | extern bool spi_gflock; | ||
| 14 | extern uint16_t spi_replace_mode; | ||
| 15 | |||
| 12 | void spidey_glow(void) { | 16 | void 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 | ||
| 43 | const rgblight_segment_t PROGMEM _none[] = NONE; | ||
| 44 | |||
| 34 | #define LAYER_OFFSET 0 | 45 | #define LAYER_OFFSET 0 |
| 35 | const rgblight_segment_t PROGMEM _layer1_layer[] = RGBLIGHT_LAYER_SEGMENTS(CORNER_BR(HSV_PURPLE)); | 46 | // No indicator for base layer |
| 36 | const rgblight_segment_t PROGMEM _layer2_layer[] = RGBLIGHT_LAYER_SEGMENTS(CORNERS(HSV_MAGENTA)); | 47 | const rgblight_segment_t PROGMEM _layer1_layer[] = RGBLIGHT_LAYER_SEGMENTS(CORNERS(HSV_MAGENTA)); // _NUMPAD |
| 37 | const rgblight_segment_t PROGMEM _layer3_layer[] = RGBLIGHT_LAYER_SEGMENTS(CORNERS(HSV_GREEN)); | 48 | const 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 |
| 40 | const rgblight_segment_t PROGMEM _numlock_layer[] = RGBLIGHT_LAYER_SEGMENTS(FRONT(3, HSV_YELLOW)); | 51 | const 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 | |||
| 49 | const rgblight_segment_t PROGMEM _no_layer[] = RGBLIGHT_LAYER_SEGMENTS(FRONT(1, HSV_RED)); | 60 | const rgblight_segment_t PROGMEM _no_layer[] = RGBLIGHT_LAYER_SEGMENTS(FRONT(1, HSV_RED)); |
| 50 | const rgblight_segment_t PROGMEM _yes_layer[] = RGBLIGHT_LAYER_SEGMENTS(FRONT(1, HSV_GREEN)); | 61 | const rgblight_segment_t PROGMEM _yes_layer[] = RGBLIGHT_LAYER_SEGMENTS(FRONT(1, HSV_GREEN)); |
| 51 | const rgblight_segment_t PROGMEM _meh_layer[] = RGBLIGHT_LAYER_SEGMENTS(FRONT(1, HSV_YELLOW)); | 62 | const rgblight_segment_t PROGMEM _meh_layer[] = RGBLIGHT_LAYER_SEGMENTS(FRONT(1, HSV_YELLOW)); |
| 63 | const 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 | ||
| 66 | const 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 | ||
| 70 | const 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. |
| 54 | const rgblight_segment_t *const PROGMEM _rgb_layers[] = { | 73 | const 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 | ||
| 75 | const uint8_t PROGMEM _n_rgb_layers = sizeof(_rgb_layers) / sizeof(_rgb_layers[0]) - 1; | 101 | const uint8_t PROGMEM _n_rgb_layers = sizeof(_rgb_layers) / sizeof(_rgb_layers[0]) - 1; |
| 76 | 102 | ||
| @@ -84,118 +110,259 @@ void clear_rgb_layers() { | |||
| 84 | void do_rgb_layers(layer_state_t state, uint8_t start, uint8_t end) { | 110 | void 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 | ||
| 118 | void 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 | |||
| 127 | void 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. | ||
| 136 | int8_t change_hue = 0; | ||
| 137 | int8_t change_sat = 0; | ||
| 138 | int8_t change_val = 0; | ||
| 139 | |||
| 140 | // timer to control color change speed | ||
| 141 | uint16_t change_timer = 0; | ||
| 142 | const uint16_t change_tick = 15; | ||
| 143 | |||
| 92 | extern rgblight_config_t rgblight_config; | 144 | extern rgblight_config_t rgblight_config; |
| 93 | extern rgblight_status_t rgblight_status; | 145 | extern rgblight_status_t rgblight_status; |
| 94 | static 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 | |||
| 157 | typedef 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 | |||
| 171 | static rgblight_config_t old_config; | ||
| 172 | static uint8_t old_base_mode; | ||
| 173 | static startup_animation_state_t startup_animation_state = DISABLED; | ||
| 174 | static uint16_t rgblight_startup_loop_timer; | ||
| 175 | |||
| 176 | void 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 | ||
| 96 | void keyboard_post_init_user_rgb(void) { | 185 | void 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 = | 196 | void 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 | |||
| 355 | void 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 | ||
| 197 | layer_state_t default_layer_state_set_user_rgb(layer_state_t state) { | 364 | layer_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) { | |||
| 225 | extern keymap_config_t keymap_config; | 392 | extern keymap_config_t keymap_config; |
| 226 | extern rgblight_config_t rgblight_config; | 393 | extern rgblight_config_t rgblight_config; |
| 227 | 394 | ||
| 228 | extern bool spi_gflock; | ||
| 229 | extern uint16_t spi_replace_mode; | ||
| 230 | |||
| 231 | bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { | 395 | bool 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 | } |
