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 += 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("
")); httpMessage += F("HASP Node Name (required. lowercase letters, numbers, and _ only)" @@ -758,10 +696,10 @@ void webHandleGuiConfig() DynamicJsonDocument settings(256); // guiGetConfig(settings.to()); - char buffer[64]; + char buffer[127]; String nodename = haspGetNodename(); String httpMessage((char *)0); - httpMessage.reserve(1024); + httpMessage.reserve(1500); httpMessage += String(F("")); httpMessage += F("

"); @@ -780,7 +718,7 @@ void webHandleGuiConfig() } //////////////////////////////////////////////////////////////////////////////////////////////////// -#if LV_USE_HASP_WIFI > 0 +#if HASP_USE_WIFI > 0 void webHandleWifiConfig() { // http://plate01/config/wifi if(!httpIsAuthenticated(F("/config/wifi"))) return; @@ -788,10 +726,10 @@ void webHandleWifiConfig() DynamicJsonDocument settings(256); wifiGetConfig(settings.to()); - char buffer[64]; + char buffer[127]; String nodename = haspGetNodename(); String httpMessage((char *)0); - httpMessage.reserve(1024); + httpMessage.reserve(1500); httpMessage += String(F("
")); httpMessage += String(F("WiFi SSID (required) 0 +#if HASP_USE_HTTP > 0 void webHandleHttpConfig() { // http://plate01/config/http if(!httpIsAuthenticated(F("/config/http"))) return; @@ -824,10 +762,10 @@ void webHandleHttpConfig() DynamicJsonDocument settings(256); httpGetConfig(settings.to()); - char buffer[64]; + char buffer[127]; String nodename = haspGetNodename(); String httpMessage((char *)0); - httpMessage.reserve(1024); + httpMessage.reserve(1500); httpMessage += String(F("")); httpMessage += String(F("Web Username (optional)()); - char buffer[64]; + char buffer[127]; String nodename = haspGetNodename(); String httpMessage((char *)0); - httpMessage.reserve(1024); + httpMessage.reserve(1500); httpMessage += F("

"); @@ -905,7 +843,6 @@ void webHandleHaspConfig() httpMessage += F("

Default Font