From 87abed6865e97f443bfc539413f9d454ee632722 Mon Sep 17 00:00:00 2001 From: Oryhara Date: Wed, 6 Jun 2018 11:52:56 -0500 Subject: Sweeping Visualizer for Ergodox Inifinity (#3136) * started work on halfkeyboard * update to keymap * halfkey layouts complete for dvorak and qwerty * added plover layout to halfkeyboard mapping * fixed error in dvorak layout right hand * fixed error in dvorak layout right hand, comments updated * thing * added minus and equals to normal layouts * added minus and equals to normal layouts * adde visualizer matching halfkeyboard mappings * adde visualizer matching halfkeyboard mappings * updated keymaps for mirror handedness functionality for all layers. Also added visualizer code for distinct color for each layer, and LCD text displaying the current layer. * had a KC_TILD where should have had KC_GRAV * its spelled KC_GRAVE * mouskeys and some visualizer work. * added LED backlight visuals * trying to get visualizer working * Move lufa descriptor to protocol/usb_descriptor * Try to compile usb_descriptor on ChibiOS * Add lufa_utils for ChibiOS Lufa USB descriptors for ChibiOS * More lufa_util compatibility fixes * First compiling version of shared USB descriptor * Send the usb descriptors * Fix the CONSOLE output on ChibiOS * Add errors for unsupported interfaces * Enable support for vitual serial port USB descriptors * Implement virtual serial port for ChibiOS * Cleanup the lufa_utils Use the default lufa header files * Add raw hid support for ChibiOS This is completely untested * Enable midi compilation on ChibiOS * Move midi functionality out of lufa.c * Don't register sysex callback when not needed * ChibiOS compilation fixes * Update ChibiOS submodule * Fix the Midi USB descriptor It didn't work properly when both Midi and Virtual serial port was enabled. * Add MIDI support for ChibiOS * Fix USB descriptor strings on ChibiOS * Use serial usb driver for raw hid * Generalize the ChibiOS stream like drivers This makes the initialization much more simple and eliminates a lot of the code duplication. * Convert console output to chibios stream driver * Fixes for ChibiOS update * Update the ChibiOS contrib submodule To include the usb data toggle synchronization fixes * Fix duplicate reset enumeration on ChibiOS * Add missing include * Add number of endpoints check for ChibiOS * Enable serial USB driver on all keyboards * Add missing includes when API is enabled withot midi * Add another missing inlcude * consolidated my custom animations into visualizer.c in my keymap directory * LED backlight keys animation KITT scanner * moved my custom rules.mk to my keymap folder * undoing changes i shouldn't have done * more fixes * updated comments on the visulizer code * steno keys added to plover layout * updated halfkeyboard rules to allow steno mode * adding my stuff back after hard reset * added a plover layout back in for androud steno app * fixed layer toggle typo * merged again * visualizer decided to have a conflict again. fixed. * keymap change to add mouse keys and put layer switching on shortcuts layer * made the ergodox LEDs scan left to right and back again * visualizer work * KITTSCANNER finally * fixed right hand shortcuts layer and removed handedness switching for base layer so jump in gaming works corrrectly * added another sweep that goes full on over both boards then full off in both directions * added function key layer and cleaned up some layer switching --- .../keymaps/halfkeyboard/visualizer.c | 353 +++++++++++++++------ 1 file changed, 262 insertions(+), 91 deletions(-) (limited to 'keyboards/ergodox_infinity/keymaps/halfkeyboard/visualizer.c') diff --git a/keyboards/ergodox_infinity/keymaps/halfkeyboard/visualizer.c b/keyboards/ergodox_infinity/keymaps/halfkeyboard/visualizer.c index 7bd5a0783..61a724c63 100644 --- a/keyboards/ergodox_infinity/keymaps/halfkeyboard/visualizer.c +++ b/keyboards/ergodox_infinity/keymaps/halfkeyboard/visualizer.c @@ -18,15 +18,21 @@ along with this program. If not, see . #include "default_animations.h" #include "led_backlight_keyframes.h" -#define ONESIDESCAN 9 -#define BOTHSIDESCAN 16 +#define NUM_ROWS LED_HEIGHT +#define NUM_COLS LED_WIDTH + +#define ONESIDESCAN 10 +#define BOTHSIDESCAN 20 #define FULL_ON LUMA2COLOR(255) #define THREE_QUARTER LUMA2COLOR(200) #define HALF_ON LUMA2COLOR(150) #define ONE_QUARTER LUMA2COLOR(50) -#define CROSSFADE_TIME 8000 -bool KITT_scan_one_side_left_to_right(keyframe_animation_t* animation, visualizer_state_t* state); -bool KITT_scan_one_side_right_to_left(keyframe_animation_t* animation, visualizer_state_t* state); + +#define CROSSFADE_TIME 500 +#define GRADIENT_TIME 3000 +bool led_backlight_keyframe_one_period_sweep(keyframe_animation_t* animation, visualizer_state_t* state); +bool led_backlight_keyframe_half_period_sweep_to_on(keyframe_animation_t* animation, visualizer_state_t* state); +bool led_backlight_keyframe_half_period_sweep_to_off(keyframe_animation_t* animation, visualizer_state_t* state); keyframe_animation_t Fade_in_all_leds = { .num_frames = 1, .loop = false, @@ -37,114 +43,272 @@ keyframe_animation_t Fade_in_all_leds = { led_backlight_keyframe_fade_in_all, }, }; -/* - * one set left to right. then reverse to go back. - * | left side | right side | | - |---|---|---|---|---|---|---|:-:|---|---|---|---|---|---|-------| - | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | phase | - _________________________________________________________________ - | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | - | 2 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | - | 1 | 2 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | - | 0 | 1 | 2 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 4 | - | 0 | 0 | 1 | 2 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 5 | - | 0 | 0 | 0 | 1 | 2 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 6 | - | 0 | 0 | 0 | 0 | 1 | 2 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 7 | - | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 8 | - | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 3 | 0 | 0 | 0 | 0 | 0 | 9 | - | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 3 | 0 | 0 | 0 | 0 | 10 | - | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 3 | 0 | 0 | 0 | 11 | - | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 3 | 0 | 0 | 12 | - | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 3 | 0 | 13 | - | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 3 | 14 | - | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 15 | - | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 16 | - */ - -#ifdef MASTER_IS_ON_RIGHT /*right side*/ - -keyframe_animation_t KITT_Scanner_animation = { - .num_frames = 2, +keyframe_animation_t decreasing_gradient = { + .num_frames = 8, .loop = true, .frame_lengths = { - CROSSFADE_TIME * BOTHSIDESCAN, - CROSSFADE_TIME * BOTHSIDESCAN, + gfxMillisecondsToTicks(GRADIENT_TIME), // left to rigt (outside in) + 0, // mirror leds + gfxMillisecondsToTicks(GRADIENT_TIME), // left_to_right (mirrored, so inside out) + 0, // normal leds + gfxMillisecondsToTicks(GRADIENT_TIME), // left to rigt (outside in) + 0, // mirror leds + gfxMillisecondsToTicks(GRADIENT_TIME), // left_to_right (mirrored, so inside out) + 0, // normal leds }, .frame_functions = { - KITT_scan_one_side_left_to_right, - KITT_scan_one_side_right_to_left, + led_backlight_keyframe_one_period_sweep, + led_backlight_keyframe_mirror_orientation, + keyframe_no_operation, + keyframe_no_operation, + keyframe_no_operation, + keyframe_no_operation, + led_backlight_keyframe_one_period_sweep, + led_backlight_keyframe_normal_orientation, + }, }; -bool KITT_scan_one_side_left_to_right(keyframe_animation_t* animation, visualizer_state_t* state) { + + +static uint8_t off_on_off_gradient(float t, float index, float num) { + const float two_pi = M_PI * 2.0f; + float normalized_index = (1.0f - index / (num - 1.0f)) * two_pi; + float x = t * two_pi + normalized_index-M_PI; + if((1*M_PI) < x && x < (3*M_PI)) + { + float v = 0.5 * (cosf(x) + 1.0f); + return (uint8_t)(255.0f * v); + } + else + { + return 0; + } +} +static uint8_t off_on_gradient(float t, float index, float num) { + const float two_pi = M_PI * 2.0f; + float normalized_index = (1.0f - index / (num - 1.0f)) * two_pi; + float x = t * two_pi + normalized_index-M_PI; + float v; + if((1*M_PI) < x && x < (2*M_PI)) + { + v = 0.5 * (cosf(x) + 1.0f); + } + else if(x >= (2*M_PI)) + { + v = 1; + } + else + { + v = 0; + } + return (uint8_t)(255.0f * v); +} +static uint8_t on_off_gradient(float t, float index, float num) { + const float two_pi = M_PI * 2.0f; + float normalized_index = (1.0f - index / (num - 1.0f)) * two_pi; + float x = t * two_pi + normalized_index-M_PI; + float v; + if((2*M_PI) < x && x < (3*M_PI)) + { + v = 0.5 * (cosf(x) + 1.0f); + + } + else if(x >= (3*M_PI)) + { + v = 0; + } + else + { + v = 1; + } + return (uint8_t)(255.0f * v); +} + +bool led_backlight_keyframe_one_period_sweep(keyframe_animation_t* animation, visualizer_state_t* state) { (void)state; float frame_length = animation->frame_lengths[animation->current_frame]; float current_pos = frame_length - animation->time_left_in_frame; - int phase = current_pos/(frame_length/BOTHSIDESCAN); - int row = 0; - gdispGClear(LED_DISPLAY, ONE_QUARTER); - gdispGDrawPixel(LED_DISPLAY, 14-phase, row, FULL_ON); - gdispGDrawPixel(LED_DISPLAY, 15-phase, row, THREE_QUARTER); - gdispGDrawPixel(LED_DISPLAY, 16-phase, row, HALF_ON); - gdispGDrawPixel(LED_DISPLAY, 6, row, ONE_QUARTER); + float t = current_pos / frame_length; + for (int i=0; i< NUM_COLS; i++) { + uint8_t color = off_on_off_gradient(t*2, i, NUM_COLS); + gdispGDrawLine(LED_DISPLAY, i, 0, i, NUM_ROWS - 1, LUMA2COLOR(color)); + } return true; } -bool KITT_scan_one_side_right_to_left(keyframe_animation_t* animation, visualizer_state_t* state) { +bool led_backlight_keyframe_half_period_sweep_to_on(keyframe_animation_t* animation, visualizer_state_t* state) { + (void)state; + float frame_length = animation->frame_lengths[animation->current_frame]; + float current_pos = frame_length - animation->time_left_in_frame; + float t = current_pos / frame_length; + for (int i=0; i< NUM_COLS; i++) { + uint8_t color = off_on_gradient(t*2, i, NUM_COLS); + gdispGDrawLine(LED_DISPLAY, i, 0, i, NUM_ROWS - 1, LUMA2COLOR(color)); + } + return true; +} +bool led_backlight_keyframe_half_period_sweep_to_off(keyframe_animation_t* animation, visualizer_state_t* state) { (void)state; float frame_length = animation->frame_lengths[animation->current_frame]; float current_pos = frame_length - animation->time_left_in_frame; - int phase = current_pos/(frame_length/BOTHSIDESCAN); - int row = 0; - gdispGClear(LED_DISPLAY, ONE_QUARTER); - gdispGDrawPixel(LED_DISPLAY, phase, row, FULL_ON); - gdispGDrawPixel(LED_DISPLAY, phase-1, row, THREE_QUARTER); - gdispGDrawPixel(LED_DISPLAY, phase-2, row, HALF_ON); - gdispGDrawPixel(LED_DISPLAY, 6, row, ONE_QUARTER); + float t = current_pos / frame_length; + for (int i=0; i< NUM_COLS; i++) { + uint8_t color = on_off_gradient(t*2, i, NUM_COLS); + gdispGDrawLine(LED_DISPLAY, i, 0, i, NUM_ROWS - 1, LUMA2COLOR(color)); + } return true; } + + +/* + +---+---+---+---+---+---+---+---+---+---+---+---+---+---+-------+ +| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | phase | ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+-------+ +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +| 5 | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | +| 4 | 5 | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | +| 3 | 4 | 5 | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 4 | +| 2 | 3 | 4 | 5 | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 5 | +| 1 | 2 | 3 | 4 | 5 | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 6 | +| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 7 | +| 0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 8 | +| 0 | 0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 0 | 0 | 0 | 0 | 0 | 9 | +| 0 | 0 | 0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 0 | 0 | 0 | 0 | 10 | +| 0 | 0 | 0 | 0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 0 | 0 | 0 | 11 | +| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 0 | 0 | 12 | +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 0 | 13 | +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 14 | +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 3 | 4 | 5 | 15 | +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 3 | 4 | 16 | +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 3 | 17 | +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 18 | +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 19 | +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 20 | ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+-------+ +*/ + +#ifdef MASTER_IS_ON_RIGHT /*right side*/ +keyframe_animation_t sweep_on_sweep_off_left_and_right = { + .num_frames = 12, + .loop = true, + .frame_lengths = { + 0, + 1, + gfxMillisecondsToTicks(GRADIENT_TIME), // left on + gfxMillisecondsToTicks(GRADIENT_TIME), // right on + gfxMillisecondsToTicks(GRADIENT_TIME), // left off + gfxMillisecondsToTicks(GRADIENT_TIME), // right off + 0, // mirror leds + gfxMillisecondsToTicks(GRADIENT_TIME), // right on + gfxMillisecondsToTicks(GRADIENT_TIME), // left on + gfxMillisecondsToTicks(GRADIENT_TIME), // right off + gfxMillisecondsToTicks(GRADIENT_TIME), // left off + 0, // normal leds + }, + .frame_functions = { + led_backlight_keyframe_mirror_orientation, + led_backlight_keyframe_fade_out_all, + keyframe_no_operation, + led_backlight_keyframe_half_period_sweep_to_on, + keyframe_no_operation, + led_backlight_keyframe_half_period_sweep_to_off, + led_backlight_keyframe_normal_orientation, + led_backlight_keyframe_half_period_sweep_to_on, + keyframe_no_operation, + led_backlight_keyframe_half_period_sweep_to_off, + keyframe_no_operation, + led_backlight_keyframe_mirror_orientation, + + }, +}; +keyframe_animation_t both_sides_fade_across = { + .num_frames = 10, + .loop = true, + .frame_lengths = { + 0, + 1, + gfxMillisecondsToTicks(GRADIENT_TIME), // left to rigt (outside in) + 0, // mirror leds + gfxMillisecondsToTicks(GRADIENT_TIME), // left_to_right (mirrored, so inside out) + 0, // normal leds + gfxMillisecondsToTicks(GRADIENT_TIME), // left to rigt (outside in) + 0, // mirror leds + gfxMillisecondsToTicks(GRADIENT_TIME), // left_to_right (mirrored, so inside out) + 0, // normal leds + }, + .frame_functions = { + led_backlight_keyframe_mirror_orientation, + led_backlight_keyframe_fade_out_all, + keyframe_no_operation, + keyframe_no_operation, + led_backlight_keyframe_one_period_sweep, + led_backlight_keyframe_normal_orientation, + led_backlight_keyframe_one_period_sweep, + led_backlight_keyframe_mirror_orientation, + keyframe_no_operation, + keyframe_no_operation, + }, +}; + #else /*left side*/ -keyframe_animation_t KITT_Scanner_animation = { - .num_frames = 2, +keyframe_animation_t sweep_on_sweep_off_left_and_right = { + .num_frames = 10, + .loop = true, + .frame_lengths = { + gfxMillisecondsToTicks(GRADIENT_TIME), // left on + gfxMillisecondsToTicks(GRADIENT_TIME), // right on + gfxMillisecondsToTicks(GRADIENT_TIME), // left off + gfxMillisecondsToTicks(GRADIENT_TIME), // right off + 0, // mirror leds + gfxMillisecondsToTicks(GRADIENT_TIME), // right on + gfxMillisecondsToTicks(GRADIENT_TIME), // left on + gfxMillisecondsToTicks(GRADIENT_TIME), // right off + gfxMillisecondsToTicks(GRADIENT_TIME), // left off + 0, // normal leds + }, + .frame_functions = { + led_backlight_keyframe_half_period_sweep_to_on, + keyframe_no_operation, + led_backlight_keyframe_half_period_sweep_to_off, + keyframe_no_operation, + led_backlight_keyframe_mirror_orientation, + keyframe_no_operation, + led_backlight_keyframe_half_period_sweep_to_on, + keyframe_no_operation, + led_backlight_keyframe_half_period_sweep_to_off, + led_backlight_keyframe_normal_orientation, + + }, +}; +keyframe_animation_t both_sides_fade_across = { + .num_frames = 8, .loop = true, .frame_lengths = { - CROSSFADE_TIME * BOTHSIDESCAN, - CROSSFADE_TIME * BOTHSIDESCAN, + gfxMillisecondsToTicks(GRADIENT_TIME), // left to rigt (outside in) + 0, // mirror leds + gfxMillisecondsToTicks(GRADIENT_TIME), // left_to_right (mirrored, so inside out) + 0, // normal leds + gfxMillisecondsToTicks(GRADIENT_TIME), // left to rigt (outside in) + 0, // mirror leds + gfxMillisecondsToTicks(GRADIENT_TIME), // left_to_right (mirrored, so inside out) + 0, // normal leds }, .frame_functions = { - KITT_scan_one_side_left_to_right, - KITT_scan_one_side_right_to_left, + led_backlight_keyframe_one_period_sweep, + led_backlight_keyframe_mirror_orientation, + keyframe_no_operation, + keyframe_no_operation, + keyframe_no_operation, + keyframe_no_operation, + led_backlight_keyframe_one_period_sweep, + led_backlight_keyframe_normal_orientation, + }, }; -bool KITT_scan_one_side_left_to_right(keyframe_animation_t* animation, visualizer_state_t* state) { - (void)state; - float frame_length = animation->frame_lengths[animation->current_frame]; - float current_pos = frame_length - animation->time_left_in_frame; - int phase = current_pos/(frame_length/BOTHSIDESCAN); - int row = 0; - gdispGClear(LED_DISPLAY, ONE_QUARTER); - gdispGDrawPixel(LED_DISPLAY, phase, row, FULL_ON); - gdispGDrawPixel(LED_DISPLAY, phase-1, row, THREE_QUARTER); - gdispGDrawPixel(LED_DISPLAY, phase-2, row, HALF_ON); - gdispGDrawPixel(LED_DISPLAY, 6, row, ONE_QUARTER); - return true; -} -bool KITT_scan_one_side_right_to_left(keyframe_animation_t* animation, visualizer_state_t* state) { - (void)state; - float frame_length = animation->frame_lengths[animation->current_frame]; - float current_pos = frame_length - animation->time_left_in_frame; - int phase = current_pos/(frame_length/BOTHSIDESCAN); - int row = 0; - gdispGClear(LED_DISPLAY, ONE_QUARTER); - gdispGDrawPixel(LED_DISPLAY, (14 - phase), row, FULL_ON); - gdispGDrawPixel(LED_DISPLAY, 14 - (phase-1), row, THREE_QUARTER); - gdispGDrawPixel(LED_DISPLAY, 14 - (phase-2), row, HALF_ON); - gdispGDrawPixel(LED_DISPLAY, 6, row, ONE_QUARTER); - return true; -} #endif #define RED 0 @@ -170,19 +334,24 @@ static void get_visualizer_layer_and_color(visualizer_state_t* state) { /* if (state->status.leds & (1u << USB_LED_CAPS_LOCK)) { saturation = 255; } */ - if (state->status.layer & 0x200) { + + if (state->status.layer & 0x400) { + state->target_lcd_color = LCD_COLOR(OCEAN, saturation, 0xFF); + state->layer_text = "STENOGRAPHY"; + } + else if (state->status.layer & 0x200) { state->target_lcd_color = LCD_COLOR(GREEN, saturation, 0xFF); - state->layer_text = "MOUSE"; + state->layer_text = "FUNCTION"; } else if (state->status.layer & 0x100) { state->target_lcd_color = LCD_COLOR(MAGENTA, saturation, 0xFF); state->layer_text = "Shortcuts Layer"; + stop_keyframe_animation(&sweep_on_sweep_off_left_and_right); + start_keyframe_animation(&led_test_animation); } else if (state->status.layer & 0x80) { state->target_lcd_color = LCD_COLOR(VIOLET, saturation, 0xFF); state->layer_text = "Plover"; - start_keyframe_animation(&KITT_Scanner_animation); - } else if (state->status.layer & 0x40) { state->target_lcd_color = LCD_COLOR(RASPBERRY, saturation, 0xFF); @@ -199,6 +368,8 @@ static void get_visualizer_layer_and_color(visualizer_state_t* state) { else if (state->status.layer & 0x4) { state->target_lcd_color = LCD_COLOR(BLUE, saturation, 0xFF); state->layer_text = "Dvorak"; + stop_keyframe_animation(&led_test_animation); + start_keyframe_animation(&sweep_on_sweep_off_left_and_right); } else if (state->status.layer & 0x2) { state->target_lcd_color = LCD_COLOR(ORANGE, saturation, 0xFF); @@ -207,7 +378,7 @@ static void get_visualizer_layer_and_color(visualizer_state_t* state) { else { state->target_lcd_color = LCD_COLOR(YELLOW, saturation, 0xFF); state->layer_text = "Qwerty"; - stop_keyframe_animation(&KITT_Scanner_animation); + stop_keyframe_animation(&led_test_animation); start_keyframe_animation(&Fade_in_all_leds); } } -- cgit v1.2.3-70-g09d2