summaryrefslogtreecommitdiff
path: root/keyboards/ergodox_infinity/keymaps/halfkeyboard/visualizer.c
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/ergodox_infinity/keymaps/halfkeyboard/visualizer.c')
-rw-r--r--keyboards/ergodox_infinity/keymaps/halfkeyboard/visualizer.c353
1 files changed, 262 insertions, 91 deletions
diff --git a/keyboards/ergodox_infinity/keymaps/halfkeyboard/visualizer.c b/keyboards/ergodox_infinity/keymaps/halfkeyboard/visualizer.c
index 7bd5a0783f..61a724c63f 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 <http://www.gnu.org/licenses/>.
#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);
}
}