From d458f673be870976263896c4ca9105e2bb13b406 Mon Sep 17 00:00:00 2001 From: Jm Date: Fri, 8 Jan 2021 22:25:44 -0800 Subject: [PATCH] Web server is now treaded and moved to mesh/wifi/* --- src/graphics/Screen.cpp | 2 +- src/main.cpp | 10 +- src/mesh/NodeDB.cpp | 2 +- src/mesh/wifi/ContentHelper.cpp | 14 ++ src/mesh/wifi/ContentHelper.h | 8 + .../wifi/ContentStatic.h} | 9 +- .../meshhttp.cpp => mesh/wifi/WebServer.cpp} | 216 +++++++++--------- .../meshhttp.h => mesh/wifi/WebServer.h} | 26 ++- src/mesh/wifi/WebServerThread.cpp | 17 -- src/mesh/wifi/WebServerThread.h | 20 -- .../wifi/WiFiAPClient.cpp} | 4 +- .../meshwifi.h => mesh/wifi/WiFiAPClient.h} | 0 src/nimble/BluetoothUtil.cpp | 2 +- src/nrf52/wifi-stubs.cpp | 4 +- 14 files changed, 160 insertions(+), 174 deletions(-) create mode 100644 src/mesh/wifi/ContentHelper.cpp create mode 100644 src/mesh/wifi/ContentHelper.h rename src/{meshwifi/meshhttpStatic.h => mesh/wifi/ContentStatic.h} (98%) rename src/{meshwifi/meshhttp.cpp => mesh/wifi/WebServer.cpp} (98%) rename src/{meshwifi/meshhttp.h => mesh/wifi/WebServer.h} (62%) delete mode 100644 src/mesh/wifi/WebServerThread.cpp delete mode 100644 src/mesh/wifi/WebServerThread.h rename src/{meshwifi/meshwifi.cpp => mesh/wifi/WiFiAPClient.cpp} (99%) rename src/{meshwifi/meshwifi.h => mesh/wifi/WiFiAPClient.h} (100%) diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 34ab53ac5..d4a1f5e71 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -31,7 +31,7 @@ along with this program. If not, see . #include "graphics/images.h" #include "main.h" #include "mesh-pb-constants.h" -#include "meshwifi/meshwifi.h" +#include "mesh/wifi/WiFiAPClient.h" #include "plugins/TextMessagePlugin.h" #include "target_specific.h" #include "utils.h" diff --git a/src/main.cpp b/src/main.cpp index 4bf110ad6..441d16fdb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -19,11 +19,10 @@ #include "concurrency/Periodic.h" #include "graphics/Screen.h" #include "main.h" -#include "meshwifi/meshhttp.h" -#include "meshwifi/meshwifi.h" -#include "mesh/wifi/WebServerThread.h" -#include "sleep.h" +#include "mesh/wifi/WebServer.h" +#include "mesh/wifi/WiFiAPClient.h" #include "plugins/Plugins.h" +#include "sleep.h" #include "target_specific.h" #include #include @@ -583,7 +582,7 @@ void loop() #endif // TODO: This should go into a thread handled by FreeRTOS. - //handleWebResponse(); + // handleWebResponse(); service.loop(); @@ -596,5 +595,4 @@ void loop() // We want to sleep as long as possible here - because it saves power mainDelay.delay(delayMsec); // if (didWake) DEBUG_MSG("wake!\n"); - } diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index a87a5e49a..d674301d1 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -16,7 +16,7 @@ #include "configuration.h" #include "error.h" #include "mesh-pb-constants.h" -#include "meshwifi/meshwifi.h" +#include "mesh/wifi/WiFiAPClient.h" #include #include diff --git a/src/mesh/wifi/ContentHelper.cpp b/src/mesh/wifi/ContentHelper.cpp new file mode 100644 index 000000000..96dec5d92 --- /dev/null +++ b/src/mesh/wifi/ContentHelper.cpp @@ -0,0 +1,14 @@ +#include "mesh/wifi/ContentHelper.h" +//#include +//#include "main.h" + +void replaceAll(std::string &str, const std::string &from, const std::string &to) +{ + if (from.empty()) + return; + size_t start_pos = 0; + while ((start_pos = str.find(from, start_pos)) != std::string::npos) { + str.replace(start_pos, from.length(), to); + start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx' + } +} diff --git a/src/mesh/wifi/ContentHelper.h b/src/mesh/wifi/ContentHelper.h new file mode 100644 index 000000000..f94b98162 --- /dev/null +++ b/src/mesh/wifi/ContentHelper.h @@ -0,0 +1,8 @@ +#include +#include + + + + +void replaceAll(std::string &str, const std::string &from, const std::string &to); + diff --git a/src/meshwifi/meshhttpStatic.h b/src/mesh/wifi/ContentStatic.h similarity index 98% rename from src/meshwifi/meshhttpStatic.h rename to src/mesh/wifi/ContentStatic.h index e48aeb414..324276476 100644 --- a/src/meshwifi/meshhttpStatic.h +++ b/src/mesh/wifi/ContentStatic.h @@ -2,14 +2,7 @@ #include /* - Steps: - - Compress the .js file to .js.gz - - Convert to hex: - http://tomeko.net/online_tools/file_to_hex.php?lang=en - - Paste into the array - - Note the filesize of your .gz file and write the file - size into the length int. - + This file contains static content. */ // Length of the binary data diff --git a/src/meshwifi/meshhttp.cpp b/src/mesh/wifi/WebServer.cpp similarity index 98% rename from src/meshwifi/meshhttp.cpp rename to src/mesh/wifi/WebServer.cpp index 76e9616f7..ef11e5d39 100644 --- a/src/meshwifi/meshhttp.cpp +++ b/src/mesh/wifi/WebServer.cpp @@ -1,12 +1,12 @@ -#include "meshwifi/meshhttp.h" +#include "mesh/wifi/WebServer.h" #include "NodeDB.h" #include "PowerFSM.h" #include "airtime.h" -#include "configuration.h" #include "esp_task_wdt.h" #include "main.h" -#include "meshhttpStatic.h" -#include "meshwifi/meshwifi.h" +#include "mesh/wifi/ContentHelper.h" +#include "mesh/wifi/ContentStatic.h" +#include "mesh/wifi/WiFiAPClient.h" #include "sleep.h" #include #include @@ -15,6 +15,7 @@ #include #include + // Persistant Data Storage #include Preferences prefs; @@ -49,7 +50,6 @@ HTTPServer *insecureServer; // Our API to handle messages to and from the radio. HttpAPI webAPI; - // Declare some handler functions for the various URLs on the server void handleAPIv1FromRadio(HTTPRequest *req, HTTPResponse *res); void handleAPIv1ToRadio(HTTPRequest *req, HTTPResponse *res); @@ -197,6 +197,19 @@ void createSSLCert() DEBUG_MSG("SSL Cert Ready!\n"); } +WebServerThread *webServerThread; + +WebServerThread::WebServerThread() : concurrency::OSThread("WebServerThread") {} + +int32_t WebServerThread::runOnce() +{ + // DEBUG_MSG("WebServerThread::runOnce()\n"); + handleWebResponse(); + + // Loop every 5ms. + return (5); +} + void initWebServer() { DEBUG_MSG("Initializing Web Server ...\n"); @@ -242,6 +255,7 @@ void initWebServer() ResourceNode *nodeAPIv1ToRadioOptions = new ResourceNode("/api/v1/toradio", "OPTIONS", &handleAPIv1ToRadio); ResourceNode *nodeAPIv1ToRadio = new ResourceNode("/api/v1/toradio", "PUT", &handleAPIv1ToRadio); ResourceNode *nodeAPIv1FromRadio = new ResourceNode("/api/v1/fromradio", "GET", &handleAPIv1FromRadio); + ResourceNode *nodeHotspot = new ResourceNode("/hotspot-detect.html", "GET", &handleHotspot); ResourceNode *nodeFavicon = new ResourceNode("/favicon.ico", "GET", &handleFavicon); ResourceNode *nodeRoot = new ResourceNode("/", "GET", &handleRoot); @@ -341,6 +355,97 @@ void middlewareSpeedUp160(HTTPRequest *req, HTTPResponse *res, std::functiongetParams(); + + // std::string paramAll = "all"; + std::string valueAll; + + // Status code is 200 OK by default. + res->setHeader("Content-Type", "application/x-protobuf"); + res->setHeader("Access-Control-Allow-Origin", "*"); + res->setHeader("Access-Control-Allow-Methods", "PUT, GET"); + res->setHeader("X-Protobuf-Schema", "https://raw.githubusercontent.com/meshtastic/Meshtastic-protobufs/master/mesh.proto"); + + uint8_t txBuf[MAX_STREAM_BUF_SIZE]; + uint32_t len = 1; + + if (params->getQueryParameter("all", valueAll)) { + + // If all is ture, return all the buffers we have available + // to us at this point in time. + if (valueAll == "true") { + while (len) { + len = webAPI.getFromRadio(txBuf); + res->write(txBuf, len); + } + + // Otherwise, just return one protobuf + } else { + len = webAPI.getFromRadio(txBuf); + res->write(txBuf, len); + } + + // the param "all" was not spcified. Return just one protobuf + } else { + len = webAPI.getFromRadio(txBuf); + res->write(txBuf, len); + } + + DEBUG_MSG("--------------- webAPI handleAPIv1FromRadio, len %d\n", len); +} + +void handleAPIv1ToRadio(HTTPRequest *req, HTTPResponse *res) +{ + DEBUG_MSG("+++++++++++++++ webAPI handleAPIv1ToRadio\n"); + + /* + For documentation, see: + https://github.com/meshtastic/Meshtastic-device/wiki/HTTP-REST-API-discussion + https://github.com/meshtastic/Meshtastic-device/blob/master/docs/software/device-api.md + + Example: + http://10.10.30.198/api/v1/toradio + */ + + // Status code is 200 OK by default. + + res->setHeader("Content-Type", "application/x-protobuf"); + res->setHeader("Access-Control-Allow-Headers", "Content-Type"); + res->setHeader("Access-Control-Allow-Origin", "*"); + res->setHeader("Access-Control-Allow-Methods", "PUT, OPTIONS"); + res->setHeader("X-Protobuf-Schema", "https://raw.githubusercontent.com/meshtastic/Meshtastic-protobufs/master/mesh.proto"); + + if (req->getMethod() == "OPTIONS") { + res->setStatusCode(204); // Success with no content + res->print(""); + return; + } + + byte buffer[MAX_TO_FROM_RADIO_SIZE]; + size_t s = req->readBytes(buffer, MAX_TO_FROM_RADIO_SIZE); + + DEBUG_MSG("Received %d bytes from PUT request\n", s); + webAPI.handleToRadio(buffer, s); + + res->write(buffer, s); + DEBUG_MSG("--------------- webAPI handleAPIv1ToRadio\n"); +} + void handleStaticPost(HTTPRequest *req, HTTPResponse *res) { // Assume POST request. Contains submitted data. @@ -877,97 +982,6 @@ void handleHotspot(HTTPRequest *req, HTTPResponse *res) res->println("\n"); } -void handleAPIv1FromRadio(HTTPRequest *req, HTTPResponse *res) -{ - - DEBUG_MSG("+++++++++++++++ webAPI handleAPIv1FromRadio\n"); - - /* - For documentation, see: - https://github.com/meshtastic/Meshtastic-device/wiki/HTTP-REST-API-discussion - https://github.com/meshtastic/Meshtastic-device/blob/master/docs/software/device-api.md - - Example: - http://10.10.30.198/api/v1/fromradio - */ - - // Get access to the parameters - ResourceParameters *params = req->getParams(); - - // std::string paramAll = "all"; - std::string valueAll; - - // Status code is 200 OK by default. - res->setHeader("Content-Type", "application/x-protobuf"); - res->setHeader("Access-Control-Allow-Origin", "*"); - res->setHeader("Access-Control-Allow-Methods", "PUT, GET"); - res->setHeader("X-Protobuf-Schema", "https://raw.githubusercontent.com/meshtastic/Meshtastic-protobufs/master/mesh.proto"); - - uint8_t txBuf[MAX_STREAM_BUF_SIZE]; - uint32_t len = 1; - - if (params->getQueryParameter("all", valueAll)) { - - // If all is ture, return all the buffers we have available - // to us at this point in time. - if (valueAll == "true") { - while (len) { - len = webAPI.getFromRadio(txBuf); - res->write(txBuf, len); - } - - // Otherwise, just return one protobuf - } else { - len = webAPI.getFromRadio(txBuf); - res->write(txBuf, len); - } - - // the param "all" was not spcified. Return just one protobuf - } else { - len = webAPI.getFromRadio(txBuf); - res->write(txBuf, len); - } - - DEBUG_MSG("--------------- webAPI handleAPIv1FromRadio, len %d\n", len); -} - -void handleAPIv1ToRadio(HTTPRequest *req, HTTPResponse *res) -{ - DEBUG_MSG("+++++++++++++++ webAPI handleAPIv1ToRadio\n"); - - /* - For documentation, see: - https://github.com/meshtastic/Meshtastic-device/wiki/HTTP-REST-API-discussion - https://github.com/meshtastic/Meshtastic-device/blob/master/docs/software/device-api.md - - Example: - http://10.10.30.198/api/v1/toradio - */ - - // Status code is 200 OK by default. - - res->setHeader("Content-Type", "application/x-protobuf"); - res->setHeader("Access-Control-Allow-Headers", "Content-Type"); - res->setHeader("Access-Control-Allow-Origin", "*"); - res->setHeader("Access-Control-Allow-Methods", "PUT, OPTIONS"); - res->setHeader("X-Protobuf-Schema", "https://raw.githubusercontent.com/meshtastic/Meshtastic-protobufs/master/mesh.proto"); - - if (req->getMethod() == "OPTIONS") { - res->setStatusCode(204); // Success with no content - res->print(""); - return; - } - - byte buffer[MAX_TO_FROM_RADIO_SIZE]; - size_t s = req->readBytes(buffer, MAX_TO_FROM_RADIO_SIZE); - - DEBUG_MSG("Received %d bytes from PUT request\n", s); - webAPI.handleToRadio(buffer, s); - - res->write(buffer, s); - DEBUG_MSG("--------------- webAPI handleAPIv1ToRadio\n"); -} - /* To convert text to c strings: @@ -1212,13 +1226,3 @@ void handleFavicon(HTTPRequest *req, HTTPResponse *res) res->write(FAVICON_DATA, FAVICON_LENGTH); } -void replaceAll(std::string &str, const std::string &from, const std::string &to) -{ - if (from.empty()) - return; - size_t start_pos = 0; - while ((start_pos = str.find(from, start_pos)) != std::string::npos) { - str.replace(start_pos, from.length(), to); - start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx' - } -} diff --git a/src/meshwifi/meshhttp.h b/src/mesh/wifi/WebServer.h similarity index 62% rename from src/meshwifi/meshhttp.h rename to src/mesh/wifi/WebServer.h index fc3e89f02..b01d59605 100644 --- a/src/meshwifi/meshhttp.h +++ b/src/mesh/wifi/WebServer.h @@ -12,18 +12,11 @@ void handleNotFound(); void handleWebResponse(); -void handleJSONChatHistory(); -void notifyWebUI(); +//void handleHotspot(); -void handleHotspot(); - -void handleStyleCSS(); -void handleRoot(); -void handleScriptsScriptJS(); -void handleJSONChatHistoryDummy(); - -void replaceAll(std::string &str, const std::string &from, const std::string &to); +//void handleStyleCSS(); +//void handleRoot(); // Interface to the PhoneAPI to access the protobufs with messages @@ -39,3 +32,16 @@ class HttpAPI : public PhoneAPI protected: // Nothing here yet }; + +class WebServerThread : private concurrency::OSThread +{ + + public: + WebServerThread(); + + protected: + + virtual int32_t runOnce(); +}; + +extern WebServerThread *webServerThread; diff --git a/src/mesh/wifi/WebServerThread.cpp b/src/mesh/wifi/WebServerThread.cpp deleted file mode 100644 index 991fd6d92..000000000 --- a/src/mesh/wifi/WebServerThread.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "mesh/wifi/WebServerThread.h" -#include "meshwifi/meshhttp.h" -#include - -WebServerThread *webServerThread; - -WebServerThread::WebServerThread() : concurrency::OSThread("WebServerThread") {} - -int32_t WebServerThread::runOnce() -{ - //DEBUG_MSG("WebServerThread::runOnce()\n"); - handleWebResponse(); - - // Loop every 5ms. - return (5); -} - diff --git a/src/mesh/wifi/WebServerThread.h b/src/mesh/wifi/WebServerThread.h deleted file mode 100644 index f57afb751..000000000 --- a/src/mesh/wifi/WebServerThread.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -#include "concurrency/OSThread.h" -#include "configuration.h" -#include -#include - - -class WebServerThread : private concurrency::OSThread -{ - - public: - WebServerThread(); - - protected: - - virtual int32_t runOnce(); -}; - -extern WebServerThread *webServerThread; diff --git a/src/meshwifi/meshwifi.cpp b/src/mesh/wifi/WiFiAPClient.cpp similarity index 99% rename from src/meshwifi/meshwifi.cpp rename to src/mesh/wifi/WiFiAPClient.cpp index 5ae83f87b..32989b2b8 100644 --- a/src/meshwifi/meshwifi.cpp +++ b/src/mesh/wifi/WiFiAPClient.cpp @@ -1,9 +1,9 @@ -#include "meshwifi.h" +#include "mesh/wifi/WiFiAPClient.h" #include "NodeDB.h" #include "mesh/wifi/WiFiServerAPI.h" #include "configuration.h" #include "main.h" -#include "meshwifi/meshhttp.h" +#include "mesh/wifi/WebServer.h" #include "target_specific.h" #include #include diff --git a/src/meshwifi/meshwifi.h b/src/mesh/wifi/WiFiAPClient.h similarity index 100% rename from src/meshwifi/meshwifi.h rename to src/mesh/wifi/WiFiAPClient.h diff --git a/src/nimble/BluetoothUtil.cpp b/src/nimble/BluetoothUtil.cpp index daba69372..37fb54d50 100644 --- a/src/nimble/BluetoothUtil.cpp +++ b/src/nimble/BluetoothUtil.cpp @@ -7,7 +7,7 @@ #include "esp_bt.h" #include "host/util/util.h" #include "main.h" -#include "meshwifi/meshwifi.h" +#include "mesh/wifi/WiFiAPClient.h" #include "nimble/NimbleDefs.h" #include "services/gap/ble_svc_gap.h" #include "services/gatt/ble_svc_gatt.h" diff --git a/src/nrf52/wifi-stubs.cpp b/src/nrf52/wifi-stubs.cpp index 1c1009862..e12e295a3 100644 --- a/src/nrf52/wifi-stubs.cpp +++ b/src/nrf52/wifi-stubs.cpp @@ -1,5 +1,5 @@ -#include "meshwifi/meshhttp.h" -#include "meshwifi/meshwifi.h" +#include "mesh/wifi/WebServer.h" +#include "mesh/wifi/WiFiAPClient.h" void initWifi(bool forceSoftAP) {}