aboutsummaryrefslogtreecommitdiff
path: root/spaghetti-monster
diff options
context:
space:
mode:
authorSelene ToyKeeper2017-09-09 23:51:59 -0600
committerSelene ToyKeeper2017-09-09 23:51:59 -0600
commitb34403f8ad26017a5bf311c1b168d4083282f473 (patch)
tree4e70f85e13827ba1ba8a4ede2922205bb86cae43 /spaghetti-monster
parentReworked thermal regulation. (diff)
downloadanduril-b34403f8ad26017a5bf311c1b168d4083282f473.tar.gz
anduril-b34403f8ad26017a5bf311c1b168d4083282f473.tar.bz2
anduril-b34403f8ad26017a5bf311c1b168d4083282f473.zip
Rewrote gradual_tick(). Is smaller, better, and safer now.
Decreased gradual adjustment speed again to make thermal regulation less stair-stepped.
Diffstat (limited to 'spaghetti-monster')
-rw-r--r--spaghetti-monster/anduril/anduril.c4
-rw-r--r--spaghetti-monster/fsm-ramping.c144
2 files changed, 30 insertions, 118 deletions
diff --git a/spaghetti-monster/anduril/anduril.c b/spaghetti-monster/anduril/anduril.c
index cf6f7f0..91a74b2 100644
--- a/spaghetti-monster/anduril/anduril.c
+++ b/spaghetti-monster/anduril/anduril.c
@@ -314,8 +314,8 @@ uint8_t steady_state(EventPtr event, uint16_t arg) {
}
#ifdef USE_SET_LEVEL_GRADUALLY
else if (event == EV_tick) {
- //if (!(arg & 7)) gradual_tick();
- if (!(arg & 3)) gradual_tick();
+ if (!(arg & 7)) gradual_tick();
+ //if (!(arg & 3)) gradual_tick();
//gradual_tick();
return MISCHIEF_MANAGED;
}
diff --git a/spaghetti-monster/fsm-ramping.c b/spaghetti-monster/fsm-ramping.c
index 50b4102..092c242 100644
--- a/spaghetti-monster/fsm-ramping.c
+++ b/spaghetti-monster/fsm-ramping.c
@@ -64,145 +64,57 @@ inline void set_level_gradually(uint8_t lvl) {
gradual_target = lvl;
}
-// FIXME: This sucks
-// FIXME: I think this can behave badly in some circumstances:
-// - large smooth adjustment in progress
-// - from something like (255,10) to (200, 0)
-// - ... and a new target gets set while actual_level is ... not quite right
-// - ... and it then ends up massively overshooting or even turning off
-// (still haven't figured out the exact circumstances to cause it)
-// (at the very least, actual_level can suddenly jump when multiple PWM levels are being adjusted)
-// (so it's bad to rely on actual_level in the middle of a smooth adjustment)
+// call this every frame or every few frames to change brightness very smoothly
void gradual_tick() {
- int8_t changed = 0;
- uint8_t target;
+ // go by only one ramp level at a time instead of directly to the target
uint8_t gt = gradual_target - 1;
- // FIXME: rewrite this completely, probably
- // (perhaps go by only one ramp level at a time instead of directly to the target?)
+ if (gt < actual_level) gt = actual_level - 1;
+ else if (gt > actual_level) gt = actual_level + 1;
+
+ uint8_t target;
+
#if PWM_CHANNELS >= 1
target = pgm_read_byte(pwm1_levels + gt);
- if (PWM1_LVL < target) { PWM1_LVL ++; changed = 1; }
- else if (PWM1_LVL > target) { PWM1_LVL --; changed = -1; }
+ if ((gt < actual_level) // special case for FET-only turbo
+ && (PWM1_LVL == 0) // (bypass adjustment period for first step)
+ && (target == 255)) PWM1_LVL = 255;
+ else if (PWM1_LVL < target) PWM1_LVL ++;
+ else if (PWM1_LVL > target) PWM1_LVL --;
#endif
#if PWM_CHANNELS >= 2
target = pgm_read_byte(pwm2_levels + gt);
- if (PWM2_LVL < target) { PWM2_LVL ++; changed = 1; }
- else if (PWM2_LVL > target) { PWM2_LVL --; changed = -1; }
+ if (PWM2_LVL < target) PWM2_LVL ++;
+ else if (PWM2_LVL > target) PWM2_LVL --;
#endif
#if PWM_CHANNELS >= 3
target = pgm_read_byte(pwm3_levels + gt);
- if (PWM3_LVL < target) { PWM3_LVL ++; changed = 1; }
- else if (PWM3_LVL > target) { PWM3_LVL --; changed = -1; }
+ if (PWM3_LVL < target) PWM3_LVL ++;
+ else if (PWM3_LVL > target) PWM3_LVL --;
#endif
#if PWM_CHANNELS >= 4
target = pgm_read_byte(pwm4_levels + gt);
- if (PWM4_LVL < target) { PWM4_LVL ++; changed = 1; }
- else if (PWM4_LVL > target) { PWM4_LVL --; changed = -1; }
+ if (PWM4_LVL < target) PWM4_LVL ++;
+ else if (PWM4_LVL > target) PWM4_LVL --;
#endif
- // figure out what actual level is
- /*
- if (changed < 0) {
- #if PWM_CHANNELS >= 4
- if (PWM4_LVL < pgm_read_byte(pwm4_levels + actual_level - 1))
- actual_level --;
- else
- #endif
- #if PWM_CHANNELS >= 3
- if (PWM3_LVL < pgm_read_byte(pwm3_levels + actual_level - 1))
- actual_level --;
- else
- #endif
- #if PWM_CHANNELS >= 2
- if (PWM2_LVL < pgm_read_byte(pwm2_levels + actual_level - 1))
- actual_level --;
- else
- #endif
- if (PWM1_LVL < pgm_read_byte(pwm1_levels + actual_level - 1))
- actual_level --;
- }
- else if (changed > 0) {
- #if PWM_CHANNELS >= 4
- if (PWM4_LVL > pgm_read_byte(pwm4_levels + actual_level - 1))
- actual_level ++;
- else
- #endif
- #if PWM_CHANNELS >= 3
- if (PWM3_LVL > pgm_read_byte(pwm3_levels + actual_level - 1))
- actual_level ++;
- else
- #endif
+
+ // did we go far enough to hit the next defined ramp level?
+ // if so, update the main ramp level tracking var
+ if ((PWM1_LVL == pgm_read_byte(pwm1_levels + gt))
#if PWM_CHANNELS >= 2
- if (PWM2_LVL > pgm_read_byte(pwm2_levels + actual_level - 1))
- actual_level ++;
- else
- #endif
- if (PWM1_LVL > pgm_read_byte(pwm1_levels + actual_level - 1))
- actual_level ++;
- }
- else {
- actual_level = gradual_target;
- }
- */
- /*
- if (changed) {
- #if PWM_CHANNELS >= 4
- if (PWM4_LVL != pgm_read_byte(pwm4_levels + actual_level - 1))
- actual_level += changed;
- else
+ && (PWM2_LVL == pgm_read_byte(pwm2_levels + gt))
#endif
#if PWM_CHANNELS >= 3
- if (PWM3_LVL != pgm_read_byte(pwm3_levels + actual_level - 1))
- actual_level += changed;
- else
- #endif
- #if PWM_CHANNELS >= 2
- if (PWM2_LVL != pgm_read_byte(pwm2_levels + actual_level - 1))
- actual_level += changed;
- else
+ && (PWM3_LVL == pgm_read_byte(pwm3_levels + gt))
#endif
- if (PWM1_LVL != pgm_read_byte(pwm1_levels + actual_level - 1))
- actual_level += changed;
- } else {
- actual_level = gradual_target;
- }
- */
- //if (! changed) { actual_level = gradual_target; }
- if (changed) {
#if PWM_CHANNELS >= 4
- if (PWM4_LVL > 0) {
- for (actual_level = 0;
- (actual_level < MAX_LEVEL) &&
- (PWM4_LVL <= pgm_read_byte(pwm4_levels + actual_level - 1));
- actual_level ++) {}
- } else
- #endif
- #if PWM_CHANNELS >= 3
- if (PWM3_LVL > 0) {
- for (actual_level = 0;
- (actual_level < MAX_LEVEL) &&
- (PWM3_LVL <= pgm_read_byte(pwm3_levels + actual_level - 1));
- actual_level ++) {}
- } else
+ && (PWM4_LVL == pgm_read_byte(pwm4_levels + gt))
#endif
- #if PWM_CHANNELS >= 2
- if (PWM2_LVL > 0) {
- for (actual_level = 0;
- (actual_level < MAX_LEVEL) &&
- (PWM2_LVL <= pgm_read_byte(pwm2_levels + actual_level - 1));
- actual_level ++) {}
- } else
- #endif
- for (actual_level = 0;
- (actual_level < MAX_LEVEL) &&
- (PWM1_LVL <= pgm_read_byte(pwm1_levels + actual_level - 1));
- actual_level ++) {}
- } else {
- actual_level = gradual_target;
+ )
+ {
+ actual_level = gt;
}
}
#endif
-// TODO: set_lvl_smooth?
-
#endif // ifdef USE_RAMPING
#endif
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.