summaryrefslogtreecommitdiff
path: root/app/src/backlight.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/backlight.c')
-rw-r--r--app/src/backlight.c137
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