diff --git a/src/Afterburner.cpp b/src/Afterburner.cpp index bd83790..c7abbb3 100644 --- a/src/Afterburner.cpp +++ b/src/Afterburner.cpp @@ -458,11 +458,9 @@ void setup() { // bCyclicEngaged = RTC_Store.getCyclicEngaged(); DebugPort.printf("Previous cyclic active = %d\r\n", RTC_Store.getCyclicEngaged()); // state flag required for cyclic mode to persist properly after a WD reboot :-) - pHourMeter = new CHourMeter(persistentRunTime, persistentGlowTime); - if(bESP32PowerUpInit || RTC_Store.getBootInit()) { // ensure we reset out persistent vars on power up, or OTA update - RTC_Store.setBootInit(false); - pHourMeter->powerOnInit(); // ensure persistent memory variable are reset after powerup - } + pHourMeter = new CHourMeter(persistentRunTime, persistentGlowTime); // persistent vars are only trustworthy with SW reboots + pHourMeter->init(bESP32PowerUpInit || RTC_Store.getBootInit()); // ensure persistent memory variable are reset after powerup, or OTA update + RTC_Store.setBootInit(false); delay(1000); // just to hold the splash screeen for while } @@ -1250,6 +1248,16 @@ void checkDebugCommands() else if(rxVal == 'r') { ESP.restart(); // reset the esp } + else if(rxVal == ('h' & 0x1f)) { // CTRL-H hourmeter reset + sHourMeter FLASHmem = NVstore.getHourMeter(); + FLASHmem.RunTime = 0; + FLASHmem.GlowTime = 0; + NVstore.setHourMeter(FLASHmem); + RTC_Store.resetRunTime(); + RTC_Store.resetGlowTime(); + persistentRunTime = 0; + persistentGlowTime = 0; + } } #ifdef PROTOCOL_INVESTIGATION if(bSendVal) { diff --git a/src/RTC/RTCStore.cpp b/src/RTC/RTCStore.cpp index 74769f9..03f19ee 100644 --- a/src/RTC/RTCStore.cpp +++ b/src/RTC/RTCStore.cpp @@ -154,6 +154,19 @@ CRTC_Store::getDesiredPump() return _demandPump; } +void +CRTC_Store::resetRunTime() +{ + _RunTime = 0; + _PackAndSaveByte6(); +} + +void +CRTC_Store::resetGlowTime() +{ + _GlowTime = 0; + _PackAndSaveByte6(); +} bool CRTC_Store::incRunTime() diff --git a/src/RTC/RTCStore.h b/src/RTC/RTCStore.h index 7c16b96..6532cc9 100644 --- a/src/RTC/RTCStore.h +++ b/src/RTC/RTCStore.h @@ -46,6 +46,8 @@ public: void setFuelGauge(float val); void setDesiredTemp(uint8_t val); void setDesiredPump(uint8_t val); + void resetRunTime(); + void resetGlowTime(); bool incRunTime(); bool incGlowTime(); void setCyclicEngaged(bool _CyclicEngaged); diff --git a/src/Utility/HourMeter.cpp b/src/Utility/HourMeter.cpp index 81d0050..bd25870 100644 --- a/src/Utility/HourMeter.cpp +++ b/src/Utility/HourMeter.cpp @@ -30,10 +30,24 @@ const int baseSeconds = 60 * 15; // 15 minutes void -CHourMeter::powerOnInit() +CHourMeter::init(bool poweron) { - _RunTime = 0; - _GlowTime = 0; + if(poweron) { + _RunTime = 0; // difinitely untrustworthy after power on or OTA updates + _GlowTime = 0; + } + int rt = RTC_Store.getRunTime(); + int gt = RTC_Store.getGlowTime(); + if(rt || gt) { + sHourMeter FLASHmem = NVstore.getHourMeter(); + FLASHmem.RunTime += _RunTime + baseSeconds * rt; + FLASHmem.GlowTime += _GlowTime + baseSeconds * gt; + NVstore.setHourMeter(FLASHmem); + RTC_Store.resetRunTime(); + RTC_Store.resetGlowTime(); + _RunTime = 0; + _GlowTime = 0; + } } void @@ -58,37 +72,55 @@ CHourMeter::monitor(const CProtocol& frame) _lastRunTime = now; sHourMeter FLASHmem = NVstore.getHourMeter(); if(_RunTime > baseSeconds) { - if(RTC_Store.incRunTime()) - FLASHmem.RunTime++; + if(RTC_Store.incRunTime()) { + // rolled RTC intermediate store - push into FLASH + FLASHmem.RunTime += baseSeconds * RTC_Store.getMaxRunTime(); + } _RunTime -= baseSeconds; } if(_GlowTime > baseSeconds) { - if(RTC_Store.incGlowTime()) - FLASHmem.GlowTime++; + if(RTC_Store.incGlowTime()) { + // rolled RTC intermediate store - push into FLASH + FLASHmem.GlowTime += baseSeconds * RTC_Store.getMaxGlowTime(); // store whole seconds to flash memory + } _GlowTime -= baseSeconds; } NVstore.setHourMeter(FLASHmem); } else { + // heater has been stopped - save remant times to flash + if(_lastRunTime) { + sHourMeter FLASHmem = NVstore.getHourMeter(); + FLASHmem.RunTime += _RunTime + baseSeconds * RTC_Store.getRunTime(); + FLASHmem.GlowTime += _GlowTime + baseSeconds * RTC_Store.getGlowTime(); + NVstore.setHourMeter(FLASHmem); + _RunTime = 0; + _GlowTime = 0; + RTC_Store.resetRunTime(); + RTC_Store.resetGlowTime(); + } _lastRunTime = 0; _lastGlowTime = 0; } - DebugPort.printf("CHourMeter %f %f\r\n", _RunTime, _GlowTime); +// DebugPort.printf("CHourMeter %f %f\r\n", _RunTime, _GlowTime); } uint32_t CHourMeter::getRunTime() { uint32_t rt = (uint32_t)_RunTime; - DebugPort.printf("HrMtr: %d %d %d\r\n", rt, RTC_Store.getRunTime(), NVstore.getHourMeter().RunTime); + DebugPort.printf("HrMtr Run: %d %d %d\r\n", rt, RTC_Store.getRunTime(), NVstore.getHourMeter().RunTime); - return rt + baseSeconds * RTC_Store.getRunTime() + baseSeconds * RTC_Store.getMaxRunTime() * NVstore.getHourMeter().RunTime; +// return rt + baseSeconds * RTC_Store.getRunTime() + baseSeconds * RTC_Store.getMaxRunTime() * NVstore.getHourMeter().RunTime; + return rt + baseSeconds * RTC_Store.getRunTime() + NVstore.getHourMeter().RunTime; } uint32_t CHourMeter::getGlowTime() { uint32_t gt = (uint32_t)_GlowTime; - return gt + baseSeconds * RTC_Store.getGlowTime() + baseSeconds * RTC_Store.getMaxGlowTime() * NVstore.getHourMeter().GlowTime; +// return gt + baseSeconds * RTC_Store.getGlowTime() + baseSeconds * RTC_Store.getMaxGlowTime() * NVstore.getHourMeter().GlowTime; + DebugPort.printf("HrMtr Glow: %d %d %d\r\n", gt, RTC_Store.getGlowTime(), NVstore.getHourMeter().GlowTime); + return gt + baseSeconds * RTC_Store.getGlowTime() + NVstore.getHourMeter().GlowTime; } diff --git a/src/Utility/HourMeter.h b/src/Utility/HourMeter.h index 0ab8e2d..c28bb94 100644 --- a/src/Utility/HourMeter.h +++ b/src/Utility/HourMeter.h @@ -43,7 +43,7 @@ public: _RunTime = runtime; _GlowTime = glowtime; }; - void powerOnInit(); + void init(bool poweron); void monitor(const CProtocol& frame); uint32_t getRunTime(); uint32_t getGlowTime(); diff --git a/src/Utility/NVStorage.cpp b/src/Utility/NVStorage.cpp index cd9d4ca..5eb16d3 100644 --- a/src/Utility/NVStorage.cpp +++ b/src/Utility/NVStorage.cpp @@ -464,6 +464,7 @@ sHourMeter::save() preferences.putULong("RunTime", RunTime); preferences.putULong("GlowTime", GlowTime); preferences.end(); + DebugPort.printf("Hourmeter NV save: Run=%d, Glow=%d\r\n", RunTime, GlowTime); } void @@ -474,4 +475,5 @@ sHourMeter::load() validatedLoad("RunTime", RunTime, 0, 0, 0xffffffffL); validatedLoad("GlowTime", GlowTime, 0, 0, 0xffffffffL); preferences.end(); + DebugPort.printf("Hourmeter NV read: Run=%d, Glow=%d\r\n", RunTime, GlowTime); } \ No newline at end of file