diff --git a/lambda-test/rules-test.c b/lambda-test/rules-test.c index fd45c15..d3a7d54 100644 --- a/lambda-test/rules-test.c +++ b/lambda-test/rules-test.c @@ -82,7 +82,7 @@ reason(meas); assertFalse(rules[1].fired); - meas.tempI = 799; + meas.tempI = 699; resetRules(); dir = firing_up; @@ -349,8 +349,8 @@ setHeaterOn(true); - // more than 3 mins - addTime(181); + // more than 5 mins + addTime(301); meas.current = 5000; reason(meas); @@ -404,31 +404,31 @@ reason(meas); assertTrue(dir == firing_up); - meas.tempI = 790; + meas.tempI = 690; meas.lambda = 2000; age = 180; reason(meas); assertTrue(dir == firing_up); - meas.tempI = 790; + meas.tempI = 690; meas.lambda = 2000; age = 180; reason(meas); assertTrue(dir == none); + meas.tempI = 690; + meas.lambda = 1900; + age = 180; + reason(meas); + assertTrue(dir == burning); + + meas.tempI = 700; + meas.lambda = 2000; + age = 180; + reason(meas); + assertTrue(dir == burning); + meas.tempI = 800; - meas.lambda = 2000; - age = 180; - reason(meas); - assertTrue(dir == firing_up); - - meas.tempI = 850; - meas.lambda = 2000; - age = 180; - reason(meas); - assertTrue(dir == none); - - meas.tempI = 900; meas.lambda = 1999; age = 180; reason(meas); @@ -466,13 +466,13 @@ reason(meas); assertTrue(dir == burning); - meas.tempI = 700; + meas.tempI = 699; meas.lambda = 2000; age = 180; reason(meas); assertTrue(dir == burning_down); - meas.tempI = 700; + meas.tempI = 699; meas.lambda = 2000; age = 180; reason(meas); diff --git a/lambda-test/sensors-test.c b/lambda-test/sensors-test.c index e8e55f8..f324958 100644 --- a/lambda-test/sensors-test.c +++ b/lambda-test/sensors-test.c @@ -208,6 +208,18 @@ return true; } +static bool testGetHeaterUptime(void) { + addTime(10); + + setHeaterOn(true); + assertTrue(0 == getHeaterUptime()); + + addTime(10); + assertTrue(10 == getHeaterUptime()); + + return true; +} + /* Test "class" */ static const char class[] PROGMEM = "sensors"; @@ -234,6 +246,7 @@ static const char testToInfoRich_P[] PROGMEM = "testToInfoRich"; static const char testSetHeaterOn_P[] PROGMEM = "testSetHeaterOn"; static const char testSetHeaterState_P[] PROGMEM = "testSetHeaterState"; +static const char testGetHeaterUptime_P[] PROGMEM = "testGetHeaterUptime"; /* Tests */ static TestCase const tests[] = { @@ -258,7 +271,8 @@ {class, testToInfoIdeal_P, testToInfoIdeal}, {class, testToInfoRich_P, testToInfoRich}, {class, testSetHeaterOn_P, testSetHeaterOn}, - {class, testSetHeaterState_P, testSetHeaterState} + {class, testSetHeaterState_P, testSetHeaterState}, + {class, testGetHeaterUptime_P, testGetHeaterUptime} }; TestClass sensorsClass = {tests, sizeof(tests) / sizeof(tests[0])}; diff --git a/lambda/display.c b/lambda/display.c index 6d1ad5f..f23e049 100644 --- a/lambda/display.c +++ b/lambda/display.c @@ -136,6 +136,7 @@ case firing_up: hint = " >"; break; case burning: hint = " ^"; break; case burning_down: hint = " <"; break; + case warm_start: hint = " +"; break; default: hint = " -"; break; } displayMeas(measLatest, hint); diff --git a/lambda/rules.c b/lambda/rules.c index 11f9c78..26f47b2 100644 --- a/lambda/rules.c +++ b/lambda/rules.c @@ -140,7 +140,7 @@ return; } if (meas.current > milliAmpsShort || meas.current < milliAmpsDisconn || - (getHeaterUptime() >= 300 && meas.current > milliAmpsReady)) { + (getHeaterUptime() >= 300 && getHeaterState() != heaterStateReady)) { // short circuit or disconnected or did not warm up within 5 minutes setHeaterOn(false); setHeaterState(heaterStateFault); @@ -150,7 +150,7 @@ } /** - * Switches the heater off if it is on for 15 mins or more and there does + * Switches the heater off if it is on for 30 mins or more and there does * not seem to be a fire, and notifies that the fire is out. */ static void heaterTimeout(bool* const fired, int8_t const dir, @@ -159,11 +159,11 @@ return; } uint32_t heaterUptime = getHeaterUptime(); - if (heaterUptime >= 900 && meas.tempI < TEMP_FIRE_OUT) { + if (heaterUptime >= 1800 && meas.tempI < TEMP_FIRE_OUT) { setHeaterOn(false); alert_P(BEEPS, LENGTH, TONE, PSTR(MSG_FIRE_OUT_0), PSTR(""), false); } - if (heaterUptime >= 1800 && meas.tempI < TEMP_AIRGATE_0) { + if (heaterUptime >= 3600 && meas.tempI < TEMP_AIRGATE_0) { setHeaterOn(false); } } @@ -225,14 +225,18 @@ if ((meas.tempI - rulesMeasPrev.tempI) >= TEMP_DELTA_UP && rulesMeasMax.tempI < TEMP_MIN && meas.lambda >= LAMBDA_MAX) { dir = firing_up; - } else if (meas.tempI > TEMP_MIN || meas.lambda < LAMBDA_MAX) { + } + if (meas.tempI >= TEMP_MIN || meas.lambda < LAMBDA_MAX) { dir = burning; - } else if ((rulesMeasPrev.tempI - meas.tempI) >= TEMP_DELTA_DOWN && - rulesMeasMax.tempI > TEMP_MIN && meas.lambda >= LAMBDA_MAX) { + } + if ((rulesMeasPrev.tempI - meas.tempI) >= TEMP_DELTA_DOWN && + rulesMeasMax.tempI >= TEMP_MIN && meas.lambda >= LAMBDA_MAX) { dir = burning_down; - } else if ((meas.tempI - rulesMeasPrev.tempI) >= TEMP_DELTA_UP) { + } + if ((meas.tempI - rulesMeasPrev.tempI) >= TEMP_DELTA_UP && + meas.tempI < TEMP_MIN && rulesMeasMax.tempI >= TEMP_MIN) { // it seems wood has been added - reset some measurements and rules - // dir = warm_start; + dir = warm_start; rulesMeasMax.tempI = meas.tempI; size_t rulesSize = sizeof(rules) / sizeof(rules[0]); for (size_t i = 0; i < rulesSize; i++) { diff --git a/lambda/rules.h b/lambda/rules.h index 4b94fea..c191407 100644 --- a/lambda/rules.h +++ b/lambda/rules.h @@ -51,6 +51,7 @@ none = 0, firing_up = 1, burning = 2, + warm_start = 3, burning_down = -1 } FireDir;