diff --git a/app/include/zmk/rgb_underglow.h b/app/include/zmk/rgb_underglow.h index 0c45e1c6..f00dcd5e 100644 --- a/app/include/zmk/rgb_underglow.h +++ b/app/include/zmk/rgb_underglow.h @@ -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); diff --git a/app/src/activity.c b/app/src/activity.c index b109d46d..161771df 100644 --- a/app/src/activity.c +++ b/app/src/activity.c @@ -16,6 +16,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include #include +#include #include #include @@ -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) diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 5f3959a7..6fa9cf83 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -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); + zmk_rgb_underglow_transient_on(); + zmk_led_write_pixels(); } 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_off(); } - zmk_led_write_pixels(); - zmk_rgb_set_ext_power(); } #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(); + zmk_rgb_underglow_set_layer(rgb_underglow_top_layer()); + 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(); } }