From b34403f8ad26017a5bf311c1b168d4083282f473 Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Sat, 9 Sep 2017 23:51:59 -0600 Subject: Rewrote gradual_tick(). Is smaller, better, and safer now. Decreased gradual adjustment speed again to make thermal regulation less stair-stepped. --- spaghetti-monster/anduril/anduril.c | 4 +- spaghetti-monster/fsm-ramping.c | 144 +++++++----------------------------- 2 files changed, 30 insertions(+), 118 deletions(-) (limited to 'spaghetti-monster') 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 -- cgit v1.2.3