From 48c6a35caeb7f7c94babbcf578e4ede5db9a466d Mon Sep 17 00:00:00 2001
From: Ricardo Bartels <ricardo@bitchbrothers.com>
Date: Wed, 30 Dec 2020 03:28:41 +0100
Subject: [PATCH] adds modal to reset button

refs: #94
---
 data/settings.htm                 | 26 ++++++++-
 esp8266-fastled-iot-webserver.ino | 93 ++++++++++++++++++++-----------
 2 files changed, 84 insertions(+), 35 deletions(-)

diff --git a/data/settings.htm b/data/settings.htm
index f80b1ba..43137a9 100644
--- a/data/settings.htm
+++ b/data/settings.htm
@@ -160,7 +160,7 @@
       <div class="form-group">
         <div class="col-sm-offset-2 col-sm-10">
           <button type="submit" class="btn btn-default">Update</button>
-          <a role="button" href='/reset' class="pull-right btn btn-danger" style="margin-left: 10px;" title="Reset">RESET</a>
+          <a role="button" data-toggle="modal" data-target="#reset_modal" data-action="add" class="pull-right btn btn-danger" style="margin-left: 10px;" title="Reset">RESET</a>
           <a role="button" href='/reboot' class="pull-right btn btn-info" style="margin-left: 10px;" title="Reboot">Reboot</a>
           <a id="alexaSupportEntry" role="button" href='/alexa' target="_blank" class="pull-right btn btn-success" style="margin-left: 10px;" title="Alexa">Alexa Pairing</a>
           <a id="otaSupportEntry" role="button" href="/ota" target="_blank" class="pull-right btn btn-success" title="OTA">OTA Update</a>
@@ -172,6 +172,30 @@
 
   </div>
 
+  <div class="modal fade" id="reset_modal" tabindex="-1" role="dialog" aria-labelledby="Reset_Modal" aria-hidden="true">
+    <form action="/reset" method="post">
+      <div class="modal-dialog">
+        <div class="modal-content">
+          <div class="modal-header">
+            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+            <h4 class="modal-title" id="edit_room_lable">Reset settings</h4>
+          </div>
+          <div class="modal-body">
+              <div class="form-group form-group-lg row">
+                <div class="col-sm-offset-3 col-sm-6">
+                  <a role="button" href='/reset?type=wifi' class="btn btn-warning btn-lg btn-block">Delete WIFI settings</a>
+                  <a role="button" href='/reset?type=all' class="btn btn-danger btn-lg btn-block">Delete ALL settings</a>
+                </div>
+              </div>
+          </div>
+          <div class="modal-footer">
+            <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
+          </div>
+        </div>
+      </div>
+      </form>
+    </div>
+
   <!-- request js from the ESP8266 web server -->
   <script src="js/jquery-3.1.1.min.js"></script>
   <script src="js/bootstrap.min.js"></script>
diff --git a/esp8266-fastled-iot-webserver.ino b/esp8266-fastled-iot-webserver.ino
index 11b9ff1..7869f16 100644
--- a/esp8266-fastled-iot-webserver.ino
+++ b/esp8266-fastled-iot-webserver.ino
@@ -708,7 +708,40 @@ void addRebootPage(int webServerNr)
     #endif // ENABLE_ALEXA_SUPPORT
 }
 
