From 167f45e630be5f7375a7387314900d020b547ef5 Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Sat, 25 Jan 2020 01:47:49 +0100
Subject: [PATCH] Save Settings to flash
---
platformio.ini | 2 +-
src/hasp.cpp | 20 ++--
src/hasp_config.cpp | 4 +-
src/hasp_http.cpp | 231 +++++++++++++++++++-------------------------
src/hasp_mqtt.cpp | 132 ++++++++++++++++++-------
src/hasp_mqtt.h | 4 +-
src/hasp_wifi.cpp | 102 ++++++++++++++-----
src/hasp_wifi.h | 3 +
8 files changed, 299 insertions(+), 199 deletions(-)
diff --git a/platformio.ini b/platformio.ini
index 86ec71c5..04a929e7 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -121,7 +121,7 @@ build_flags =
-D TFT_SCLK=14 ;D5
-D TFT_DC=15 ;D8
-D TFT_CS=16 ;D0
- -D TFT_BCKL=5 ;D1
+ -D TFT_BCKL=5 ;D1
-D TFT_RST=-1 ;RST
-D TOUCH_CS=0 ;D3 (can also be D1 or D4)
-D SPI_FREQUENCY=40000000
diff --git a/src/hasp.cpp b/src/hasp.cpp
index 323a0981..5549bd4b 100644
--- a/src/hasp.cpp
+++ b/src/hasp.cpp
@@ -24,6 +24,7 @@
#include "hasp_debug.h"
#include "hasp_config.h"
#include "hasp_mqtt.h"
+#include "hasp_wifi.h"
#include "hasp_gui.h"
#include "hasp_tft.h"
#include "hasp.h"
@@ -83,12 +84,15 @@ static const char * btnm_map2[] = {"0", "1", "\n", "2", "3", "\n", "4", "5",
"\n", "6", "7", "\n", "P1", "P2", "P3", ""};
*/
+static lv_font_t * haspFonts[6];
#if defined(ARDUINO_ARCH_ESP8266)
-lv_obj_t * pages[4];
-// lv_style_t styles[6];
+static lv_obj_t * pages[4];
+static lv_style_t labelStyles[6];
+static lv_style_t rollerStyles[6];
#else
-lv_obj_t * pages[12];
-// lv_style_t styles[20];
+static lv_obj_t * pages[12];
+static lv_style_t labelStyles[6];
+static lv_style_t rollerStyles[6];
#endif
uint16_t current_page = 0;
// uint16_t current_style = 0;
@@ -1019,10 +1023,12 @@ void haspReset()
{
mqttStop(); // Stop the MQTT Client first
configWriteConfig();
- debugPrintln(F("HASP: Reboot MCU"));
debugStop();
- delay(1000);
- ESP.restart(); // nextionReset();
+ delay(250);
+ wifiStop();
+ debugPrintln(F("HASP: Properly Rebooting the MCU now!"));
+ debugPrintln(F("-------------------------------------"));
+ ESP.restart();
delay(5000);
}
diff --git a/src/hasp_config.cpp b/src/hasp_config.cpp
index f92ec296..7c344ea1 100644
--- a/src/hasp_config.cpp
+++ b/src/hasp_config.cpp
@@ -112,10 +112,10 @@ void configWriteConfig()
changed |= haspGetConfig(settings[F("hasp")].to());
// changed |= httpGetConfig(settings[F("http")].to());
// changed |= mdnsGetConfig(settings[F("mdns")].to());
- // changed |= mqttGetConfig(settings[F("mqtt")].to());
+ changed |= mqttGetConfig(settings[F("mqtt")].to());
// changed |= otaGetConfig(settings[F("ota")].to());
// changed |= tftGetConfig(settings[F("tft")].to());
- // changed |= wifiGetConfig(settings[F("wifi")].to());
+ changed |= wifiGetConfig(settings[F("wifi")].to());
if(changed) {
File file = SPIFFS.open(HASP_CONFIG_FILE, "w");
diff --git a/src/hasp_http.cpp b/src/hasp_http.cpp
index 41ac2b6a..7ab16064 100644
--- a/src/hasp_http.cpp
+++ b/src/hasp_http.cpp
@@ -246,6 +246,26 @@ void webHandleRoot()
webServer.sendContent_P(HTTP_END); // 20
}
+////////////////////////////////////////////////////////////////////////////////////////////////////
+void httpHandleReboot()
+{ // http://plate01/reboot
+ if(!httpIsAuthenticated(F("/reboot"))) return;
+
+ String nodename = haspGetNodename();
+ String httpMessage = F("Rebooting Device");
+ webSendPage(nodename, httpMessage.length(), true);
+ webServer.sendContent(httpMessage); // len
+ webServer.sendContent_P(HTTP_END); // 20
+ delay(500);
+
+ debugPrintln(PSTR("HTTP: Reboot device"));
+ haspSetPage(0);
+ haspSetAttr(F("p[0].b[1].txt"), F("\"Rebooting...\""));
+
+ delay(500);
+ haspReset();
+}
+
////////////////////////////////////////////////////////////////////////////////////////////////////
void webHandleAbout()
{ // http://plate01/about
@@ -603,27 +623,28 @@ void webHandleConfig()
if(webServer.method() == HTTP_POST) {
if(webServer.hasArg(F("save"))) {
+
DynamicJsonDocument settings(256);
+ for(int i = 0; i < webServer.args(); i++) settings[webServer.argName(i)] = webServer.arg(i);
if(webServer.arg(F("save")) == String(F("hasp"))) {
- /*
- if(webServer.hasArg(F_CONFIG_THEME) settings[F_CONFIG_THEME] = webServer.arg(F_CONFIG_THEME).toInt();
- if(webServer.hasArg(F_CONFIG_HUE) settings[F_CONFIG_HUE] = webServer.arg(F_CONFIG_HUE.toInt();
- if(webServer.hasArg(F_CONFIG_ZIFONT) settings[F_CONFIG_ZIFONT] = webServer.arg(F_CONFIG_ZIFONT;
- if(webServer.hasArg(F_CONFIG_PAGES) settings[F_CONFIG_PAGES] = webServer.arg(F_CONFIG_PAGES;
- if(webServer.hasArg(F_CONFIG_STARTPAGE)
- settings[F_CONFIG_STARTPAGE] = webServer.arg(F_CONFIG_STARTPAGE).toInt();*/
- for(int i = 0; i < webServer.args(); i++) settings[webServer.argName(i)] = webServer.arg(i);
-
haspSetConfig(settings.as());
} else if(webServer.arg(F("save")) == String(F("mqtt"))) {
+ mqttSetConfig(settings.as());
+
} else if(webServer.arg(F("save")) == String(F("http"))) {
+
} else if(webServer.arg(F("save")) == String(F("wifi"))) {
+ wifiSetConfig(settings.as());
}
}
}
+ if(WiFi.getMode() == WIFI_AP) {
+ httpHandleReboot();
+ }
+
char buffer[64];
String nodename = haspGetNodename();
String httpMessage((char *)0);
@@ -666,101 +687,68 @@ void webHandleMqttConfig()
{ // http://plate01/config/mqtt
if(!httpIsAuthenticated(F("/config/mqtt"))) return;
+ DynamicJsonDocument settings(256);
+ mqttGetConfig(settings.to());
+
char buffer[64];
String nodename = haspGetNodename();
String httpMessage((char *)0);
httpMessage.reserve(1024);
- httpMessage += String(F(""));
-
- if (updateEspAvailable)
- {
- httpMessage += String(F("
HASP Update
- available!
")); httpMessage += String(F(""));
- }*/
-
- httpMessage += F("");
-
- httpMessage += F("
");
+ httpMessage += String(F("");
+ httpMessage += F("");
+
+ webSendPage(nodename, httpMessage.length(), false);
+ webServer.sendContent(httpMessage); // len
+ webServer.sendContent_P(HTTP_END); // 20
+}
+#endif
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+#if LV_USE_HASP_WIFI > 0
+void webHandleWifiConfig()
+{ // http://plate01/config/wifi
+ if(!httpIsAuthenticated(F("/config/wifi"))) return;
+
+ DynamicJsonDocument settings(256);
+ wifiGetConfig(settings.to());
+
+ char buffer[64];
+ String nodename = haspGetNodename();
+ String httpMessage((char *)0);
+ httpMessage.reserve(1024);
+
+ httpMessage += String(F("");
httpMessage += F("");
webSendPage(nodename, httpMessage.length(), false);
@@ -770,7 +758,6 @@ void webHandleMqttConfig()
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////
-#if LV_USE_HASP_MQTT > 0
void webHandleHaspConfig()
{ // http://plate01/config/http
if(!httpIsAuthenticated(F("/config/hasp"))) return;
@@ -863,7 +850,7 @@ void webHandleHaspConfig()
webServer.sendContent(httpMessage); // len
webServer.sendContent_P(HTTP_END); // 20
}
-#endif
+
////////////////////////////////////////////////////////////////////////////////////////////////////
void httpHandleNotFound()
{ // webServer 404
@@ -922,26 +909,6 @@ void httpHandleEspFirmware()
// espStartOta(webServer.arg("espFirmware"));
}
-////////////////////////////////////////////////////////////////////////////////////////////////////
-void httpHandleReboot()
-{ // http://plate01/reboot
- if(!httpIsAuthenticated(F("/reboot"))) return;
-
- String nodename = haspGetNodename();
- String httpMessage = F("Rebooting Device");
- webSendPage(nodename, httpMessage.length(), true);
- webServer.sendContent(httpMessage); // len
- webServer.sendContent_P(HTTP_END); // 20
- delay(500);
-
- debugPrintln(PSTR("HTTP: Reboot device"));
- haspSetPage(0);
- haspSetAttr(F("p[0].b[1].txt"), F("\"Rebooting...\""));
-
- delay(500);
- haspReset();
-}
-
////////////////////////////////////////////////////////////////////////////////////////////////////
void httpHandleResetConfig()
{ // http://plate01/resetConfig
@@ -1022,6 +989,9 @@ void httpSetup(const JsonObject & settings)
webServer.on(F("/config/hasp"), webHandleHaspConfig);
#if LV_USE_HASP_MQTT > 0
webServer.on(F("/config/mqtt"), webHandleMqttConfig);
+#endif
+#if LV_USE_HASP_WIFI > 0
+ webServer.on(F("/config/wifi"), webHandleWifiConfig);
#endif
webServer.on(F("/saveConfig"), webHandleSaveConfig);
webServer.on(F("/resetConfig"), httpHandleResetConfig);
@@ -1036,9 +1006,16 @@ void httpReconnect()
{
if(!httpEnable) return;
+ if(WiFi.getMode() == WIFI_AP) {
+ webServer.on(F("/"), webHandleWifiConfig);
+ webServer.on(F("/config"), webHandleConfig);
+ webServer.onNotFound(webHandleWifiConfig);
+ }
+
webServer.stop();
webServer.begin();
- debugPrintln(String(F("HTTP: Server started @ http://")) + WiFi.localIP().toString());
+ debugPrintln(String(F("HTTP: Server started @ http://")) +
+ (WiFi.getMode() == WIFI_AP ? WiFi.softAPIP().toString() : WiFi.localIP().toString()));
}
////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1050,14 +1027,10 @@ void httpLoop(bool wifiIsConnected)
////////////////////////////////////////////////////////////////////////////////////////////////////
bool httpGetConfig(const JsonObject & settings)
{
- if(!settings.isNull() && settings[F_HTTP_ENABLE] == httpEnable && settings[F_HTTP_PORT] == httpPort &&
- settings[F_HTTP_USER] == httpUser && settings[F_HTTP_PASS] == httpPassword)
- return false;
-
- settings[F_HTTP_ENABLE] = httpEnable;
- settings[F_HTTP_PORT] = httpPort;
- settings[F_HTTP_USER] = httpUser;
- settings[F_HTTP_PASS] = httpPassword;
+ settings[FPSTR(F_HTTP_ENABLE)] = httpEnable;
+ settings[FPSTR(F_HTTP_PORT)] = httpPort;
+ settings[FPSTR(F_HTTP_USER)] = httpUser;
+ settings[FPSTR(F_HTTP_PASS)] = httpPassword;
size_t size = serializeJson(settings, Serial);
Serial.println();
diff --git a/src/hasp_mqtt.cpp b/src/hasp_mqtt.cpp
index f0cdd117..15338f50 100644
--- a/src/hasp_mqtt.cpp
+++ b/src/hasp_mqtt.cpp
@@ -42,15 +42,31 @@ String mqttLightBrightStateTopic; // MQTT topic for outgoing panel backlight d
String mqttNodeTopic;
String mqttGroupTopic;
+bool mqttEnabled;
////////////////////////////////////////////////////////////////////////////////////////////////////
// These defaults may be overwritten with values saved by the web interface
-char mqttServer[64] = MQTT_HOST;
-uint16_t mqttPort = MQTT_PORT;
-char mqttUser[32] = MQTT_USER;
-char mqttPassword[32] = MQTT_PASSW;
-// char haspNode[16] = "plate01";
-String mqttGroupName = "plates";
+#ifdef MQTT_HOST
+std::string mqttServer = MQTT_HOST;
+#else
+std::string mqttServer = "";
+#endif
+#ifdef MQTT_PORT
+uint16_t mqttPort = MQTT_PORT;
+#else
+uint16_t mqttPort = 1883;
+#endif
+#ifdef MQTT_USER
+std::string mqttUser = MQTT_USER;
+#else
+std::string mqttUser = "";
+#endif
+#ifdef MQTT_PASSW
+std::string mqttPassword = MQTT_PASSW;
+#else
+std::string mqttPassword = "";
+#endif
+std::string mqttGroupName = "plates";
/*
const String mqttCommandSubscription = mqttCommandTopic + "/#";
@@ -278,12 +294,13 @@ void mqttReconnect()
mqttGroupTopic = topicBuffer;
// haspSetPage(0);
- debugPrintln(String(F("MQTT: Attempting connection to broker ")) + String(mqttServer) + String(F(" as clientID ")) +
- mqttClientId);
+ debugPrintln(String(F("MQTT: Attempting connection to broker ")) + String(mqttServer.c_str()) +
+ String(F(" as clientID ")) + mqttClientId);
// Attempt to connect and set LWT and Clean Session
sprintf_P(topicBuffer, PSTR("%sstatus"), mqttNodeTopic.c_str());
- if(!mqttClient.connect(mqttClientId.c_str(), mqttUser, mqttPassword, topicBuffer, 0, false, "OFF", true)) {
+ if(!mqttClient.connect(mqttClientId.c_str(), mqttUser.c_str(), mqttPassword.c_str(), topicBuffer, 0, false, "OFF",
+ true)) {
// Retry until we give up and restart after connectTimeout seconds
mqttReconnectCount++;
@@ -353,28 +370,19 @@ void mqttReconnect()
void mqttSetup(const JsonObject & settings)
{
- if(!settings[F_CONFIG_HOST].isNull()) {
- strcpy(mqttServer, settings[F_CONFIG_HOST]);
- }
- if(!settings[F_CONFIG_PORT].isNull()) {
- mqttPort = settings[F_CONFIG_PORT];
- }
- if(!settings[F_CONFIG_USER].isNull()) {
- strcpy(mqttUser, settings[F_CONFIG_USER]);
- }
- if(!settings[F_CONFIG_PASS].isNull()) {
- strcpy(mqttPassword, settings[F_CONFIG_PASS]);
- }
- if(!settings[F_CONFIG_GROUP].isNull()) {
- mqttGroupName = settings[F_CONFIG_GROUP].as();
- }
+ mqttSetConfig(settings);
- mqttClient.setServer(mqttServer, 1883);
+ mqttEnabled = mqttServer != "" && mqttPort > 0;
+ if(!mqttEnabled) return;
+
+ mqttClient.setServer(mqttServer.c_str(), 1883);
mqttClient.setCallback(mqttCallback);
}
void mqttLoop(bool wifiIsConnected)
{
+ if(!mqttEnabled) return;
+
if(wifiIsConnected && !mqttClient.connected())
mqttReconnect();
else
@@ -404,19 +412,71 @@ void mqttStop()
bool mqttGetConfig(const JsonObject & settings)
{
- if(!settings.isNull() && settings[F_CONFIG_HOST] == mqttServer && settings[F_CONFIG_PORT] == mqttPort &&
- settings[F_CONFIG_USER] == mqttUser && settings[F_CONFIG_PASS] == mqttPassword &&
- settings[F_CONFIG_GROUP] == mqttGroupName)
- return false;
-
- settings[F_CONFIG_GROUP] = mqttGroupName;
- settings[F_CONFIG_HOST] = mqttServer;
- settings[F_CONFIG_PORT] = mqttPort;
- settings[F_CONFIG_USER] = mqttUser;
- settings[F_CONFIG_PASS] = mqttPassword;
+ settings[FPSTR(F_CONFIG_GROUP)] = String(mqttGroupName.c_str());
+ settings[FPSTR(F_CONFIG_HOST)] = String(mqttServer.c_str());
+ settings[FPSTR(F_CONFIG_PORT)] = mqttPort;
+ settings[FPSTR(F_CONFIG_USER)] = String(mqttUser.c_str());
+ settings[FPSTR(F_CONFIG_PASS)] = String(mqttPassword.c_str());
size_t size = serializeJson(settings, Serial);
Serial.println();
return true;
-}
\ No newline at end of file
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+bool mqttSetConfig(const JsonObject & settings)
+{
+ bool changed = false;
+
+ if(!settings[FPSTR(F_CONFIG_GROUP)].isNull()) {
+ if(mqttGroupName != settings[FPSTR(F_CONFIG_GROUP)].as().c_str()) {
+ debugPrintln(F("mqttGroupName changed"));
+ }
+ changed |= mqttGroupName != settings[FPSTR(F_CONFIG_GROUP)].as().c_str();
+
+ mqttGroupName = settings[FPSTR(F_CONFIG_GROUP)].as().c_str();
+ }
+
+ if(!settings[FPSTR(F_CONFIG_HOST)].isNull()) {
+ if(mqttServer != settings[FPSTR(F_CONFIG_HOST)].as().c_str()) {
+ debugPrintln(F("mqttServer changed"));
+ }
+ changed |= mqttServer != settings[FPSTR(F_CONFIG_HOST)].as().c_str();
+
+ mqttServer = settings[FPSTR(F_CONFIG_HOST)].as().c_str();
+ }
+
+ if(!settings[FPSTR(F_CONFIG_PORT)].isNull()) {
+ if(mqttPort != settings[FPSTR(F_CONFIG_PORT)].as()) {
+ debugPrintln(F("mqttPort changed"));
+ }
+ changed |= mqttPort != settings[FPSTR(F_CONFIG_PORT)].as();
+
+ mqttPort = settings[FPSTR(F_CONFIG_PORT)].as();
+ }
+
+ if(!settings[FPSTR(F_CONFIG_USER)].isNull()) {
+ if(mqttUser != settings[FPSTR(F_CONFIG_USER)].as().c_str()) {
+ debugPrintln(F("mqttUser changed"));
+ }
+ changed |= mqttUser != settings[FPSTR(F_CONFIG_USER)].as().c_str();
+
+ mqttUser = settings[FPSTR(F_CONFIG_USER)].as().c_str();
+ }
+
+ if(!settings[FPSTR(F_CONFIG_PASS)].isNull()) {
+ if(mqttPassword != settings[FPSTR(F_CONFIG_PASS)].as().c_str()) {
+ debugPrintln(F("mqttPassword changed"));
+ }
+ changed |= mqttPassword != settings[FPSTR(F_CONFIG_PASS)].as().c_str();
+
+ mqttPassword = settings[FPSTR(F_CONFIG_PASS)].as().c_str();
+ }
+
+ size_t size = serializeJson(settings, Serial);
+ Serial.println();
+
+ return changed;
+}
diff --git a/src/hasp_mqtt.h b/src/hasp_mqtt.h
index 8e121343..e788613b 100644
--- a/src/hasp_mqtt.h
+++ b/src/hasp_mqtt.h
@@ -7,7 +7,6 @@ void mqttSetup(const JsonObject & settings);
void mqttLoop(bool wifiIsConnected);
void mqttStop();
void mqttReconnect();
-bool mqttGetConfig(const JsonObject & settings);
void mqttSendNewEvent(uint8_t pageid, uint8_t btnid, int32_t val);
void mqttSendNewValue(uint8_t pageid, uint8_t btnid, int32_t val);
@@ -16,4 +15,7 @@ void mqttHandlePage(String strPageid);
bool mqttIsConnected(void);
+bool mqttGetConfig(const JsonObject & settings);
+bool mqttSetConfig(const JsonObject & settings);
+
#endif
\ No newline at end of file
diff --git a/src/hasp_wifi.cpp b/src/hasp_wifi.cpp
index 460afd84..6677a8a9 100644
--- a/src/hasp_wifi.cpp
+++ b/src/hasp_wifi.cpp
@@ -20,11 +20,22 @@
static WiFiEventHandler wifiEventHandler[3];
#endif
-
+#include "DNSserver.h"
#include "user_config_override.h"
-std::string wifiSsid = WIFI_SSID;
+#ifdef WIFI_SSID
+std::string wifiSsid = WIFI_SSID;
+#else
+std::string wifiSsid = "";
+#endif
+#ifdef WIFI_PASSW
std::string wifiPassword = WIFI_PASSW;
+#else
+std::string wifiPassword = "";
+#endif
+
+const byte DNS_PORT = 53;
+DNSServer dnsServer;
// long wifiPrevMillis = 0;
// bool wifiWasConnected = false;
@@ -101,33 +112,40 @@ void wifiSetup(JsonObject settings)
{
char buffer[64];
- if(!settings[F_CONFIG_SSID].isNull()) {
- wifiSsid = settings[F_CONFIG_SSID].as().c_str();
+ wifiSetConfig(settings);
- // sprintf_P(buffer, PSTR("Wifi Ssid: %s"), wifiSsid.c_str());
- // debugPrintln(buffer);
- }
- if(!settings[F_CONFIG_PASS].isNull()) {
- wifiPassword = settings[F_CONFIG_PASS].as().c_str();
+ if(wifiSsid == "") {
+ WiFi.mode(WIFI_AP);
+ WiFi.softAP("HASP-test", "haspadmin");
+ IPAddress IP = WiFi.softAPIP();
- // sprintf_P(buffer, PSTR("Wifi Password: %s"), wifiPassword.c_str());
- // debugPrintln(buffer);
+ /* Setup the DNS server redirecting all the domains to the apIP */
+ dnsServer.setErrorReplyCode(DNSReplyCode::NoError);
+ dnsServer.start(DNS_PORT, "*", IP);
+
+ sprintf_P(buffer, PSTR("WIFI: Setting up temporary Access Point"));
+ debugPrintln(buffer);
+ sprintf_P(buffer, PSTR("WIFI: AP IP address : %s"), IP.toString().c_str());
+ debugPrintln(buffer);
+
+ httpReconnect();
+ return;
}
+ WiFi.mode(WIFI_STA);
sprintf_P(buffer, PSTR("WIFI: Connecting to : %s"), wifiSsid.c_str());
debugPrintln(buffer);
- WiFi.mode(WIFI_STA);
- WiFi.begin(wifiSsid.c_str(), wifiPassword.c_str());
-
-#if defined(ARDUINO_ARCH_ESP32)
- WiFi.onEvent(wifi_callback);
-#endif
#if defined(ARDUINO_ARCH_ESP8266)
wifiEventHandler[0] = WiFi.onStationModeGotIP(wifiSTAGotIP); // As soon WiFi is connected, start NTP Client
wifiEventHandler[1] = WiFi.onStationModeDisconnected(wifiSTADisconnected);
wifiEventHandler[2] = WiFi.onStationModeConnected(wifiSTAConnected);
#endif
+#if defined(ARDUINO_ARCH_ESP32)
+ WiFi.onEvent(wifi_callback);
+#endif
+
+ WiFi.begin(wifiSsid.c_str(), wifiPassword.c_str());
}
bool wifiLoop()
@@ -165,15 +183,53 @@ bool wifiLoop()
bool wifiGetConfig(const JsonObject & settings)
{
- if(!settings.isNull() && settings[F_CONFIG_SSID] == String(wifiSsid.c_str()) &&
- settings[F_CONFIG_PASS] == String(wifiPassword.c_str()))
- return false;
-
- settings[F_CONFIG_SSID] = String(wifiSsid.c_str());
- settings[F_CONFIG_PASS] = String(wifiPassword.c_str());
+ settings[FPSTR(F_CONFIG_SSID)] = String(wifiSsid.c_str());
+ settings[FPSTR(F_CONFIG_PASS)] = String(wifiPassword.c_str());
size_t size = serializeJson(settings, Serial);
Serial.println();
return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+bool wifiSetConfig(const JsonObject & settings)
+{
+ /* if(!settings.isNull() && settings[FPSTR(F_CONFIG_STARTPAGE)] == haspStartPage &&
+ settings[FPSTR(F_CONFIG_THEME)] == haspThemeId && settings[FPSTR(F_CONFIG_HUE)] == haspThemeHue &&
+ settings[FPSTR(F_CONFIG_ZIFONT)] == haspZiFontPath && settings[FPSTR(F_CONFIG_PAGES)] == haspPagesPath)
+ return false;
+ */
+ bool changed = false;
+
+ if(!settings[FPSTR(F_CONFIG_SSID)].isNull()) {
+ if(wifiSsid != settings[FPSTR(F_CONFIG_SSID)].as().c_str()) {
+ debugPrintln(F("wifiSsid changed"));
+ }
+ changed |= wifiSsid != settings[FPSTR(F_CONFIG_SSID)].as().c_str();
+
+ wifiSsid = settings[FPSTR(F_CONFIG_SSID)].as().c_str();
+ }
+
+ if(!settings[FPSTR(F_CONFIG_PASS)].isNull() && settings[FPSTR(F_CONFIG_PASS)].as() != F("********")) {
+ if(wifiPassword != settings[FPSTR(F_CONFIG_PASS)].as().c_str()) {
+ debugPrintln(F("wifiPassword changed"));
+ }
+ changed |= wifiPassword != settings[FPSTR(F_CONFIG_PASS)].as().c_str();
+
+ wifiPassword = settings[FPSTR(F_CONFIG_PASS)].as().c_str();
+ }
+
+ size_t size = serializeJson(settings, Serial);
+ Serial.println();
+
+ return changed;
+}
+
+void wifiStop()
+{
+ debugPrintln(F("WIFI: Stopped"));
+ WiFi.mode(WIFI_OFF);
+ WiFi.disconnect();
}
\ No newline at end of file
diff --git a/src/hasp_wifi.h b/src/hasp_wifi.h
index ddee217b..32ed79ad 100644
--- a/src/hasp_wifi.h
+++ b/src/hasp_wifi.h
@@ -5,6 +5,9 @@
void wifiSetup(JsonObject settings);
bool wifiLoop();
+void wifiStop();
+
bool wifiGetConfig(const JsonObject & settings);
+bool wifiSetConfig(const JsonObject & settings);
#endif
\ No newline at end of file