From c07c2e66d6aba552400c8f59e8d2d4149777dd1c Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Sun, 8 Mar 2020 19:47:47 +0100 Subject: [PATCH] Fixed uptime rollover in UI --- src/Uptime.cpp | 8 ++++++++ src/Uptime.h | 10 ++++++++++ src/web/AmsWebServer.cpp | 6 ++++-- src/web/AmsWebServer.h | 3 ++- web/index.html | 2 +- 5 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 src/Uptime.cpp create mode 100644 src/Uptime.h diff --git a/src/Uptime.cpp b/src/Uptime.cpp new file mode 100644 index 00000000..d3f739fd --- /dev/null +++ b/src/Uptime.cpp @@ -0,0 +1,8 @@ +#include "Uptime.h" + +uint64_t millis64() { + uint32_t new_low32 = millis(); + if (new_low32 < _uptime_last_value) _uptime_rollovers++; + _uptime_last_value = new_low32; + return (uint64_t) _uptime_rollovers << 32 | _uptime_last_value; +} diff --git a/src/Uptime.h b/src/Uptime.h new file mode 100644 index 00000000..9b1a14a9 --- /dev/null +++ b/src/Uptime.h @@ -0,0 +1,10 @@ +#ifndef _UPTIME_H +#define _UPTIME_H + +#include "Arduino.h" + +static uint32_t _uptime_last_value = 0; +static uint32_t _uptime_rollovers = 0; +uint64_t millis64(); + +#endif diff --git a/src/web/AmsWebServer.cpp b/src/web/AmsWebServer.cpp index 63f7714a..02e865b3 100644 --- a/src/web/AmsWebServer.cpp +++ b/src/web/AmsWebServer.cpp @@ -37,6 +37,8 @@ void AmsWebServer::loop() { void AmsWebServer::setData(AmsData& data) { + millis64(); // Make sure it catch all those rollovers + this->data.apply(data); if(maxPwr == 0 && data.getListType() > 1 && config->hasConfig() && config->getMainFuse() > 0 && config->getDistributionSystem() > 0) { @@ -351,11 +353,10 @@ void AmsWebServer::dataJson() { json["po_pct"] = -1; } - unsigned long now = millis(); json["id"] = WiFi.macAddress(); json["maxPower"] = maxPwr; json["meterType"] = config->getMeterType(); - json["currentMillis"] = now; + json["uptime_seconds"] = millis64() / 1000; double vcc = hw.getVcc(); json["vcc"] = serialized(String(vcc, 3)); @@ -383,6 +384,7 @@ void AmsWebServer::dataJson() { } json["status"]["esp"] = espStatus; + unsigned long now = millis(); String hanStatus; if(config->getMeterType() == 0) { hanStatus = "secondary"; diff --git a/src/web/AmsWebServer.h b/src/web/AmsWebServer.h index 888844c0..f676dbe4 100644 --- a/src/web/AmsWebServer.h +++ b/src/web/AmsWebServer.h @@ -8,6 +8,7 @@ #include "AmsConfiguration.h" #include "HwTools.h" #include "AmsData.h" +#include "Uptime.h" #if defined(ARDUINO) && ARDUINO >= 100 #include "Arduino.h" @@ -33,7 +34,7 @@ public: void setData(AmsData& data); private: - int maxPwr; + int maxPwr = 0; HwTools hw; AmsConfiguration* config; AmsData data; diff --git a/web/index.html b/web/index.html index 56fa19c6..8cd90c21 100644 --- a/web/index.html +++ b/web/index.html @@ -241,7 +241,7 @@ var fetch = function() { } if(window.moment) { - $('#currentMillis').html(moment.duration(parseInt(json.currentMillis)).humanize()); + $('#currentMillis').html(moment.duration(parseInt(json.uptime_seconds), 'seconds').humanize()); $('#currentMillis').closest('.row').show(); }