diff --git a/lambda-test/rules-test.c b/lambda-test/rules-test.c index 2746ba6..527719f 100644 --- a/lambda-test/rules-test.c +++ b/lambda-test/rules-test.c @@ -148,7 +148,6 @@ meas.tempI = 99; meas.lambda = 2000; - resetRules(); reason(meas); assertFalse(rules[3].fired); @@ -162,21 +161,18 @@ meas.tempI = 99; meas.lambda = 1199; - resetRules(); reason(meas); assertFalse(rules[3].fired); meas.tempI = 100; meas.lambda = 1199; - resetRules(); reason(meas); assertTrue(rules[3].fired); meas.lambda = 1300; age = 0; - reason(meas); assertFalse(rules[3].fired); @@ -192,31 +188,26 @@ dir = 1; meas.tempI = 50; - age = 0; reason(meas); assertFalse(rules[4].fired); meas.tempI = 100; - age = 0; reason(meas); assertFalse(rules[4].fired); meas.tempI = 125; - age = 0; reason(meas); assertFalse(rules[4].fired); meas.tempI = 99; - age = 0; reason(meas); assertTrue(rules[4].fired); meas.tempI = 125; - age = 0; reason(meas); assertFalse(rules[4].fired); @@ -226,6 +217,112 @@ return true; } +bool testReasonDirBurnUp(void) { + + resetRules(); + Measurement meas = {0, 0, 2000}; + + age = 0; + reason(meas); + assertTrue(dir == 0); + + meas.tempI = 9; + meas.lambda = 2000; + age = 180; + reason(meas); + assertTrue(dir == 0); + + meas.tempI = 100; + meas.lambda = 2000; + age = 180; + reason(meas); + assertTrue(dir == 1); + + meas.tempI = 790; + meas.lambda = 2000; + age = 180; + reason(meas); + assertTrue(dir == 1); + + meas.tempI = 790; + meas.lambda = 2000; + age = 180; + reason(meas); + assertTrue(dir == 0); + + meas.tempI = 800; + meas.lambda = 2000; + age = 180; + reason(meas); + assertTrue(dir == 1); + + meas.tempI = 850; + meas.lambda = 2000; + age = 180; + reason(meas); + assertTrue(dir == 0); + + meas.tempI = 900; + meas.lambda = 1999; + age = 180; + reason(meas); + assertTrue(dir == 0); + + cancelAlert(); + + return true; +} + +bool testReasonDirBurnDown(void) { + + resetRules(); + Measurement meas = {999, 0, 1999}; + + age = 0; + reason(meas); + assertTrue(dir == 0); + + meas.tempI = 900; + meas.lambda = 1999; + age = 180; + reason(meas); + assertTrue(dir == 0); + + meas.tempI = 800; + meas.lambda = 1999; + age = 180; + reason(meas); + assertTrue(dir == 0); + + meas.tempI = 750; + meas.lambda = 1999; + age = 180; + reason(meas); + assertTrue(dir == 0); + + meas.tempI = 700; + meas.lambda = 2000; + age = 180; + reason(meas); + assertTrue(dir == -1); + + meas.tempI = 700; + meas.lambda = 2000; + age = 180; + reason(meas); + assertTrue(dir == 0); + + meas.tempI = 100; + meas.lambda = 2000; + age = 180; + reason(meas); + assertTrue(dir == -1); + + cancelAlert(); + + return true; +} + /* Test "class" */ static const char class[] PROGMEM = "rules"; @@ -235,6 +332,8 @@ static const char testAirgateClose_P[] PROGMEM = "testAirgateClose"; static const char testTooRich_P[] PROGMEM = "testTooRich"; static const char testFireOut_P[] PROGMEM = "testFireOut"; +static const char testReasonDirBurnUp_P[] PROGMEM = "testReasonDirBurnUp"; +static const char testReasonDirBurnDown_P[] PROGMEM = "testReasonDirBurnDown"; /* Tests */ static TestCase const tests[] = { @@ -242,7 +341,9 @@ {class, testAirgate25_P, testAirgate25}, {class, testAirgateClose_P, testAirgateClose}, {class, testTooRich_P, testTooRich}, - {class, testFireOut_P, testFireOut} + {class, testFireOut_P, testFireOut}, + {class, testReasonDirBurnUp_P, testReasonDirBurnUp}, + {class, testReasonDirBurnDown_P, testReasonDirBurnDown} }; TestClass rulesClass = {tests, sizeof(tests) / sizeof(tests[0])}; diff --git a/lambda/rules.c b/lambda/rules.c index 906c7b2..129d119 100644 --- a/lambda/rules.c +++ b/lambda/rules.c @@ -19,11 +19,12 @@ #define DIR_BURN_UP 1 #define DIR_BURN_DOWN -1 -Measurement rulesMeasMax = {0, 0, 2000}; -Measurement rulesMeasPrev = {0, 0, 2000}; uint16_t age = 0; int8_t dir = 0; +static Measurement rulesMeasMax = {0, 0, 2000}; +static Measurement rulesMeasPrev = {0, 0, 2000}; + /** * Reminds to set the air gate to 50% when the fire is still building up * and the temperature has reached 500°C. @@ -114,6 +115,8 @@ } } + age++; + // try to figure out if the fire is building up or burning down by // comparing current measurements with ones that are 3 minutes old. if (age >= 180) { @@ -133,8 +136,6 @@ rulesMeasMax.tempI = MAX(rulesMeasMax.tempI, meas.tempI); rulesMeasMax.tempO = MAX(rulesMeasMax.tempO, meas.tempO); rulesMeasMax.lambda = MIN(rulesMeasMax.lambda, meas.lambda); - - age++; } void resetRules(void) {