From: Don Armstrong Date: Thu, 27 Apr 2017 22:39:01 +0000 (-0700) Subject: switch to the user visualizer from Fred X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=29fd22ee08cd6f0630fd2e821fcaf03280a643fd;p=qmk_firmware.git switch to the user visualizer from Fred --- diff --git a/keyboards/ergodox/keymaps/don/visualizer.c b/keyboards/ergodox/keymaps/don/visualizer.c index f011b5b5f..7a2ff7a95 100644 --- a/keyboards/ergodox/keymaps/don/visualizer.c +++ b/keyboards/ergodox/keymaps/don/visualizer.c @@ -1,5 +1,5 @@ /* -Copyright 2016 Fred Sundvik +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 @@ -15,162 +15,40 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -// 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 "led_test.h" - -static const char* welcome_text[] = {"QMK: Don Keymap", "Infinity Ergodox"}; - -// Just an example how to write custom keyframe functions, we could have moved -// all this into the init function -bool display_welcome(keyframe_animation_t* animation, visualizer_state_t* state) { - (void)animation; - // Read the uGFX documentation for information how to use the displays - // http://wiki.ugfx.org/index.php/Main_Page - gdispClear(White); - // You can use static variables for things that can't be found in the animation - // or state structs - gdispDrawString(0, 3, welcome_text[0], state->font_dejavusansbold12, Black); - gdispDrawString(0, 15, welcome_text[1], state->font_dejavusansbold12, Black); - // Always remember to flush the display - gdispFlush(); - // you could set the backlight color as well, but we won't do it here, since - // it's part of the following animation - // lcd_backlight_color(hue, saturation, intensity); - // We don't need constant updates, just drawing the screen once is enough - return false; -} - -// Feel free to modify the animations below, or even add new ones if needed - -// Don't worry, if the startup animation is long, you can use the keyboard like normal -// during that time -static keyframe_animation_t startup_animation = { - .num_frames = 4, - .loop = false, - .frame_lengths = {0, gfxMillisecondsToTicks(1000), gfxMillisecondsToTicks(5000), 0}, - .frame_functions = { - display_welcome, - keyframe_animate_backlight_color, - keyframe_no_operation, - enable_visualization - }, -}; - -// 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, keyframe_animate_backlight_color}, -}; - -// The LCD animation alternates between the layer name display and a -// bitmap that displays all active layers -static keyframe_animation_t lcd_animation = { - .num_frames = 2, - .loop = true, - .frame_lengths = {gfxMillisecondsToTicks(2000), gfxMillisecondsToTicks(2000)}, - .frame_functions = {keyframe_display_layer_text, keyframe_display_layer_bitmap}, -}; - -static keyframe_animation_t suspend_animation = { - .num_frames = 3, - .loop = false, - .frame_lengths = {0, gfxMillisecondsToTicks(1000), 0}, - .frame_functions = { - keyframe_display_layer_text, - keyframe_animate_backlight_color, - keyframe_disable_lcd_and_backlight, - }, -}; - -static keyframe_animation_t resume_animation = { - .num_frames = 5, - .loop = false, - .frame_lengths = {0, 0, gfxMillisecondsToTicks(1000), gfxMillisecondsToTicks(5000), 0}, - .frame_functions = { - keyframe_enable_lcd_and_backlight, - display_welcome, - keyframe_animate_backlight_color, - keyframe_no_operation, - enable_visualization, - }, -}; - -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(0x50); - state->current_lcd_color = LCD_COLOR(0x00, 0x00, 0xFF); - state->target_lcd_color = LCD_COLOR(0x10, 0xFF, 0xFF); - start_keyframe_animation(&startup_animation); - // start_keyframe_animation(&led_test_animation); -} - -void update_user_visualizer_state(visualizer_state_t* state) { - // 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) +#include "simple_visualizer.h" + +// 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) { + uint8_t saturation = 255; + if (state->status.leds & (1u << USB_LED_CAPS_LOCK)) { + saturation = 255; + } if (state->status.layer & 0x20) { - state->target_lcd_color = LCD_COLOR(0xB0, 0xFF, 0xFF); - state->layer_text = "Plover"; + state->target_lcd_color = LCD_COLOR(0xB0, saturation, 0xFF); + state->layer_text = "Plover"; } else if (state->status.layer & 0x10) { - state->target_lcd_color = LCD_COLOR(0x90, 0xFF, 0xFF); - state->layer_text = "Numpad"; + state->target_lcd_color = LCD_COLOR(0x90, saturation, 0xFF); + state->layer_text = "Numpad"; } else if (state->status.layer & 0x8) { - state->target_lcd_color = LCD_COLOR(0x60, 0xFF, 0xFF); - state->layer_text = "KBD FXNs"; + state->target_lcd_color = LCD_COLOR(0x60, saturation, 0xFF); + state->layer_text = "KBD FXNs"; } else if (state->status.layer & 0x4) { - state->target_lcd_color = LCD_COLOR(0x30, 0xFF, 0xFF); + state->target_lcd_color = LCD_COLOR(0x30, saturation, 0xFF); state->layer_text = "Mouse"; } else if (state->status.layer & 0x2) { - state->target_lcd_color = LCD_COLOR(0x00, 0xFF, 0xFF); + state->target_lcd_color = LCD_COLOR(0x00, saturation, 0xFF); state->layer_text = "FXN/Symbols"; } else { - state->target_lcd_color = LCD_COLOR(0x00, 0x80, 0x80); - state->layer_text = "Default"; + state->target_lcd_color = LCD_COLOR(0x00, saturation, 0x80); + state->layer_text = "Default"; } - // 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. - start_keyframe_animation(&lcd_animation); - start_keyframe_animation(&color_animation); -} - -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(&suspend_animation); -} - -void user_visualizer_resume(visualizer_state_t* state) { - state->current_lcd_color = LCD_COLOR(0x00, 0x00, 0x00); - state->target_lcd_color = LCD_COLOR(0x10, 0xFF, 0xFF); - start_keyframe_animation(&resume_animation); - // start_keyframe_animation(&led_test_animation); }