From ea8bf0b936615dd7afe85dd6266a17afbd8921b4 Mon Sep 17 00:00:00 2001 From: Donald Gordon Date: Wed, 28 Sep 2022 21:11:04 +0900 Subject: [PATCH] RGB underglow: dim or disable when battery low Disable underglow when battery below 10%, halve brightness when battery below 20% --- app/src/rgb_underglow.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 65b19d59..b4621e82 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -185,6 +185,7 @@ static void zmk_led_write_pixels() { static struct led_rgb led_buffer[STRIP_NUM_PIXELS]; int bat0 = zmk_battery_state_of_charge(); int blend = 0; + int reset_ext_power = 0; if (state.status_active) { blend = zmk_led_generate_status(); } @@ -194,6 +195,18 @@ static void zmk_led_write_pixels() { led_strip_update_rgb(led_strip, pixels, STRIP_NUM_PIXELS); return; } + // battery below minimum charge + if (bat0 < 10) { + memset(pixels, 0, sizeof(struct led_rgb) * STRIP_NUM_PIXELS); + if (state.on) { + int c_power = ext_power_get(ext_power); + if (c_power && !state.status_active) { + // power is on, RGB underglow is on, but battery is too low + state.on = false; + reset_ext_power = true; + } + } + } if (blend == 0) { for (int i = 0; i < STRIP_NUM_PIXELS; i++) { @@ -216,7 +229,20 @@ static void zmk_led_write_pixels() { } } + // battery below 20%, reduce LED brightness + if (bat0 < 20) { + for (int i = 0; i < STRIP_NUM_PIXELS; i++) { + led_buffer[i].r = led_buffer[i].r >> 1; + led_buffer[i].g = led_buffer[i].g >> 1; + led_buffer[i].b = led_buffer[i].b >> 1; + } + } + led_strip_update_rgb(led_strip, led_buffer, STRIP_NUM_PIXELS); + + if (reset_ext_power) { + zmk_rgb_set_ext_power(); + } } #define UNDERGLOW_INDICATORS DT_PATH(underglow_indicators) @@ -485,6 +511,12 @@ int zmk_rgb_set_ext_power() { c_power = 0; } int desired_state = state.on || state.status_active; + // force power off, when battery low (<10%) + if (state.on && !state.status_active) { + if (zmk_battery_state_of_charge() < 10) { + desired_state = false; + } + } if (desired_state && !c_power) { int rc = ext_power_enable(ext_power); if (rc != 0) {