Display QMK logo at startup of Infinity Ergodox

master
Fred Sundvik 2017-04-01 16:37:31 +03:00
parent a8f5897b97
commit e6f7a8a47a
2 changed files with 65 additions and 24 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 490 B

View File

@ -29,25 +29,68 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "visualizer.h" #include "visualizer.h"
#include "led_test.h" #include "led_test.h"
static const char* welcome_text[] = {"TMK", "Infinity Ergodox"}; // To generate an image array like this
// Ensure the image is 128 x 32 or smaller
// Convert the bitmap to a C array using a program like http://www.riuson.com/lcd-image-converter/
// Ensure the the conversion process produces a monochrome format array - 1 bit/pixel, left to right, top to bottom
// Update array in the source code with the C array produced by the conversion program
// Just an example how to write custom keyframe functions, we could have moved // The image below is generated from lcd_logo.png
// all this into the init function static const uint8_t image_data_lcd_logo[512] = {
bool display_welcome(keyframe_animation_t* animation, visualizer_state_t* state) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xf8, 0xfe, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x38, 0x38, 0x38, 0x06, 0x29, 0x41, 0x24, 0x52, 0x24, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x38, 0x38, 0x38, 0x09, 0x55, 0x42, 0xaa, 0xaa, 0xaa, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x38, 0x38, 0x38, 0x09, 0x55, 0x82, 0x28, 0xaa, 0xae, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x38, 0x38, 0x38, 0x09, 0x55, 0x43, 0x28, 0xaa, 0xaa, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x38, 0x38, 0x38, 0x0a, 0x55, 0x42, 0x28, 0xaa, 0xaa, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x38, 0x38, 0x38, 0x05, 0x45, 0x42, 0x28, 0x89, 0x4a, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x18, 0x38, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1c, 0x38, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0e, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x03, 0xff, 0x80, 0x04, 0x45, 0x14, 0xa4, 0x92, 0x83, 0x52, 0x22, 0x22, 0x36, 0x00, 0x00,
0x00, 0x00, 0x38, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xba, 0x84, 0x55, 0x55, 0x57, 0x45, 0x00, 0x00,
0x00, 0x00, 0x38, 0x00, 0x08, 0xaa, 0xaa, 0xaa, 0x92, 0xb2, 0x55, 0x55, 0x42, 0x65, 0x00, 0x00,
0x00, 0x00, 0x38, 0x00, 0x08, 0xaa, 0xaa, 0xaa, 0x92, 0x81, 0x56, 0x65, 0x42, 0x45, 0x00, 0x00,
0x00, 0x00, 0x38, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0x92, 0x81, 0x54, 0x45, 0x42, 0x45, 0x00, 0x00,
0x00, 0x00, 0x38, 0x00, 0x04, 0x48, 0xa2, 0x4a, 0x89, 0x06, 0x24, 0x42, 0x41, 0x36, 0x00, 0x00,
0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static const uint32_t logo_background_color = LCD_COLOR(0x00, 0x00, 0x80);
static const uint32_t initial_color = LCD_COLOR(0, 0, 0xFF);
bool display_logo(keyframe_animation_t* animation, visualizer_state_t* state) {
(void)state;
(void)animation; (void)animation;
(void)state;
// Read the uGFX documentation for information how to use the displays // Read the uGFX documentation for information how to use the displays
// http://wiki.ugfx.org/index.php/Main_Page // http://wiki.ugfx.org/index.php/Main_Page
gdispClear(White); gdispClear(White);
// You can use static variables for things that can't be found in the animation // You can use static variables for things that can't be found in the animation
// or state structs // or state structs, here we use the image
gdispDrawString(0, 3, welcome_text[0], state->font_dejavusansbold12, Black);
gdispDrawString(0, 15, welcome_text[1], state->font_dejavusansbold12, Black); //gdispGBlitArea is a tricky function to use since it supports blitting part of the image
// if you have full screen image, then just use 128 and 32 for both source and target dimensions
gdispGBlitArea(GDISP, 0, 0, 128, 32, 0, 0, 128, (pixel_t*)image_data_lcd_logo);
// Always remember to flush the display // Always remember to flush the display
gdispFlush(); 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; return false;
} }
@ -56,13 +99,12 @@ bool display_welcome(keyframe_animation_t* animation, visualizer_state_t* state)
// Don't worry, if the startup animation is long, you can use the keyboard like normal // Don't worry, if the startup animation is long, you can use the keyboard like normal
// during that time // during that time
static keyframe_animation_t startup_animation = { static keyframe_animation_t startup_animation = {
.num_frames = 4, .num_frames = 3,
.loop = false, .loop = false,
.frame_lengths = {0, gfxMillisecondsToTicks(1000), gfxMillisecondsToTicks(5000), 0}, .frame_lengths = {0, gfxMillisecondsToTicks(10000), 0},
.frame_functions = { .frame_functions = {
display_welcome, display_logo,
keyframe_animate_backlight_color, keyframe_animate_backlight_color,
keyframe_no_operation,
enable_visualization enable_visualization
}, },
}; };
@ -78,6 +120,7 @@ static keyframe_animation_t color_animation = {
.frame_functions = {keyframe_no_operation, keyframe_animate_backlight_color}, .frame_functions = {keyframe_no_operation, keyframe_animate_backlight_color},
}; };
// The LCD animation alternates between the layer name display and a // The LCD animation alternates between the layer name display and a
// bitmap that displays all active layers // bitmap that displays all active layers
static keyframe_animation_t lcd_animation = { static keyframe_animation_t lcd_animation = {
@ -99,14 +142,13 @@ static keyframe_animation_t suspend_animation = {
}; };
static keyframe_animation_t resume_animation = { static keyframe_animation_t resume_animation = {
.num_frames = 5, .num_frames = 4,
.loop = false, .loop = false,
.frame_lengths = {0, 0, gfxMillisecondsToTicks(1000), gfxMillisecondsToTicks(5000), 0}, .frame_lengths = {0, 0, gfxMillisecondsToTicks(10000), 0},
.frame_functions = { .frame_functions = {
keyframe_enable_lcd_and_backlight, keyframe_enable_lcd_and_backlight,
display_welcome, display_logo,
keyframe_animate_backlight_color, keyframe_animate_backlight_color,
keyframe_no_operation,
enable_visualization, enable_visualization,
}, },
}; };
@ -115,10 +157,9 @@ void initialize_user_visualizer(visualizer_state_t* state) {
// The brightness will be dynamically adjustable in the future // The brightness will be dynamically adjustable in the future
// But for now, change it here. // But for now, change it here.
lcd_backlight_brightness(0x50); lcd_backlight_brightness(0x50);
state->current_lcd_color = LCD_COLOR(0x00, 0x00, 0xFF); state->current_lcd_color = initial_color;
state->target_lcd_color = LCD_COLOR(0x10, 0xFF, 0xFF); state->target_lcd_color = logo_background_color;
start_keyframe_animation(&startup_animation); start_keyframe_animation(&startup_animation);
start_keyframe_animation(&led_test_animation);
} }
void update_user_visualizer_state(visualizer_state_t* state) { void update_user_visualizer_state(visualizer_state_t* state) {
@ -161,8 +202,8 @@ void user_visualizer_suspend(visualizer_state_t* state) {
} }
void user_visualizer_resume(visualizer_state_t* state) { void user_visualizer_resume(visualizer_state_t* state) {
state->current_lcd_color = LCD_COLOR(0x00, 0x00, 0x00); state->current_lcd_color = initial_color;
state->target_lcd_color = LCD_COLOR(0x10, 0xFF, 0xFF); state->target_lcd_color = logo_background_color;
start_keyframe_animation(&resume_animation); start_keyframe_animation(&resume_animation);
start_keyframe_animation(&led_test_animation); start_keyframe_animation(&led_test_animation);
} }