diff --git a/src/hasp.cpp b/src/hasp.cpp
index 06f10f2e..adc29bf5 100644
--- a/src/hasp.cpp
+++ b/src/hasp.cpp
@@ -199,7 +199,7 @@ void haspSendNewEvent(lv_obj_t * obj, uint8_t val)
uint8_t objid;
if(FindIdFromObj(obj, &pageid, &objid)) {
- // char buffer[40];
+ // char buffer[127];
// sprintf_P(buffer, PSTR("HASP: Send p[%u].b[%u].event=%d"), pageid, objid, val);
// debugPrintln(buffer);
@@ -215,7 +215,7 @@ void haspSendNewValue(lv_obj_t * obj, int32_t val)
uint8_t objid;
if(FindIdFromObj(obj, &pageid, &objid)) {
- // char buffer[40];
+ // char buffer[127];
// sprintf_P(buffer, PSTR("HASP: Send p[%u].b[%u].val=%d"), pageid, objid, val);
// debugPrintln(buffer);
@@ -231,7 +231,7 @@ void haspSendNewValue(lv_obj_t * obj, String txt)
uint8_t objid;
if(FindIdFromObj(obj, &pageid, &objid)) {
- // char buffer[40];
+ // char buffer[127];
// sprintf_P(buffer, PSTR("HASP: Send p[%u].b[%u].txt='%s'"), pageid, objid, txt.c_str());
// debugPrintln(buffer);
@@ -247,7 +247,7 @@ void haspSendNewValue(lv_obj_t * obj, const char * txt)
uint8_t objid;
if(FindIdFromObj(obj, &pageid, &objid)) {
- // char buffer[40];
+ // char buffer[127];
// sprintf_P(buffer, PSTR("HASP: Send p[%u].b[%u].txt='%s'"), pageid, objid, txt);
// debugPrintln(buffer);
@@ -382,13 +382,13 @@ bool haspGetObjAttribute(lv_obj_t * obj, String strAttr, std::string & strPayloa
return true;
}
if(check_obj_type(list.type[0], LV_HASP_DDLIST)) {
- char buffer[128];
+ char buffer[127];
lv_ddlist_get_selected_str(obj, buffer, sizeof(buffer));
strPayload = String(buffer).c_str();
return true;
}
if(check_obj_type(list.type[0], LV_HASP_ROLLER)) {
- char buffer[128];
+ char buffer[127];
lv_roller_get_selected_str(obj, buffer, sizeof(buffer));
strPayload = String(buffer).c_str();
return true;
@@ -641,7 +641,7 @@ void haspDisplayAP(const char * ssid, const char * pass)
String txt((char *)0);
txt.reserve(64);
- char buffer[64];
+ char buffer[127];
sprintf_P(buffer, PSTR("WIFI:S:%s;T:WPA;P:%s;;"), ssid, pass);
/*Clear all screens*/
@@ -752,7 +752,7 @@ void haspFirstSetup(void)
*/
void haspSetup(JsonObject settings)
{
- char buffer[64];
+ char buffer[127];
haspSetConfig(settings);
@@ -1010,7 +1010,7 @@ static void btn_event_handler(lv_obj_t * obj, lv_event_t event)
uint8_t pageid = 0;
lv_obj_user_data_t objid;
- char buffer[64];
+ char buffer[127];
sprintf(buffer, PSTR("HASP: "));
if(!FindIdFromObj(obj, &pageid, &objid)) {
@@ -1106,7 +1106,7 @@ static void ddlist_event_handler(lv_obj_t * obj, lv_event_t event)
{
if(event == LV_EVENT_VALUE_CHANGED) {
haspSendNewValue(obj, lv_ddlist_get_selected(obj));
- char buffer[100];
+ char buffer[127];
lv_ddlist_get_selected_str(obj, buffer, sizeof(buffer));
haspSendNewValue(obj, String(buffer));
}
@@ -1116,7 +1116,7 @@ static void roller_event_handler(lv_obj_t * obj, lv_event_t event)
{
if(event == LV_EVENT_VALUE_CHANGED) {
haspSendNewValue(obj, lv_roller_get_selected(obj));
- char buffer[100];
+ char buffer[127];
lv_roller_get_selected_str(obj, buffer, sizeof(buffer));
haspSendNewValue(obj, String(buffer));
}
diff --git a/src/hasp_http.cpp b/src/hasp_http.cpp
index 56c90b11..05b05a48 100644
--- a/src/hasp_http.cpp
+++ b/src/hasp_http.cpp
@@ -4,10 +4,12 @@
#include "hasp_log.h"
#include "hasp_gui.h"
+#include "hasp_hal.h"
#include "hasp_debug.h"
#include "hasp_http.h"
#include "hasp_mqtt.h"
#include "hasp_wifi.h"
+#include "hasp_spiffs.h"
#include "hasp_config.h"
#include "hasp_dispatch.h"
#include "hasp.h"
@@ -32,73 +34,9 @@ ESP8266WebServer webServer(80);
#endif
#if defined(ARDUINO_ARCH_ESP32)
-#include // needed to get the ResetInfo
#include
WebServer webServer(80);
-// Compatibility function for ESP8266 getRestInfo
-String esp32ResetReason(uint8_t cpuid)
-{
- if(cpuid > 1) {
- return F("Invalid CPU id");
- }
- RESET_REASON reason = rtc_get_reset_reason(cpuid);
-
- String resetReason((char *)0);
- resetReason.reserve(25);
- switch(reason) {
- case 1:
- resetReason = F("POWERON");
- break; /**<1, Vbat power on reset*/
- case 3:
- resetReason = F("SW");
- break; /**<3, Software reset digital core*/
- case 4:
- resetReason = F("OWDT");
- break; /**<4, Legacy watch dog reset digital core*/
- case 5:
- resetReason = F("DEEPSLEEP");
- break; /**<5, Deep Sleep reset digital core*/
- case 6:
- resetReason = F("SDIO");
- break; /**<6, Reset by SLC module, reset digital core*/
- case 7:
- resetReason = F("TG0WDT_SYS");
- break; /**<7, Timer Group0 Watch dog reset digital core*/
- case 8:
- resetReason = F("TG1WDT_SYS");
- break; /**<8, Timer Group1 Watch dog reset digital core*/
- case 9:
- resetReason = F("RTCWDT_SYS");
- break; /**<9, RTC Watch dog Reset digital core*/
- case 10:
- resetReason = F("INTRUSION");
- break; /**<10, Instrusion tested to reset CPU*/
- case 11:
- resetReason = F("TGWDT_CPU");
- break; /**<11, Time Group reset CPU*/
- case 12:
- resetReason = F("SW_CPU");
- break; /**<12, Software reset CPU*/
- case 13:
- resetReason = F("RTCWDT_CPU");
- break; /**<13, RTC Watch dog Reset CPU*/
- case 14:
- resetReason = F("EXT_CPU");
- break; /**<14, for APP CPU, reseted by PRO CPU*/
- case 15:
- resetReason = F("RTCWDT_BROWN_OUT");
- break; /**<15, Reset when the vdd voltage is not stable*/
- case 16:
- resetReason = F("RTCWDT_RTC");
- break; /**<16, RTC Watch dog reset digital core and rtc module*/
- default:
- return F("NO_MEAN");
- }
- resetReason += F("_RESET");
- return resetReason;
-}
-
#endif // ESP32
static const char MAIN_MENU_BUTTON[] PROGMEM =
@@ -146,7 +84,6 @@ String espFirmwareUrl = "http://haswitchplate.com/update/HASwitchPlate.ino.d1_mi
String lcdFirmwareUrl = "http://haswitchplate.com/update/HASwitchPlate.tft";
////////////////////////////////////////////////////////////////////////////////////////////////////
-String formatBytes(size_t bytes);
void webHandleHaspConfig();
////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -158,23 +95,23 @@ bool httpIsAuthenticated(const String & page)
return false;
}
}
- char buffer[128];
- sprintf(buffer, PSTR("HTTP: Sending %s page to client connected from: %s"), page.c_str(),
- webServer.client().remoteIP().toString().c_str());
+ char buffer[127];
+ snprintf(buffer, sizeof(buffer), PSTR("HTTP: Sending %s page to client connected from: %s"), page.c_str(),
+ webServer.client().remoteIP().toString().c_str());
debugPrintln(buffer);
return true;
}
String getOption(uint8_t value, String label, bool selected)
{
- char buffer[128];
+ char buffer[127];
sprintf_P(buffer, PSTR(""), value, (selected ? PSTR("selected") : ""),
label.c_str());
return buffer;
}
String getOption(String value, String label, bool selected)
{
- char buffer[128];
+ char buffer[127];
sprintf_P(buffer, PSTR(""), value.c_str(), (selected ? PSTR("selected") : ""),
label.c_str());
return buffer;
@@ -182,7 +119,7 @@ String getOption(String value, String label, bool selected)
void webSendPage(String & nodename, uint32_t httpdatalength, bool gohome = false)
{
- char buffer[64];
+ char buffer[127];
/* Calculate Content Length upfront */
uint16_t contentLength = 0;
@@ -211,18 +148,19 @@ void webHandleRoot()
{
if(!httpIsAuthenticated(F("root"))) return;
- char buffer[64];
+ char buffer[127];
String nodename = haspGetNodename();
String httpMessage((char *)0);
- httpMessage.reserve(1024);
+ httpMessage.reserve(1500);
httpMessage += String(F(""));
httpMessage += String(nodename);
httpMessage += String(F("
"));
httpMessage += F("
");
+ httpMessage += F("");
httpMessage +=
- PSTR("");
+ PSTR("");
httpMessage +=
F("");
@@ -252,7 +190,7 @@ void httpHandleReboot()
webServer.sendContent_P(HTTP_END); // 20
delay(200);
- dispatchCommand(F("reboot"));
+ dispatchReboot(true);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -260,10 +198,27 @@ void webHandleScreenshot()
{ // http://plate01/about
if(!httpIsAuthenticated(F("/screenshot"))) return;
- webServer.setContentLength(138 + 320 * 240 * 4);
- webServer.send(200, PSTR("image/bmp"), "");
+ if(webServer.hasArg(F("q"))) {
+ webServer.setContentLength(138 + 320 * 240 * 4);
+ webServer.send(200, PSTR("image/bmp"), "");
- guiTakeScreenshot(webServer.client());
+ guiTakeScreenshot(webServer);
+ } else {
+
+ String nodename = haspGetNodename();
+ String httpMessage((char *)0);
+ httpMessage.reserve(1500);
+
+ httpMessage += F("
");
+ httpMessage += F("");
+ httpMessage += FPSTR(MAIN_MENU_BUTTON);
+
+ webSendPage(nodename, httpMessage.length(), false);
+ webServer.sendContent(httpMessage); // len
+ webServer.sendContent_P(HTTP_END); // 20
+ }
}
////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -311,7 +266,7 @@ void webHandleInfo()
{ // http://plate01/
if(!httpIsAuthenticated(F("/info"))) return;
- char buffer[64];
+ char buffer[127];
String nodename = haspGetNodename();
String httpMessage((char *)0);
httpMessage.reserve(1500);
@@ -357,55 +312,34 @@ void webHandleInfo()
httpMessage += String(ESP.getChipId());
#endif
httpMessage += F("
Flash Chip Size: ");
- httpMessage += formatBytes(ESP.getFlashChipSize());
+ httpMessage += spiffsFormatBytes(ESP.getFlashChipSize());
httpMessage += F("Program Size: ");
- httpMessage += formatBytes(ESP.getSketchSize());
+ httpMessage += spiffsFormatBytes(ESP.getSketchSize());
httpMessage += F(" bytes
Free Program Space: ");
- httpMessage += formatBytes(ESP.getFreeSketchSpace());
+ httpMessage += spiffsFormatBytes(ESP.getFreeSketchSpace());
httpMessage += F(" bytes
Free Memory: ");
- httpMessage += formatBytes(ESP.getFreeHeap());
+ httpMessage += spiffsFormatBytes(ESP.getFreeHeap());
+
+ httpMessage += F("
Memory Fragmentation: ");
+ httpMessage += String(halGetHeapFragmentation());
#if defined(ARDUINO_ARCH_ESP32)
- // httpMessage += F("
Heap Max Alloc: ");
- // httpMessage += String(ESP.getMaxAllocHeap());
- httpMessage += F("
Memory Fragmentation: ");
- httpMessage += String((int16_t)(100.00f - (float)ESP.getMaxAllocHeap() / (float)ESP.getFreeHeap() * 100.00f));
httpMessage += F("
ESP SDK version: ");
httpMessage += String(ESP.getSdkVersion());
- httpMessage += F("
Last Reset: CPU0: ");
- httpMessage += String(esp32ResetReason(0));
- httpMessage += F(" / CPU1: ");
- httpMessage += String(esp32ResetReason(1));
#else
- httpMessage += F("
Memory Fragmentation: ");
- httpMessage += String(ESP.getHeapFragmentation());
httpMessage += F("
ESP Core version: ");
httpMessage += String(ESP.getCoreVersion());
- httpMessage += F("
Last Reset: ");
- httpMessage += String(ESP.getResetInfo());
#endif
+ httpMessage += F("
Last Reset: ");
+ httpMessage += halGetResetInfo();
httpMessage += FPSTR(MAIN_MENU_BUTTON);
- ;
webSendPage(nodename, httpMessage.length(), false);
webServer.sendContent(httpMessage); // len
webServer.sendContent_P(HTTP_END); // 20
}
-String formatBytes(size_t bytes)
-{
- if(bytes < 1024) {
- return String(bytes) + "B";
- } else if(bytes < (1024 * 1024)) {
- return String(bytes / 1024.0) + "KB";
- } else if(bytes < (1024 * 1024 * 1024)) {
- return String(bytes / 1024.0 / 1024.0) + "MB";
- } else {
- return String(bytes / 1024.0 / 1024.0 / 1024.0) + "GB";
- }
-}
-
String getContentType(String filename)
{
if(webServer.hasArg(F("download"))) {
@@ -447,7 +381,8 @@ String urldecode(String str)
if(c == '+') {
encodedString += ' ';
} else if(c == '%') {
- char buffer[3];
+ // char buffer[3];
+ char buffer[127];
i++;
buffer[0] = str.charAt(i);
i++;
@@ -509,7 +444,7 @@ void handleFileUpload()
// DBG_OUTPUT_PORT.print("handleFileUpload Data: "); debugPrintln(upload.currentSize);
if(fsUploadFile) {
fsUploadFile.write(upload.buf, upload.currentSize);
- char buffer[128];
+ char buffer[127];
sprintf_P(buffer, PSTR("Uploading %u of %u"), upload.currentSize, upload.totalSize);
debugPrintln(buffer);
}
@@ -518,8 +453,8 @@ void handleFileUpload()
fsUploadFile.close();
}
debugPrintln(String(F("handleFileUpload Size: ")) + String(upload.totalSize));
- String filename = upload.filename;
- if(filename.endsWith(".zi")) webHandleHaspConfig();
+ // String filename = upload.filename;
+ webHandleHaspConfig();
}
}
@@ -527,19 +462,22 @@ void handleFileDelete()
{
if(!httpIsAuthenticated(F("filedelete"))) return;
+ char mimetype[10];
+ sprintf(mimetype, PSTR("text/plain"));
+
if(webServer.args() == 0) {
- return webServer.send(500, PSTR("text/plain"), PSTR("BAD ARGS"));
+ return webServer.send_P(500, mimetype, PSTR("BAD ARGS"));
}
String path = webServer.arg(0);
debugPrintln(String(F("handleFileDelete: ")) + path);
if(path == "/") {
- return webServer.send(500, PSTR("text/plain"), PSTR("BAD PATH"));
+ return webServer.send_P(500, mimetype, PSTR("BAD PATH"));
}
if(!filesystem->exists(path)) {
- return webServer.send(404, PSTR("text/plain"), PSTR("FileNotFound"));
+ return webServer.send_P(404, mimetype, PSTR("FileNotFound"));
}
filesystem->remove(path);
- webServer.send(200, PSTR("text/plain"), "");
+ webServer.send_P(200, mimetype, PSTR(""));
path.clear();
}
@@ -668,16 +606,16 @@ void webHandleConfig()
httpHandleReboot();
}
- char buffer[64];
+ char buffer[127];
String nodename = haspGetNodename();
String httpMessage((char *)0);
- httpMessage.reserve(1024);
+ httpMessage.reserve(1500);
httpMessage += F("
");
httpMessage +=
F("");
-#if LV_USE_HASP_MQTT > 0
+#if HASP_USE_MQTT > 0
httpMessage +=
F("");
#endif
@@ -706,7 +644,7 @@ void webHandleConfig()
}
////////////////////////////////////////////////////////////////////////////////////////////////////
-#if LV_USE_HASP_MQTT > 0
+#if HASP_USE_MQTT > 0
void webHandleMqttConfig()
{ // http://plate01/config/mqtt
if(!httpIsAuthenticated(F("/config/mqtt"))) return;
@@ -714,10 +652,10 @@ void webHandleMqttConfig()
DynamicJsonDocument settings(256);
mqttGetConfig(settings.to());
- char buffer[64];
+ char buffer[127];
String nodename = haspGetNodename();
String httpMessage((char *)0);
- httpMessage.reserve(1024);
+ httpMessage.reserve(1500);
httpMessage += String(F("