From 12b1218a3e80e864cc35d6720c45aedfe4793c04 Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Wed, 27 Jun 2018 02:34:25 -0600 Subject: Made high levels regulate down even faster. Added missing save_config() at the end of, um, config modes. Fixed ramp table indentation. --- spaghetti-monster/anduril/anduril.c | 11 ++++++----- spaghetti-monster/fsm-ramping.h | 16 ++++++++-------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/spaghetti-monster/anduril/anduril.c b/spaghetti-monster/anduril/anduril.c index a29adae..2b958cc 100644 --- a/spaghetti-monster/anduril/anduril.c +++ b/spaghetti-monster/anduril/anduril.c @@ -587,7 +587,9 @@ uint8_t steady_state(EventPtr event, uint16_t arg) { #endif #ifdef USE_SET_LEVEL_GRADUALLY // make thermal adjustment speed scale with magnitude - if (arg & 1) return MISCHIEF_MANAGED; // adjust slower + if ((arg & 1) && (actual_level < THERM_DOUBLE_SPEED_LEVEL)) { + return MISCHIEF_MANAGED; // adjust slower when not a high mode + } // [int(62*4 / (x**0.8)) for x in (1,2,4,8,16,32,64,128)] //uint8_t intervals[] = {248, 142, 81, 46, 26, 15, 8, 5}; // [int(62*4 / (x**0.9)) for x in (1,2,4,8,16,32,64,128)] @@ -600,12 +602,10 @@ uint8_t steady_state(EventPtr event, uint16_t arg) { if (target_level > actual_level) diff = target_level - actual_level; else { diff = actual_level - target_level; - // if we're on a really high mode, drop faster - if (actual_level >= THERM_DOUBLE_SPEED_LEVEL) { - diff <<= 1; - } } uint8_t magnitude = 0; + // if we're on a really high mode, drop faster + if (actual_level >= THERM_DOUBLE_SPEED_LEVEL) { magnitude ++; } while (diff) { magnitude ++; diff >>= 1; @@ -1253,6 +1253,7 @@ uint8_t config_state_base(EventPtr event, uint16_t arg, else { // TODO: blink out some sort of success pattern savefunc(); + save_config(); //set_state(retstate, retval); pop_state(); } diff --git a/spaghetti-monster/fsm-ramping.h b/spaghetti-monster/fsm-ramping.h index b942ec0..14c8dae 100644 --- a/spaghetti-monster/fsm-ramping.h +++ b/spaghetti-monster/fsm-ramping.h @@ -72,14 +72,14 @@ PROGMEM const uint8_t pwm4_levels[] = { PWM4_LEVELS }; PROGMEM const uint8_t pwm2_levels[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,5,7,10,13,16,19,23,26,30,34,38,42,47,51,56,61,66,72,77,83,89,95,101,108,115,122,129,136,144,152,160,168,177,186,195,204,214,224,234,244,255 }; #define MAX_1x7135 33 #elif RAMP_LENGTH == 150 - // ../../bin/level_calc.py 1 65 7135 1 0.8 150 - // ... mixed with this: - // ../../bin/level_calc.py 2 150 7135 4 0.33 150 FET 1 10 1500 - PROGMEM const uint8_t pwm1_levels[] = { 1,1,2,2,3,3,4,4,5,6,7,8,9,10,12,13,14,15,17,19,20,22,24,26,29,31,34,36,39,42,45,48,51,55,59,62,66,70,75,79,84,89,93,99,104,110,115,121,127,134,140,147,154,161,168,176,184,192,200,209,217,226,236,245,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0 }; - PROGMEM const uint8_t pwm2_levels[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,4,5,7,8,9,11,12,14,15,17,19,20,22,24,25,27,29,31,33,35,37,39,41,43,45,48,50,52,55,57,59,62,64,67,70,72,75,78,81,84,87,90,93,96,99,102,105,109,112,115,119,122,126,129,133,137,141,144,148,152,156,160,165,169,173,177,182,186,191,195,200,205,209,214,219,224,229,234,239,244,250,255 }; - #define MAX_1x7135 65 - #define HALFSPEED_LEVEL 14 - #define QUARTERSPEED_LEVEL 5 + // ../../bin/level_calc.py 1 65 7135 1 0.8 150 + // ... mixed with this: + // ../../bin/level_calc.py 2 150 7135 4 0.33 150 FET 1 10 1500 + PROGMEM const uint8_t pwm1_levels[] = { 1,1,2,2,3,3,4,4,5,6,7,8,9,10,12,13,14,15,17,19,20,22,24,26,29,31,34,36,39,42,45,48,51,55,59,62,66,70,75,79,84,89,93,99,104,110,115,121,127,134,140,147,154,161,168,176,184,192,200,209,217,226,236,245,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0 }; + PROGMEM const uint8_t pwm2_levels[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,4,5,7,8,9,11,12,14,15,17,19,20,22,24,25,27,29,31,33,35,37,39,41,43,45,48,50,52,55,57,59,62,64,67,70,72,75,78,81,84,87,90,93,96,99,102,105,109,112,115,119,122,126,129,133,137,141,144,148,152,156,160,165,169,173,177,182,186,191,195,200,205,209,214,219,224,229,234,239,244,250,255 }; + #define MAX_1x7135 65 + #define HALFSPEED_LEVEL 14 + #define QUARTERSPEED_LEVEL 5 #endif #elif PWM_CHANNELS == 3 #if RAMP_LENGTH == 50 -- cgit v1.2.3 From 0e039cd22402ff44fe2cf3bea5dc276da49d7b36 Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Fri, 29 Jun 2018 13:37:18 -0600 Subject: Oops, not sure how it even compiled with this typo. --- spaghetti-monster/anduril/anduril.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spaghetti-monster/anduril/anduril.c b/spaghetti-monster/anduril/anduril.c index 2b958cc..f2d02ee 100644 --- a/spaghetti-monster/anduril/anduril.c +++ b/spaghetti-monster/anduril/anduril.c @@ -69,7 +69,7 @@ #if defined(FSM_BLF_GT_DRIVER) #include "cfg-blf-gt.h" -#elif FSM_BLF_Q8_DRIVER +#elif defined(FSM_BLF_Q8_DRIVER) #include "cfg-blf-q8.h" #elif defined(FSM_EMISAR_D4_DRIVER) -- cgit v1.2.3 From ddaa3eb594a8dc6656529306ccdf9f9a240a3588 Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Sat, 30 Jun 2018 16:50:55 -0600 Subject: Just in case, overheating in muggle mode triggers an immediate drop to the floor. Because WTF. This basically can't happen unless someone is doing something very stupid. --- spaghetti-monster/anduril/anduril.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/spaghetti-monster/anduril/anduril.c b/spaghetti-monster/anduril/anduril.c index f2d02ee..e79d568 100644 --- a/spaghetti-monster/anduril/anduril.c +++ b/spaghetti-monster/anduril/anduril.c @@ -1219,6 +1219,18 @@ uint8_t muggle_state(EventPtr event, uint16_t arg) { } return MISCHIEF_MANAGED; } + #ifdef USE_THERMAL_REGULATION + // overheating is handled specially in muggle mode + else if(event == EV_temperature_high) { + // don't even try... + // go immediately to the bottom, in case someone put the light on + // maximum while wrapped in dark-colored flammable insulation + // or something, because muggles are cool like that + // memorized_level = MUGGLE_FLOOR; // override memory? maybe not + set_level(MUGGLE_FLOOR); + return MISCHIEF_MANAGED; + } + #endif // low voltage is handled specially in muggle mode else if(event == EV_voltage_low) { uint8_t lvl = (actual_level >> 1) + (actual_level >> 2); -- cgit v1.2.3 From 3fd042cfc13c5cddc79b5a6b38e5c50e4d24c7d6 Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Sat, 30 Jun 2018 19:25:05 -0600 Subject: Fixed thermal regulation bug, where it used the wrong target to determine adjustment speed. Added a THERM_HARD_TURBO_DROP option, but after fixing the previous bug I'm not sure it's really needed. Decreased default temperature ceiling to 45 C (was 50). --- spaghetti-monster/anduril/anduril.c | 27 ++++++++++++++++++++++++--- spaghetti-monster/anduril/cfg-emisar-d4.h | 4 ++++ spaghetti-monster/anduril/cfg-fw3a.h | 6 ++++++ 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/spaghetti-monster/anduril/anduril.c b/spaghetti-monster/anduril/anduril.c index e79d568..0766361 100644 --- a/spaghetti-monster/anduril/anduril.c +++ b/spaghetti-monster/anduril/anduril.c @@ -28,7 +28,7 @@ #define USE_LVP // FIXME: won't build when this option is turned off #define USE_THERMAL_REGULATION -#define DEFAULT_THERM_CEIL 50 +#define DEFAULT_THERM_CEIL 45 #define MIN_THERM_STEPDOWN MAX_1x7135 // lowest value it'll step down to #ifdef MAX_Nx7135 #define THERM_DOUBLE_SPEED_LEVEL MAX_Nx7135 // throttle back faster when high @@ -590,6 +590,13 @@ uint8_t steady_state(EventPtr event, uint16_t arg) { if ((arg & 1) && (actual_level < THERM_DOUBLE_SPEED_LEVEL)) { return MISCHIEF_MANAGED; // adjust slower when not a high mode } + #ifdef THERM_HARD_TURBO_DROP + else if ((! (actual_level < THERM_DOUBLE_SPEED_LEVEL)) + && (actual_level > gradual_target)) { + gradual_tick(); + } + else { + #endif // [int(62*4 / (x**0.8)) for x in (1,2,4,8,16,32,64,128)] //uint8_t intervals[] = {248, 142, 81, 46, 26, 15, 8, 5}; // [int(62*4 / (x**0.9)) for x in (1,2,4,8,16,32,64,128)] @@ -599,13 +606,15 @@ uint8_t steady_state(EventPtr event, uint16_t arg) { uint8_t diff; static uint8_t ticks_since_adjust = 0; ticks_since_adjust ++; - if (target_level > actual_level) diff = target_level - actual_level; + if (gradual_target > actual_level) diff = gradual_target - actual_level; else { - diff = actual_level - target_level; + diff = actual_level - gradual_target; } uint8_t magnitude = 0; + #ifndef THERM_HARD_TURBO_DROP // if we're on a really high mode, drop faster if (actual_level >= THERM_DOUBLE_SPEED_LEVEL) { magnitude ++; } + #endif while (diff) { magnitude ++; diff >>= 1; @@ -617,6 +626,9 @@ uint8_t steady_state(EventPtr event, uint16_t arg) { ticks_since_adjust = 0; } //if (!(arg % ticks_per_adjust)) gradual_tick(); + #ifdef THERM_HARD_TURBO_DROP + } + #endif #endif return MISCHIEF_MANAGED; } @@ -630,6 +642,15 @@ uint8_t steady_state(EventPtr event, uint16_t arg) { delay_4ms(2); set_level(foo); #endif + #ifdef THERM_HARD_TURBO_DROP + if (actual_level > THERM_DOUBLE_SPEED_LEVEL) { + #ifdef USE_SET_LEVEL_GRADUALLY + set_level_gradually(THERM_DOUBLE_SPEED_LEVEL); + #else + set_level(THERM_DOUBLE_SPEED_LEVEL); + #endif + } else + #endif if (actual_level > MIN_THERM_STEPDOWN) { int16_t stepdown = actual_level - arg; if (stepdown < MIN_THERM_STEPDOWN) stepdown = MIN_THERM_STEPDOWN; diff --git a/spaghetti-monster/anduril/cfg-emisar-d4.h b/spaghetti-monster/anduril/cfg-emisar-d4.h index d17e2b0..a90d318 100644 --- a/spaghetti-monster/anduril/cfg-emisar-d4.h +++ b/spaghetti-monster/anduril/cfg-emisar-d4.h @@ -12,3 +12,7 @@ #define MAX_1x7135 65 #define HALFSPEED_LEVEL 14 #define QUARTERSPEED_LEVEL 5 + +// optional, makes initial turbo step-down faster so first peak isn't as hot +//#define THERM_HARD_TURBO_DROP + diff --git a/spaghetti-monster/anduril/cfg-fw3a.h b/spaghetti-monster/anduril/cfg-fw3a.h index 3df426d..2790086 100644 --- a/spaghetti-monster/anduril/cfg-fw3a.h +++ b/spaghetti-monster/anduril/cfg-fw3a.h @@ -16,3 +16,9 @@ #define HALFSPEED_LEVEL 14 #define QUARTERSPEED_LEVEL 5 +#ifdef THERM_DOUBLE_SPEED_LEVEL +#undef THERM_DOUBLE_SPEED_LEVEL +#endif +#define THERM_DOUBLE_SPEED_LEVEL MAX_Nx7135 +// optional, makes initial turbo step-down faster so first peak isn't as hot +//#define THERM_HARD_TURBO_DROP -- cgit v1.2.3 From 667d789caf9b425f2fb1105d47b8aff8c2091ecb Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Sat, 30 Jun 2018 19:42:05 -0600 Subject: Fixed bug: moon mode flickered a bit in momentary mode due to constant MCU clock speed adjustments. (also, reduced code size and made it harder for similar bugs to appear in the future) --- spaghetti-monster/anduril/anduril.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/spaghetti-monster/anduril/anduril.c b/spaghetti-monster/anduril/anduril.c index 0766361..ab6a0af 100644 --- a/spaghetti-monster/anduril/anduril.c +++ b/spaghetti-monster/anduril/anduril.c @@ -1670,16 +1670,6 @@ void loop() { #endif if (0) {} - #ifdef USE_IDLE_MODE - else if ( (state == steady_state) - || (state == off_state) - || (state == lockout_state) - || (state == goodnight_state) ) { - // doze until next clock tick - idle_mode(); - } - #endif - if (state == strobe_state) { uint8_t st = strobe_type; // bike flasher @@ -1777,4 +1767,12 @@ void loop() { set_level(0); nice_delay_ms(((beacon_seconds) * 1000) - 500); } + + #ifdef USE_IDLE_MODE + else { + // doze until next clock tick + idle_mode(); + } + #endif + } -- cgit v1.2.3