From d7c7ff8e921456b1f1a27ad16f6d3466157c91c4 Mon Sep 17 00:00:00 2001 From: SiteRelEnby Date: Mon, 6 Nov 2023 14:50:06 -0600 Subject: Add a feature to make RGB voltage configurable Adds two entries to the battery voltage settings menu, the first isathreshold for switching aux to high, and the second sets a minimum level for it to be displayed, also effectively allowing the feature to be entirely disabled if not wanted. --- ui/anduril/anduril.c | 10 +++++++--- ui/anduril/battcheck-mode.c | 20 +++++++++++--------- ui/anduril/battcheck-mode.h | 15 +++++++++++++++ ui/anduril/load-save-config-fsm.h | 4 ++++ ui/anduril/load-save-config.h | 15 +++++++++++++++ 5 files changed, 52 insertions(+), 12 deletions(-) (limited to 'ui') diff --git a/ui/anduril/anduril.c b/ui/anduril/anduril.c index 4378816..fdc9527 100644 --- a/ui/anduril/anduril.c +++ b/ui/anduril/anduril.c @@ -278,9 +278,13 @@ void loop() { StatePtr state = current_state; #ifdef USE_AUX_RGB_LEDS_WHILE_ON - // display battery charge on RGB button during use - if (state == steady_state) - rgb_led_voltage_readout(actual_level > USE_AUX_RGB_LEDS_WHILE_ON); + // display battery charge on RGB button during use + #ifdef USE_CONFIGURABLE_RGB_VOLTAGE_LEVELS + if ((state == steady_state) && (actual_level > cfg.use_aux_rgb_leds_while_on_min_level)) // only show voltage if we are above the configured minimum ramp level + #else + if (state == steady_state) + #endif + rgb_led_voltage_readout(actual_level > USE_AUX_RGB_LEDS_WHILE_ON); #endif if (0) {} // placeholder diff --git a/ui/anduril/battcheck-mode.c b/ui/anduril/battcheck-mode.c index c7c80dd..997c2b0 100644 --- a/ui/anduril/battcheck-mode.c +++ b/ui/anduril/battcheck-mode.c @@ -61,21 +61,23 @@ uint8_t battcheck_state(Event event, uint16_t arg) { // ... // 13 = add 0.30V void voltage_config_save(uint8_t step, uint8_t value) { + #if defined(USE_AUX_RGB_LEDS_WHILE_ON) && defined(USE_CONFIGURABLE_RGB_VOLTAGE_LEVELS) + if (use_aux_rgb_leds_while_on_config_step == step) cfg.use_aux_rgb_leds_while_on = value; + else if (use_aux_rgb_leds_while_on_min_level_step == step) cfg.use_aux_rgb_leds_while_on_min_level = value; + else + #endif #ifdef USE_POST_OFF_VOLTAGE - if (2 == step) cfg.post_off_voltage = value; - else + if (post_off_voltage_config_step == step) cfg.post_off_voltage = value; + else + #endif + #ifdef USE_VOLTAGE_CORRECTION + if (value) cfg.voltage_correction = value; #endif - if (value) cfg.voltage_correction = value; } uint8_t voltage_config_state(Event event, uint16_t arg) { - #ifdef USE_POST_OFF_VOLTAGE - #define VOLTAGE_CONFIG_STEPS 2 - #else - #define VOLTAGE_CONFIG_STEPS 1 - #endif return config_state_base(event, arg, - VOLTAGE_CONFIG_STEPS, + (voltage_config_num_steps - 1), voltage_config_save); } #endif // #ifdef USE_VOLTAGE_CORRECTION diff --git a/ui/anduril/battcheck-mode.h b/ui/anduril/battcheck-mode.h index b505b68..4acdb74 100644 --- a/ui/anduril/battcheck-mode.h +++ b/ui/anduril/battcheck-mode.h @@ -10,3 +10,18 @@ void voltage_config_save(uint8_t step, uint8_t value); uint8_t voltage_config_state(Event event, uint16_t arg); #endif +typedef enum { + voltage_cfg_zero = 0, + #ifdef USE_VOLTAGE_CORRECTION + voltage_correction_config_step, + #endif + #ifdef USE_POST_OFF_VOLTAGE + post_off_voltage_config_step, + #endif + #if defined(USE_AUX_RGB_LEDS_WHILE_ON) && defined(USE_CONFIGURABLE_RGB_VOLTAGE_LEVELS) + use_aux_rgb_leds_while_on_config_step, + use_aux_rgb_leds_while_on_min_level_step, + #endif + voltage_config_num_steps +} voltage_config_steps_e; + diff --git a/ui/anduril/load-save-config-fsm.h b/ui/anduril/load-save-config-fsm.h index d189d3a..61947ce 100644 --- a/ui/anduril/load-save-config-fsm.h +++ b/ui/anduril/load-save-config-fsm.h @@ -97,6 +97,10 @@ typedef struct Config { uint8_t therm_ceil; int8_t therm_cal_offset; #endif + #if defined(USE_AUX_RGB_LEDS_WHILE_ON) && defined(USE_CONFIGURABLE_RGB_VOLTAGE_LEVELS) + uint8_t use_aux_rgb_leds_while_on; + uint8_t use_aux_rgb_leds_while_on_min_level; + #endif ///// aux LEDs #ifdef USE_INDICATOR_LED diff --git a/ui/anduril/load-save-config.h b/ui/anduril/load-save-config.h index 3ad477c..6a52171 100644 --- a/ui/anduril/load-save-config.h +++ b/ui/anduril/load-save-config.h @@ -169,5 +169,20 @@ Config cfg = { .jump_start_level = DEFAULT_JUMP_START_LEVEL, #endif + #if defined(USE_AUX_RGB_LEDS_WHILE_ON) && defined(USE_CONFIGURABLE_RGB_VOLTAGE_LEVELS) + // config for RGB voltage. We need to check these here rather than setting defaults in `config-default.h` as we only know *after* defaults are loaded if `USE_AUX_RGB_LEDS_WHILE_ON` is set or unset (in `CFG_H`). + #if (USE_AUX_RGB_LEDS_WHILE_ON + 0) // if USE_AUX_RGB_LEDS_WHILE_ON is an int, passes. If blank (undefined or defined with no value), evaluates to `(+0)` which evaluates to false. + .use_aux_rgb_leds_while_on = USE_AUX_RGB_LEDS_WHILE_ON, + #else + #warning "USE_AUX_RGB_LEDS_WHILE_ON defined but has no value. Setting minimum threshold to default of 25" + .use_aux_rgb_leds_while_on = 25, + #endif + #ifdef USE_AUX_RGB_LEDS_WHILE_ON_INITIAL_MINIMUM_LEVEL + .use_aux_rgb_leds_while_on_min_level = USE_AUX_RGB_LEDS_WHILE_ON_INITIAL_MINIMUM_LEVEL, + #else + .use_aux_rgb_leds_while_on_min_level = 15, // default + #endif + #endif + }; -- cgit v1.2.3 From 2b19de99a2c4acd8041a50593ff3a7586fe06a27 Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Fri, 4 Jul 2025 04:57:34 -0600 Subject: made new settings apply to all button LEDs on lights bigger than 8K ROM This replaces "USE_CONFIGURABLE_RGB_VOLTAGE_LEVELS" with "USE_AUX_THRESHOLD_CONFIG", which controls the brightness of button LEDs while the main LEDs are on, and during post-off voltage display. Same basic concept, but works on single-color LEDs too, and lets the user finally configure POVD thresholds. The code for this is a bit messy, but the aux LED code as a whole is pretty messy since it wasn't designed for the things it does now. The entire thing needs a refactor or rewrite someday. But not today. For now, this is just enough to make the pull request cover more use cases before merging into trunk. I've tested it on a variety of lights, but am not yet entirely comfortable with it. However, it worked on at least these: - 1-color button LED, no RGB - front RGB, 1-color button LED - front RGB, hardwired also to RGB button - RGB button, no other aux These may need extra changes, and may have extra config options which do nothing... - front RGB, no button LED - 1-color front aux, no button LED - no aux at all - attiny85 lights (some could theoretically support the new options, but none even try) --- ui/anduril/anduril.c | 16 ++++++++++------ ui/anduril/aux-leds.c | 13 ++++++++++++- ui/anduril/battcheck-mode.c | 40 +++++++++++++++++++++++++-------------- ui/anduril/battcheck-mode.h | 12 ++++++------ ui/anduril/config-default.h | 8 ++++++++ ui/anduril/load-save-config-fsm.h | 6 +++--- ui/anduril/load-save-config.h | 28 ++++++++++++++++++--------- 7 files changed, 84 insertions(+), 39 deletions(-) (limited to 'ui') diff --git a/ui/anduril/anduril.c b/ui/anduril/anduril.c index 5972eb2..a17ecf2 100644 --- a/ui/anduril/anduril.c +++ b/ui/anduril/anduril.c @@ -287,12 +287,16 @@ void loop() { #ifdef USE_AUX_RGB_LEDS_WHILE_ON // display battery charge on RGB button during use - #ifdef USE_CONFIGURABLE_RGB_VOLTAGE_LEVELS - if ((state == steady_state) && (actual_level > cfg.use_aux_rgb_leds_while_on_min_level)) // only show voltage if we are above the configured minimum ramp level - #else - if (state == steady_state) - #endif - rgb_led_voltage_readout(actual_level > USE_AUX_RGB_LEDS_WHILE_ON); + if (state == steady_state) { + #ifdef USE_AUX_THRESHOLD_CONFIG + // only show voltage if feature is enabled and + // we are above the configured minimum ramp level + if (actual_level > cfg.button_led_low_ramp_level) + rgb_led_voltage_readout(actual_level > cfg.button_led_high_ramp_level); + #else + rgb_led_voltage_readout(actual_level > USE_AUX_RGB_LEDS_WHILE_ON); + #endif + } #endif if (0) {} // placeholder diff --git a/ui/anduril/aux-leds.c b/ui/anduril/aux-leds.c index 7356666..50ce5c5 100644 --- a/ui/anduril/aux-leds.c +++ b/ui/anduril/aux-leds.c @@ -125,7 +125,18 @@ void rgb_led_update(uint8_t mode, uint16_t arg) { && (ticks_since_on > 0) // don't blink red on 1st frame ) { // use high mode if regular aux level is high or prev level was high - pattern = 1 + ((2 == pattern) | (prev_level >= POST_OFF_VOLTAGE_BRIGHTNESS)); + #ifdef USE_AUX_THRESHOLD_CONFIG + // always high if configured for high aux + // otherwise 0/1/2 depending on recent main LED brightness + // (using >= makes it off by 1, but allows POVD at boot time) + if (pattern != 2) + pattern = (prev_level >= cfg.button_led_low_ramp_level) + << (prev_level > cfg.button_led_high_ramp_level); + #else + pattern = 1 + + ((2 == pattern) + | (prev_level >= POST_OFF_VOLTAGE_BRIGHTNESS)); + #endif // voltage mode color = RGB_LED_NUM_COLORS - 1; } diff --git a/ui/anduril/battcheck-mode.c b/ui/anduril/battcheck-mode.c index 997c2b0..460c58a 100644 --- a/ui/anduril/battcheck-mode.c +++ b/ui/anduril/battcheck-mode.c @@ -51,7 +51,7 @@ uint8_t battcheck_state(Event event, uint16_t arg) { return EVENT_NOT_HANDLED; } -#ifdef USE_VOLTAGE_CORRECTION +#if defined(USE_VOLTAGE_CORRECTION) || defined(USE_POST_OFF_VOLTAGE) || defined(USE_AUX_THRESHOLD_CONFIG) // the user can adjust the battery measurements... on a scale of 1 to 13 // 1 = subtract 0.30V // 2 = subtract 0.25V @@ -61,23 +61,35 @@ uint8_t battcheck_state(Event event, uint16_t arg) { // ... // 13 = add 0.30V void voltage_config_save(uint8_t step, uint8_t value) { - #if defined(USE_AUX_RGB_LEDS_WHILE_ON) && defined(USE_CONFIGURABLE_RGB_VOLTAGE_LEVELS) - if (use_aux_rgb_leds_while_on_config_step == step) cfg.use_aux_rgb_leds_while_on = value; - else if (use_aux_rgb_leds_while_on_min_level_step == step) cfg.use_aux_rgb_leds_while_on_min_level = value; - else - #endif - #ifdef USE_POST_OFF_VOLTAGE - if (post_off_voltage_config_step == step) cfg.post_off_voltage = value; - else - #endif - #ifdef USE_VOLTAGE_CORRECTION - if (value) cfg.voltage_correction = value; - #endif + switch (step) { + #if defined(USE_AUX_THRESHOLD_CONFIG) + case button_led_low_ramp_level_step: + // 0 clicks = 255 = never turn on + cfg.button_led_low_ramp_level = value - 1; + break; + case button_led_high_ramp_level_step: + // 0 clicks = 255 = never turn on + cfg.button_led_high_ramp_level = value - 1; + break; + #endif + + #ifdef USE_POST_OFF_VOLTAGE + case post_off_voltage_config_step: + cfg.post_off_voltage = value; + break; + #endif + + #ifdef USE_VOLTAGE_CORRECTION + default: + if (value) cfg.voltage_correction = value; + break; + #endif + } } uint8_t voltage_config_state(Event event, uint16_t arg) { return config_state_base(event, arg, - (voltage_config_num_steps - 1), + voltage_config_num_steps - 1, voltage_config_save); } #endif // #ifdef USE_VOLTAGE_CORRECTION diff --git a/ui/anduril/battcheck-mode.h b/ui/anduril/battcheck-mode.h index 4acdb74..2ff7c81 100644 --- a/ui/anduril/battcheck-mode.h +++ b/ui/anduril/battcheck-mode.h @@ -5,7 +5,7 @@ uint8_t battcheck_state(Event event, uint16_t arg); -#ifdef USE_VOLTAGE_CORRECTION +#if defined(USE_VOLTAGE_CORRECTION) || defined(USE_POST_OFF_VOLTAGE) || defined(USE_AUX_THRESHOLD_CONFIG) void voltage_config_save(uint8_t step, uint8_t value); uint8_t voltage_config_state(Event event, uint16_t arg); #endif @@ -13,14 +13,14 @@ uint8_t voltage_config_state(Event event, uint16_t arg); typedef enum { voltage_cfg_zero = 0, #ifdef USE_VOLTAGE_CORRECTION - voltage_correction_config_step, + voltage_correction_config_step, #endif #ifdef USE_POST_OFF_VOLTAGE - post_off_voltage_config_step, + post_off_voltage_config_step, #endif - #if defined(USE_AUX_RGB_LEDS_WHILE_ON) && defined(USE_CONFIGURABLE_RGB_VOLTAGE_LEVELS) - use_aux_rgb_leds_while_on_config_step, - use_aux_rgb_leds_while_on_min_level_step, + #if defined(USE_AUX_THRESHOLD_CONFIG) + button_led_low_ramp_level_step, + button_led_high_ramp_level_step, #endif voltage_config_num_steps } voltage_config_steps_e; diff --git a/ui/anduril/config-default.h b/ui/anduril/config-default.h index 1b34e8c..51249f6 100644 --- a/ui/anduril/config-default.h +++ b/ui/anduril/config-default.h @@ -199,6 +199,14 @@ #define USE_LOWPASS_WHILE_ASLEEP #endif +// if the light has aux LEDs and enough ROM, let the user choose whether +// the aux LEDs should be on while the main LEDs are on +#if (ROM_SIZE > 10000) +// can be enabled even if no aux LEDs exist, +// will simply do nothing in that case +#define USE_AUX_THRESHOLD_CONFIG +#endif + // if there's tint ramping, allow user to set it smooth or stepped #define USE_STEPPED_TINT_RAMPING #define DEFAULT_TINT_RAMP_STYLE 0 // smooth diff --git a/ui/anduril/load-save-config-fsm.h b/ui/anduril/load-save-config-fsm.h index 61947ce..a69d1b1 100644 --- a/ui/anduril/load-save-config-fsm.h +++ b/ui/anduril/load-save-config-fsm.h @@ -97,9 +97,9 @@ typedef struct Config { uint8_t therm_ceil; int8_t therm_cal_offset; #endif - #if defined(USE_AUX_RGB_LEDS_WHILE_ON) && defined(USE_CONFIGURABLE_RGB_VOLTAGE_LEVELS) - uint8_t use_aux_rgb_leds_while_on; - uint8_t use_aux_rgb_leds_while_on_min_level; + #ifdef USE_AUX_THRESHOLD_CONFIG + uint8_t button_led_low_ramp_level; + uint8_t button_led_high_ramp_level; #endif ///// aux LEDs diff --git a/ui/anduril/load-save-config.h b/ui/anduril/load-save-config.h index 6a52171..f5afb29 100644 --- a/ui/anduril/load-save-config.h +++ b/ui/anduril/load-save-config.h @@ -169,18 +169,28 @@ Config cfg = { .jump_start_level = DEFAULT_JUMP_START_LEVEL, #endif - #if defined(USE_AUX_RGB_LEDS_WHILE_ON) && defined(USE_CONFIGURABLE_RGB_VOLTAGE_LEVELS) - // config for RGB voltage. We need to check these here rather than setting defaults in `config-default.h` as we only know *after* defaults are loaded if `USE_AUX_RGB_LEDS_WHILE_ON` is set or unset (in `CFG_H`). - #if (USE_AUX_RGB_LEDS_WHILE_ON + 0) // if USE_AUX_RGB_LEDS_WHILE_ON is an int, passes. If blank (undefined or defined with no value), evaluates to `(+0)` which evaluates to false. - .use_aux_rgb_leds_while_on = USE_AUX_RGB_LEDS_WHILE_ON, + #if defined(USE_AUX_THRESHOLD_CONFIG) + // config for RGB voltage. We need to check these here rather than + // setting defaults in `config-default.h` as we only know *after* + // defaults are loaded if `USE_AUX_RGB_LEDS_WHILE_ON` is set or unset + // (in `CFG_H`). + #ifdef USE_AUX_LEDS_WHILE_ON_INITIAL_MINIMUM_LEVEL + .button_led_low_ramp_level = USE_AUX_LEDS_WHILE_ON_INITIAL_MINIMUM_LEVEL, #else - #warning "USE_AUX_RGB_LEDS_WHILE_ON defined but has no value. Setting minimum threshold to default of 25" - .use_aux_rgb_leds_while_on = 25, + .button_led_low_ramp_level = 0, // default #endif - #ifdef USE_AUX_RGB_LEDS_WHILE_ON_INITIAL_MINIMUM_LEVEL - .use_aux_rgb_leds_while_on_min_level = USE_AUX_RGB_LEDS_WHILE_ON_INITIAL_MINIMUM_LEVEL, + #if (USE_AUX_RGB_LEDS_WHILE_ON + 0) + // if USE_AUX_RGB_LEDS_WHILE_ON is an int, passes. If blank (undefined + // or defined with no value), evaluates to `(+0)` which evaluates to + // false. + .button_led_high_ramp_level = USE_AUX_RGB_LEDS_WHILE_ON, #else - .use_aux_rgb_leds_while_on_min_level = 15, // default + #ifdef USE_AUX_RGB_LEDS + //#warning "USE_AUX_RGB_LEDS_WHILE_ON defined but has no value. Setting to default value." + .button_led_high_ramp_level = 25 - 1, // default + #else + .button_led_high_ramp_level = DEFAULT_LEVEL - 1, // default + #endif #endif #endif -- cgit v1.2.3