diff options
author | Nick <nick.win999@gmail.com> | 2020-11-22 20:07:13 -0600 |
---|---|---|
committer | Pete Johanson <peter@peterjohanson.com> | 2020-11-22 21:23:29 -0500 |
commit | a1d3230eef91217953a62d93b6e79dd4ef670168 (patch) | |
tree | eb28de10b3f9512906a404f9bc6c8fcca9bb2a7f /app/src/rgb_underglow.c | |
parent | f5ecf761a36f4bc79a77fdc2217cd45acc1eb5d8 (diff) |
feat(underglow): RGB toggle controls ext_power
fix(ug): Don't return if finding ext power fails
fix(ug): Move ext_power to a static variable
Add #if defs
Diffstat (limited to 'app/src/rgb_underglow.c')
-rw-r--r-- | app/src/rgb_underglow.c | 81 |
1 files changed, 54 insertions, 27 deletions
diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 084482e..3e2c254 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -15,6 +15,7 @@ #include <logging/log.h> #include <drivers/led_strip.h> +#include <drivers/ext_power.h> LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -45,34 +46,14 @@ struct rgb_underglow_state { bool on; }; -struct device *led_strip; +static struct device *led_strip; -struct led_rgb pixels[STRIP_NUM_PIXELS]; +static struct led_rgb pixels[STRIP_NUM_PIXELS]; -struct rgb_underglow_state state; +static struct rgb_underglow_state state; -#if IS_ENABLED(CONFIG_SETTINGS) -static int rgb_settings_set(const char *name, size_t len, settings_read_cb read_cb, void *cb_arg) { - const char *next; - int rc; - - if (settings_name_steq(name, "state", &next) && !next) { - if (len != sizeof(state)) { - return -EINVAL; - } - - rc = read_cb(cb_arg, &state, sizeof(state)); - if (rc >= 0) { - return 0; - } - - return rc; - } - - return -ENOENT; -} - -struct settings_handler rgb_conf = {.name = "rgb/underglow", .h_set = rgb_settings_set}; +#if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) +static struct device *ext_power; #endif static struct led_rgb hsb_to_rgb(struct led_hsb hsb) { @@ -228,6 +209,29 @@ static void zmk_rgb_underglow_tick_handler(struct k_timer *timer) { K_TIMER_DEFINE(underglow_tick, zmk_rgb_underglow_tick_handler, NULL); #if IS_ENABLED(CONFIG_SETTINGS) +static int rgb_settings_set(const char *name, size_t len, settings_read_cb read_cb, void *cb_arg) { + const char *next; + int rc; + + if (settings_name_steq(name, "state", &next) && !next) { + if (len != sizeof(state)) { + return -EINVAL; + } + + rc = read_cb(cb_arg, &state, sizeof(state)); + if (rc >= 0) { + k_timer_start(&underglow_tick, K_NO_WAIT, K_MSEC(50)); + return 0; + } + + return rc; + } + + return -ENOENT; +} + +struct settings_handler rgb_conf = {.name = "rgb/underglow", .h_set = rgb_settings_set}; + static void zmk_rgb_underglow_save_state_work() { settings_save_one("rgb/underglow/state", &state, sizeof(state)); } @@ -244,6 +248,13 @@ static int zmk_rgb_underglow_init(struct device *_arg) { return -EINVAL; } +#if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) + ext_power = device_get_binding("EXT_POWER"); + if (ext_power == NULL) { + LOG_ERR("Unable to retrieve ext_power device: EXT_POWER"); + } +#endif + state = (struct rgb_underglow_state){ hue : CONFIG_ZMK_RGB_UNDERGLOW_HUE_START, saturation : CONFIG_ZMK_RGB_UNDERGLOW_SAT_START, @@ -257,9 +268,9 @@ static int zmk_rgb_underglow_init(struct device *_arg) { #if IS_ENABLED(CONFIG_SETTINGS) settings_register(&rgb_conf); k_delayed_work_init(&underglow_save_work, zmk_rgb_underglow_save_state_work); -#endif - +#else k_timer_start(&underglow_tick, K_NO_WAIT, K_MSEC(50)); +#endif return 0; } @@ -299,6 +310,22 @@ int zmk_rgb_underglow_toggle() { 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); + } + + if (rc != 0) { + LOG_ERR("Unable to toggle EXT_POWER: %d", rc); + } + } +#endif + if (state.on) { state.animation_step = 0; k_timer_start(&underglow_tick, K_NO_WAIT, K_MSEC(50)); |