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%&#37;">
+          <div class="progress-bar text-light" role="progressbar" aria-valuenow="%TANK_REMAIN_CAPACITY%"
+            aria-valuemin="0" aria-valuemax="100" style="width: %TANK_REMAIN_CAPACITY%&#37;">
             %TANK_REMAIN_CAPACITY%&#37;
           </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">&Uuml;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&uuml;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&auml;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&auml;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"