diff options
Diffstat (limited to 'users/spidey3/layer_rgb.c')
| -rw-r--r-- | users/spidey3/layer_rgb.c | 311 |
1 files changed, 232 insertions, 79 deletions
diff --git a/users/spidey3/layer_rgb.c b/users/spidey3/layer_rgb.c index 75e66384e..160cc4317 100644 --- a/users/spidey3/layer_rgb.c +++ b/users/spidey3/layer_rgb.c | |||
| @@ -5,127 +5,280 @@ | |||
| 5 | 5 | ||
| 6 | uint32_t rgb_mode; | 6 | uint32_t rgb_mode; |
| 7 | uint16_t rgb_hue; | 7 | uint16_t rgb_hue; |
| 8 | uint8_t rgb_sat; | 8 | uint8_t rgb_sat; |
| 9 | uint8_t rgb_val; | 9 | uint8_t rgb_val; |
| 10 | bool rgb_saved = 0; | 10 | bool rgb_saved = 0; |
| 11 | 11 | ||
| 12 | void spidey_swirl(void) { | 12 | void spidey_glow(void) { |
| 13 | dprint("Setting Spidey Swirl!\n"); | 13 | rgblight_enable(); |
| 14 | rgblight_enable(); | 14 | rgblight_mode(RGBLIGHT_MODE_TWINKLE + 4); |
| 15 | rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL); | 15 | rgblight_sethsv(213, 255, 128); |
| 16 | rgblight_sethsv(213, 255, 128); | ||
| 17 | #ifdef VELOCIKEY_ENABLE | 16 | #ifdef VELOCIKEY_ENABLE |
| 18 | if (!velocikey_enabled()) | 17 | if (velocikey_enabled()) velocikey_toggle(); |
| 19 | velocikey_toggle(); | ||
| 20 | #endif | 18 | #endif |
| 21 | } | 19 | } |
| 22 | 20 | ||
| 23 | void eeconfig_init_user_rgb(void) | 21 | void eeconfig_init_user_rgb(void) { spidey_glow(); } |
| 24 | { | 22 | |
| 25 | spidey_swirl(); | 23 | // clang-format off |
| 26 | } | 24 | |
| 25 | // Convenience macros | ||
| 26 | #define CORNER_BL(color) { 0, 1, color } | ||
| 27 | #define CORNER_BR(color) { RGBLED_NUM / 2 - 1, 1, color } | ||
| 28 | #define CORNER_FR(color) { RGBLED_NUM / 2, 1, color } | ||
| 29 | #define CORNER_FL(color) { RGBLED_NUM - 1, 1, color } | ||
| 30 | #define CORNERS(color) {0, 1, color}, {RGBLED_NUM / 2 - 1, 2, color}, { RGBLED_NUM - 1, 1, color } | ||
| 31 | #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 } | ||
| 33 | |||
| 34 | #define LAYER_OFFSET 0 | ||
| 35 | const rgblight_segment_t PROGMEM _layer1_layer[] = RGBLIGHT_LAYER_SEGMENTS(CORNER_BR(HSV_PURPLE)); | ||
| 36 | const rgblight_segment_t PROGMEM _layer2_layer[] = RGBLIGHT_LAYER_SEGMENTS(CORNERS(HSV_MAGENTA)); | ||
| 37 | const rgblight_segment_t PROGMEM _layer3_layer[] = RGBLIGHT_LAYER_SEGMENTS(CORNERS(HSV_GREEN)); | ||
| 38 | |||
| 39 | #define LOCK_OFFSET 3 | ||
| 40 | const rgblight_segment_t PROGMEM _numlock_layer[] = RGBLIGHT_LAYER_SEGMENTS(FRONT(3, HSV_YELLOW)); | ||
| 41 | const rgblight_segment_t PROGMEM _capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS(CORNER_FL(HSV_AZURE)); | ||
| 42 | const rgblight_segment_t PROGMEM _scrolllock_layer[] = RGBLIGHT_LAYER_SEGMENTS(CORNER_FR(HSV_ORANGE)); | ||
| 43 | |||
| 44 | #define MISC_OFFSET 6 | ||
| 45 | const rgblight_segment_t PROGMEM _gflock_layer[] = RGBLIGHT_LAYER_SEGMENTS(BACK(1, HSV_ORANGE)); | ||
| 46 | const rgblight_segment_t PROGMEM _glyphreplace_layer[] = RGBLIGHT_LAYER_SEGMENTS(FRONT(1, HSV_ORANGE)); | ||
| 47 | |||
| 48 | #define ACK_OFFSET 8 | ||
| 49 | 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)); | ||
| 51 | const rgblight_segment_t PROGMEM _meh_layer[] = RGBLIGHT_LAYER_SEGMENTS(FRONT(1, HSV_YELLOW)); | ||
| 52 | |||
| 53 | // Now define the array of layers. Higher numbered layers take precedence. | ||
| 54 | const rgblight_segment_t *const PROGMEM _rgb_layers[] = { | ||
| 55 | [LAYER_OFFSET + 0] = _layer1_layer, | ||
| 56 | [LAYER_OFFSET + 1] = _layer2_layer, | ||
| 57 | [LAYER_OFFSET + 2] = _layer3_layer, | ||
| 58 | |||
| 59 | [LOCK_OFFSET + USB_LED_NUM_LOCK] = _numlock_layer, | ||
| 60 | [LOCK_OFFSET + USB_LED_CAPS_LOCK] = _capslock_layer, | ||
| 61 | [LOCK_OFFSET + USB_LED_SCROLL_LOCK] = _scrolllock_layer, | ||
| 62 | |||
| 63 | [MISC_OFFSET + 0] = _gflock_layer, | ||
| 64 | [MISC_OFFSET + 1] = _glyphreplace_layer, | ||
| 65 | |||
| 66 | [ACK_OFFSET + ACK_NO] = _no_layer, | ||
| 67 | [ACK_OFFSET + ACK_YES] = _yes_layer, | ||
| 68 | [ACK_OFFSET + ACK_MEH] = _meh_layer, | ||
| 27 | 69 | ||
| 28 | const rgblight_segment_t PROGMEM _capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS( {0, 2, HSV_AZURE}, {14, 2, HSV_AZURE} ); | 70 | [ACK_OFFSET + ACK_MEH + 1] = NULL |
| 29 | const rgblight_segment_t PROGMEM _layer1_layer[] = RGBLIGHT_LAYER_SEGMENTS( {7, 1, HSV_PURPLE} ); | 71 | }; |
| 30 | const rgblight_segment_t PROGMEM _layer2_layer[] = RGBLIGHT_LAYER_SEGMENTS( {10, 3, HSV_MAGENTA} ); | 72 | |
| 31 | const rgblight_segment_t PROGMEM _layer3_layer[] = RGBLIGHT_LAYER_SEGMENTS( {10, 1, HSV_GREEN} ); | 73 | // clang-format on |
| 32 | const rgblight_segment_t PROGMEM _yes_layer[] = RGBLIGHT_LAYER_SEGMENTS( {9, 6, HSV_GREEN} ); | ||
| 33 | const rgblight_segment_t PROGMEM _no_layer[] = RGBLIGHT_LAYER_SEGMENTS( {9, 6, HSV_RED} ); | ||
| 34 | 74 | ||
| 35 | // Now define the array of layers. Later layers take precedence | ||
| 36 | const rgblight_segment_t* const PROGMEM _rgb_layers[] = | ||
| 37 | RGBLIGHT_LAYERS_LIST( _capslock_layer, _layer1_layer, _layer2_layer, _layer3_layer, _yes_layer, _no_layer ); | ||
| 38 | const uint8_t PROGMEM _n_rgb_layers = sizeof(_rgb_layers) / sizeof(_rgb_layers[0]) - 1; | 75 | const uint8_t PROGMEM _n_rgb_layers = sizeof(_rgb_layers) / sizeof(_rgb_layers[0]) - 1; |
| 39 | 76 | ||
| 40 | void clear_rgb_layers() { | 77 | void clear_rgb_layers() { |
| 41 | for (uint8_t i=0; i<_n_rgb_layers; i++) { | 78 | dprint("clear_rgb_layers()\n"); |
| 79 | for (uint8_t i = 0; i < _n_rgb_layers; i++) { | ||
| 42 | rgblight_set_layer_state(i, false); | 80 | rgblight_set_layer_state(i, false); |
| 43 | } | 81 | } |
| 44 | } | 82 | } |
| 45 | 83 | ||
| 46 | void do_rgb_layers(layer_state_t state, uint8_t start, uint8_t end) { | 84 | void do_rgb_layers(layer_state_t state, uint8_t start, uint8_t end) { |
| 47 | dprint("do_rgb_layers()\n"); | 85 | for (uint8_t i = start; i < end; i++) { |
| 48 | for (uint8_t i=start; i<end; i++) { | 86 | bool is_on = layer_state_cmp(state, i); |
| 49 | bool is_on = layer_state_cmp(state, i); | 87 | dprintf("layer[%u]=%u\n", i, is_on); |
| 50 | dprintf("\tlayer[%d]=%u\n", i, is_on); | 88 | rgblight_set_layer_state(LAYER_OFFSET + i - 1, is_on); |
| 51 | rgblight_set_layer_state(i, is_on); | ||
| 52 | } | 89 | } |
| 53 | } | 90 | } |
| 54 | 91 | ||
| 92 | extern rgblight_config_t rgblight_config; | ||
| 93 | extern rgblight_status_t rgblight_status; | ||
| 94 | static bool startup_animation_done = false; | ||
| 95 | |||
| 55 | void keyboard_post_init_user_rgb(void) { | 96 | void keyboard_post_init_user_rgb(void) { |
| 56 | do_rgb_layers(default_layer_state, 1u, RGB_LAYER_BASE_REGULAR); | ||
| 57 | do_rgb_layers(layer_state, RGB_LAYER_BASE_REGULAR, RGB_LAYER_BASE_ACKS); | ||
| 58 | do_rgb_layers(0, RGB_LAYER_BASE_ACKS, _n_rgb_layers); | ||
| 59 | // Enable the LED layers | 97 | // Enable the LED layers |
| 60 | rgblight_layers = _rgb_layers; | 98 | rgblight_layers = _rgb_layers; |
| 99 | do_rgb_layers(default_layer_state, LAYER_BASE_DEFAULT + 1, LAYER_BASE_REGULAR); | ||
| 100 | do_rgb_layers(layer_state, LAYER_BASE_REGULAR, LAYER_BASE_END); | ||
| 101 | |||
| 102 | // Startup animation | ||
| 103 | { | ||
| 104 | bool is_enabled = rgblight_config.enable; | ||
| 105 | uint8_t old_hue = rgblight_config.hue; | ||
| 106 | uint8_t old_sat = rgblight_config.sat; | ||
| 107 | uint8_t old_val = rgblight_config.val; | ||
| 108 | uint8_t old_mode = rgblight_config.mode; | ||
| 109 | |||
| 110 | bool ramp_down = | ||
| 111 | #ifdef RGBLIGHT_EFFECT_BREATHING | ||
| 112 | (rgblight_status.base_mode == RGBLIGHT_MODE_BREATHING) || | ||
| 113 | #endif | ||
| 114 | #ifdef RGBLIGHT_EFFECT_SNAKE | ||
| 115 | (rgblight_status.base_mode == RGBLIGHT_MODE_SNAKE) || | ||
| 116 | #endif | ||
| 117 | #ifdef RGBLIGHT_EFFECT_KNIGHT | ||
| 118 | (rgblight_status.base_mode == RGBLIGHT_MODE_KNIGHT) || | ||
| 119 | #endif | ||
| 120 | #ifdef RGBLIGHT_EFFECT_TWINKLE | ||
| 121 | (rgblight_status.base_mode == RGBLIGHT_MODE_TWINKLE) || | ||
| 122 | #endif | ||
| 123 | !is_enabled; | ||
| 124 | |||
| 125 | bool ramp_to = | ||
| 126 | #ifdef RGBLIGHT_EFFECT_STATIC_GRADIENT | ||
| 127 | (rgblight_status.base_mode == RGBLIGHT_MODE_STATIC_GRADIENT) || | ||
| 128 | #endif | ||
| 129 | #ifdef RGBLIGHT_EFFECT_RAINBOW_MOOD | ||
| 130 | (rgblight_status.base_mode == RGBLIGHT_MODE_RAINBOW_MOOD) || | ||
| 131 | #endif | ||
| 132 | #ifdef RGBLIGHT_EFFECT_RAINBOW_SWIRL | ||
| 133 | (rgblight_status.base_mode == RGBLIGHT_MODE_RAINBOW_SWIRL) || | ||
| 134 | #endif | ||
| 135 | #ifdef RGBLIGHT_EFFECT_RAINBOW_CHRISTMAS | ||
| 136 | (rgblight_status.base_mode == RGBLIGHT_MODE_CHRISTMAS) || | ||
| 137 | #endif | ||
| 138 | #ifdef RGBLIGHT_EFFECT_RAINBOW_RGB_TEST_ | ||
| 139 | (rgblight_status.base_mode == RGBLIGHT_MODE_RGB_TEST) || | ||
| 140 | #endif | ||
| 141 | (rgblight_status.base_mode == RGBLIGHT_MODE_STATIC_LIGHT); | ||
| 142 | |||
| 143 | #define STARTUP_ANIMATION_SATURATION 200 | ||
| 144 | #define STARTUP_ANIMATION_VALUE 255 | ||
| 145 | #define STARTUP_ANIMATION_STEP 5 | ||
| 146 | |||
| 147 | rgblight_enable_noeeprom(); | ||
| 148 | if (rgblight_config.enable) { | ||
| 149 | rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); | ||
| 150 | for (uint8_t i = 0; i < STARTUP_ANIMATION_VALUE; i += STARTUP_ANIMATION_STEP) { | ||
| 151 | rgblight_sethsv_noeeprom(old_hue, STARTUP_ANIMATION_SATURATION, i); | ||
| 152 | matrix_scan(); | ||
| 153 | wait_ms(10); | ||
| 154 | } | ||
| 155 | for (uint8_t i = 255; i > 0; i -= STARTUP_ANIMATION_STEP) { | ||
| 156 | rgblight_sethsv_noeeprom((i + old_hue) % 255, STARTUP_ANIMATION_SATURATION, STARTUP_ANIMATION_VALUE); | ||
| 157 | matrix_scan(); | ||
| 158 | wait_ms(10); | ||
| 159 | } | ||
| 160 | |||
| 161 | if (ramp_down) { | ||
| 162 | dprintln("ramp_down"); | ||
| 163 | for (uint8_t i = STARTUP_ANIMATION_VALUE; i > 0; i -= STARTUP_ANIMATION_STEP) { | ||
| 164 | rgblight_sethsv_noeeprom(old_hue, STARTUP_ANIMATION_SATURATION, i); | ||
| 165 | matrix_scan(); | ||
| 166 | wait_ms(10); | ||
| 167 | } | ||
| 168 | } else if (ramp_to) { | ||
| 169 | dprintf("ramp_to s=%u, v=%u\n", old_sat, old_val); | ||
| 170 | uint8_t steps = 50; | ||
| 171 | for (uint8_t i = 0; i < steps; i++) { | ||
| 172 | uint8_t s = STARTUP_ANIMATION_SATURATION + i * (((float)old_sat - STARTUP_ANIMATION_SATURATION) / (float)steps); | ||
| 173 | uint8_t v = STARTUP_ANIMATION_VALUE + i * (((float)old_val - STARTUP_ANIMATION_VALUE) / (float)steps); | ||
| 174 | rgblight_sethsv_noeeprom(old_hue, s, v); | ||
| 175 | matrix_scan(); | ||
| 176 | wait_ms(10); | ||
| 177 | } | ||
| 178 | } | ||
| 179 | rgblight_mode_noeeprom(old_mode); | ||
| 180 | } | ||
| 181 | if (is_enabled) { | ||
| 182 | rgblight_sethsv_noeeprom(old_hue, old_sat, old_val); | ||
| 183 | } else { | ||
| 184 | rgblight_disable_noeeprom(); | ||
| 185 | // Hack! | ||
| 186 | // rgblight_sethsv_noeeprom() doesn't update these if rgblight is disabled, | ||
| 187 | // but if do it before disabling we get an ugly flash. | ||
| 188 | rgblight_config.hue = old_hue; | ||
| 189 | rgblight_config.sat = old_sat; | ||
| 190 | rgblight_config.val = old_val; | ||
| 191 | } | ||
| 192 | dprint("done\n"); | ||
| 193 | startup_animation_done = true; | ||
| 194 | } | ||
| 61 | } | 195 | } |
| 62 | 196 | ||
| 63 | layer_state_t default_layer_state_set_user_rgb(layer_state_t state) { | 197 | layer_state_t default_layer_state_set_user_rgb(layer_state_t state) { |
| 64 | dprint("default_layer_state_set_user_rgb()\n"); | 198 | do_rgb_layers(state, 1u, LAYER_BASE_REGULAR); |
| 65 | do_rgb_layers(state, 1u, RGB_LAYER_BASE_REGULAR); | ||
| 66 | return state; | 199 | return state; |
| 67 | } | 200 | } |
| 68 | 201 | ||
| 69 | layer_state_t layer_state_set_user_rgb(layer_state_t state) { | 202 | layer_state_t layer_state_set_user_rgb(layer_state_t state) { |
| 70 | dprint("layer_state_set_user_rgb()\n"); | 203 | do_rgb_layers(state, LAYER_BASE_REGULAR, LAYER_BASE_END); |
| 71 | do_rgb_layers(state, RGB_LAYER_BASE_REGULAR, RGB_LAYER_BASE_ACKS); | ||
| 72 | return state; | 204 | return state; |
| 73 | } | 205 | } |
| 74 | 206 | ||
| 75 | bool led_update_user_rgb(led_t led_state) { | 207 | bool led_update_user_rgb(led_t led_state) { |
| 76 | dprintf("caps_lock=%u\n", led_state.caps_lock); | 208 | dprintf("num=%u, cap=%u, scl=%u, cmp=%u, kan=%u\n", led_state.num_lock, led_state.caps_lock, led_state.scroll_lock, led_state.compose, led_state.kana); |
| 77 | rgblight_set_layer_state(0, led_state.caps_lock); | 209 | |
| 210 | rgblight_set_layer_state(LOCK_OFFSET + USB_LED_NUM_LOCK, led_state.num_lock); | ||
| 211 | rgblight_set_layer_state(LOCK_OFFSET + USB_LED_CAPS_LOCK, led_state.caps_lock); | ||
| 212 | rgblight_set_layer_state(LOCK_OFFSET + USB_LED_SCROLL_LOCK, led_state.scroll_lock); | ||
| 213 | |||
| 78 | return true; | 214 | return true; |
| 79 | } | 215 | } |
| 80 | 216 | ||
| 81 | void rgb_layer_ack(bool yn, bool pressed) { | 217 | void rgb_layer_ack_yn(bool yn) { rgb_layer_ack(yn ? ACK_YES : ACK_NO); } |
| 82 | uint8_t layer = RGB_LAYER_BASE_ACKS + (yn ? 0 : 1); | 218 | |
| 83 | rgblight_set_layer_state(layer, pressed); | 219 | void rgb_layer_ack(layer_ack_t n) { |
| 220 | uint8_t layer = ACK_OFFSET + n; | ||
| 221 | dprintf("rgb_layer_ack(%u) ==> %u\n", n, layer); | ||
| 222 | rgblight_blink_layer(layer, RGB_LAYER_ACK_DURATION); | ||
| 84 | } | 223 | } |
| 85 | 224 | ||
| 86 | extern keymap_config_t keymap_config; | 225 | extern keymap_config_t keymap_config; |
| 226 | extern rgblight_config_t rgblight_config; | ||
| 227 | |||
| 228 | extern bool spi_gflock; | ||
| 229 | extern uint16_t spi_replace_mode; | ||
| 87 | 230 | ||
| 88 | bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { | 231 | bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { |
| 89 | bool pressed = record->event.pressed; | 232 | if (record->event.pressed) { |
| 90 | 233 | switch (keycode) { | |
| 91 | switch (keycode) { | 234 | case SPI_GLO: |
| 92 | case SPI_GLO: | 235 | spidey_glow(); |
| 93 | if (pressed) { | 236 | return false; |
| 94 | spidey_swirl(); | 237 | } |
| 95 | } | 238 | } |
| 96 | return false; | 239 | |
| 97 | 240 | return true; | |
| 98 | // Acks follow... | 241 | } |
| 99 | case DEBUG: | 242 | |
| 100 | rgb_layer_ack(debug_enable, pressed); | 243 | void post_process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { |
| 101 | return false; | 244 | switch (keycode) { |
| 102 | 245 | // Acks follow... | |
| 103 | case SPI_LNX: | 246 | case DEBUG: |
| 104 | case SPI_OSX: | 247 | rgb_layer_ack_yn(debug_enable); |
| 105 | case SPI_WIN: | 248 | break; |
| 106 | rgb_layer_ack(true, pressed); | 249 | |
| 107 | return false; | 250 | case SPI_LNX: |
| 108 | 251 | case SPI_OSX: | |
| 109 | // Tricky! | 252 | case SPI_WIN: |
| 110 | // For these, on press the toggle hasn't happened yet, | 253 | rgb_layer_ack(ACK_MEH); |
| 111 | // so we need a little logic to invert, assuming that | 254 | break; |
| 112 | // on key press the flag WILL be toggled, and on key | 255 | |
| 113 | // release the flag has already been toggled. | 256 | case SPI_GFLOCK: |
| 257 | rgb_layer_ack_yn(spi_gflock); | ||
| 258 | rgblight_set_layer_state(MISC_OFFSET + 0, spi_gflock); | ||
| 259 | break; | ||
| 260 | |||
| 261 | case SPI_NORMAL ... SPI_FRAKTR: | ||
| 262 | rgb_layer_ack_yn(spi_replace_mode != SPI_NORMAL); | ||
| 263 | rgblight_set_layer_state(MISC_OFFSET + 1, spi_replace_mode != SPI_NORMAL); | ||
| 264 | break; | ||
| 265 | |||
| 266 | case RGB_TOG: | ||
| 267 | rgb_layer_ack_yn(rgblight_config.enable); | ||
| 268 | break; | ||
| 114 | 269 | ||
| 115 | #ifdef VELOCIKEY_ENABLE | 270 | #ifdef VELOCIKEY_ENABLE |
| 116 | case VLK_TOG: | 271 | case VLK_TOG: |
| 117 | rgb_layer_ack(pressed != velocikey_enabled(), pressed); | 272 | rgb_layer_ack_yn(velocikey_enabled()); |
| 118 | return true; | 273 | break; |
| 119 | #endif | 274 | #endif |
| 120 | 275 | ||
| 121 | #ifdef NKRO_ENABLE | 276 | #ifdef NKRO_ENABLE |
| 122 | case NK_TOGG: | 277 | case NK_TOGG: |
| 123 | case NK_ON: | 278 | case NK_ON: |
| 124 | case NK_OFF: | 279 | case NK_OFF: |
| 125 | rgb_layer_ack(pressed != keymap_config.nkro, pressed); | 280 | rgb_layer_ack_yn(keymap_config.nkro); |
| 126 | return true; | 281 | break; |
| 127 | #endif | 282 | #endif |
| 128 | } | 283 | } |
| 129 | |||
| 130 | return true; | ||
| 131 | } | 284 | } |
