forked from mirrors/qmk_firmware
Remove the need to manually enable the visualizer
This commit is contained in:
parent
1e7585e767
commit
64d63ab422
4 changed files with 27 additions and 27 deletions
|
@ -136,13 +136,12 @@ bool display_logo(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 = 3,
|
.num_frames = 2,
|
||||||
.loop = false,
|
.loop = false,
|
||||||
.frame_lengths = {0, gfxMillisecondsToTicks(10000), 0},
|
.frame_lengths = {0, gfxMillisecondsToTicks(10000), 0},
|
||||||
.frame_functions = {
|
.frame_functions = {
|
||||||
display_logo,
|
display_logo,
|
||||||
backlight_keyframe_animate_color,
|
backlight_keyframe_animate_color,
|
||||||
enable_visualization
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -198,7 +197,7 @@ 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, 0, gfxMillisecondsToTicks(10000), 0},
|
.frame_lengths = {0, 0, 0, gfxMillisecondsToTicks(10000), 0},
|
||||||
.frame_functions = {
|
.frame_functions = {
|
||||||
|
@ -206,7 +205,6 @@ static keyframe_animation_t resume_animation = {
|
||||||
backlight_keyframe_enable,
|
backlight_keyframe_enable,
|
||||||
display_logo,
|
display_logo,
|
||||||
backlight_keyframe_animate_color,
|
backlight_keyframe_animate_color,
|
||||||
enable_visualization,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -110,13 +110,12 @@ bool display_logo(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 = 3,
|
.num_frames = 2,
|
||||||
.loop = false,
|
.loop = false,
|
||||||
.frame_lengths = {0, gfxMillisecondsToTicks(10000), 0},
|
.frame_lengths = {0, gfxMillisecondsToTicks(10000), 0},
|
||||||
.frame_functions = {
|
.frame_functions = {
|
||||||
display_logo,
|
display_logo,
|
||||||
backlight_keyframe_animate_color,
|
backlight_keyframe_animate_color,
|
||||||
enable_visualization
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -140,7 +139,7 @@ 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, 0, gfxMillisecondsToTicks(10000), 0},
|
.frame_lengths = {0, 0, 0, gfxMillisecondsToTicks(10000), 0},
|
||||||
.frame_functions = {
|
.frame_functions = {
|
||||||
|
@ -148,7 +147,6 @@ static keyframe_animation_t resume_animation = {
|
||||||
backlight_keyframe_enable,
|
backlight_keyframe_enable,
|
||||||
display_logo,
|
display_logo,
|
||||||
backlight_keyframe_animate_color,
|
backlight_keyframe_animate_color,
|
||||||
enable_visualization,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -154,6 +154,14 @@ void stop_all_keyframe_animations(void) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint8_t get_num_running_animations(void) {
|
||||||
|
uint8_t count = 0;
|
||||||
|
for (int i=0;i<MAX_SIMULTANEOUS_ANIMATIONS;i++) {
|
||||||
|
count += animations[i] ? 1 : 0;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
static bool update_keyframe_animation(keyframe_animation_t* animation, visualizer_state_t* state, systemticks_t delta, systemticks_t* sleep_time) {
|
static bool update_keyframe_animation(keyframe_animation_t* animation, visualizer_state_t* state, systemticks_t delta, systemticks_t* sleep_time) {
|
||||||
// TODO: Clean up this messy code
|
// TODO: Clean up this messy code
|
||||||
dprintf("Animation frame%d, left %d, delta %d\n", animation->current_frame,
|
dprintf("Animation frame%d, left %d, delta %d\n", animation->current_frame,
|
||||||
|
@ -228,14 +236,6 @@ bool keyframe_no_operation(keyframe_animation_t* animation, visualizer_state_t*
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool enable_visualization(keyframe_animation_t* animation, visualizer_state_t* state) {
|
|
||||||
(void)animation;
|
|
||||||
(void)state;
|
|
||||||
dprint("User visualizer inited\n");
|
|
||||||
visualizer_enabled = true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Optimize the stack size, this is probably way too big
|
// TODO: Optimize the stack size, this is probably way too big
|
||||||
static DECLARE_THREAD_STACK(visualizerThreadStack, 1024);
|
static DECLARE_THREAD_STACK(visualizerThreadStack, 1024);
|
||||||
static DECLARE_THREAD_FUNCTION(visualizerThread, arg) {
|
static DECLARE_THREAD_FUNCTION(visualizerThread, arg) {
|
||||||
|
@ -276,13 +276,15 @@ static DECLARE_THREAD_FUNCTION(visualizerThread, arg) {
|
||||||
|
|
||||||
systemticks_t sleep_time = TIME_INFINITE;
|
systemticks_t sleep_time = TIME_INFINITE;
|
||||||
systemticks_t current_time = gfxSystemTicks();
|
systemticks_t current_time = gfxSystemTicks();
|
||||||
|
bool force_update = true;
|
||||||
|
|
||||||
while(true) {
|
while(true) {
|
||||||
systemticks_t new_time = gfxSystemTicks();
|
systemticks_t new_time = gfxSystemTicks();
|
||||||
systemticks_t delta = new_time - current_time;
|
systemticks_t delta = new_time - current_time;
|
||||||
current_time = new_time;
|
current_time = new_time;
|
||||||
bool enabled = visualizer_enabled;
|
bool enabled = visualizer_enabled;
|
||||||
if (!same_status(&state.status, ¤t_status)) {
|
if (force_update || !same_status(&state.status, ¤t_status)) {
|
||||||
|
force_update = false;
|
||||||
if (visualizer_enabled) {
|
if (visualizer_enabled) {
|
||||||
if (current_status.suspended) {
|
if (current_status.suspended) {
|
||||||
stop_all_keyframe_animations();
|
stop_all_keyframe_animations();
|
||||||
|
@ -320,10 +322,10 @@ static DECLARE_THREAD_FUNCTION(visualizerThread, arg) {
|
||||||
#ifdef EMULATOR
|
#ifdef EMULATOR
|
||||||
draw_emulator();
|
draw_emulator();
|
||||||
#endif
|
#endif
|
||||||
// The animation can enable the visualizer
|
// Enable the visualizer when the startup or the suspend animation has finished
|
||||||
// And we might need to update the state when that happens
|
if (!visualizer_enabled && state.status.suspended == false && get_num_running_animations() == 0) {
|
||||||
// so don't sleep
|
visualizer_enabled = true;
|
||||||
if (enabled != visualizer_enabled) {
|
force_update = true;
|
||||||
sleep_time = 0;
|
sleep_time = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -130,20 +130,22 @@ void run_next_keyframe(keyframe_animation_t* animation, visualizer_state_t* stat
|
||||||
// Does nothing, useful for adding delays
|
// Does nothing, useful for adding delays
|
||||||
bool keyframe_no_operation(keyframe_animation_t* animation, visualizer_state_t* state);
|
bool keyframe_no_operation(keyframe_animation_t* animation, visualizer_state_t* state);
|
||||||
|
|
||||||
// Call this once, when the initial animation has finished, alternatively you can call it
|
|
||||||
// directly from the initalize_user_visualizer function (the animation can be null)
|
|
||||||
bool enable_visualization(keyframe_animation_t* animation, visualizer_state_t* state);
|
|
||||||
|
|
||||||
// The master can set userdata which will be transferred to the slave
|
// The master can set userdata which will be transferred to the slave
|
||||||
#ifdef VISUALIZER_USER_DATA_SIZE
|
#ifdef VISUALIZER_USER_DATA_SIZE
|
||||||
void visualizer_set_user_data(void* user_data);
|
void visualizer_set_user_data(void* user_data);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// These functions have to be implemented by the user
|
// These functions have to be implemented by the user
|
||||||
void initialize_user_visualizer(visualizer_state_t* state);
|
// Called regularly each time the state has changed (but not every scan loop)
|
||||||
void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status);
|
void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status);
|
||||||
|
// Called when the computer goes to suspend, will also stop calling update_user_visualizer_state
|
||||||
void user_visualizer_suspend(visualizer_state_t* state);
|
void user_visualizer_suspend(visualizer_state_t* state);
|
||||||
|
// You have to start at least one animation as a response to the following two functions
|
||||||
|
// When the animation has finished the visualizer will resume normal operation and start calling the
|
||||||
|
// update_user_visualizer_state again
|
||||||
|
// Called when the keyboard boots up
|
||||||
|
void initialize_user_visualizer(visualizer_state_t* state);
|
||||||
|
// Called when the computer resumes from a suspend
|
||||||
void user_visualizer_resume(visualizer_state_t* state);
|
void user_visualizer_resume(visualizer_state_t* state);
|
||||||
|
|
||||||
|
|
||||||
#endif /* VISUALIZER_H */
|
#endif /* VISUALIZER_H */
|
||||||
|
|
Loading…
Reference in a new issue