From 22ade61af8fc12d816df226b9f9d2a08b7e4f317 Mon Sep 17 00:00:00 2001 From: Magnus Persson Date: Sun, 30 Jan 2022 22:54:48 +0100 Subject: [PATCH] Added runtime time logger --- src/config.cpp | 12 --------- src/config.hpp | 58 +++++++++++++++++++++--------------------- src/helper.cpp | 65 +++++++++++++++++++++++++++++++++++++++-------- src/helper.hpp | 19 ++++++++++++-- src/main.cpp | 11 ++++++++ src/webserver.cpp | 14 +++++++--- src/webserver.hpp | 2 +- 7 files changed, 124 insertions(+), 57 deletions(-) diff --git a/src/config.cpp b/src/config.cpp index 3bb9e35..7568e0f 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -52,23 +52,11 @@ Config::Config() { _mDNS.c_str()); #endif - setTempFormat('C'); - setGravityFormat('G'); - setSleepInterval(900); // 15 minutes #if defined(ESP8266) setVoltageFactor(1.59); // Conversion factor for battery on ESP8266 #else // defined (ESP32) setVoltageFactor(1.43); // Conversion factor for battery on ESP32 #endif - setTempSensorAdjC(0.0); - setGravityTempAdj(false); - _gyroCalibration = {0, 0, 0, 0, 0, 0}; - _formulaData = {{0, 0, 0, 0, 0}, {1, 1, 1, 1, 1}}; - _gyroTemp = false; - _saveNeeded = false; - _mqttPort = 1883; - _httpHeader[0] = F("Content-Type: application/json"); - _http2Header[0] = F("Content-Type: application/json"); } // diff --git a/src/config.hpp b/src/config.hpp index 50201bb..08ea6fc 100644 --- a/src/config.hpp +++ b/src/config.hpp @@ -85,48 +85,48 @@ class HardwareConfig { class Config { private: - bool _saveNeeded; + bool _saveNeeded = false; // Device configuration - String _id; - String _mDNS; - String _otaURL; - char _tempFormat; - float _voltageFactor; - float _tempSensorAdjC; - int _sleepInterval; - bool _gyroTemp; + String _id = ""; + String _mDNS = ""; + String _otaURL = ""; + char _tempFormat = 'C'; + float _voltageFactor = 0; + float _tempSensorAdjC = 0; + int _sleepInterval = 900; + bool _gyroTemp = false; // Wifi Config - String _wifiSSID; - String _wifiPASS; + String _wifiSSID = ""; + String _wifiPASS = ""; // Push target settings - String _brewfatherPushUrl; + String _brewfatherPushUrl = ""; - String _httpUrl; - String _httpHeader[2]; - String _http2Url; - String _http2Header[2]; + String _httpUrl = ""; + String _httpHeader[2] = { "Content-Type: application/json", "" }; + String _http2Url = ""; + String _http2Header[2] = { "Content-Type: application/json", "" }; - String _influxDb2Url; - String _influxDb2Org; - String _influxDb2Bucket; - String _influxDb2Token; + String _influxDb2Url = ""; + String _influxDb2Org = ""; + String _influxDb2Bucket = ""; + String _influxDb2Token = ""; - String _mqttUrl; - int _mqttPort; - String _mqttUser; - String _mqttPass; + String _mqttUrl = ""; + int _mqttPort = 1883; + String _mqttUser = ""; + String _mqttPass = ""; // Gravity and temperature calculations - String _gravityFormula; - bool _gravityTempAdj; - char _gravityFormat; + String _gravityFormula = ""; + bool _gravityTempAdj = false; + char _gravityFormat = 'G'; // Gyro calibration and formula calculation data - RawGyroData _gyroCalibration; - RawFormulaData _formulaData; + RawGyroData _gyroCalibration = {0, 0, 0, 0, 0, 0}; + RawFormulaData _formulaData = {{0, 0, 0, 0, 0}, {1, 1, 1, 1, 1}}; void formatFileSystem(); diff --git a/src/helper.cpp b/src/helper.cpp index 4ac6290..4bbfc20 100644 --- a/src/helper.cpp +++ b/src/helper.cpp @@ -69,25 +69,20 @@ ErrorFileLog::ErrorFileLog() { if (errFile) { do { - errors[i] = errFile.readStringUntil('\n'); - } while (errors[i++].length()); + _errors[i] = errFile.readStringUntil('\n'); + } while (_errors[i++].length()); errFile.close(); } } -// -// -// -const char* ErrorFileLog::getEntry(int idx) { return errors[idx].c_str(); } - // // // void ErrorFileLog::addEntry(String err) { for (int i = (ERR_COUNT - 1); i > 0; i--) { - errors[i] = errors[i - 1]; + _errors[i] = _errors[i - 1]; } - errors[0] = err; + _errors[0] = err; Log.errorln(err.c_str()); save(); } @@ -99,12 +94,62 @@ void ErrorFileLog::save() { File errFile = LittleFS.open(ERR_FILENAME, "w"); if (errFile) { for (int i = 0; i < ERR_COUNT; i++) { - errFile.println(errors[i]); + errFile.println(_errors[i]); } errFile.close(); } } +// +// +// +FloatHistoryLog::FloatHistoryLog(String fName) { + /*File debug = LittleFS.open(fName, "r"); + String s = debug.readString(); + Serial.println( s.c_str() ); + debug.close();*/ + _fName = fName; + + File runFile = LittleFS.open(_fName, "r"); + int i = 0; + + if (runFile) { + for(int i = 0; i<10; i++) { + _runTime[i] = runFile.readStringUntil('\n').toFloat(); + if (_runTime[i]) { + _average += _runTime[i]; + _count++; + } + } + runFile.close(); + _average = _average/_count; + } +} + +// +// +// +void FloatHistoryLog::addEntry(float time) { + for (int i = (10 - 1); i > 0; i--) { + _runTime[i] = _runTime[i - 1]; + } + _runTime[0] = time; + save(); +} + +// +// +// +void FloatHistoryLog::save() { + File runFile = LittleFS.open(_fName, "w"); + if (runFile) { + for (int i = 0; i < 10; i++) { + runFile.println(_runTime[i], 2); + } + runFile.close(); + } +} + // // Print the heap information. // diff --git a/src/helper.hpp b/src/helper.hpp index 845dfb4..6d69f89 100644 --- a/src/helper.hpp +++ b/src/helper.hpp @@ -30,6 +30,8 @@ SOFTWARE. #define ERR_FILENAME "/error.log" #define ERR_COUNT 15 +#define RUNTIME_FILENAME "/runtime.log" + // Sleep mode void deepSleep(int t); @@ -64,15 +66,28 @@ class SerialDebug { class ErrorFileLog { private: - String errors[ERR_COUNT]; + String _errors[ERR_COUNT]; public: ErrorFileLog(); - const char* getEntry(int idx); void addEntry(String error); void save(); }; +class FloatHistoryLog { + private: + String _fName; + float _average = 0; + float _runTime[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + int _count = 0; + void save(); + + public: + FloatHistoryLog(String fName); + void addEntry(float time); + float getAverage() { return _average; } +}; + class BatteryVoltage { private: float _batteryLevel; diff --git a/src/main.cpp b/src/main.cpp index be4fb62..90da60d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -274,6 +274,8 @@ void loopGravityOnInterval() { } } +bool skipRunTimeLog = false; + // // Main loop that determines if device should go to sleep // @@ -281,6 +283,11 @@ void goToSleep(int sleepInterval) { float volt = myBatteryVoltage.getVoltage(); float runtime = (millis() - runtimeMillis); + if (!skipRunTimeLog) { + FloatHistoryLog runLog(RUNTIME_FILENAME); + runLog.addEntry(runtime); + } + Log.notice(F("MAIN: Entering deep sleep for %ds, run time %Fs, " "battery=%FV." CR), sleepInterval, reduceFloatPrecision(runtime / 1000, 2), volt); @@ -301,6 +308,10 @@ void loop() { myWebServerHandler.loop(); myWifi.loop(); loopGravityOnInterval(); + + // If we switched mode, dont include this in the log. + if (runMode!=RunMode::configurationMode) + skipRunTimeLog = true; break; case RunMode::gravityMode: diff --git a/src/webserver.cpp b/src/webserver.cpp index 4408c2b..a7c11b3 100644 --- a/src/webserver.cpp +++ b/src/webserver.cpp @@ -199,13 +199,20 @@ void WebServerHandler::webHandleCalibrate() { // // Callback from webServer when / has been accessed. // -void WebServerHandler::webHandleFactoryReset() { +void WebServerHandler::webHandleFactoryDefaults() { String id = _server->arg(PARAM_ID); Log.notice(F("WEB : webServer callback for /api/factory." CR)); if (!id.compareTo(myConfig.getID())) { - _server->send(200, "text/plain", "Doing reset..."); + _server->send(200, "text/plain", "Removing configuration and restarting..."); LittleFS.remove(CFG_FILENAME); + LittleFS.remove(CFG_HW_FILENAME); + LittleFS.remove(ERR_FILENAME); + LittleFS.remove(RUNTIME_FILENAME); + LittleFS.remove(TPL_FNAME_HTTP1); + LittleFS.remove(TPL_FNAME_HTTP2); + LittleFS.remove(TPL_FNAME_INFLUXDB); + LittleFS.remove(TPL_FNAME_MQTT); LittleFS.end(); delay(500); ESP_RESET(); @@ -951,6 +958,7 @@ bool WebServerHandler::setupWebServer() { } #endif _server->serveStatic("/log", LittleFS, ERR_FILENAME); + _server->serveStatic("/runtime", LittleFS, RUNTIME_FILENAME); // Dynamic content _server->on( @@ -969,7 +977,7 @@ bool WebServerHandler::setupWebServer() { std::bind(&WebServerHandler::webHandleCalibrate, this)); // Run calibration routine (param id) _server->on("/api/factory", HTTP_GET, - std::bind(&WebServerHandler::webHandleFactoryReset, + std::bind(&WebServerHandler::webHandleFactoryDefaults, this)); // Reset the device _server->on("/api/status", HTTP_GET, std::bind(&WebServerHandler::webHandleStatus, diff --git a/src/webserver.hpp b/src/webserver.hpp index bfd98c3..210840d 100644 --- a/src/webserver.hpp +++ b/src/webserver.hpp @@ -64,7 +64,7 @@ class WebServerHandler { void webHandleStatusSleepmode(); void webHandleClearWIFI(); void webHandleStatus(); - void webHandleFactoryReset(); + void webHandleFactoryDefaults(); void webHandleCalibrate(); void webHandleUploadFile(); void webHandleUpload();