+// we can't assing wifiManager.resetSettings(); to reset, somewhow it gets called straight away.
+void setWiFiConf(String ssid, String password)
+{
+#ifdef ESP8266
+    struct station_config conf;
+
+    wifi_station_get_config(&conf);
+
+    memset(conf.ssid, 0, sizeof(conf.ssid));
+    for (int i = 0; i < ssid.length() && i < sizeof(conf.ssid); i++)
+        conf.ssid[i] = ssid.charAt(i);
+
+    memset(conf.password, 0, sizeof(conf.password));
+    for (int i = 0; i < password.length() && i < sizeof(conf.password); i++)
+        conf.password[i] = password.charAt(i);
+
+    wifi_station_set_config(&conf);
+
+// untested due to lack of ESP32
+#elif defined(ESP32)
+    if(WiFiGenericClass::getMode() != WIFI_MODE_NULL){
+
+          wifi_config_t conf;
+          esp_wifi_get_config(WIFI_IF_STA, &conf);
 
+          memset(conf.sta.ssid, 0, sizeof(conf.sta.ssid));
+          ssid.toCharArray(conf.sta.ssid, sizeof(conf.sta.ssid));
+          memset(conf.sta.password, 0, sizeof(conf.sta.password));
+          password.toCharArray(conf.sta.password, sizeof(conf.sta.password));
+
+          esp_wifi_set_config(WIFI_IF_STA, &conf);
+    }
+#endif
+}
 void setup() {
     WiFi.setSleepMode(WIFI_NONE_SLEEP);
     Serial.begin(115200);
@@ -779,10 +812,6 @@ void setup() {
     char nameChar[nameString.length() + 1];
     nameString.toCharArray(nameChar, sizeof(nameChar));
 
-    //reset settings - wipe credentials for testing
-    // wifiManager.resetSettings();
-
-    wifiManager.setConfigPortalBlocking(false);
     wifiManager.setHostname(cfg.hostname);
 
     //automatically connect using saved credentials if they exist
@@ -1018,36 +1047,7 @@ void setup() {
         String password = webServer.arg("password");
 
         if (ssid.length() != 0 && password.length() != 0) {
-#ifdef ESP8266
-            struct station_config conf;
-
-            wifi_station_get_config(&conf);
-
-            memset(conf.ssid, 0, sizeof(conf.ssid));
-            for (int i = 0; i < ssid.length() && i < sizeof(conf.ssid); i++)
-                conf.ssid[i] = ssid.charAt(i);
-
-            memset(conf.password, 0, sizeof(conf.password));
-            for (int i = 0; i < password.length() && i < sizeof(conf.password); i++)
-                conf.password[i] = password.charAt(i);
-
-            wifi_station_set_config(&conf);
-
-// untested due to lack of ESP32
-#elif defined(ESP32)
-            if(WiFiGenericClass::getMode() != WIFI_MODE_NULL){
-
-                  wifi_config_t conf;
-                  esp_wifi_get_config(WIFI_IF_STA, &conf);
-
-                  memset(conf.sta.ssid, 0, sizeof(conf.sta.ssid));
-                  ssid.toCharArray(conf.sta.ssid, sizeof(conf.sta.ssid));
-                  memset(conf.sta.password, 0, sizeof(conf.sta.password));
-                  password.toCharArray(conf.sta.password, sizeof(conf.sta.password));
-
-                  esp_wifi_set_config(WIFI_IF_STA, &conf);
-            }
-#endif
+            setWiFiConf(ssid, password);
             force_restart = true;
         }
 
@@ -1104,6 +1104,29 @@ void setup() {
         }
         });
 
+    webServer.on("/reset", HTTP_GET, []() {
+
+        // delete EEPROM settings
+        if (webServer.arg("type") == String("all")) {
+            // delete EEPROM config
+            EEPROM.begin(4095);
+            for (int i = 0 ; i < sizeof(cfg) ; i++) {
+                EEPROM.write(i, 0);
+            }
+            delay(200);
+            EEPROM.commit();
+            EEPROM.end();
+        }
+
+        // delete wireless config
+        if (webServer.arg("type") == String("wifi") || webServer.arg("type") == String("all")) {
+            setWiFiConf(String(""), String(""));
+        }
+        webServer.send(200, "text/html", "<html><head></head><body><font face='arial'><b><h2>Config reset finished. Device is rebooting now and you need to connect to the wireless again.</h2></b></font></body></html>");
+        delay(500);
+        ESP.restart();
+        });
+
     webServer.on("/fieldValue", HTTP_GET, []() {
         String name = webServer.arg("name");
         String value = getFieldValue(name, fields, fieldCount);
@@ -1479,6 +1502,7 @@ void loadConfig()
         save_config = true;
     }
 
+#ifdef ENABLE_MQTT_SUPPORT
     // fall back to default settings if hostname is invalid
     if (!isValidHostname(cfg.MQTTHost, sizeof(cfg.MQTTHost))) {
         cfg.MQTTEnabled = MQTT_ENABLED;
@@ -1490,6 +1514,7 @@ void loadConfig()
         strncpy(cfg.MQTTDeviceName, MQTT_DEVICE_NAME, sizeof(cfg.MQTTDeviceName));
         save_config = true;
     }
+#endif
 }
 
 bool isValidHostname(char *hostname_to_check, long size)
-- 
GitLab