From 371e21429dded49ccf9b9bb4a7ad8008fed34cec Mon Sep 17 00:00:00 2001 From: Marcel Peterkau <marcel@peterkau.de> Date: Thu, 1 Sep 2022 23:46:20 +0200 Subject: [PATCH] WebUI adjusted and prepared EE-Backup-Stuff --- Software/data_src/index.htm | 96 ++++++++++++++++++++++++-------- Software/platformio.ini | 1 + Software/src/webui.cpp | 106 ++++++++++++++++++++++++++++++++++++ Software/src/webui.h | 2 + 4 files changed, 182 insertions(+), 23 deletions(-) diff --git a/Software/data_src/index.htm b/Software/data_src/index.htm index 9dd5e8a..476d651 100644 --- a/Software/data_src/index.htm +++ b/Software/data_src/index.htm @@ -58,8 +58,8 @@ <p> <h4>Tankinhalt verbleibend</h4> <div class="progress"> - <div class="progress-bar text-light" role="progressbar" aria-valuenow="%TANK_REMAIN_CAPACITY%" aria-valuemin="0" - aria-valuemax="100" style="width: %TANK_REMAIN_CAPACITY%%"> + <div class="progress-bar text-light" role="progressbar" aria-valuenow="%TANK_REMAIN_CAPACITY%" + aria-valuemin="0" aria-valuemax="100" style="width: %TANK_REMAIN_CAPACITY%%"> %TANK_REMAIN_CAPACITY%% </div> </div> @@ -76,10 +76,10 @@ <table class="table"> <tbody> <tr> - <th class="col-md-3" scope="col">Zeitstempel</th> - <th class="col-md-3" scope="col">Fehlercode</th> - <th class="col-md-3" scope="col">Schwere</th> - <th class="col-md-3" scope="col">Aktiv</th> + <th class="col-6" scope="col">Zeitstempel</th> + <th class="col-2" scope="col">Fehlercode</th> + <th class="col-2" scope="col">Schwere</th> + <th class="col-2" scope="col">Aktiv</th> </tr> %DTC_TABLE% </tbody> @@ -113,7 +113,7 @@ Dadurch wird die WiFi-Verbindung getrennt und muss neu aufgebaut werden. </div> <div class="form-group row"> - <div class="offset-4 col-8"> + <div class="col text-center"> <button name="sourcesave" type="submit" class="btn btn-outline-primary">Übernehmen</button> </div> </div> @@ -174,12 +174,13 @@ </div> </div> <div class="form-group row"> - <div class="offset-4 col-8"> + <div class="col text-center"> <button name="pulsesave" type="submit" class="btn btn-outline-primary">Speichern</button> </div> </div> </form> </p> + <hr /> </div> <!-- Div Source:Impulse Settings--> <!-- Div Source:CAN Settings--> @@ -197,12 +198,13 @@ </div> </div> <div class="form-group row"> - <div class="offset-4 col-8"> + <div class="col text-center"> <button name="cansave" type="submit" class="btn btn-outline-primary">Speichern</button> </div> </div> </form> </p> + <hr /> </div> <!-- Div Source:CAN Settings--> <!-- Div Source:GPS Settings--> @@ -220,12 +222,13 @@ </div> </div> <div class="form-group row"> - <div class="offset-4 col-8"> + <div class="col text-center"> <button name="gpssave" type="submit" class="btn btn-outline-primary">Speichern</button> </div> </div> </form> </p> + <hr /> </div> <!-- Div Source:GPS Settings--> </div> @@ -234,8 +237,8 @@ <div id="tab_lube" class="tab-pane fade" role="tabpanel"> <h3>Schmierung</h3> <hr /> - <h4>Dosierung</h4> <p> + <h4>Dosierung</h4> <form action="post.htm" method="POST" class="form-horizontal"> <div class="form-group row"> <label for="lubedistancenormal" class="control-label col-4">Normal (grün)</label> @@ -262,7 +265,7 @@ </div> </div> <div class="form-group row"> - <div class="offset-4 col-8"> + <div class="col text-center"> <button name="oilsave" type="submit" class="btn btn-outline-primary">Speichern</button> </div> </div> @@ -327,7 +330,7 @@ </div> </div> <div class="form-group row"> - <div class="offset-4 col-8 row"> + <div class="col text-center"> <button name="oilsave" type="submit" class="btn btn-outline-primary">Speichern</button> <button name="resettank" type="submit" class="btn btn-outline-primary ml-2">Tank zurücksetzen</button> </div> @@ -350,7 +353,7 @@ </div> </div> <div class="form-group row"> - <div class="offset-4 col-8 row"> + <div class="col text-center"> <button name="maintsave" type="submit" class="btn btn-outline-primary">Speichern</button> <button name="purgenow" type="submit" class="btn btn-outline-primary ml-2">Entlüftung starten</button> </div> @@ -358,8 +361,8 @@ </form> </p> <hr /> - <h4>EEPROM formatieren</h4> <p> + <h4>EEPROM formatieren</h4> <div class="alert alert-primary alert-dismissable show fade" role="alert"> <button type="button" class="close" data-dismiss="alert" aria-label="Close"> <span aria-hidden="true">×</span> @@ -389,26 +392,37 @@ </div> </div> <div class="form-group row"> - <div class="offset-4 col-8"> + <div class="col text-center"> <button name="reset_ee_btn" type="submit" class="btn btn-outline-primary">EEPROM formatieren</button> </div> </div> </form> </p> <hr /> + <p> + <h4>Gerät neustarten</h4> + <form action="post.htm" method="POST" class="form-horizontal"> + <div class="form-group row"> + <div class="col text-center"> + <button name="reboot" type="submit" class="btn btn-outline-primary">Reboot</button> + </div> + </div> + </form> + </p> + <hr /> </div> <!-- Div Tab Maintenance --> <!-- Div Tab SystemInfo --> <div id="tab_sysinfo" class="tab-pane fade" role="tabpanel"> <h3>Systeminfo</h3> <hr /> - <h4>Einstellungen</h4> <p> + <h4>Einstellungen</h4> <table class="table"> <tbody> <tr> - <th class="col-md-8" scope="col">Parameter</td> - <th class="col-md-4" scope="col">Value</td> + <th class="col-7" scope="col">Parameter</td> + <th class="col-5" scope="col">Value</td> </tr> <tr> <td>DistancePerLube_Default</td> @@ -473,13 +487,14 @@ </tbody> </table> </p> - <h4>Betriebsdaten</h4> + <hr /> <p> + <h4>Betriebsdaten</h4> <table class="table"> <tbody> <tr> - <th class="col-md-8" scope="col">Parameter</td> - <th class="col-md-4" scope="col">Value</td> + <th class="col-7" scope="col">Parameter</td> + <th class="col-5" scope="col">Value</td> </tr> <tr> <td>writeCycleCounter</td> @@ -507,6 +522,7 @@ </tr> </table> </p> + <hr /> </div> <!-- Div Tab SystemInfo --> <!-- Div Tab Firmware Update--> @@ -517,6 +533,10 @@ <h4>Version-Info</h4> <table class="table"> <tbody> + <tr> + <th class="col-7" scope="col">Parameter</td> + <th class="col-5" scope="col">Value</td> + </tr> <tr> <td>Firmware Version</td> <td>%SW_VERSION%</td> @@ -529,6 +549,33 @@ </p> <hr /> <p> + <h4>EEPROM-Backup</h4> + <div class="form-group row"> + <div class="col text-center"> + <a class="btn btn-outline-primary" href="eejson" role="button" id="ee-backup-download">Download</a> + </div> + </div> + </p> + <hr /> + <p> + <h4>EEPROM-Restore</h4> + <form method='POST' action='eeRestore' enctype='multipart/form-data'> + <div class="form-group row"> + <div class="custom-file"> + <input type="file" name="ee-restore-file" class="custom-file-input" id="ee-restore-file" accept=".ee.json" + required /> + <label class="custom-file-label" for="ee-restore-file">EEPROM-Backup auswählen</label> + </div> + </div> + <div class="form-group row"> + <div class="col text-center"> + <button name="submit" type="submit" class="btn btn-outline-primary">Restore starten</button> + </div> + </div> + </form> + </p> + <hr /> + <p> <h4>Firmware-Update</h4> <form method='POST' action='doUpdate' enctype='multipart/form-data'> <div class="form-group row"> @@ -539,10 +586,13 @@ </div> </div> <div class="form-group row"> - <button name="submit" type="submit" class="btn btn-outline-primary">Update starten</button> + <div class="col text-center"> + <button name="submit" type="submit" class="btn btn-outline-primary">Update starten</button> + </div> </div> </form> </p> + <hr /> </div> <!-- Div Tab Firmware Update--> </div> diff --git a/Software/platformio.ini b/Software/platformio.ini index 418f999..cbd76cc 100644 --- a/Software/platformio.ini +++ b/Software/platformio.ini @@ -59,3 +59,4 @@ lib_deps = robtillaart/I2C_EEPROM @ ^1.5.2 mikalhart/TinyGPSPlus @ ^1.0.3 me-no-dev/ESP Async WebServer @ ^1.2.3 + bblanchon/ArduinoJson @ ^6.19.4 \ No newline at end of file diff --git a/Software/src/webui.cpp b/Software/src/webui.cpp index 47d1750..f0e5155 100644 --- a/Software/src/webui.cpp +++ b/Software/src/webui.cpp @@ -9,6 +9,8 @@ void WebserverPOST_Callback(AsyncWebServerRequest *request); void WebserverNotFound_Callback(AsyncWebServerRequest *request); void Webserver_Callback(AsyncWebServerRequest *request); void WebserverFirmwareUpdate_Callback(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final); +void WebserverEERestore_Callback(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final); +void WebServerEEJSON_Callback(AsyncWebServerRequest *request); void GetFlashVersion(char *buff, size_t buff_size); void initWebUI() @@ -37,8 +39,11 @@ void initWebUI() webServer.onNotFound(WebserverNotFound_Callback); webServer.on("/index.htm", HTTP_GET, Webserver_Callback); webServer.on("/post.htm", HTTP_POST, WebserverPOST_Callback); + webServer.on("/eejson", HTTP_GET, WebServerEEJSON_Callback); webServer.on( "/doUpdate", HTTP_POST, [](AsyncWebServerRequest *request) {}, WebserverFirmwareUpdate_Callback); + webServer.on( + "/eeRestore", HTTP_POST, [](AsyncWebServerRequest *request) {}, WebserverEERestore_Callback); webServer.begin(); } @@ -327,6 +332,10 @@ void WebserverPOST_Callback(AsyncWebServerRequest *request) globals.systemStatus = sysStat_Purge; globals.purgePulses = LubeConfig.BleedingPulses; } + if(p->name() == "reboot") + { + globals.systemStatus = sysStat_Shutdown; + } // end: POST Form Maintenance } } @@ -395,3 +404,100 @@ void WebserverFirmwareUpdate_Callback(AsyncWebServerRequest *request, const Stri } } } + +void WebserverEERestore_Callback(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final) +{ + + bool ee_done = false; + bool validext = false; + + if (!index) + { + Serial.println("EEPROM restore"); + size_t content_len = request->contentLength(); + validext = (filename.indexOf(".ee.json") > -1); + } + + if (validext) + { + Serial.println("Restoring EEPROM-Stuff"); + } + + if (final) + { + AsyncWebServerResponse *response = request->beginResponse(302, "text/plain", "Please wait while the device reboots"); + response->addHeader("Refresh", "20"); + response->addHeader("Location", "/"); + request->send(response); + if (ee_done) + { + Serial.println("Update complete"); + Serial.flush(); + globals.systemStatus = sysStat_Shutdown; + } + else + { + } + } +} + +void WebServerEEJSON_Callback(AsyncWebServerRequest *request) +{ + AsyncResponseStream *response = request->beginResponseStream("application/json"); + DynamicJsonDocument json(1024); + JsonObject fwinfo = json.createNestedObject("info"); + + char buffer[16]; + + fwinfo["DeviceName"] = globals.DeviceName; + fwinfo["FW-Version"] = QUOTE(SW_VERSION); + fwinfo["FS-Version"] = globals.FlashVersion; + + JsonObject config = json.createNestedObject("config"); + + config["EEPROM_Version"] = LubeConfig.EEPROM_Version; + config["DistancePerLube_Default"] = LubeConfig.DistancePerLube_Default; + config["DistancePerLube_Rain"] = LubeConfig.DistancePerLube_Rain; + config["tankCapacity_ml"] = LubeConfig.tankCapacity_ml; + config["amountPerDose_µl"] = LubeConfig.amountPerDose_µl; + config["TankRemindAtPercentage"] = LubeConfig.TankRemindAtPercentage; + config["PulsePerRevolution"] = LubeConfig.PulsePerRevolution; + config["TireWidth_mm"] = LubeConfig.TireWidth_mm; + config["TireWidthHeight_Ratio"] = LubeConfig.TireWidthHeight_Ratio; + config["RimDiameter_Inch"] = LubeConfig.RimDiameter_Inch; + config["DistancePerRevolution_mm"] = LubeConfig.DistancePerRevolution_mm; + config["BleedingPulses"] = LubeConfig.BleedingPulses; + config["SpeedSource"] = LubeConfig.SpeedSource; + config["SpeedSource_Str"] = SpeedSourceString[LubeConfig.SpeedSource]; +#ifdef FEATURE_ENABLE_GPS + config["GPSBaudRate"] = LubeConfig.GPSBaudRate; + config["GPSBaudRate_Str"] = GPSBaudRateString[LubeConfig.GPSBaudRate]; +#endif +#ifdef FEATURE_ENABLE_CAN + config["CANSource"] = LubeConfig.CANSource; + config["CANSource_Str"] = CANSourceString[LubeConfig.CANSource]; +#endif + sprintf(buffer, "0x%08X", LubeConfig.checksum); + config["checksum"] = buffer; + + JsonObject eepart = json.createNestedObject("eepart"); + + sprintf(buffer, "0x%04X", globals.eePersistanceAdress); + eepart["PersistanceAddress"] = buffer; + + JsonObject persis = json.createNestedObject("persis"); + + persis["writeCycleCounter"] = PersistenceData.writeCycleCounter; + persis["tankRemain_µl"] = PersistenceData.tankRemain_µl; + persis["TravelDistance_highRes_mm"] = PersistenceData.TravelDistance_highRes_mm; + persis["odometer_mm"] = PersistenceData.odometer_mm; + persis["odometer"] = PersistenceData.odometer; + sprintf(buffer, "0x%08X", PersistenceData.checksum); + persis["checksum"] = buffer; + + serializeJsonPretty(json, *response); + + response->addHeader("Content-disposition", "attachment; filename=backup.ee.json"); + + request->send(response); +} \ No newline at end of file diff --git a/Software/src/webui.h b/Software/src/webui.h index 772c5dd..170c5b1 100644 --- a/Software/src/webui.h +++ b/Software/src/webui.h @@ -8,6 +8,8 @@ #include <ESPAsyncWebServer.h> #include <Updater.h> #include <ESP8266mDNS.h> +#include <AsyncJson.h> +#include <ArduinoJson.h> #include "config.h" #include "globals.h"