From bb2c478af915616640d78ae9ba984fbf1f817185 Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Wed, 20 Jan 2021 10:57:03 -0500 Subject: [PATCH] refactor(rgb): Expose explicit on/off command/API. --- app/include/dt-bindings/zmk/rgb.h | 26 ++++--- app/include/zmk/rgb_underglow.h | 3 + app/src/behaviors/behavior_rgb_underglow.c | 4 + app/src/rgb_underglow.c | 87 ++++++++++++---------- 4 files changed, 71 insertions(+), 49 deletions(-) diff --git a/app/include/dt-bindings/zmk/rgb.h b/app/include/dt-bindings/zmk/rgb.h index 1f7b44ec..403cba98 100644 --- a/app/include/dt-bindings/zmk/rgb.h +++ b/app/include/dt-bindings/zmk/rgb.h @@ -5,19 +5,23 @@ */ #define RGB_TOG_CMD 0 -#define RGB_HUI_CMD 1 -#define RGB_HUD_CMD 2 -#define RGB_SAI_CMD 3 -#define RGB_SAD_CMD 4 -#define RGB_BRI_CMD 5 -#define RGB_BRD_CMD 6 -#define RGB_SPI_CMD 7 -#define RGB_SPD_CMD 8 -#define RGB_EFF_CMD 9 -#define RGB_EFR_CMD 10 -#define RGB_COLOR_HSB_CMD 11 +#define RGB_ON_CMD 1 +#define RGB_OFF_CMD 2 +#define RGB_HUI_CMD 3 +#define RGB_HUD_CMD 4 +#define RGB_SAI_CMD 5 +#define RGB_SAD_CMD 6 +#define RGB_BRI_CMD 7 +#define RGB_BRD_CMD 8 +#define RGB_SPI_CMD 9 +#define RGB_SPD_CMD 10 +#define RGB_EFF_CMD 11 +#define RGB_EFR_CMD 12 +#define RGB_COLOR_HSB_CMD 13 #define RGB_TOG RGB_TOG_CMD 0 +#define RGB_ON RGB_ON_CMD 0 +#define RGB_OFF RGB_OFF_CMD 0 #define RGB_HUI RGB_HUI_CMD 0 #define RGB_HUD RGB_HUD_CMD 0 #define RGB_SAI RGB_SAI_CMD 0 diff --git a/app/include/zmk/rgb_underglow.h b/app/include/zmk/rgb_underglow.h index 7fcd42dd..7c2ff13f 100644 --- a/app/include/zmk/rgb_underglow.h +++ b/app/include/zmk/rgb_underglow.h @@ -7,6 +7,9 @@ #pragma once int zmk_rgb_underglow_toggle(); +int zmk_rgb_underglow_get_state(bool *state); +int zmk_rgb_underglow_on(); +int zmk_rgb_underglow_off(); int zmk_rgb_underglow_cycle_effect(int direction); int zmk_rgb_underglow_change_hue(int direction); int zmk_rgb_underglow_change_sat(int direction); diff --git a/app/src/behaviors/behavior_rgb_underglow.c b/app/src/behaviors/behavior_rgb_underglow.c index eb4680e1..f9eaa136 100644 --- a/app/src/behaviors/behavior_rgb_underglow.c +++ b/app/src/behaviors/behavior_rgb_underglow.c @@ -25,6 +25,10 @@ static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, switch (binding->param1) { case RGB_TOG_CMD: return zmk_rgb_underglow_toggle(); + case RGB_ON_CMD: + return zmk_rgb_underglow_on(); + case RGB_OFF_CMD: + return zmk_rgb_underglow_off(); case RGB_HUI_CMD: return zmk_rgb_underglow_change_hue(1); case RGB_HUD_CMD: diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index f3bd7a9d..1e07fa28 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -105,14 +105,6 @@ static struct led_rgb hsb_to_rgb(struct led_hsb hsb) { return rgb; } -static void zmk_rgb_underglow_off() { - for (int i = 0; i < STRIP_NUM_PIXELS; i++) { - pixels[i] = (struct led_rgb){r : 0, g : 0, b : 0}; - } - - led_strip_update_rgb(led_strip, pixels, STRIP_NUM_PIXELS); -} - static void zmk_rgb_underglow_effect_solid() { for (int i = 0; i < STRIP_NUM_PIXELS; i++) { int hue = state.hue; @@ -196,10 +188,6 @@ K_WORK_DEFINE(underglow_work, zmk_rgb_underglow_tick); static void zmk_rgb_underglow_tick_handler(struct k_timer *timer) { if (!state.on) { - zmk_rgb_underglow_off(); - - k_timer_stop(timer); - return; } @@ -292,60 +280,83 @@ int zmk_rgb_underglow_save_state() { #endif } -int zmk_rgb_underglow_cycle_effect(int direction) { +int zmk_rgb_underglow_get_state(bool *on_off) { if (!led_strip) return -ENODEV; - if (state.current_effect == 0 && direction < 0) { - state.current_effect = UNDERGLOW_EFFECT_NUMBER - 1; - return 0; - } + *on_off = state.on; + return 0; +} - state.current_effect += direction; +int zmk_rgb_underglow_on() { + if (!led_strip) + return -ENODEV; - if (state.current_effect >= UNDERGLOW_EFFECT_NUMBER) { - state.current_effect = 0; +#if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) + if (ext_power != NULL) { + int rc = ext_power_enable(ext_power); + if (rc != 0) { + LOG_ERR("Unable to enable EXT_POWER: %d", rc); + } } +#endif + state.on = true; state.animation_step = 0; + k_timer_start(&underglow_tick, K_NO_WAIT, K_MSEC(50)); return zmk_rgb_underglow_save_state(); } -int zmk_rgb_underglow_toggle() { +int zmk_rgb_underglow_off() { if (!led_strip) return -ENODEV; - state.on = !state.on; - #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) if (ext_power != NULL) { - int rc; - - if (state.on) { - rc = ext_power_enable(ext_power); - } else { - rc = ext_power_disable(ext_power); - } - + int rc = ext_power_disable(ext_power); if (rc != 0) { - LOG_ERR("Unable to toggle EXT_POWER: %d", rc); + LOG_ERR("Unable to disable EXT_POWER: %d", rc); } } #endif - if (state.on) { - state.animation_step = 0; - k_timer_start(&underglow_tick, K_NO_WAIT, K_MSEC(50)); - } else { - zmk_rgb_underglow_off(); + for (int i = 0; i < STRIP_NUM_PIXELS; i++) { + pixels[i] = (struct led_rgb){r : 0, g : 0, b : 0}; + } + + led_strip_update_rgb(led_strip, pixels, STRIP_NUM_PIXELS); + + k_timer_stop(&underglow_tick); + state.on = false; + + return zmk_rgb_underglow_save_state(); +} + +int zmk_rgb_underglow_cycle_effect(int direction) { + if (!led_strip) + return -ENODEV; - k_timer_stop(&underglow_tick); + if (state.current_effect == 0 && direction < 0) { + state.current_effect = UNDERGLOW_EFFECT_NUMBER - 1; + return 0; } + state.current_effect += direction; + + if (state.current_effect >= UNDERGLOW_EFFECT_NUMBER) { + state.current_effect = 0; + } + + state.animation_step = 0; + return zmk_rgb_underglow_save_state(); } +int zmk_rgb_underglow_toggle() { + return state.on ? zmk_rgb_underglow_off() : zmk_rgb_underglow_on(); +} + int zmk_rgb_underglow_set_hsb(uint16_t hue, uint8_t saturation, uint8_t brightness) { if (hue > 360 || saturation > 100 || brightness > 100) { return -ENOTSUP;