aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSelene ToyKeeper2023-08-25 17:27:43 -0600
committerSelene ToyKeeper2023-08-25 17:27:43 -0600
commit9e5f2dacebf880f61671974ddd8f604cf1782f37 (patch)
tree49e3624babda4a9d646e1dd2026efedab658bab0
parentmade custom 3H handler system work, added circular HSV ramping, (diff)
downloadanduril-9e5f2dacebf880f61671974ddd8f604cf1782f37.tar.gz
anduril-9e5f2dacebf880f61671974ddd8f604cf1782f37.tar.bz2
anduril-9e5f2dacebf880f61671974ddd8f604cf1782f37.zip
started splitting set_level(0) into its own set_level_zero(), and
made USE_AUX_RGB_LEDS_WHILE_ON work more like the old indicator LEDs, where it gets set automatically with set_level() Using set_level_zero() reduces space used by channel modes, and simplifies code for each mode's set_level_*() functions. I measured about 220 bytes less in the emisar-d4k-3ch build this way, while also reducing the chance of bugs.
-rw-r--r--hwdef-emisar-d4k-3ch.c132
-rw-r--r--spaghetti-monster/anduril/anduril.c2
-rw-r--r--spaghetti-monster/anduril/cfg-emisar-d4k-3ch.h2
-rw-r--r--spaghetti-monster/fsm-ramping.c33
-rw-r--r--spaghetti-monster/fsm-ramping.h1
5 files changed, 64 insertions, 106 deletions
diff --git a/hwdef-emisar-d4k-3ch.c b/hwdef-emisar-d4k-3ch.c
index 1955b59..ac9c597 100644
--- a/hwdef-emisar-d4k-3ch.c
+++ b/hwdef-emisar-d4k-3ch.c
@@ -76,20 +76,26 @@ StatePtr channel_3H_modes[NUM_CHANNEL_MODES] = {
NULL, NULL, circular_tint_3h, NULL,
};
+void set_level_zero() {
+ // turn off all LEDs
+ MAIN2_ENABLE_PORT &= ~(1 << MAIN2_ENABLE_PIN);
+ LED3_ENABLE_PORT &= ~(1 << LED3_ENABLE_PIN );
+ LED4_ENABLE_PORT &= ~(1 << LED4_ENABLE_PIN );
+ MAIN2_PWM_LVL = 0;
+ LED3_PWM_LVL = 0;
+ LED4_PWM_LVL = 0;
+ PWM_CNT = 0;
+ PWM_TOP = PWM_TOP_INIT;
+}
+
// LEDs 1+2 are 8-bit
// this 8-bit channel may be LEDs 1+2 or LED 4, depending on wiring
void set_level_main2(uint8_t level) {
LED3_ENABLE_PORT &= ~(1 << LED3_ENABLE_PIN ); // turn off unused LEDs
LED4_ENABLE_PORT &= ~(1 << LED4_ENABLE_PIN ); // turn off unused LEDs
- if (level == 0) {
- MAIN2_PWM_LVL = 0;
- MAIN2_ENABLE_PORT &= ~(1 << MAIN2_ENABLE_PIN); // turn off opamp
- } else {
- level --;
- MAIN2_ENABLE_PORT |= (1 << MAIN2_ENABLE_PIN);
- MAIN2_PWM_LVL = PWM_GET8(pwm1_levels, level);
- }
+ MAIN2_ENABLE_PORT |= (1 << MAIN2_ENABLE_PIN);
+ MAIN2_PWM_LVL = PWM_GET8(pwm1_levels, level);
}
// LED 3 is 16-bit
@@ -97,19 +103,12 @@ void set_level_led3(uint8_t level) {
MAIN2_ENABLE_PORT &= ~(1 << MAIN2_ENABLE_PIN); // turn off unused LEDs
LED4_ENABLE_PORT &= ~(1 << LED4_ENABLE_PIN ); // turn off unused LEDs
- if (level == 0) {
- LED3_PWM_LVL = 0;
- PWM_CNT = 0;
- LED3_ENABLE_PORT &= ~(1 << LED3_ENABLE_PIN ); // turn off opamp
- } else {
- level --;
- LED3_ENABLE_PORT |= (1 << LED3_ENABLE_PIN);
- LED3_PWM_LVL = PWM_GET16(pwm2_levels, level);
- uint16_t top = PWM_GET16(pwm_tops, level);
- while(actual_level && (PWM_CNT > (top - 32))) {}
- PWM_TOP = top;
- if (! actual_level) PWM_CNT = 0;
- }
+ LED3_ENABLE_PORT |= (1 << LED3_ENABLE_PIN);
+ LED3_PWM_LVL = PWM_GET16(pwm2_levels, level);
+ uint16_t top = PWM_GET16(pwm_tops, level);
+ while(actual_level && (PWM_CNT > (top - 32))) {}
+ PWM_TOP = top;
+ if (! actual_level) PWM_CNT = 0;
}
// this 16-bit channel may be LED 4 or LEDs 1+2, depending on wiring
@@ -117,40 +116,20 @@ void set_level_led4(uint8_t level) {
MAIN2_ENABLE_PORT &= ~(1 << MAIN2_ENABLE_PIN); // turn off unused LEDs
LED3_ENABLE_PORT &= ~(1 << LED3_ENABLE_PIN ); // turn off unused LEDs
- if (level == 0) {
- LED4_PWM_LVL = 0;
- PWM_CNT = 0; // reset phase
- LED4_ENABLE_PORT &= ~(1 << LED4_ENABLE_PIN ); // turn off opamp
- } else {
- level --; // PWM array index = level - 1
- // gotta turn on the opamp before light can come out
- LED4_ENABLE_PORT |= (1 << LED4_ENABLE_PIN);
- LED4_PWM_LVL = PWM_GET16(pwm2_levels, level);
- // pulse frequency modulation, a.k.a. dynamic PWM
- uint16_t top = PWM_GET16(pwm_tops, level);
- // wait to sync the counter and avoid flashes
- while(actual_level && (PWM_CNT > (top - 32))) {}
- PWM_TOP = top;
- // force reset phase when turning on from zero
- // (because otherwise the initial response is inconsistent)
- if (! actual_level) PWM_CNT = 0;
- }
+ // gotta turn on the opamp before light can come out
+ LED4_ENABLE_PORT |= (1 << LED4_ENABLE_PIN);
+ LED4_PWM_LVL = PWM_GET16(pwm2_levels, level);
+ // pulse frequency modulation, a.k.a. dynamic PWM
+ uint16_t top = PWM_GET16(pwm_tops, level);
+ // wait to sync the counter and avoid flashes
+ while(actual_level && (PWM_CNT > (top - 32))) {}
+ PWM_TOP = top;
+ // force reset phase when turning on from zero
+ // (because otherwise the initial response is inconsistent)
+ if (! actual_level) PWM_CNT = 0;
}
void set_level_all(uint8_t level) {
- if (level == 0) {
- MAIN2_PWM_LVL = 0;
- LED3_PWM_LVL = 0;
- LED4_PWM_LVL = 0;
- PWM_CNT = 0;
- MAIN2_ENABLE_PORT &= ~(1 << MAIN2_ENABLE_PIN); // turn off opamp
- LED3_ENABLE_PORT &= ~(1 << LED3_ENABLE_PIN ); // turn off opamp
- LED4_ENABLE_PORT &= ~(1 << LED4_ENABLE_PIN ); // turn off opamp
- return;
- }
-
- level --;
-
MAIN2_ENABLE_PORT |= (1 << MAIN2_ENABLE_PIN);
LED3_ENABLE_PORT |= (1 << LED3_ENABLE_PIN );
LED4_ENABLE_PORT |= (1 << LED4_ENABLE_PIN );
@@ -170,17 +149,6 @@ void set_level_all(uint8_t level) {
void set_level_led34a_blend(uint8_t level) {
MAIN2_ENABLE_PORT &= ~(1 << MAIN2_ENABLE_PIN); // turn off unused LEDs
- if (level == 0) {
- LED3_PWM_LVL = 0;
- LED4_PWM_LVL = 0;
- PWM_CNT = 0; // reset phase
- LED3_ENABLE_PORT &= ~(1 << LED3_ENABLE_PIN ); // turn off opamp
- LED4_ENABLE_PORT &= ~(1 << LED4_ENABLE_PIN ); // turn off opamp
- return;
- }
-
- level --; // PWM array index = level - 1
-
PWM_DATATYPE warm_PWM, cool_PWM;
PWM_DATATYPE brightness = PWM_GET16(pwm2_levels, level);
PWM_DATATYPE top = PWM_GET16(pwm_tops, level);
@@ -201,17 +169,6 @@ void set_level_led34a_blend(uint8_t level) {
void set_level_led34b_blend(uint8_t level) {
LED4_ENABLE_PORT &= ~(1 << LED4_ENABLE_PIN ); // turn off unused LEDs
- if (level == 0) {
- MAIN2_PWM_LVL = 0;
- LED3_PWM_LVL = 0;
- PWM_CNT = 0; // reset phase
- MAIN2_ENABLE_PORT &= ~(1 << MAIN2_ENABLE_PIN); // turn off opamp
- LED3_ENABLE_PORT &= ~(1 << LED3_ENABLE_PIN ); // turn off opamp
- return;
- }
-
- level --;
-
const uint16_t top = 2047;
uint16_t warm_PWM, cool_PWM; // 11 bits, 8 bits
uint8_t blend = cfg.channel_mode_args[channel_mode];
@@ -236,20 +193,6 @@ void set_level_led34b_blend(uint8_t level) {
}
void set_level_hsv(uint8_t level) {
- // TODO: implement a custom 3H handler which wraps around 0 to 255
- if (level == 0) {
- MAIN2_PWM_LVL = 0;
- LED3_PWM_LVL = 0;
- LED4_PWM_LVL = 0;
- PWM_CNT = 0;
- MAIN2_ENABLE_PORT &= ~(1 << MAIN2_ENABLE_PIN); // turn off opamp
- LED3_ENABLE_PORT &= ~(1 << LED3_ENABLE_PIN ); // turn off opamp
- LED4_ENABLE_PORT &= ~(1 << LED4_ENABLE_PIN ); // turn off opamp
- return;
- }
-
- level --;
-
RGB_t color;
uint8_t h = cfg.channel_mode_args[channel_mode];
uint8_t s = 255; // TODO: drop saturation at brightest levels
@@ -304,19 +247,6 @@ void calc_auto_3ch_blend(
// 3-channel "auto tint" channel mode
void set_level_auto3(uint8_t level) {
- if (level == 0) {
- MAIN2_PWM_LVL = 0;
- LED3_PWM_LVL = 0;
- LED4_PWM_LVL = 0;
- PWM_CNT = 0;
- MAIN2_ENABLE_PORT &= ~(1 << MAIN2_ENABLE_PIN); // turn off opamp
- LED3_ENABLE_PORT &= ~(1 << LED3_ENABLE_PIN ); // turn off opamp
- LED4_ENABLE_PORT &= ~(1 << LED4_ENABLE_PIN ); // turn off opamp
- return;
- }
-
- level --;
-
uint16_t a, b;
uint8_t c;
calc_auto_3ch_blend(&a, &b, &c, level);
diff --git a/spaghetti-monster/anduril/anduril.c b/spaghetti-monster/anduril/anduril.c
index ab43df6..6399ef6 100644
--- a/spaghetti-monster/anduril/anduril.c
+++ b/spaghetti-monster/anduril/anduril.c
@@ -267,7 +267,7 @@ void loop() {
#ifdef USE_AUX_RGB_LEDS_WHILE_ON
// display battery charge on RGB button during use
- if (! setting_rgb_mode_now)
+ if (state == steady_state)
rgb_led_voltage_readout(actual_level > USE_AUX_RGB_LEDS_WHILE_ON);
#endif
diff --git a/spaghetti-monster/anduril/cfg-emisar-d4k-3ch.h b/spaghetti-monster/anduril/cfg-emisar-d4k-3ch.h
index 46d5796..c015295 100644
--- a/spaghetti-monster/anduril/cfg-emisar-d4k-3ch.h
+++ b/spaghetti-monster/anduril/cfg-emisar-d4k-3ch.h
@@ -13,7 +13,7 @@
// turn on the aux LEDs while main LEDs are on
// (in case there's a RGB button)
-#define USE_AUX_RGB_LEDS_WHILE_ON 20
+#define USE_AUX_RGB_LEDS_WHILE_ON 25
#define USE_INDICATOR_LED_WHILE_RAMPING
// channel modes...
diff --git a/spaghetti-monster/fsm-ramping.c b/spaghetti-monster/fsm-ramping.c
index a970f0e..89f540b 100644
--- a/spaghetti-monster/fsm-ramping.c
+++ b/spaghetti-monster/fsm-ramping.c
@@ -36,6 +36,25 @@ inline void set_level_aux_leds(uint8_t level) {
}
#endif // ifdef HAS_AUX_LEDS
+#ifdef USE_AUX_RGB_LEDS_WHILE_ON
+// TODO: maybe move this stuff into FSM
+#include "anduril/aux-leds.h" // for rgb_led_voltage_readout()
+inline void set_level_aux_rgb_leds(uint8_t level) {
+ if (! go_to_standby) {
+ if (level > 0) {
+ rgb_led_voltage_readout(level > USE_AUX_RGB_LEDS_WHILE_ON);
+ } else {
+ rgb_led_set(0);
+ }
+ // some drivers can be wired with RGB or single color to button
+ // ... so support both even though only one is connected
+ #ifdef USE_BUTTON_LED
+ button_led_set((level > 0) + (level > DEFAULT_LEVEL));
+ #endif
+ }
+}
+#endif // ifdef USE_AUX_RGB_LEDS_WHILE_ON
+
void set_level(uint8_t level) {
#ifdef USE_JUMP_START
@@ -58,9 +77,17 @@ void set_level(uint8_t level) {
set_level_aux_leds(level);
#endif
- // call the relevant hardware-specific set_level_*()
- SetLevelFuncPtr set_level_func = channels[channel_mode].set_level;
- set_level_func(level);
+ #ifdef USE_AUX_RGB_LEDS_WHILE_ON
+ set_level_aux_rgb_leds(level);
+ #endif
+
+ if (0 == level) {
+ set_level_zero();
+ } else {
+ // call the relevant hardware-specific set_level_*()
+ SetLevelFuncPtr set_level_func = channels[channel_mode].set_level;
+ set_level_func(level - 1);
+ }
if (actual_level != level) prev_level = actual_level;
actual_level = level;
diff --git a/spaghetti-monster/fsm-ramping.h b/spaghetti-monster/fsm-ramping.h
index cae9a4d..bfcc5fb 100644
--- a/spaghetti-monster/fsm-ramping.h
+++ b/spaghetti-monster/fsm-ramping.h
@@ -13,6 +13,7 @@ uint8_t prev_level = 0;
void set_level(uint8_t level);
//void set_level_smooth(uint8_t level);
+void set_level_zero(); // implement this in a hwdef
#ifdef USE_SET_LEVEL_GRADUALLY
// adjust brightness very smoothly
If you find this content useful please consider a small donation via bitcoin: bitcoin:1mxKyQsHHugqRxPKgwaA7wUwJEGCNthn2?amount=0.001&message=Donation Scraping git contents via cgit is very resource intensive. The continued hosting of these git repositories is entirely financed by your bitcoin contributions. For donations of a least 1 mBTC you include your IP address in the message of your bitcoin donation. This will remove this message in the future for requests from your IP, which will significantly reduce token usage. In any case, any contributions to bitcoin address 1mxKyQsHHugqRxPKgwaA7wUwJEGCNthn2 are very welcome. Thanks in advance for you contribution to a self-sustaining ecosystem.