From b96ee7be72a94551bedc721f128bd6a79edb1f50 Mon Sep 17 00:00:00 2001 From: Jm Casler Date: Sat, 19 Dec 2020 12:09:48 -0800 Subject: [PATCH 01/17] New feature #571 - Report contents of spiffs in a json data structure. --- src/meshwifi/meshhttp.cpp | 79 +++++++++++++++++++++++++++++++++------ 1 file changed, 68 insertions(+), 11 deletions(-) diff --git a/src/meshwifi/meshhttp.cpp b/src/meshwifi/meshhttp.cpp index b1cefb706..c8f583752 100644 --- a/src/meshwifi/meshhttp.cpp +++ b/src/meshwifi/meshhttp.cpp @@ -60,6 +60,7 @@ void handleRestart(HTTPRequest *req, HTTPResponse *res); void handle404(HTTPRequest *req, HTTPResponse *res); void handleFormUpload(HTTPRequest *req, HTTPResponse *res); void handleScanNetworks(HTTPRequest *req, HTTPResponse *res); +void handleSpiffsBrowseStatic(HTTPRequest *req, HTTPResponse *res); void middlewareSpeedUp240(HTTPRequest *req, HTTPResponse *res, std::function next); void middlewareSpeedUp160(HTTPRequest *req, HTTPResponse *res, std::function next); @@ -125,11 +126,12 @@ void taskCreateCert(void *parameter) DEBUG_MSG("Existing SSL Certificate found!\n"); } else { DEBUG_MSG("Creating the certificate. This may take a while. Please wait...\n"); + yield(); cert = new SSLCert(); - // disableCore1WDT(); + yield(); int createCertResult = createSelfSignedCert(*cert, KEYSIZE_2048, "CN=meshtastic.local,O=Meshtastic,C=US", "20190101000000", "20300101000000"); - // enableCore1WDT(); + yield(); if (createCertResult != 0) { DEBUG_MSG("Creating the certificate failed\n"); @@ -241,6 +243,7 @@ void initWebServer() ResourceNode *node404 = new ResourceNode("", "GET", &handle404); ResourceNode *nodeFormUpload = new ResourceNode("/upload", "POST", &handleFormUpload); ResourceNode *nodeJsonScanNetworks = new ResourceNode("/json/scanNetworks", "GET", &handleScanNetworks); + ResourceNode *nodeJsonSpiffsBrowseStatic = new ResourceNode("/json/spiffs/browse/static/", "GET", &handleSpiffsBrowseStatic); // Secure nodes secureServer->registerNode(nodeAPIv1ToRadioOptions); @@ -255,6 +258,7 @@ void initWebServer() secureServer->registerNode(nodeRestart); secureServer->registerNode(nodeFormUpload); secureServer->registerNode(nodeJsonScanNetworks); + secureServer->registerNode(nodeJsonSpiffsBrowseStatic); secureServer->setDefaultNode(node404); secureServer->addMiddleware(&middlewareSpeedUp240); @@ -272,6 +276,7 @@ void initWebServer() insecureServer->registerNode(nodeRestart); insecureServer->registerNode(nodeFormUpload); insecureServer->registerNode(nodeJsonScanNetworks); + insecureServer->registerNode(nodeJsonSpiffsBrowseStatic); insecureServer->setDefaultNode(node404); insecureServer->addMiddleware(&middlewareSpeedUp160); @@ -379,6 +384,60 @@ void handleStaticPost(HTTPRequest *req, HTTPResponse *res) res->println(""); } +void handleSpiffsBrowseStatic(HTTPRequest *req, HTTPResponse *res) +{ + // jm + + // res->setHeader("Content-Type", "application/json"); + res->setHeader("Content-Type", "text/html"); + + File root = SPIFFS.open("/"); + + if (root.isDirectory()) { + res->println("{"); + res->println("\"data\": {"); + + File file = root.openNextFile(); + res->print("\"files\": ["); + bool firstFile = 1; + while (file) { + if (firstFile) { + firstFile = 0; + } else { + res->println(","); + } + + res->println("{"); + + String filePath = String(file.name()); + if (filePath.indexOf("/static") == 0) { + if (String(file.name()).substring(1).endsWith(".gz")) { + String modifiedFile = String(file.name()).substring(1); + modifiedFile.remove((modifiedFile.length() - 3), 3); + res->print("\"nameModified\": \"" + modifiedFile + "\","); + res->print("\"name\": \"" + String(file.name()).substring(1) + "\","); + + } else { + res->print("\"name\": \"" + String(file.name()).substring(1) + "\","); + } + res->print("\"size\": " + String(file.size())); + } + + file = root.openNextFile(); + res->print("}"); + } + res->print("],"); + res->print("\"filesystem\" : {"); + res->print("\"total\" : " + String(SPIFFS.totalBytes()) + ","); + res->print("\"used\" : " + String(SPIFFS.usedBytes()) + ","); + res->print("\"free\" : " + String(SPIFFS.totalBytes() - SPIFFS.usedBytes())); + res->println("}"); + res->println("},"); + res->println("\"status\": \"ok\""); + res->println("}"); + } +} + void handleStaticBrowse(HTTPRequest *req, HTTPResponse *res) { // Get access to the parameters @@ -929,17 +988,16 @@ void handleScanNetworks(HTTPRequest *req, HTTPResponse *res) for (int i = 0; i < n; ++i) { char ssidArray[50]; String ssidString = String(WiFi.SSID(i)); - //String ssidString = String(WiFi.SSID(i)).toCharArray(ssidArray, WiFi.SSID(i).length()); + // String ssidString = String(WiFi.SSID(i)).toCharArray(ssidArray, WiFi.SSID(i).length()); ssidString.replace("\"", "\\\""); ssidString.toCharArray(ssidArray, 50); - - + if (WiFi.encryptionType(i) != WIFI_AUTH_OPEN) { - //res->println("{\"ssid\": \"%s\",\"rssi\": -75}, ", String(WiFi.SSID(i).c_str() ); - - res->printf("{\"ssid\": \"%s\",\"rssi\": %d}", ssidArray, WiFi.RSSI(i) ) ; - //WiFi.RSSI(i) - if (i != n-1) { + // res->println("{\"ssid\": \"%s\",\"rssi\": -75}, ", String(WiFi.SSID(i).c_str() ); + + res->printf("{\"ssid\": \"%s\",\"rssi\": %d}", ssidArray, WiFi.RSSI(i)); + // WiFi.RSSI(i) + if (i != n - 1) { res->printf(","); } } @@ -953,7 +1011,6 @@ void handleScanNetworks(HTTPRequest *req, HTTPResponse *res) res->println("},"); res->println("\"status\": \"ok\""); res->println("}"); - } void handleFavicon(HTTPRequest *req, HTTPResponse *res) From fae9ea8b3be57918d5477debb7e46caebfd0faa6 Mon Sep 17 00:00:00 2001 From: Jm Casler Date: Sat, 19 Dec 2020 12:18:08 -0800 Subject: [PATCH 02/17] Update for #571 (i forgot to set the mime type) --- src/meshwifi/meshhttp.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/meshwifi/meshhttp.cpp b/src/meshwifi/meshhttp.cpp index c8f583752..23cbf58cf 100644 --- a/src/meshwifi/meshhttp.cpp +++ b/src/meshwifi/meshhttp.cpp @@ -388,8 +388,8 @@ void handleSpiffsBrowseStatic(HTTPRequest *req, HTTPResponse *res) { // jm - // res->setHeader("Content-Type", "application/json"); - res->setHeader("Content-Type", "text/html"); + res->setHeader("Content-Type", "application/json"); + // res->setHeader("Content-Type", "text/html"); File root = SPIFFS.open("/"); From 1ca83509dd6fe1ebd077b60da9426b8447aa30e6 Mon Sep 17 00:00:00 2001 From: Jm Casler Date: Sun, 20 Dec 2020 11:32:49 -0800 Subject: [PATCH 03/17] Blink the LED for one second on get of /json/blink --- src/meshwifi/meshhttp.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/meshwifi/meshhttp.cpp b/src/meshwifi/meshhttp.cpp index 23cbf58cf..d3e1c9bb7 100644 --- a/src/meshwifi/meshhttp.cpp +++ b/src/meshwifi/meshhttp.cpp @@ -61,6 +61,7 @@ void handle404(HTTPRequest *req, HTTPResponse *res); void handleFormUpload(HTTPRequest *req, HTTPResponse *res); void handleScanNetworks(HTTPRequest *req, HTTPResponse *res); void handleSpiffsBrowseStatic(HTTPRequest *req, HTTPResponse *res); +void handleBlinkLED(HTTPRequest *req, HTTPResponse *res); void middlewareSpeedUp240(HTTPRequest *req, HTTPResponse *res, std::function next); void middlewareSpeedUp160(HTTPRequest *req, HTTPResponse *res, std::function next); @@ -243,6 +244,7 @@ void initWebServer() ResourceNode *node404 = new ResourceNode("", "GET", &handle404); ResourceNode *nodeFormUpload = new ResourceNode("/upload", "POST", &handleFormUpload); ResourceNode *nodeJsonScanNetworks = new ResourceNode("/json/scanNetworks", "GET", &handleScanNetworks); + ResourceNode *nodeJsonBlinkLED = new ResourceNode("/json/blink", "GET", &handleBlinkLED); ResourceNode *nodeJsonSpiffsBrowseStatic = new ResourceNode("/json/spiffs/browse/static/", "GET", &handleSpiffsBrowseStatic); // Secure nodes @@ -258,6 +260,7 @@ void initWebServer() secureServer->registerNode(nodeRestart); secureServer->registerNode(nodeFormUpload); secureServer->registerNode(nodeJsonScanNetworks); + secureServer->registerNode(nodeJsonBlinkLED); secureServer->registerNode(nodeJsonSpiffsBrowseStatic); secureServer->setDefaultNode(node404); @@ -276,6 +279,7 @@ void initWebServer() insecureServer->registerNode(nodeRestart); insecureServer->registerNode(nodeFormUpload); insecureServer->registerNode(nodeJsonScanNetworks); + insecureServer->registerNode(nodeJsonBlinkLED); insecureServer->registerNode(nodeJsonSpiffsBrowseStatic); insecureServer->setDefaultNode(node404); @@ -970,6 +974,28 @@ void handleRestart(HTTPRequest *req, HTTPResponse *res) ESP.restart(); } +void handleBlinkLED(HTTPRequest *req, HTTPResponse *res) +{ + res->setHeader("Content-Type", "application/json"); + + // This can be cleaned up at some point to make it non-blocking and to allow for more configuration. + + res->println("{"); + res->println("\"status\": \"ok\""); + res->println("}"); + + uint8_t count = 50; + + while (count > 0) + { + setLed(true); + delay(10); + setLed(false); + delay(10); + count = count - 1; + } +} + void handleScanNetworks(HTTPRequest *req, HTTPResponse *res) { res->setHeader("Content-Type", "application/json"); From 7205e9a5b4f6c4174ba50077962ca64a40456c96 Mon Sep 17 00:00:00 2001 From: Charles Crossan Date: Sun, 20 Dec 2020 14:50:13 -0500 Subject: [PATCH 04/17] adjust LED timings; switch to HTTP/POST --- src/meshwifi/meshhttp.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/meshwifi/meshhttp.cpp b/src/meshwifi/meshhttp.cpp index d3e1c9bb7..47d6e6d1d 100644 --- a/src/meshwifi/meshhttp.cpp +++ b/src/meshwifi/meshhttp.cpp @@ -244,7 +244,7 @@ void initWebServer() ResourceNode *node404 = new ResourceNode("", "GET", &handle404); ResourceNode *nodeFormUpload = new ResourceNode("/upload", "POST", &handleFormUpload); ResourceNode *nodeJsonScanNetworks = new ResourceNode("/json/scanNetworks", "GET", &handleScanNetworks); - ResourceNode *nodeJsonBlinkLED = new ResourceNode("/json/blink", "GET", &handleBlinkLED); + ResourceNode *nodeJsonBlinkLED = new ResourceNode("/json/blink", "POST", &handleBlinkLED); ResourceNode *nodeJsonSpiffsBrowseStatic = new ResourceNode("/json/spiffs/browse/static/", "GET", &handleSpiffsBrowseStatic); // Secure nodes @@ -984,14 +984,14 @@ void handleBlinkLED(HTTPRequest *req, HTTPResponse *res) res->println("\"status\": \"ok\""); res->println("}"); - uint8_t count = 50; + uint8_t count = 10; while (count > 0) { setLed(true); - delay(10); + delay(50); setLed(false); - delay(10); + delay(50); count = count - 1; } } From db2193b52612eb9542e573520168afdd0e9c3383 Mon Sep 17 00:00:00 2001 From: Charles Crossan Date: Sun, 20 Dec 2020 17:45:45 -0500 Subject: [PATCH 05/17] implement screen blink --- src/graphics/Screen.cpp | 21 +++++++++++++++++++++ src/graphics/Screen.h | 2 ++ src/meshwifi/meshhttp.cpp | 6 ++++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 229aa63a1..e9cfe89a8 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -894,6 +894,27 @@ void Screen::handleStartBluetoothPinScreen(uint32_t pin) setFastFramerate(); } +void Screen::blink() { + setFastFramerate(); + uint8_t count = 10; + uint8_t blinker = 0; + + dispdev.setBrightness(254); + + while(count>0) { + if (blinker == 254) { + blinker = 0; + count--; + } else { + blinker++; + } + int width = blinker / (254.00 / SCREEN_WIDTH); + dispdev.fillRect(0, 0, width, SCREEN_HEIGHT); + dispdev.display(); + } + dispdev.setBrightness(brightness); +} + void Screen::handlePrint(const char *text) { DEBUG_MSG("Screen: %s", text); diff --git a/src/graphics/Screen.h b/src/graphics/Screen.h index 90e8ad089..888f31011 100644 --- a/src/graphics/Screen.h +++ b/src/graphics/Screen.h @@ -107,6 +107,8 @@ class Screen : public concurrency::OSThread */ void doDeepSleep(); + void blink(); + /// Handles a button press. void onPress() { enqueueCmd(ScreenCmd{.cmd = Cmd::ON_PRESS}); } diff --git a/src/meshwifi/meshhttp.cpp b/src/meshwifi/meshhttp.cpp index 47d6e6d1d..50a1ac321 100644 --- a/src/meshwifi/meshhttp.cpp +++ b/src/meshwifi/meshhttp.cpp @@ -986,14 +986,16 @@ void handleBlinkLED(HTTPRequest *req, HTTPResponse *res) uint8_t count = 10; - while (count > 0) + /*while (count > 0) { setLed(true); delay(50); setLed(false); delay(50); count = count - 1; - } + }*/ + + screen->blink(); } void handleScanNetworks(HTTPRequest *req, HTTPResponse *res) From 2f779bfd3705d6d0d8b06935355534e4446b3e77 Mon Sep 17 00:00:00 2001 From: Charles Crossan Date: Sun, 20 Dec 2020 18:24:48 -0500 Subject: [PATCH 06/17] improve blink; LED or SCREEN as POST Parameter --- src/graphics/Screen.cpp | 17 +++++-------- src/meshwifi/meshhttp.cpp | 51 ++++++++++++++++++++++++++++----------- 2 files changed, 43 insertions(+), 25 deletions(-) diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index e9cfe89a8..3f98969d1 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -897,20 +897,15 @@ void Screen::handleStartBluetoothPinScreen(uint32_t pin) void Screen::blink() { setFastFramerate(); uint8_t count = 10; - uint8_t blinker = 0; - dispdev.setBrightness(254); - while(count>0) { - if (blinker == 254) { - blinker = 0; - count--; - } else { - blinker++; - } - int width = blinker / (254.00 / SCREEN_WIDTH); - dispdev.fillRect(0, 0, width, SCREEN_HEIGHT); + dispdev.fillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); dispdev.display(); + delay(50); + dispdev.clear(); + dispdev.display(); + delay(50); + count = count -1; } dispdev.setBrightness(brightness); } diff --git a/src/meshwifi/meshhttp.cpp b/src/meshwifi/meshhttp.cpp index 50a1ac321..6190b0458 100644 --- a/src/meshwifi/meshhttp.cpp +++ b/src/meshwifi/meshhttp.cpp @@ -979,23 +979,46 @@ void handleBlinkLED(HTTPRequest *req, HTTPResponse *res) res->setHeader("Content-Type", "application/json"); // This can be cleaned up at some point to make it non-blocking and to allow for more configuration. + std::string contentType = req->getHeader("Content-Type"); + std::string blink_target; + HTTPBodyParser *parser; + + + if (contentType.rfind("multipart/form-data",0) == 0) { + // If a body was submitted to /blink, then figure out whether the user + // watned to blink the LED or the screen + parser = new HTTPMultipartBodyParser(req); + while (parser->nextField()) { + std::string name = parser->getFieldName(); + if (name == "blink_target") { + char buf[512]; + size_t readLength = parser->read((byte *)buf, 512); + // filename = std::string("/public/") + std::string(buf, readLength); + blink_target = std::string(buf, readLength); + } + } + } else { + blink_target = "LED"; + } + + if (blink_target == "LED" ) { + uint8_t count = 10; + while (count > 0) + { + setLed(true); + delay(50); + setLed(false); + delay(50); + count = count - 1; + } + } + else { + screen->blink(); + } res->println("{"); - res->println("\"status\": \"ok\""); + res->println("\"status\": \"Blink completed: LED\""); res->println("}"); - - uint8_t count = 10; - - /*while (count > 0) - { - setLed(true); - delay(50); - setLed(false); - delay(50); - count = count - 1; - }*/ - - screen->blink(); } void handleScanNetworks(HTTPRequest *req, HTTPResponse *res) From 2743b9d3100944c86f9174c16ce841aca237f974 Mon Sep 17 00:00:00 2001 From: Charles Crossan Date: Sun, 20 Dec 2020 21:44:51 -0500 Subject: [PATCH 07/17] use POST URL parameters; fix response status --- src/meshwifi/meshhttp.cpp | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/src/meshwifi/meshhttp.cpp b/src/meshwifi/meshhttp.cpp index 6190b0458..98da0dee6 100644 --- a/src/meshwifi/meshhttp.cpp +++ b/src/meshwifi/meshhttp.cpp @@ -978,26 +978,14 @@ void handleBlinkLED(HTTPRequest *req, HTTPResponse *res) { res->setHeader("Content-Type", "application/json"); - // This can be cleaned up at some point to make it non-blocking and to allow for more configuration. - std::string contentType = req->getHeader("Content-Type"); + ResourceParameters *params = req->getParams(); std::string blink_target; HTTPBodyParser *parser; - if (contentType.rfind("multipart/form-data",0) == 0) { - // If a body was submitted to /blink, then figure out whether the user - // watned to blink the LED or the screen - parser = new HTTPMultipartBodyParser(req); - while (parser->nextField()) { - std::string name = parser->getFieldName(); - if (name == "blink_target") { - char buf[512]; - size_t readLength = parser->read((byte *)buf, 512); - // filename = std::string("/public/") + std::string(buf, readLength); - blink_target = std::string(buf, readLength); - } - } - } else { + if (! params->getQueryParameter("blink_target", blink_target)) { + // if no blink_target was supplied in the URL parameters of the + // POST request, then assume we should blink the LED blink_target = "LED"; } @@ -1017,7 +1005,7 @@ void handleBlinkLED(HTTPRequest *req, HTTPResponse *res) } res->println("{"); - res->println("\"status\": \"Blink completed: LED\""); + res->println("\"status\": \"ok\""); res->println("}"); } From dcb9125b32cf3dffc72b01571b56bd1369a3307e Mon Sep 17 00:00:00 2001 From: Charles Crossan Date: Sun, 20 Dec 2020 21:47:23 -0500 Subject: [PATCH 08/17] remove unused parser --- src/meshwifi/meshhttp.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/meshwifi/meshhttp.cpp b/src/meshwifi/meshhttp.cpp index 98da0dee6..87302816c 100644 --- a/src/meshwifi/meshhttp.cpp +++ b/src/meshwifi/meshhttp.cpp @@ -979,9 +979,7 @@ void handleBlinkLED(HTTPRequest *req, HTTPResponse *res) res->setHeader("Content-Type", "application/json"); ResourceParameters *params = req->getParams(); - std::string blink_target; - HTTPBodyParser *parser; - + std::string blink_target; if (! params->getQueryParameter("blink_target", blink_target)) { // if no blink_target was supplied in the URL parameters of the From 7f59e76c72cd229ca233384c7414c3310bc384dd Mon Sep 17 00:00:00 2001 From: Charles Crossan Date: Sun, 20 Dec 2020 21:47:46 -0500 Subject: [PATCH 09/17] fix formatting --- src/meshwifi/meshhttp.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/meshwifi/meshhttp.cpp b/src/meshwifi/meshhttp.cpp index 87302816c..1af531129 100644 --- a/src/meshwifi/meshhttp.cpp +++ b/src/meshwifi/meshhttp.cpp @@ -979,27 +979,25 @@ void handleBlinkLED(HTTPRequest *req, HTTPResponse *res) res->setHeader("Content-Type", "application/json"); ResourceParameters *params = req->getParams(); - std::string blink_target; + std::string blink_target; - if (! params->getQueryParameter("blink_target", blink_target)) { - // if no blink_target was supplied in the URL parameters of the + if (!params->getQueryParameter("blink_target", blink_target)) { + // if no blink_target was supplied in the URL parameters of the // POST request, then assume we should blink the LED - blink_target = "LED"; + blink_target = "LED"; } - if (blink_target == "LED" ) { + if (blink_target == "LED") { uint8_t count = 10; - while (count > 0) - { + while (count > 0) { setLed(true); delay(50); setLed(false); delay(50); count = count - 1; } - } - else { - screen->blink(); + } else { + screen->blink(); } res->println("{"); From ef0891ae5dbcf0b5d0470422c8003f09b66cf7bd Mon Sep 17 00:00:00 2001 From: Jm Casler Date: Sun, 20 Dec 2020 20:09:17 -0800 Subject: [PATCH 10/17] Fix for #576 - The browser was seeing the other files on the filesystem. --- src/meshwifi/meshhttp.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/meshwifi/meshhttp.cpp b/src/meshwifi/meshhttp.cpp index 1af531129..ebff1e7b8 100644 --- a/src/meshwifi/meshhttp.cpp +++ b/src/meshwifi/meshhttp.cpp @@ -405,16 +405,16 @@ void handleSpiffsBrowseStatic(HTTPRequest *req, HTTPResponse *res) res->print("\"files\": ["); bool firstFile = 1; while (file) { - if (firstFile) { - firstFile = 0; - } else { - res->println(","); - } - - res->println("{"); - String filePath = String(file.name()); if (filePath.indexOf("/static") == 0) { + if (firstFile) { + firstFile = 0; + } else { + res->println(","); + } + + res->println("{"); + if (String(file.name()).substring(1).endsWith(".gz")) { String modifiedFile = String(file.name()).substring(1); modifiedFile.remove((modifiedFile.length() - 3), 3); @@ -425,10 +425,10 @@ void handleSpiffsBrowseStatic(HTTPRequest *req, HTTPResponse *res) res->print("\"name\": \"" + String(file.name()).substring(1) + "\","); } res->print("\"size\": " + String(file.size())); + res->print("}"); } file = root.openNextFile(); - res->print("}"); } res->print("],"); res->print("\"filesystem\" : {"); From 5c70f36aa598c4919b1d0f016ef417200e725d9f Mon Sep 17 00:00:00 2001 From: Charles Crossan Date: Mon, 21 Dec 2020 17:42:55 -0500 Subject: [PATCH 11/17] add mime types for ico and svg --- src/meshwifi/meshhttp.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/meshwifi/meshhttp.cpp b/src/meshwifi/meshhttp.cpp index ebff1e7b8..04dc237c1 100644 --- a/src/meshwifi/meshhttp.cpp +++ b/src/meshwifi/meshhttp.cpp @@ -78,7 +78,8 @@ char contentTypes[][2][32] = {{".txt", "text/plain"}, {".html", "text/html"} {".js", "text/javascript"}, {".png", "image/png"}, {".jpg", "image/jpg"}, {".gz", "application/gzip"}, {".gif", "image/gif"}, {".json", "application/json"}, - {".css", "text/css"}, {"", ""}}; + {".css", "text/css"}, {".ico","image/vnd.microsoft.icon"}, + {".svg", "image/svg+xml"}, {"", ""}}; void handleWebResponse() { From 5f97740ab74ad59044a9fc83782fb22d9f067ee4 Mon Sep 17 00:00:00 2001 From: Jm Casler Date: Mon, 21 Dec 2020 17:42:00 -0800 Subject: [PATCH 12/17] Fix for #535 -- Heltec board stays asleep ... --- src/PowerFSM.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/PowerFSM.cpp b/src/PowerFSM.cpp index 7894361d4..be1ace0df 100644 --- a/src/PowerFSM.cpp +++ b/src/PowerFSM.cpp @@ -144,12 +144,12 @@ static void onEnter() uint32_t now = millis(); - if (now - lastPingMs > 30 * 1000) { // if more than a minute since our last press, ask node we are looking at to update their state + if (now - lastPingMs > + 30 * 1000) { // if more than a minute since our last press, ask node we are looking at to update their state if (displayedNodeNum) service.sendNetworkPing(displayedNodeNum, true); // Refresh the currently displayed node lastPingMs = now; } - } static void screenPress() @@ -174,7 +174,12 @@ void PowerFSM_setup() // If we are not a router and we already have AC power go to POWER state after init, otherwise go to ON // We assume routers might be powered all the time, but from a low current (solar) source bool isLowPower = radioConfig.preferences.is_low_power; - bool hasPower = !isLowPower && powerStatus && powerStatus->getHasUSB(); + + /* To determine if we're externally powered, assumptions + 1) If we're powered up and there's no battery, we must be getting power externally. + 2) If we detect USB power from the power management chip, we must be getting power externally. + */ + bool hasPower = (powerStatus && !powerStatus->getHasBattery()) || !isLowPower && powerStatus && powerStatus->getHasUSB(); bool isRouter = radioConfig.preferences.is_router; DEBUG_MSG("PowerFSM init, USB power=%d\n", hasPower); powerFSM.add_timed_transition(&stateBOOT, hasPower ? &statePOWER : &stateON, 3 * 1000, NULL, "boot timeout"); From 47ccfb610693704c1865451e6d530b422bd1ba40 Mon Sep 17 00:00:00 2001 From: Charles Crossan Date: Mon, 21 Dec 2020 21:10:53 -0500 Subject: [PATCH 13/17] add HTTP/Delete method handler for SPIFFS --- src/meshwifi/meshhttp.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/meshwifi/meshhttp.cpp b/src/meshwifi/meshhttp.cpp index 04dc237c1..11d6dfc2e 100644 --- a/src/meshwifi/meshhttp.cpp +++ b/src/meshwifi/meshhttp.cpp @@ -55,6 +55,7 @@ void handleFavicon(HTTPRequest *req, HTTPResponse *res); void handleRoot(HTTPRequest *req, HTTPResponse *res); void handleStaticBrowse(HTTPRequest *req, HTTPResponse *res); void handleStaticPost(HTTPRequest *req, HTTPResponse *res); +void handleStaticDelete(HTTPRequest *req, HTTPResponse *res); void handleStatic(HTTPRequest *req, HTTPResponse *res); void handleRestart(HTTPRequest *req, HTTPResponse *res); void handle404(HTTPRequest *req, HTTPResponse *res); @@ -240,6 +241,7 @@ void initWebServer() ResourceNode *nodeRoot = new ResourceNode("/", "GET", &handleRoot); ResourceNode *nodeStaticBrowse = new ResourceNode("/static", "GET", &handleStaticBrowse); ResourceNode *nodeStaticPOST = new ResourceNode("/static", "POST", &handleStaticPost); + ResourceNode *nodeStaticDelete = new ResourceNode("/static", "DELETE", &handleStaticDelete); ResourceNode *nodeStatic = new ResourceNode("/static/*", "GET", &handleStatic); ResourceNode *nodeRestart = new ResourceNode("/restart", "POST", &handleRestart); ResourceNode *node404 = new ResourceNode("", "GET", &handle404); @@ -257,6 +259,7 @@ void initWebServer() secureServer->registerNode(nodeRoot); secureServer->registerNode(nodeStaticBrowse); secureServer->registerNode(nodeStaticPOST); + secureServer->registerNode(nodeStaticDelete); secureServer->registerNode(nodeStatic); secureServer->registerNode(nodeRestart); secureServer->registerNode(nodeFormUpload); @@ -276,6 +279,7 @@ void initWebServer() insecureServer->registerNode(nodeRoot); insecureServer->registerNode(nodeStaticBrowse); insecureServer->registerNode(nodeStaticPOST); + insecureServer->registerNode(nodeStaticDelete); insecureServer->registerNode(nodeStatic); insecureServer->registerNode(nodeRestart); insecureServer->registerNode(nodeFormUpload); @@ -389,6 +393,31 @@ void handleStaticPost(HTTPRequest *req, HTTPResponse *res) res->println(""); } +void handleStaticDelete(HTTPRequest *req, HTTPResponse *res) +{ + ResourceParameters *params = req->getParams(); + std::string paramValDelete; + + res->setHeader("Content-Type", "application/json"); + if (params->getQueryParameter("delete", paramValDelete)) { + std::string pathDelete = "/" + paramValDelete; + if (SPIFFS.remove(pathDelete.c_str())) { + Serial.println(pathDelete.c_str()); + res->println("{"); + res->println("\"status\": \"ok\""); + res->println("}"); + return; + } else { + Serial.println(pathDelete.c_str()); + res->println("{"); + res->println("\"status\": \"Error\""); + res->println("}"); + return; + } + } +} + + void handleSpiffsBrowseStatic(HTTPRequest *req, HTTPResponse *res) { // jm From 5a96dc0083cf92e2ed6bb4fb8c0875f9e33575c4 Mon Sep 17 00:00:00 2001 From: Charles Crossan Date: Tue, 22 Dec 2020 17:44:40 -0500 Subject: [PATCH 14/17] move json delete endpoint --- src/meshwifi/meshhttp.cpp | 55 ++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/src/meshwifi/meshhttp.cpp b/src/meshwifi/meshhttp.cpp index 11d6dfc2e..79e7fd89d 100644 --- a/src/meshwifi/meshhttp.cpp +++ b/src/meshwifi/meshhttp.cpp @@ -55,13 +55,13 @@ void handleFavicon(HTTPRequest *req, HTTPResponse *res); void handleRoot(HTTPRequest *req, HTTPResponse *res); void handleStaticBrowse(HTTPRequest *req, HTTPResponse *res); void handleStaticPost(HTTPRequest *req, HTTPResponse *res); -void handleStaticDelete(HTTPRequest *req, HTTPResponse *res); void handleStatic(HTTPRequest *req, HTTPResponse *res); void handleRestart(HTTPRequest *req, HTTPResponse *res); void handle404(HTTPRequest *req, HTTPResponse *res); void handleFormUpload(HTTPRequest *req, HTTPResponse *res); void handleScanNetworks(HTTPRequest *req, HTTPResponse *res); void handleSpiffsBrowseStatic(HTTPRequest *req, HTTPResponse *res); +void handleSpiffsDeleteStatic(HTTPRequest *req, HTTPResponse *res); void handleBlinkLED(HTTPRequest *req, HTTPResponse *res); void middlewareSpeedUp240(HTTPRequest *req, HTTPResponse *res, std::function next); @@ -241,7 +241,6 @@ void initWebServer() ResourceNode *nodeRoot = new ResourceNode("/", "GET", &handleRoot); ResourceNode *nodeStaticBrowse = new ResourceNode("/static", "GET", &handleStaticBrowse); ResourceNode *nodeStaticPOST = new ResourceNode("/static", "POST", &handleStaticPost); - ResourceNode *nodeStaticDelete = new ResourceNode("/static", "DELETE", &handleStaticDelete); ResourceNode *nodeStatic = new ResourceNode("/static/*", "GET", &handleStatic); ResourceNode *nodeRestart = new ResourceNode("/restart", "POST", &handleRestart); ResourceNode *node404 = new ResourceNode("", "GET", &handle404); @@ -249,6 +248,7 @@ void initWebServer() ResourceNode *nodeJsonScanNetworks = new ResourceNode("/json/scanNetworks", "GET", &handleScanNetworks); ResourceNode *nodeJsonBlinkLED = new ResourceNode("/json/blink", "POST", &handleBlinkLED); ResourceNode *nodeJsonSpiffsBrowseStatic = new ResourceNode("/json/spiffs/browse/static/", "GET", &handleSpiffsBrowseStatic); + ResourceNode *nodeJsonDelete = new ResourceNode("/json/spiffs/delete/static", "DELETE", &handleSpiffsDeleteStatic); // Secure nodes secureServer->registerNode(nodeAPIv1ToRadioOptions); @@ -259,13 +259,13 @@ void initWebServer() secureServer->registerNode(nodeRoot); secureServer->registerNode(nodeStaticBrowse); secureServer->registerNode(nodeStaticPOST); - secureServer->registerNode(nodeStaticDelete); secureServer->registerNode(nodeStatic); secureServer->registerNode(nodeRestart); secureServer->registerNode(nodeFormUpload); secureServer->registerNode(nodeJsonScanNetworks); secureServer->registerNode(nodeJsonBlinkLED); secureServer->registerNode(nodeJsonSpiffsBrowseStatic); + secureServer->registerNode(nodeJsonDelete); secureServer->setDefaultNode(node404); secureServer->addMiddleware(&middlewareSpeedUp240); @@ -279,13 +279,13 @@ void initWebServer() insecureServer->registerNode(nodeRoot); insecureServer->registerNode(nodeStaticBrowse); insecureServer->registerNode(nodeStaticPOST); - insecureServer->registerNode(nodeStaticDelete); insecureServer->registerNode(nodeStatic); insecureServer->registerNode(nodeRestart); insecureServer->registerNode(nodeFormUpload); insecureServer->registerNode(nodeJsonScanNetworks); insecureServer->registerNode(nodeJsonBlinkLED); insecureServer->registerNode(nodeJsonSpiffsBrowseStatic); + insecureServer->registerNode(nodeJsonDelete); insecureServer->setDefaultNode(node404); insecureServer->addMiddleware(&middlewareSpeedUp160); @@ -393,29 +393,6 @@ void handleStaticPost(HTTPRequest *req, HTTPResponse *res) res->println(""); } -void handleStaticDelete(HTTPRequest *req, HTTPResponse *res) -{ - ResourceParameters *params = req->getParams(); - std::string paramValDelete; - - res->setHeader("Content-Type", "application/json"); - if (params->getQueryParameter("delete", paramValDelete)) { - std::string pathDelete = "/" + paramValDelete; - if (SPIFFS.remove(pathDelete.c_str())) { - Serial.println(pathDelete.c_str()); - res->println("{"); - res->println("\"status\": \"ok\""); - res->println("}"); - return; - } else { - Serial.println(pathDelete.c_str()); - res->println("{"); - res->println("\"status\": \"Error\""); - res->println("}"); - return; - } - } -} void handleSpiffsBrowseStatic(HTTPRequest *req, HTTPResponse *res) @@ -472,6 +449,30 @@ void handleSpiffsBrowseStatic(HTTPRequest *req, HTTPResponse *res) } } +void handleSpiffsDeleteStatic(HTTPRequest *req, HTTPResponse *res) +{ + ResourceParameters *params = req->getParams(); + std::string paramValDelete; + + res->setHeader("Content-Type", "application/json"); + if (params->getQueryParameter("delete", paramValDelete)) { + std::string pathDelete = "/" + paramValDelete; + if (SPIFFS.remove(pathDelete.c_str())) { + Serial.println(pathDelete.c_str()); + res->println("{"); + res->println("\"status\": \"ok\""); + res->println("}"); + return; + } else { + Serial.println(pathDelete.c_str()); + res->println("{"); + res->println("\"status\": \"Error\""); + res->println("}"); + return; + } + } +} + void handleStaticBrowse(HTTPRequest *req, HTTPResponse *res) { // Get access to the parameters From 8e0c2248138138e6a4d6273310f3e2ae020e7914 Mon Sep 17 00:00:00 2001 From: Charles Crossan Date: Tue, 22 Dec 2020 17:47:24 -0500 Subject: [PATCH 15/17] remove extra whitespace --- src/meshwifi/meshhttp.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/meshwifi/meshhttp.cpp b/src/meshwifi/meshhttp.cpp index 79e7fd89d..a0183f340 100644 --- a/src/meshwifi/meshhttp.cpp +++ b/src/meshwifi/meshhttp.cpp @@ -393,8 +393,6 @@ void handleStaticPost(HTTPRequest *req, HTTPResponse *res) res->println(""); } - - void handleSpiffsBrowseStatic(HTTPRequest *req, HTTPResponse *res) { // jm From 877dc824a9979ab81dd5b76bbe506a9f7531b2c9 Mon Sep 17 00:00:00 2001 From: Jm Date: Tue, 22 Dec 2020 22:26:08 -0800 Subject: [PATCH 16/17] #407 - Fix for wifi does not come back up after power down --- platformio.ini | 2 +- src/meshwifi/meshwifi.cpp | 21 +++++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/platformio.ini b/platformio.ini index 015aa105b..327c5d6ca 100644 --- a/platformio.ini +++ b/platformio.ini @@ -103,7 +103,7 @@ lib_deps = # board_build.ldscript = linker/esp32.extram.bss.ld lib_ignore = segger_rtt platform_packages = - framework-arduinoespressif32@https://github.com/meshtastic/arduino-esp32.git#2814f110aa618429bdd9a0a2d6a93c55f29f87a6 + framework-arduinoespressif32@https://github.com/meshtastic/arduino-esp32.git#c29e0bcde1b1b4a939dd7339dea0302d2d589ae7 ; customize the partition table ; http://docs.platformio.org/en/latest/platforms/espressif32.html#partition-tables diff --git a/src/meshwifi/meshwifi.cpp b/src/meshwifi/meshwifi.cpp index 16ae61850..54358077a 100644 --- a/src/meshwifi/meshwifi.cpp +++ b/src/meshwifi/meshwifi.cpp @@ -40,12 +40,14 @@ bool isWifiAvailable() const char *wifiName = radioConfig.preferences.wifi_ssid; const char *wifiPsw = radioConfig.preferences.wifi_password; - // strcpy(radioConfig.preferences.wifi_ssid, ""); - // strcpy(radioConfig.preferences.wifi_password, ""); + // strcpy(radioConfig.preferences.wifi_ssid, "meshtastic"); + // strcpy(radioConfig.preferences.wifi_password, "meshtastic!"); // strcpy(radioConfig.preferences.wifi_ssid, "meshtasticAdmin"); // strcpy(radioConfig.preferences.wifi_password, "12345678"); + // radioConfig.preferences.wifi_ap_mode = true; + // radioConfig.preferences.wifi_ap_mode = false; if (*wifiName && *wifiPsw) { return 1; @@ -221,9 +223,16 @@ static void WiFiEvent(WiFiEvent_t event) DEBUG_MSG("Obtained IP address: \n"); Serial.println(WiFi.localIP()); - // Start web server - initWebServer(); - initApiServer(); + if (!APStartupComplete) { + // Start web server + DEBUG_MSG("... Starting network services\n"); + initWebServer(); + initApiServer(); + + APStartupComplete = true; + } else { + DEBUG_MSG("... Not starting network services (They're already running)\n"); + } break; case SYSTEM_EVENT_STA_LOST_IP: @@ -253,7 +262,7 @@ static void WiFiEvent(WiFiEvent_t event) APStartupComplete = true; } else { - DEBUG_MSG("... Not starting network services\n"); + DEBUG_MSG("... Not starting network services (They're already running)\n"); } break; From bacc1b1dad83611c7f044cfa7d6f42b797c1dcb4 Mon Sep 17 00:00:00 2001 From: Jm Date: Tue, 22 Dec 2020 22:37:34 -0800 Subject: [PATCH 17/17] #581 - Quiet a compile time warning I introduced. --- src/PowerFSM.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PowerFSM.cpp b/src/PowerFSM.cpp index be1ace0df..20ad66256 100644 --- a/src/PowerFSM.cpp +++ b/src/PowerFSM.cpp @@ -179,7 +179,7 @@ void PowerFSM_setup() 1) If we're powered up and there's no battery, we must be getting power externally. 2) If we detect USB power from the power management chip, we must be getting power externally. */ - bool hasPower = (powerStatus && !powerStatus->getHasBattery()) || !isLowPower && powerStatus && powerStatus->getHasUSB(); + bool hasPower = (powerStatus && !powerStatus->getHasBattery()) || (!isLowPower && powerStatus && powerStatus->getHasUSB()); bool isRouter = radioConfig.preferences.is_router; DEBUG_MSG("PowerFSM init, USB power=%d\n", hasPower); powerFSM.add_timed_transition(&stateBOOT, hasPower ? &statePOWER : &stateON, 3 * 1000, NULL, "boot timeout");