Added runtime time logger
This commit is contained in:
@ -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");
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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.
|
||||
//
|
||||
|
@ -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;
|
||||
|
11
src/main.cpp
11
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:
|
||||
|
@ -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,
|
||||
|
@ -64,7 +64,7 @@ class WebServerHandler {
|
||||
void webHandleStatusSleepmode();
|
||||
void webHandleClearWIFI();
|
||||
void webHandleStatus();
|
||||
void webHandleFactoryReset();
|
||||
void webHandleFactoryDefaults();
|
||||
void webHandleCalibrate();
|
||||
void webHandleUploadFile();
|
||||
void webHandleUpload();
|
||||
|
Reference in New Issue
Block a user