From 3bc0ee7180201763c45382d7d5bd427d2347fcd0 Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Thu, 30 Jan 2020 23:09:49 +0100
Subject: [PATCH] Add Web Config page
---
src/hasp_http.cpp | 167 ++++++++++++++++++++++++++++++++++------------
src/hasp_http.h | 1 +
2 files changed, 127 insertions(+), 41 deletions(-)
diff --git a/src/hasp_http.cpp b/src/hasp_http.cpp
index 5fc9918b..2feaea28 100644
--- a/src/hasp_http.cpp
+++ b/src/hasp_http.cpp
@@ -16,18 +16,13 @@
#include
#include
-#define F_HTTP_ENABLE F("enable")
-#define F_HTTP_PORT F("port")
-#define F_HTTP_USER F("user")
-#define F_HTTP_PASS F("pass")
-
bool httpEnable = true;
bool webServerStarted = false;
uint16_t httpPort = 80;
FS * filesystem = &SPIFFS;
File fsUploadFile;
-String httpUser = "admin";
-String httpPassword = "";
+char httpUser[32] = "";
+char httpPassword[64] = "";
#if defined(ARDUINO_ARCH_ESP8266)
#include
@@ -104,6 +99,10 @@ String esp32ResetReason(uint8_t cpuid)
#endif // ESP32
+static const char MAIN_MENU_BUTTON[] PROGMEM =
+ "
";
+static const char MIT_LICENSE[] PROGMEM = "MIT License";
+
static const char HTTP_DOCTYPE[] PROGMEM =
"";
@@ -152,7 +151,7 @@ void webHandleHaspConfig();
bool httpIsAuthenticated(const String & page)
{
if(httpPassword[0] != '\0') { // Request HTTP auth if httpPassword is set
- if(!webServer.authenticate(httpUser.c_str(), httpPassword.c_str())) {
+ if(!webServer.authenticate(httpUser, httpPassword)) {
webServer.requestAuthentication();
return false;
}
@@ -220,7 +219,8 @@ void webHandleRoot()
httpMessage += String(F(""));
httpMessage += F("");
- httpMessage += F("");
+ httpMessage +=
+ PSTR("");
httpMessage +=
F("");
@@ -266,26 +266,32 @@ void webHandleAbout()
String httpMessage((char *)0);
httpMessage.reserve(1500);
- httpMessage += F("HASP OpenHardware edition
Copyright© 2020 Francis Van Roie "
- "MIT License");
+ httpMessage += F("HASP OpenHardware edition
Copyright© 2020 Francis Van Roie ");
+ httpMessage += FPSTR(MIT_LICENSE);
httpMessage += F("Based on the previous work of the following open source developers.
");
- httpMessage +=
- F("HASwitchPlate
Copyright© 2019 Allen Derusha allen@derusha.orgMIT License");
+ httpMessage += F("HASwitchPlate
Copyright© 2019 Allen Derusha allen@derusha.org");
+ httpMessage += FPSTR(MIT_LICENSE);
httpMessage +=
F("LittlevGL
Copyright© 2016 Gábor Kiss-VámosiCopyright© 2019 "
- "LittlevGLMIT License");
- httpMessage += F("zi Font Engine
Copyright© 2020 Francis Van RoieMIT License");
+ "LittlevGL");
+ httpMessage += FPSTR(MIT_LICENSE);
+ httpMessage += F("zi Font Engine
Copyright© 2020 Francis Van Roie");
+ httpMessage += FPSTR(MIT_LICENSE);
httpMessage += F("TFT_eSPI Library
Copyright© 2017 Bodmer (https://github.com/Bodmer) All "
"rights reserved.FreeBSD License");
httpMessage +=
F("includes parts from the Adafruit_GFX libraryCopyright© 2012 Adafruit Industries. "
"All rights reservedBSD License
");
- httpMessage += F("ArduinoJson
Copyright© 2014-2019 Benoit BLANCHONMIT License");
- httpMessage += F("PubSubClient
Copyright© 2008-2015 Nicholas O'LearyMIT License");
- httpMessage += F("Syslog
Copyright© 2016 Martin SloupMIT License");
- httpMessage += F("QR Code generator
Copyright© Project NayukiMIT License");
+ httpMessage += F("ArduinoJson
Copyright© 2014-2019 Benoit BLANCHON");
+ httpMessage += FPSTR(MIT_LICENSE);
+ httpMessage += F("PubSubClient
Copyright© 2008-2015 Nicholas O'Leary");
+ httpMessage += FPSTR(MIT_LICENSE);
+ httpMessage += F("Syslog
Copyright© 2016 Martin Sloup");
+ httpMessage += FPSTR(MIT_LICENSE);
+ httpMessage += F("QR Code generator
Copyright© Project Nayuki");
+ httpMessage += FPSTR(MIT_LICENSE);
- httpMessage += F("");
+ httpMessage += FPSTR(MAIN_MENU_BUTTON);
webSendPage(nodename, httpMessage.length(), false);
webServer.sendContent(httpMessage); // len
@@ -370,7 +376,8 @@ void webHandleInfo()
httpMessage += String(ESP.getResetInfo());
#endif
- httpMessage += F("");
+ httpMessage += FPSTR(MAIN_MENU_BUTTON);
+ ;
webSendPage(nodename, httpMessage.length(), false);
webServer.sendContent(httpMessage); // len
@@ -625,20 +632,24 @@ void webHandleConfig()
if(!httpIsAuthenticated(F("/config"))) return;
if(webServer.method() == HTTP_POST) {
- if(webServer.hasArg(F("save"))) {
+ if(webServer.hasArg(PSTR("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.arg(PSTR("save")) == String(PSTR("hasp"))) {
haspSetConfig(settings.as());
- } else if(webServer.arg(F("save")) == String(F("mqtt"))) {
+ } else if(webServer.arg(PSTR("save")) == String(PSTR("mqtt"))) {
mqttSetConfig(settings.as());
- } else if(webServer.arg(F("save")) == String(F("http"))) {
+ } else if(webServer.arg(PSTR("save")) == String(PSTR("http"))) {
+ httpSetConfig(settings.as());
- } else if(webServer.arg(F("save")) == String(F("wifi"))) {
+ // Password might have changed
+ if(!httpIsAuthenticated(F("/config"))) return;
+
+ } else if(webServer.arg(PSTR("save")) == String(PSTR("wifi"))) {
wifiSetConfig(settings.as());
}
}
@@ -675,9 +686,10 @@ void webHandleConfig()
F("");
httpMessage += F("");
+ "All Settings");
- httpMessage += F("");
+ httpMessage += FPSTR(MAIN_MENU_BUTTON);
+ ;
webSendPage(nodename, httpMessage.length(), false);
webServer.sendContent(httpMessage); // len
@@ -719,8 +731,9 @@ void webHandleMqttConfig()
"name='pass' type='password' maxlength=31 placeholder='mqttPassword' value='");
if(settings[FPSTR(F_CONFIG_PASS)].as() != "") httpMessage += F("********");
- httpMessage += F("'>");
- httpMessage += F("");
+ httpMessage += F("'>");
+ httpMessage +=
+ PSTR("");
webSendPage(nodename, httpMessage.length(), false);
webServer.sendContent(httpMessage); // len
@@ -755,7 +768,43 @@ void webHandleWifiConfig()
if(WiFi.getMode() == WIFI_STA) {
httpMessage +=
- F("");
+ PSTR("");
+ }
+
+ webSendPage(nodename, httpMessage.length(), false);
+ webServer.sendContent(httpMessage); // len
+ webServer.sendContent_P(HTTP_END); // 20
+}
+#endif
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+#if LV_USE_HASP_HTTP > 0
+void webHandleHttpConfig()
+{ // http://plate01/config/http
+ if(!httpIsAuthenticated(F("/config/http"))) return;
+
+ DynamicJsonDocument settings(256);
+ httpGetConfig(settings.to());
+
+ char buffer[64];
+ String nodename = haspGetNodename();
+ String httpMessage((char *)0);
+ httpMessage.reserve(1024);
+
+ httpMessage += String(F("");
+
+ if(WiFi.getMode() == WIFI_STA) {
+ httpMessage +=
+ PSTR("");
}
webSendPage(nodename, httpMessage.length(), false);
@@ -849,9 +898,10 @@ void webHandleHaspConfig()
"name='startpage' type='number' min='0' max='3' value='")) +
settings[FPSTR(F_CONFIG_STARTPAGE)].as() + "'>";
- httpMessage += F("");
+ httpMessage += F("");
- httpMessage += F("");
+ httpMessage +=
+ PSTR("");
webSendPage(nodename, httpMessage.length(), false);
webServer.sendContent(httpMessage); // len
@@ -925,7 +975,7 @@ void httpHandleResetConfig()
String nodename = haspGetNodename();
char buffer[64];
String httpMessage((char *)0);
- httpMessage.reserve(128);
+ httpMessage.reserve(768);
if(resetConfirmed) { // User has confirmed, so reset everything
httpMessage += F("");
@@ -944,8 +994,10 @@ void httpHandleResetConfig()
"re-configure the device before accessing it again. ALL FILES WILL BE LOST!"
"
"
- "
");
+ "
");
+
+ httpMessage +=
+ PSTR("");
}
webSendPage(nodename, httpMessage.length(), resetConfirmed);
@@ -953,8 +1005,9 @@ void httpHandleResetConfig()
webServer.sendContent_P(HTTP_END); // 20
if(resetConfirmed) {
- delay(1000);
+ delay(250);
// configClearSaved();
+ haspReset();
}
}
@@ -994,6 +1047,7 @@ void httpSetup(const JsonObject & settings)
webServer.on(F("/info"), webHandleInfo);
webServer.on(F("/config"), webHandleConfig);
webServer.on(F("/config/hasp"), webHandleHaspConfig);
+ webServer.on(F("/config/http"), webHandleHttpConfig);
#if LV_USE_HASP_MQTT > 0
webServer.on(F("/config/mqtt"), webHandleMqttConfig);
#endif
@@ -1034,13 +1088,44 @@ void httpLoop(bool wifiIsConnected)
////////////////////////////////////////////////////////////////////////////////////////////////////
bool httpGetConfig(const JsonObject & settings)
{
- settings[FPSTR(F_HTTP_ENABLE)] = httpEnable;
- settings[FPSTR(F_HTTP_PORT)] = httpPort;
- settings[FPSTR(F_HTTP_USER)] = httpUser;
- settings[FPSTR(F_HTTP_PASS)] = httpPassword;
+ settings[FPSTR(F_CONFIG_ENABLE)] = httpEnable;
+ settings[FPSTR(F_CONFIG_PORT)] = httpPort;
+ settings[FPSTR(F_CONFIG_USER)] = httpUser;
+ settings[FPSTR(F_CONFIG_PASS)] = httpPassword;
size_t size = serializeJson(settings, Serial);
Serial.println();
return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+bool httpSetConfig(const JsonObject & settings)
+{
+ bool changed = false;
+
+ if(!settings[FPSTR(F_CONFIG_USER)].isNull()) {
+ changed |= strcmp(httpUser, settings[FPSTR(F_CONFIG_USER)]) != 0;
+ strncpy(httpUser, settings[FPSTR(F_CONFIG_USER)], sizeof(httpUser));
+ }
+
+ if(!settings[FPSTR(F_CONFIG_PASS)].isNull()) {
+ changed |= strcmp(httpPassword, settings[FPSTR(F_CONFIG_PASS)]) != 0;
+ strncpy(httpPassword, settings[FPSTR(F_CONFIG_PASS)], sizeof(httpPassword));
+ }
+
+ if(!settings[FPSTR(F_CONFIG_PORT)].isNull()) {
+ if(httpPort != settings[FPSTR(F_CONFIG_PORT)].as()) {
+ debugPrintln(F("httpPort set"));
+ }
+ changed |= httpPort != settings[FPSTR(F_CONFIG_PORT)].as();
+
+ httpPort = settings[FPSTR(F_CONFIG_PORT)].as();
+ }
+
+ size_t size = serializeJson(settings, Serial);
+ Serial.println();
+
+ return changed;
}
\ No newline at end of file
diff --git a/src/hasp_http.h b/src/hasp_http.h
index d68e08b5..d0744928 100644
--- a/src/hasp_http.h
+++ b/src/hasp_http.h
@@ -8,5 +8,6 @@ void httpLoop(bool wifiIsConnected);
void httpReconnect();
bool httpGetConfig(const JsonObject & settings);
+bool httpSetConfig(const JsonObject & settings);
#endif
\ No newline at end of file