diff options
Diffstat (limited to 'app/src/backlight.c')
-rw-r--r-- | app/src/backlight.c | 137 |
1 files changed, 37 insertions, 100 deletions
diff --git a/app/src/backlight.c b/app/src/backlight.c index fc8831c..6ef7f8f 100644 --- a/app/src/backlight.c +++ b/app/src/backlight.c @@ -43,10 +43,11 @@ static struct backlight_state state = {.brightness = CONFIG_ZMK_BACKLIGHT_BRT_ST .on = IS_ENABLED(CONFIG_ZMK_BACKLIGHT_ON_START)}; static int zmk_backlight_update() { - uint8_t brt = state.on ? state.brightness : 0; + uint8_t brt = zmk_backlight_get_brt(); for (int i = 0; i < BACKLIGHT_NUM_LEDS; i++) { int rc = led_set_brightness(backlight_dev, i, brt); if (rc != 0) { + LOG_ERR("Failed to update backlight LED %d: %d", i, rc); return rc; } } @@ -54,34 +55,25 @@ static int zmk_backlight_update() { } #if IS_ENABLED(CONFIG_SETTINGS) -static int backlight_settings_set(const char *name, size_t len, settings_read_cb read_cb, - void *cb_arg) { +static int backlight_settings_load_cb(const char *name, size_t len, settings_read_cb read_cb, + void *cb_arg, void *param) { const char *next; - if (settings_name_steq(name, "state", &next) && !next) { if (len != sizeof(state)) { return -EINVAL; } int rc = read_cb(cb_arg, &state, sizeof(state)); - if (rc < 0) { - return rc; - } - - return zmk_backlight_update(); + return MIN(rc, 0); } - return -ENOENT; } -static struct settings_handler backlight_conf = {.name = "backlight", - .h_set = backlight_settings_set}; - -static void zmk_backlight_save_state_work() { +static void backlight_save_work_handler(struct k_work *work) { settings_save_one("backlight/state", &state, sizeof(state)); } -static struct k_delayed_work backlight_save_work; +static K_DELAYED_WORK_DEFINE(backlight_save_work, backlight_save_work_handler); #endif static int zmk_backlight_init(const struct device *_arg) { @@ -92,22 +84,21 @@ static int zmk_backlight_init(const struct device *_arg) { #if IS_ENABLED(CONFIG_SETTINGS) settings_subsys_init(); - - int err = settings_register(&backlight_conf); - if (err) { - LOG_ERR("Failed to register the backlight settings handler (err %d)", err); - return err; + int rc = settings_load_subtree_direct("backlight", backlight_settings_load_cb, NULL); + if (rc != 0) { + LOG_ERR("Failed to load backlight settings: %d", rc); } - - k_delayed_work_init(&backlight_save_work, zmk_backlight_save_state_work); - - settings_load_subtree("backlight"); #endif return zmk_backlight_update(); } -static int zmk_backlight_save_state() { +static int zmk_backlight_update_and_save() { + int rc = zmk_backlight_update(); + if (rc != 0) { + return rc; + } + #if IS_ENABLED(CONFIG_SETTINGS) k_delayed_work_cancel(&backlight_save_work); return k_delayed_work_submit(&backlight_save_work, K_MSEC(CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE)); @@ -116,111 +107,57 @@ static int zmk_backlight_save_state() { #endif } -bool zmk_backlight_get_on() { return state.on; } - int zmk_backlight_on() { - if (!state.on && state.brightness == 0) { - state.brightness = CONFIG_ZMK_BACKLIGHT_BRT_STEP; - } + state.brightness = MAX(state.brightness, CONFIG_ZMK_BACKLIGHT_BRT_STEP); state.on = true; - - int rc = zmk_backlight_update(); - if (rc != 0) { - return rc; - } - - return zmk_backlight_save_state(); + return zmk_backlight_update_and_save(); } int zmk_backlight_off() { - state.on = false; - - int rc = zmk_backlight_update(); - if (rc != 0) { - return rc; - } - - return zmk_backlight_save_state(); + return zmk_backlight_update_and_save(); } -int zmk_backlight_get_brt() { return state.on ? state.brightness : 0; } - int zmk_backlight_toggle() { return state.on ? zmk_backlight_off() : zmk_backlight_on(); } -int zmk_backlight_set_brt(uint8_t brightness) { - if (brightness > BRT_MAX) { - brightness = BRT_MAX; - } - - state.brightness = brightness; - state.on = (brightness > 0); - - int rc = zmk_backlight_update(); - if (rc != 0) { - return rc; - } - - return zmk_backlight_save_state(); -} - -uint8_t zmk_backlight_calc_brt(int direction) { - uint8_t brightness = state.brightness; - - int b = state.brightness + (direction * CONFIG_ZMK_BACKLIGHT_BRT_STEP); - return CLAMP(b, 0, BRT_MAX); -} - -int zmk_backlight_adjust_brt(int direction) { +bool zmk_backlight_is_on() { return state.on; } - state.brightness = zmk_backlight_calc_brt(direction); +int zmk_backlight_set_brt(uint8_t brightness) { + state.brightness = MIN(brightness, BRT_MAX); state.on = (state.brightness > 0); - - int rc = zmk_backlight_update(); - if (rc != 0) { - return rc; - } - - return zmk_backlight_save_state(); + return zmk_backlight_update_and_save(); } -#if IS_ENABLED(CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE) -static bool auto_off_idle_prev_state = false; -#endif +uint8_t zmk_backlight_get_brt() { return state.on ? state.brightness : 0; } -#if IS_ENABLED(CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB) -static bool auto_off_usb_prev_state = false; -#endif +uint8_t zmk_backlight_calc_brt(int direction) { + int brt = state.brightness + (direction * CONFIG_ZMK_BACKLIGHT_BRT_STEP); + return CLAMP(brt, 0, BRT_MAX); +} #if IS_ENABLED(CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE) || IS_ENABLED(CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB) -static int backlight_auto_state(bool *prev_state, bool *new_state) { - if (state.on == *new_state) { +static int backlight_auto_state(bool *prev_state, bool new_state) { + if (state.on == new_state) { return 0; } - if (*new_state) { - state.on = *prev_state; - *prev_state = false; - return zmk_backlight_on(); - } else { - state.on = false; - *prev_state = true; - return zmk_backlight_off(); - } + state.on = new_state && *prev_state; + *prev_state = !new_state; + return zmk_backlight_update(); } static int backlight_event_listener(const zmk_event_t *eh) { #if IS_ENABLED(CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE) if (as_zmk_activity_state_changed(eh)) { - bool new_state = (zmk_activity_get_state() == ZMK_ACTIVITY_ACTIVE); - return backlight_auto_state(&auto_off_idle_prev_state, &new_state); + static bool prev_state = false; + return backlight_auto_state(&prev_state, zmk_activity_get_state() == ZMK_ACTIVITY_ACTIVE); } #endif #if IS_ENABLED(CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB) if (as_zmk_usb_conn_state_changed(eh)) { - bool new_state = zmk_usb_is_powered(); - return backlight_auto_state(&auto_off_usb_prev_state, &new_state); + static bool prev_state = false; + return backlight_auto_state(&prev_state, zmk_usb_is_powered()); } #endif |