underglow-layer: Don't save state on idle/resume & register activity on layer change

This commit is contained in:
darknao 2024-05-13 14:43:08 +02:00 committed by afiqzudinhadi
parent da994be0ba
commit 9308ba806a
3 changed files with 31 additions and 16 deletions

View file

@ -16,6 +16,8 @@ int zmk_rgb_underglow_toggle(void);
int zmk_rgb_underglow_get_state(bool *state);
int zmk_rgb_underglow_on(void);
int zmk_rgb_underglow_off(void);
int zmk_rgb_underglow_transient_on(void);
int zmk_rgb_underglow_transient_off(void);
int zmk_rgb_underglow_cycle_effect(int direction);
int zmk_rgb_underglow_calc_effect(int direction);
int zmk_rgb_underglow_select_effect(int effect);

View file

@ -16,6 +16,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
#include <zmk/event_manager.h>
#include <zmk/events/activity_state_changed.h>
#include <zmk/events/position_state_changed.h>
#include <zmk/events/split_peripheral_layer_changed.h>
#include <zmk/events/sensor_event.h>
#include <zmk/pm.h>
@ -109,6 +110,7 @@ static int activity_init(void) {
ZMK_LISTENER(activity, activity_event_listener);
ZMK_SUBSCRIPTION(activity, zmk_position_state_changed);
ZMK_SUBSCRIPTION(activity, zmk_sensor_event);
ZMK_SUBSCRIPTION(activity, zmk_split_peripheral_layer_changed);
#if IS_ENABLED(CONFIG_ZMK_POINTING)

View file

@ -475,18 +475,17 @@ static void zmk_rgb_underglow_apply_rgbmap(uint32_t rgbmap[], size_t rgbmap_len)
}
static void zmk_rgb_underglow_set_layer(uint8_t layer) {
state.on = true;
if (state.current_effect != UNDERGLOW_EFFECT_LAYER_INDICATORS)
return;
uint32_t *rgbmap = rgb_underglow_get_bindings(layer);
if (rgbmap != NULL) {
zmk_rgb_underglow_apply_rgbmap(rgbmap, ZMK_KEYMAP_LEN);
} else {
for (int i = 0; i < STRIP_NUM_PIXELS; i++) {
pixels[i] = (struct led_rgb){r : 0, g : 0, b : 0};
}
state.on = false;
}
zmk_rgb_underglow_transient_on();
zmk_led_write_pixels();
zmk_rgb_set_ext_power();
} else {
zmk_rgb_underglow_transient_off();
}
}
#endif /* UNDERGLOW_LAYER_ENABLED */
@ -515,7 +514,7 @@ static void zmk_rgb_underglow_tick(struct k_work *work) {
K_WORK_DEFINE(underglow_tick_work, zmk_rgb_underglow_tick);
static void zmk_rgb_underglow_tick_handler(struct k_timer *timer) {
if (!state.on && state.current_effect == UNDERGLOW_EFFECT_LAYER_INDICATORS) {
if (!state.on || state.current_effect == UNDERGLOW_EFFECT_LAYER_INDICATORS) {
return;
}
@ -647,6 +646,11 @@ void zmk_rgb_set_ext_power(void) {
}
int zmk_rgb_underglow_on(void) {
zmk_rgb_underglow_transient_on();
return zmk_rgb_underglow_save_state();
}
int zmk_rgb_underglow_transient_on(void) {
if (!led_strip)
return -ENODEV;
@ -656,7 +660,7 @@ int zmk_rgb_underglow_on(void) {
state.animation_step = 0;
k_timer_start(&underglow_tick, K_NO_WAIT, K_MSEC(25));
return zmk_rgb_underglow_save_state();
return 0;
}
static void zmk_rgb_underglow_off_handler(struct k_work *work) {
@ -669,6 +673,11 @@ static void zmk_rgb_underglow_off_handler(struct k_work *work) {
K_WORK_DEFINE(underglow_off_work, zmk_rgb_underglow_off_handler);
int zmk_rgb_underglow_off(void) {
zmk_rgb_underglow_transient_off();
return zmk_rgb_underglow_save_state();
}
int zmk_rgb_underglow_transient_off(void) {
if (!led_strip)
return -ENODEV;
@ -678,7 +687,7 @@ int zmk_rgb_underglow_off(void) {
state.on = false;
zmk_rgb_set_ext_power();
return zmk_rgb_underglow_save_state();
return 0;
}
int zmk_rgb_underglow_calc_effect(int direction) {
@ -855,17 +864,19 @@ static int rgb_underglow_auto_state(bool target_wake_state) {
sleep_state.is_awake = target_wake_state;
if (sleep_state.is_awake) {
if (sleep_state.rgb_state_before_sleeping) {
#ifdef UNDERGLOW_LAYER_ENABLED
zmk_rgb_underglow_set_layer(rgb_underglow_top_layer());
#endif
return zmk_rgb_underglow_on();
return 0;
#else
if (sleep_state.rgb_state_before_sleeping) {
return zmk_rgb_underglow_transient_on();
} else {
return zmk_rgb_underglow_off();
return zmk_rgb_underglow_transient_off();
}
#endif
} else {
sleep_state.rgb_state_before_sleeping = state.on;
return zmk_rgb_underglow_off();
return zmk_rgb_underglow_transient_off();
}
}