diff options
| -rw-r--r-- | keyboards/ergodox/keymaps/default/visualizer.c | 76 | ||||
| -rw-r--r-- | quantum/visualizer/visualizer.c | 28 | ||||
| -rw-r--r-- | quantum/visualizer/visualizer.h | 1 |
3 files changed, 44 insertions, 61 deletions
diff --git a/keyboards/ergodox/keymaps/default/visualizer.c b/keyboards/ergodox/keymaps/default/visualizer.c index d99d5f702..305aaae15 100644 --- a/keyboards/ergodox/keymaps/default/visualizer.c +++ b/keyboards/ergodox/keymaps/default/visualizer.c | |||
| @@ -28,6 +28,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
| 28 | 28 | ||
| 29 | #include "visualizer.h" | 29 | #include "visualizer.h" |
| 30 | #include "system/serial_link.h" | 30 | #include "system/serial_link.h" |
| 31 | #include "led.h" | ||
| 31 | 32 | ||
| 32 | // To generate an image array like this | 33 | // To generate an image array like this |
| 33 | // Ensure the image is 128 x 32 or smaller | 34 | // Ensure the image is 128 x 32 or smaller |
| @@ -117,34 +118,11 @@ static keyframe_animation_t startup_animation = { | |||
| 117 | }, | 118 | }, |
| 118 | }; | 119 | }; |
| 119 | 120 | ||
| 120 | // The LCD animation alternates between the layer name display and a | 121 | static keyframe_animation_t lcd_layer_display = { |
| 121 | // bitmap that displays all active layers | 122 | .num_frames = 1, |
| 122 | static keyframe_animation_t lcd_layer_bitmap_animation = { | 123 | .loop = false, |
| 123 | .num_frames = 2, | 124 | .frame_lengths = {gfxMillisecondsToTicks(0)}, |
| 124 | .loop = true, | 125 | .frame_functions = {keyframe_display_layer_and_led_states} |
| 125 | .frame_lengths = { | ||
| 126 | gfxMillisecondsToTicks(2000), | ||
| 127 | gfxMillisecondsToTicks(2000) | ||
| 128 | }, | ||
| 129 | .frame_functions = { | ||
| 130 | keyframe_display_layer_text, | ||
| 131 | keyframe_display_layer_bitmap | ||
| 132 | }, | ||
| 133 | }; | ||
| 134 | |||
| 135 | static keyframe_animation_t lcd_layer_bitmap_leds_animation = { | ||
| 136 | .num_frames = 3, | ||
| 137 | .loop = true, | ||
| 138 | .frame_lengths = { | ||
| 139 | gfxMillisecondsToTicks(2000), | ||
| 140 | gfxMillisecondsToTicks(2000), | ||
| 141 | gfxMillisecondsToTicks(2000) | ||
| 142 | }, | ||
| 143 | .frame_functions = { | ||
| 144 | keyframe_display_layer_text, | ||
| 145 | keyframe_display_led_states, | ||
| 146 | keyframe_display_layer_bitmap, | ||
| 147 | }, | ||
| 148 | }; | 126 | }; |
| 149 | 127 | ||
| 150 | static keyframe_animation_t suspend_animation = { | 128 | static keyframe_animation_t suspend_animation = { |
| @@ -200,49 +178,31 @@ void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard | |||
| 200 | // state->status.default_layer | 178 | // state->status.default_layer |
| 201 | // state->status.leds (see led.h for available statuses) | 179 | // state->status.leds (see led.h for available statuses) |
| 202 | 180 | ||
| 181 | uint8_t saturation = 60; | ||
| 182 | if (state->status.leds & (1u << USB_LED_CAPS_LOCK)) { | ||
| 183 | saturation = 255; | ||
| 184 | } | ||
| 203 | if (state->status.layer & 0x4) { | 185 | if (state->status.layer & 0x4) { |
| 204 | state->target_lcd_color = LCD_COLOR(0, 0xB0, 0xFF); | 186 | state->target_lcd_color = LCD_COLOR(0, saturation, 0xFF); |
| 205 | state->layer_text = "Media & Mouse"; | 187 | state->layer_text = "Media & Mouse"; |
| 206 | } | 188 | } |
| 207 | else if (state->status.layer & 0x2) { | 189 | else if (state->status.layer & 0x2) { |
| 208 | state->target_lcd_color = LCD_COLOR(0x80, 0xB0, 0xFF); | 190 | state->target_lcd_color = LCD_COLOR(168, saturation, 0xFF); |
| 209 | state->layer_text = "Symbol"; | 191 | state->layer_text = "Symbol"; |
| 210 | } | 192 | } |
| 211 | else { | 193 | else { |
| 212 | state->target_lcd_color = LCD_COLOR(0x40, 0xB0, 0xFF); | 194 | state->target_lcd_color = LCD_COLOR(84, saturation, 0xFF); |
| 213 | state->layer_text = "Default"; | 195 | state->layer_text = "Default"; |
| 214 | } | 196 | } |
| 215 | 197 | ||
| 216 | if (lcd_state == LCD_STATE_INITIAL || state->status.layer != prev_status->layer) { | 198 | if (lcd_state == LCD_STATE_INITIAL || |
| 199 | state->status.layer != prev_status->layer || | ||
| 200 | state->status.default_layer != prev_status->default_layer || | ||
| 201 | state->status.leds != prev_status->leds) { | ||
| 217 | start_keyframe_animation(&color_animation); | 202 | start_keyframe_animation(&color_animation); |
| 203 | start_keyframe_animation(&lcd_layer_display); | ||
| 218 | } | 204 | } |
| 219 | 205 | ||
| 220 | if (state->status.leds) { | ||
| 221 | if (lcd_state != LCD_STATE_BITMAP_AND_LEDS || | ||
| 222 | state->status.leds != prev_status->leds || | ||
| 223 | state->status.layer != prev_status->layer || | ||
| 224 | state->status.default_layer != prev_status->default_layer) { | ||
| 225 | |||
| 226 | // NOTE: that it doesn't matter if the animation isn't playing, stop will do nothing in that case | ||
| 227 | stop_keyframe_animation(&lcd_layer_bitmap_animation); | ||
| 228 | |||
| 229 | lcd_state = LCD_STATE_BITMAP_AND_LEDS; | ||
| 230 | // For information: | ||
| 231 | // The logic in this function makes sure that this doesn't happen, but if you call start on an | ||
| 232 | // animation that is already playing it will be restarted. | ||
| 233 | start_keyframe_animation(&lcd_layer_bitmap_leds_animation); | ||
| 234 | } | ||
| 235 | } else { | ||
| 236 | if (lcd_state != LCD_STATE_LAYER_BITMAP || | ||
| 237 | state->status.layer != prev_status->layer || | ||
| 238 | state->status.default_layer != prev_status->default_layer) { | ||
| 239 | |||
| 240 | stop_keyframe_animation(&lcd_layer_bitmap_leds_animation); | ||
| 241 | |||
| 242 | lcd_state = LCD_STATE_LAYER_BITMAP; | ||
| 243 | start_keyframe_animation(&lcd_layer_bitmap_animation); | ||
| 244 | } | ||
| 245 | } | ||
| 246 | // You can also stop existing animations, and start your custom ones here | 206 | // You can also stop existing animations, and start your custom ones here |
| 247 | // remember that you should normally have only one animation for the LCD | 207 | // remember that you should normally have only one animation for the LCD |
| 248 | // and one for the background. But you can also combine them if you want. | 208 | // and one for the background. But you can also combine them if you want. |
diff --git a/quantum/visualizer/visualizer.c b/quantum/visualizer/visualizer.c index 3b3f51b1f..2533eb709 100644 --- a/quantum/visualizer/visualizer.c +++ b/quantum/visualizer/visualizer.c | |||
| @@ -364,9 +364,9 @@ bool keyframe_display_mods_bitmap(keyframe_animation_t* animation, visualizer_st | |||
| 364 | return false; | 364 | return false; |
| 365 | } | 365 | } |
| 366 | 366 | ||
| 367 | bool keyframe_display_led_states(keyframe_animation_t* animation, visualizer_state_t* state) | 367 | #define LED_STATE_STRING_SIZE sizeof("NUM CAPS SCRL COMP KANA") |
| 368 | { | 368 | |
| 369 | char output[sizeof("NUM CAPS SCRL COMP KANA")]; | 369 | static void get_led_state_string(char* output, visualizer_state_t* state) { |
| 370 | uint8_t pos = 0; | 370 | uint8_t pos = 0; |
| 371 | 371 | ||
| 372 | if (state->status.leds & (1u << USB_LED_NUM_LOCK)) { | 372 | if (state->status.leds & (1u << USB_LED_NUM_LOCK)) { |
| @@ -390,12 +390,34 @@ bool keyframe_display_led_states(keyframe_animation_t* animation, visualizer_sta | |||
| 390 | pos += 5; | 390 | pos += 5; |
| 391 | } | 391 | } |
| 392 | output[pos] = 0; | 392 | output[pos] = 0; |
| 393 | } | ||
| 394 | |||
| 395 | bool keyframe_display_led_states(keyframe_animation_t* animation, visualizer_state_t* state) | ||
| 396 | { | ||
| 397 | (void)animation; | ||
| 398 | char output[LED_STATE_STRING_SIZE]; | ||
| 399 | get_led_state_string(output, state); | ||
| 393 | gdispClear(White); | 400 | gdispClear(White); |
| 394 | gdispDrawString(0, 10, output, state->font_dejavusansbold12, Black); | 401 | gdispDrawString(0, 10, output, state->font_dejavusansbold12, Black); |
| 395 | gdispFlush(); | 402 | gdispFlush(); |
| 396 | return false; | 403 | return false; |
| 397 | } | 404 | } |
| 398 | 405 | ||
| 406 | bool keyframe_display_layer_and_led_states(keyframe_animation_t* animation, visualizer_state_t* state) { | ||
| 407 | (void)animation; | ||
| 408 | gdispClear(White); | ||
| 409 | uint8_t y = 10; | ||
| 410 | if (state->status.leds) { | ||
| 411 | char output[LED_STATE_STRING_SIZE]; | ||
| 412 | get_led_state_string(output, state); | ||
| 413 | gdispDrawString(0, 1, output, state->font_dejavusansbold12, Black); | ||
| 414 | y = 17; | ||
| 415 | } | ||
| 416 | gdispDrawString(0, y, state->layer_text, state->font_dejavusansbold12, Black); | ||
| 417 | gdispFlush(); | ||
| 418 | return false; | ||
| 419 | } | ||
| 420 | |||
| 399 | #endif // LCD_ENABLE | 421 | #endif // LCD_ENABLE |
| 400 | 422 | ||
| 401 | bool keyframe_disable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state) { | 423 | bool keyframe_disable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state) { |
diff --git a/quantum/visualizer/visualizer.h b/quantum/visualizer/visualizer.h index e8ace5b37..3b05c305e 100644 --- a/quantum/visualizer/visualizer.h +++ b/quantum/visualizer/visualizer.h | |||
| @@ -141,6 +141,7 @@ bool keyframe_display_layer_bitmap(keyframe_animation_t* animation, visualizer_s | |||
| 141 | bool keyframe_display_mods_bitmap(keyframe_animation_t* animation, visualizer_state_t* state); | 141 | bool keyframe_display_mods_bitmap(keyframe_animation_t* animation, visualizer_state_t* state); |
| 142 | // Displays the keyboard led states (CAPS (Caps lock), NUM (Num lock), SCRL (Scroll lock), COMP (Compose), KANA) | 142 | // Displays the keyboard led states (CAPS (Caps lock), NUM (Num lock), SCRL (Scroll lock), COMP (Compose), KANA) |
| 143 | bool keyframe_display_led_states(keyframe_animation_t* animation, visualizer_state_t* state); | 143 | bool keyframe_display_led_states(keyframe_animation_t* animation, visualizer_state_t* state); |
| 144 | bool keyframe_display_layer_and_led_states(keyframe_animation_t* animation, visualizer_state_t* state); | ||
| 144 | 145 | ||
| 145 | bool keyframe_disable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state); | 146 | bool keyframe_disable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state); |
| 146 | bool keyframe_enable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state); | 147 | bool keyframe_enable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state); |
