diff options
| author | jpetermans <tibcmhhm@gmail.com> | 2017-05-24 11:51:20 -0700 | 
|---|---|---|
| committer | jpetermans <tibcmhhm@gmail.com> | 2017-05-24 11:51:20 -0700 | 
| commit | 2dcd6c38fa478b40a973c9411c3f5b4c87ae0ba7 (patch) | |
| tree | 289d5cce94ad5883741f0b637749d87680c14d33 /keyboards/ergodox/infinity/simple_visualizer.h | |
| parent | d89114400c398b900e27bf324a7973d1e0f25e58 (diff) | |
| parent | 7a4ec3bd926865e490fbf7c5ec68d762e998683f (diff) | |
| download | firmware-2dcd6c38fa478b40a973c9411c3f5b4c87ae0ba7.tar.gz firmware-2dcd6c38fa478b40a973c9411c3f5b4c87ae0ba7.tar.bz2 firmware-2dcd6c38fa478b40a973c9411c3f5b4c87ae0ba7.zip  | |
Merge remote-tracking branch 'upstream/master' into infinity60
Diffstat (limited to 'keyboards/ergodox/infinity/simple_visualizer.h')
| -rw-r--r-- | keyboards/ergodox/infinity/simple_visualizer.h | 123 | 
1 files changed, 123 insertions, 0 deletions
diff --git a/keyboards/ergodox/infinity/simple_visualizer.h b/keyboards/ergodox/infinity/simple_visualizer.h new file mode 100644 index 000000000..ded8a3222 --- /dev/null +++ b/keyboards/ergodox/infinity/simple_visualizer.h @@ -0,0 +1,123 @@ +/* Copyright 2017 Fred Sundvik + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEYBOARDS_ERGODOX_INFINITY_SIMPLE_VISUALIZER_H_ +#define KEYBOARDS_ERGODOX_INFINITY_SIMPLE_VISUALIZER_H_ + +// Currently we are assuming that both the backlight and LCD are enabled +// But it's entirely possible to write a custom visualizer that use only +// one of them +#ifndef LCD_BACKLIGHT_ENABLE +#error This visualizer needs that LCD backlight is enabled +#endif + +#ifndef LCD_ENABLE +#error This visualizer needs that LCD is enabled +#endif + +#include "visualizer.h" +#include "visualizer_keyframes.h" +#include "lcd_keyframes.h" +#include "lcd_backlight_keyframes.h" +#include "system/serial_link.h" +#include "led.h" +#include "animations.h" + +static const uint32_t logo_background_color = LCD_COLOR(0x00, 0x00, 0xFF); +static const uint32_t initial_color = LCD_COLOR(0, 0, 0); + +static bool initial_update = true; + +// Feel free to modify the animations below, or even add new ones if needed + +static keyframe_animation_t lcd_layer_display = { +    .num_frames = 1, +    .loop = false, +    .frame_lengths = {gfxMillisecondsToTicks(0)}, +    .frame_functions = {lcd_keyframe_display_layer_and_led_states} +}; + +// The color animation animates the LCD color when you change layers +static keyframe_animation_t color_animation = { +    .num_frames = 2, +    .loop = false, +    // Note that there's a 200 ms no-operation frame, +    // this prevents the color from changing when activating the layer +    // momentarily +    .frame_lengths = {gfxMillisecondsToTicks(200), gfxMillisecondsToTicks(500)}, +    .frame_functions = {keyframe_no_operation, backlight_keyframe_animate_color}, +}; + +void initialize_user_visualizer(visualizer_state_t* state) { +    // The brightness will be dynamically adjustable in the future +    // But for now, change it here. +    lcd_backlight_brightness(130); +    state->current_lcd_color = initial_color; +    state->target_lcd_color = logo_background_color; +    initial_update = true; +    start_keyframe_animation(&default_startup_animation); +} + + +// This function should be implemented by the keymap visualizer +// Don't change anything else than state->target_lcd_color and state->layer_text as that's the only thing +// that the simple_visualizer assumes that you are updating +// Also make sure that the buffer passed to state->layer_text remains valid until the previous animation is +// stopped. This can be done by either double buffering it or by using constant strings +static void get_visualizer_layer_and_color(visualizer_state_t* state); + +void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) { +    // Add more tests, change the colors and layer texts here +    // Usually you want to check the high bits (higher layers first) +    // because that's the order layers are processed for keypresses +    // You can for check for example: +    // state->status.layer +    // state->status.default_layer +    // state->status.leds (see led.h for available statuses) + +    uint32_t prev_color = state->target_lcd_color; +    const char* prev_layer_text = state->layer_text; + +    get_visualizer_layer_and_color(state); + +    if (initial_update || prev_color != state->target_lcd_color) { +        start_keyframe_animation(&color_animation); +    } + +    if (initial_update || prev_layer_text != state->layer_text) { +        start_keyframe_animation(&lcd_layer_display); +    } +    // You can also stop existing animations, and start your custom ones here +    // remember that you should normally have only one animation for the LCD +    // and one for the background. But you can also combine them if you want. +} + +void user_visualizer_suspend(visualizer_state_t* state) { +    state->layer_text = "Suspending..."; +    uint8_t hue = LCD_HUE(state->current_lcd_color); +    uint8_t sat = LCD_SAT(state->current_lcd_color); +    state->target_lcd_color = LCD_COLOR(hue, sat, 0); +    start_keyframe_animation(&default_suspend_animation); +} + +void user_visualizer_resume(visualizer_state_t* state) { +    state->current_lcd_color = initial_color; +    state->target_lcd_color = logo_background_color; +    initial_update = true; +    start_keyframe_animation(&default_startup_animation); +} + +#endif /* KEYBOARDS_ERGODOX_INFINITY_SIMPLE_VISUALIZER_H_ */  | 
