From 925829dc58565c340e5a1c5e3701c8351167af5e Mon Sep 17 00:00:00 2001 From: Jm Date: Fri, 1 Jan 2021 12:31:46 -0800 Subject: [PATCH 1/7] Partial work to migrate to OSThread model --- src/airtime.cpp | 49 +++++++++++++++++++++++----------- src/airtime.h | 22 ++++++++++++--- src/main.cpp | 2 -- src/mesh/RadioLibInterface.cpp | 6 ++--- src/meshwifi/meshhttp.cpp | 21 +++++++++++---- src/meshwifi/meshhttp.h | 21 +++++++++++++-- 6 files changed, 91 insertions(+), 30 deletions(-) diff --git a/src/airtime.cpp b/src/airtime.cpp index ec0bf8c86..9632181b4 100644 --- a/src/airtime.cpp +++ b/src/airtime.cpp @@ -3,6 +3,8 @@ #define periodsToLog 48 +AirTime airTime; + // A reminder that there are 3600 seconds in an hour so I don't have // to keep googling it. // This can be changed to a smaller number to speed up testing. @@ -11,6 +13,8 @@ uint32_t secondsPerPeriod = 3600; uint32_t lastMillis = 0; uint32_t secSinceBoot = 0; +// AirTime at; + // Don't read out of this directly. Use the helper functions. struct airtimeStruct { uint16_t periodTX[periodsToLog]; @@ -19,14 +23,18 @@ struct airtimeStruct { uint8_t lastPeriodIndex; } airtimes; -void logAirtime(reportTypes reportType, uint32_t airtime_ms) +void AirTime::logAirtime(reportTypes reportType, uint32_t airtime_ms) { + DEBUG_MSG("Packet - logAirtime()\n"); if (reportType == TX_LOG) { + DEBUG_MSG("Packet transmitted = %u\n", (uint32_t)round(airtime_ms / 1000)); airtimes.periodTX[0] = airtimes.periodTX[0] + round(airtime_ms / 1000); } else if (reportType == RX_LOG) { + DEBUG_MSG("Packet received = %u\n", (uint32_t)round(airtime_ms / 1000)); airtimes.periodRX[0] = airtimes.periodRX[0] + round(airtime_ms / 1000); } else if (reportType == RX_ALL_LOG) { + DEBUG_MSG("Packet received (noise?) = %u\n", (uint32_t)round(airtime_ms / 1000)); airtimes.periodRX_ALL[0] = airtimes.periodRX_ALL[0] + round(airtime_ms / 1000); } else { // Unknown report type @@ -38,23 +46,22 @@ uint8_t currentPeriodIndex() return ((getSecondsSinceBoot() / secondsPerPeriod) % periodsToLog); } -void airtimeCalculator() +void airtimeRotatePeriod() { - if (millis() - lastMillis > 1000) { - lastMillis = millis(); - secSinceBoot++; - if (airtimes.lastPeriodIndex != currentPeriodIndex()) { - for (int i = periodsToLog - 2; i >= 0; --i) { - airtimes.periodTX[i + 1] = airtimes.periodTX[i]; - airtimes.periodRX[i + 1] = airtimes.periodRX[i]; - airtimes.periodRX_ALL[i + 1] = airtimes.periodRX_ALL[i]; - } - airtimes.periodTX[0] = 0; - airtimes.periodRX[0] = 0; - airtimes.periodRX_ALL[0] = 0; - airtimes.lastPeriodIndex = currentPeriodIndex(); + if (airtimes.lastPeriodIndex != currentPeriodIndex()) { + DEBUG_MSG("Rotating airtimes to a new period = %u\n", currentPeriodIndex()); + + for (int i = periodsToLog - 2; i >= 0; --i) { + airtimes.periodTX[i + 1] = airtimes.periodTX[i]; + airtimes.periodRX[i + 1] = airtimes.periodRX[i]; + airtimes.periodRX_ALL[i + 1] = airtimes.periodRX_ALL[i]; } + airtimes.periodTX[0] = 0; + airtimes.periodRX[0] = 0; + airtimes.periodRX_ALL[0] = 0; + + airtimes.lastPeriodIndex = currentPeriodIndex(); } } @@ -86,3 +93,15 @@ uint32_t getSecondsSinceBoot() { return secSinceBoot; } + +AirTime::AirTime() : concurrency::OSThread("AirTime") {} + +int32_t AirTime::runOnce() +{ + DEBUG_MSG("AirTime::runOnce()\n"); + + airtimeRotatePeriod(); + secSinceBoot++; + + return 1000; +} \ No newline at end of file diff --git a/src/airtime.h b/src/airtime.h index 4cfbb82c2..d79e8829b 100644 --- a/src/airtime.h +++ b/src/airtime.h @@ -1,5 +1,6 @@ #pragma once +#include "concurrency/OSThread.h" #include "configuration.h" #include #include @@ -18,7 +19,7 @@ TX_LOG + RX_LOG = Total air time for a perticular meshtastic channel. TX_LOG + RX_LOG = Total air time for a perticular meshtastic channel, including - other lora radios. + other lora radios. RX_ALL_LOG - RX_LOG = Other lora radios on our frequency channel. */ @@ -26,7 +27,7 @@ enum reportTypes { TX_LOG, RX_LOG, RX_ALL_LOG }; void logAirtime(reportTypes reportType, uint32_t airtime_ms); -void airtimeCalculator(); +void airtimeRotatePeriod(); uint8_t currentPeriodIndex(); uint8_t getPeriodsToLog(); @@ -35,4 +36,19 @@ uint32_t getSecondsSinceBoot(); uint16_t *airtimeReport(reportTypes reportType); -uint32_t getSecondsPerPeriod(); \ No newline at end of file +uint32_t getSecondsPerPeriod(); + +class AirTime : private concurrency::OSThread +{ + + public: + AirTime(); + + void logAirtime(reportTypes reportType, uint32_t airtime_ms); + + protected: + + virtual int32_t runOnce(); +}; + +extern AirTime airTime; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 029f753ea..bf62e5852 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -584,6 +584,4 @@ void loop() mainDelay.delay(delayMsec); // if (didWake) DEBUG_MSG("wake!\n"); - // Handles cleanup for the airtime calculator. - airtimeCalculator(); } diff --git a/src/mesh/RadioLibInterface.cpp b/src/mesh/RadioLibInterface.cpp index f4ceeded3..b4c93ac92 100644 --- a/src/mesh/RadioLibInterface.cpp +++ b/src/mesh/RadioLibInterface.cpp @@ -97,7 +97,7 @@ ErrorCode RadioLibInterface::send(MeshPacket *p) // Count the packet toward our TX airtime utilization. // We only count it if it can be added to the TX queue. - logAirtime(TX_LOG, xmitMsec); + airTime.logAirtime(TX_LOG, xmitMsec); // We want all sending/receiving to be done by our daemon thread, We use a delay here because this packet might have been sent // in response to a packet we just received. So we want to make sure the other side has had a chance to reconfigure its radio @@ -216,7 +216,7 @@ void RadioLibInterface::handleReceiveInterrupt() size_t length = iface->getPacketLength(); xmitMsec = getPacketTime(length); - logAirtime(RX_ALL_LOG, xmitMsec); + airTime.logAirtime(RX_ALL_LOG, xmitMsec); int state = iface->readData(radiobuf, length); if (state != ERR_NONE) { @@ -258,7 +258,7 @@ void RadioLibInterface::handleReceiveInterrupt() printPacket("Lora RX", mp); xmitMsec = getPacketTime(mp); - logAirtime(RX_LOG, xmitMsec); + airTime.logAirtime(RX_LOG, xmitMsec); deliverToReceiver(mp); } diff --git a/src/meshwifi/meshhttp.cpp b/src/meshwifi/meshhttp.cpp index 319a70d7a..46fb18091 100644 --- a/src/meshwifi/meshhttp.cpp +++ b/src/meshwifi/meshhttp.cpp @@ -808,10 +808,10 @@ void handleFormUpload(HTTPRequest *req, HTTPResponse *res) return; } - //if (readLength) { - file.write(buf, readLength); - fileLength += readLength; - DEBUG_MSG("File Length %i\n", fileLength); + // if (readLength) { + file.write(buf, readLength); + fileLength += readLength; + DEBUG_MSG("File Length %i\n", fileLength); //} } // enableLoopWDT(); @@ -988,7 +988,8 @@ void handleRoot(HTTPRequest *req, HTTPResponse *res) res->printf("

\n"); res->printf("

You have gotten this error because the filesystem for the web server has not been loaded.

\n"); res->printf("

Please review the 'Common Problems' section of the web interface documentation.

\n"); + "href=https://github.com/meshtastic/Meshtastic-device/wiki/" + "How-to-use-the-Meshtastic-Web-Interface-over-WiFi>web interface documentation.

\n"); return; } @@ -1212,3 +1213,13 @@ void replaceAll(std::string &str, const std::string &from, const std::string &to start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx' } } + +HttpServer::HttpServer() : concurrency::OSThread("HttpServer") { + DEBUG_MSG("22**********************************\n"); +} + +int32_t HttpServer::runOnce() +{ + DEBUG_MSG("11**********************************\n"); + return 200; // Poll our GPIOs every 200ms (FIXME, make adjustable via protobuf arg) +} diff --git a/src/meshwifi/meshhttp.h b/src/meshwifi/meshhttp.h index b7a84475e..3bcf25111 100644 --- a/src/meshwifi/meshhttp.h +++ b/src/meshwifi/meshhttp.h @@ -1,6 +1,7 @@ #pragma once #include "PhoneAPI.h" +#include "concurrency/OSThread.h" #include #include @@ -22,7 +23,7 @@ void handleRoot(); void handleScriptsScriptJS(); void handleJSONChatHistoryDummy(); -void replaceAll(std::string& str, const std::string& from, const std::string& to); +void replaceAll(std::string &str, const std::string &from, const std::string &to); class HttpAPI : public PhoneAPI { @@ -35,4 +36,20 @@ class HttpAPI : public PhoneAPI protected: // Nothing here yet -}; \ No newline at end of file +}; + +/** + * A plugin that provides easy low-level remote access to device hardware. + */ +class HttpServer : public concurrency::OSThread +{ + public: + // Nothing here + // RemoteHardwarePlugin(); + HttpServer(); + + protected: + virtual int32_t runOnce(); +}; + +// extern HttpServer httpServer; From 8295b88d96cfaa0fa913a20e08c66914ae39cec3 Mon Sep 17 00:00:00 2001 From: Jm Date: Fri, 1 Jan 2021 21:20:34 -0800 Subject: [PATCH 2/7] Checking in work so I don't lose it. Nothing's broke with the build. --- src/airtime.cpp | 28 +++++++++++++++++----------- src/main.cpp | 1 + src/meshwifi/WebServerThread.cpp | 14 ++++++++++++++ src/meshwifi/WebServerThread.h | 22 ++++++++++++++++++++++ src/meshwifi/meshhttp.cpp | 11 +---------- src/meshwifi/meshhttp.h | 18 ++---------------- 6 files changed, 57 insertions(+), 37 deletions(-) create mode 100644 src/meshwifi/WebServerThread.cpp create mode 100644 src/meshwifi/WebServerThread.h diff --git a/src/airtime.cpp b/src/airtime.cpp index 9632181b4..a8399fbcd 100644 --- a/src/airtime.cpp +++ b/src/airtime.cpp @@ -17,27 +17,27 @@ uint32_t secSinceBoot = 0; // Don't read out of this directly. Use the helper functions. struct airtimeStruct { - uint16_t periodTX[periodsToLog]; - uint16_t periodRX[periodsToLog]; - uint16_t periodRX_ALL[periodsToLog]; + uint16_t periodTX[periodsToLog]; // AirTime transmitted + uint16_t periodRX[periodsToLog]; // AirTime received and repeated (Only valid mesh packets) + uint16_t periodRX_ALL[periodsToLog]; // AirTime received regardless of valid mesh packet. Could include noise. uint8_t lastPeriodIndex; } airtimes; void AirTime::logAirtime(reportTypes reportType, uint32_t airtime_ms) { - DEBUG_MSG("Packet - logAirtime()\n"); + // DEBUG_MSG("Packet - logAirtime()\n"); if (reportType == TX_LOG) { - DEBUG_MSG("Packet transmitted = %u\n", (uint32_t)round(airtime_ms / 1000)); + DEBUG_MSG("AirTime - Packet transmitted : %us %ums\n", (uint32_t)round((float)airtime_ms / (float)1000), airtime_ms); airtimes.periodTX[0] = airtimes.periodTX[0] + round(airtime_ms / 1000); } else if (reportType == RX_LOG) { - DEBUG_MSG("Packet received = %u\n", (uint32_t)round(airtime_ms / 1000)); + DEBUG_MSG("AirTime - Packet received : %us %ums\n", (uint32_t)round((float)airtime_ms / (float)1000), airtime_ms); airtimes.periodRX[0] = airtimes.periodRX[0] + round(airtime_ms / 1000); } else if (reportType == RX_ALL_LOG) { - DEBUG_MSG("Packet received (noise?) = %u\n", (uint32_t)round(airtime_ms / 1000)); + DEBUG_MSG("AirTime - Packet received (noise?) : %us %ums\n", (uint32_t)round((float)airtime_ms / (float)1000), airtime_ms); airtimes.periodRX_ALL[0] = airtimes.periodRX_ALL[0] + round(airtime_ms / 1000); } else { - // Unknown report type + DEBUG_MSG("AirTime - Unknown report time. This should never happen!!\n"); } } @@ -67,7 +67,6 @@ void airtimeRotatePeriod() uint16_t *airtimeReport(reportTypes reportType) { - // currentHourIndexReset(); if (reportType == TX_LOG) { return airtimes.periodTX; @@ -98,10 +97,17 @@ AirTime::AirTime() : concurrency::OSThread("AirTime") {} int32_t AirTime::runOnce() { - DEBUG_MSG("AirTime::runOnce()\n"); + // DEBUG_MSG("AirTime::runOnce()\n"); airtimeRotatePeriod(); secSinceBoot++; - return 1000; + /* + This actually doesn't need to be run once per second but we currently use it for the + secSinceBoot counter. + + If we have a better counter of how long the device has been online (and not millis()) + then we can change this to something less frequent. Maybe once ever 5 seconds? + */ + return (1000 * 1); } \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index bf62e5852..32704093a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -21,6 +21,7 @@ #include "main.h" #include "meshwifi/meshhttp.h" #include "meshwifi/meshwifi.h" +#include "meshwifi/WebServerThread.h" #include "sleep.h" #include "target_specific.h" #include diff --git a/src/meshwifi/WebServerThread.cpp b/src/meshwifi/WebServerThread.cpp new file mode 100644 index 000000000..dbb4a82f2 --- /dev/null +++ b/src/meshwifi/WebServerThread.cpp @@ -0,0 +1,14 @@ +#include "meshwifi/WebServerThread.h" +#include + +// Thread for the HTTP Server +WebServerThread webServerThread; + +WebServerThread::WebServerThread() : concurrency::OSThread("WebServerThread") {} + +int32_t WebServerThread::runOnce() +{ + DEBUG_MSG("WebServerThread::runOnce()\n"); + + return (1000 * 1); +} diff --git a/src/meshwifi/WebServerThread.h b/src/meshwifi/WebServerThread.h new file mode 100644 index 000000000..2f3b55101 --- /dev/null +++ b/src/meshwifi/WebServerThread.h @@ -0,0 +1,22 @@ +#pragma once + +#include "concurrency/OSThread.h" +#include "concurrency/Periodic.h" +#include +#include +#include "configuration.h" + + +class WebServerThread : private concurrency::OSThread +{ + + public: + WebServerThread(); + + + protected: + + virtual int32_t runOnce(); +}; + +extern WebServerThread webServerThread; \ No newline at end of file diff --git a/src/meshwifi/meshhttp.cpp b/src/meshwifi/meshhttp.cpp index 46fb18091..8814dc9d5 100644 --- a/src/meshwifi/meshhttp.cpp +++ b/src/meshwifi/meshhttp.cpp @@ -49,6 +49,7 @@ 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); @@ -1213,13 +1214,3 @@ void replaceAll(std::string &str, const std::string &from, const std::string &to start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx' } } - -HttpServer::HttpServer() : concurrency::OSThread("HttpServer") { - DEBUG_MSG("22**********************************\n"); -} - -int32_t HttpServer::runOnce() -{ - DEBUG_MSG("11**********************************\n"); - return 200; // Poll our GPIOs every 200ms (FIXME, make adjustable via protobuf arg) -} diff --git a/src/meshwifi/meshhttp.h b/src/meshwifi/meshhttp.h index 3bcf25111..fc3e89f02 100644 --- a/src/meshwifi/meshhttp.h +++ b/src/meshwifi/meshhttp.h @@ -25,6 +25,8 @@ void handleJSONChatHistoryDummy(); void replaceAll(std::string &str, const std::string &from, const std::string &to); + +// Interface to the PhoneAPI to access the protobufs with messages class HttpAPI : public PhoneAPI { @@ -37,19 +39,3 @@ class HttpAPI : public PhoneAPI protected: // Nothing here yet }; - -/** - * A plugin that provides easy low-level remote access to device hardware. - */ -class HttpServer : public concurrency::OSThread -{ - public: - // Nothing here - // RemoteHardwarePlugin(); - HttpServer(); - - protected: - virtual int32_t runOnce(); -}; - -// extern HttpServer httpServer; From f7dcef39ced03ce2a993f657172a6068a4133092 Mon Sep 17 00:00:00 2001 From: Jm Date: Tue, 5 Jan 2021 23:21:14 -0800 Subject: [PATCH 3/7] intermediate work --- src/airtime.cpp | 2 +- src/main.cpp | 2 +- src/{meshwifi => mesh/wifi}/WebServerThread.cpp | 4 ++-- src/{meshwifi => mesh/wifi}/WebServerThread.h | 6 ++---- 4 files changed, 6 insertions(+), 8 deletions(-) rename src/{meshwifi => mesh/wifi}/WebServerThread.cpp (78%) rename src/{meshwifi => mesh/wifi}/WebServerThread.h (77%) diff --git a/src/airtime.cpp b/src/airtime.cpp index a8399fbcd..5c8eb67fd 100644 --- a/src/airtime.cpp +++ b/src/airtime.cpp @@ -97,7 +97,7 @@ AirTime::AirTime() : concurrency::OSThread("AirTime") {} int32_t AirTime::runOnce() { - // DEBUG_MSG("AirTime::runOnce()\n"); + //DEBUG_MSG("AirTime::runOnce()\n"); airtimeRotatePeriod(); secSinceBoot++; diff --git a/src/main.cpp b/src/main.cpp index 32704093a..2c9485e22 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -21,7 +21,7 @@ #include "main.h" #include "meshwifi/meshhttp.h" #include "meshwifi/meshwifi.h" -#include "meshwifi/WebServerThread.h" +#include "mesh/wifi/WebServerThread.h" #include "sleep.h" #include "target_specific.h" #include diff --git a/src/meshwifi/WebServerThread.cpp b/src/mesh/wifi/WebServerThread.cpp similarity index 78% rename from src/meshwifi/WebServerThread.cpp rename to src/mesh/wifi/WebServerThread.cpp index dbb4a82f2..2bf0f79c7 100644 --- a/src/meshwifi/WebServerThread.cpp +++ b/src/mesh/wifi/WebServerThread.cpp @@ -1,7 +1,6 @@ -#include "meshwifi/WebServerThread.h" +#include "mesh/wifi/WebServerThread.h" #include -// Thread for the HTTP Server WebServerThread webServerThread; WebServerThread::WebServerThread() : concurrency::OSThread("WebServerThread") {} @@ -12,3 +11,4 @@ int32_t WebServerThread::runOnce() return (1000 * 1); } + diff --git a/src/meshwifi/WebServerThread.h b/src/mesh/wifi/WebServerThread.h similarity index 77% rename from src/meshwifi/WebServerThread.h rename to src/mesh/wifi/WebServerThread.h index 2f3b55101..43e357f13 100644 --- a/src/meshwifi/WebServerThread.h +++ b/src/mesh/wifi/WebServerThread.h @@ -1,10 +1,9 @@ #pragma once #include "concurrency/OSThread.h" -#include "concurrency/Periodic.h" +#include "configuration.h" #include #include -#include "configuration.h" class WebServerThread : private concurrency::OSThread @@ -13,10 +12,9 @@ class WebServerThread : private concurrency::OSThread public: WebServerThread(); - protected: virtual int32_t runOnce(); }; -extern WebServerThread webServerThread; \ No newline at end of file +extern WebServerThread webServerThread; From 0af5b225c4eb2d23420d3a4dcb8dc03d60adbdf1 Mon Sep 17 00:00:00 2001 From: Jm Date: Tue, 5 Jan 2021 23:32:33 -0800 Subject: [PATCH 4/7] intermediate --- src/JMTest.cpp | 14 ++++++++++++++ src/JMTest.h | 20 ++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 src/JMTest.cpp create mode 100644 src/JMTest.h diff --git a/src/JMTest.cpp b/src/JMTest.cpp new file mode 100644 index 000000000..1f2877af5 --- /dev/null +++ b/src/JMTest.cpp @@ -0,0 +1,14 @@ +#include "JMTest.h" +#include + +JMTest jMTest; + +JMTest::JMTest() : concurrency::OSThread("JMTest") {} + +int32_t JMTest::runOnce() +{ + DEBUG_MSG("JMTest::runOnce()\n"); + + return (1000); +} + diff --git a/src/JMTest.h b/src/JMTest.h new file mode 100644 index 000000000..dfb87345c --- /dev/null +++ b/src/JMTest.h @@ -0,0 +1,20 @@ +#pragma once + +#include "concurrency/OSThread.h" +#include "configuration.h" +#include +#include + + +class JMTest : private concurrency::OSThread +{ + + public: + JMTest(); + + protected: + + virtual int32_t runOnce(); +}; + +extern JMTest jMTest; From 977e47d109ccf46675b33a661de031e88e94c420 Mon Sep 17 00:00:00 2001 From: Jm Date: Fri, 8 Jan 2021 20:06:11 -0800 Subject: [PATCH 5/7] partial work --- proto | 2 +- src/JMTest.cpp | 14 -------------- src/JMTest.h | 20 -------------------- src/main.cpp | 6 +++++- src/mesh/wifi/WebServerThread.cpp | 2 +- src/mesh/wifi/WebServerThread.h | 2 +- 6 files changed, 8 insertions(+), 38 deletions(-) delete mode 100644 src/JMTest.cpp delete mode 100644 src/JMTest.h diff --git a/proto b/proto index dfe7bc121..75078afe4 160000 --- a/proto +++ b/proto @@ -1 +1 @@ -Subproject commit dfe7bc1217a00c23eecb9dfcf1d56fe95ebddc3b +Subproject commit 75078afe43934f4ce15ef86ebc6950658a170145 diff --git a/src/JMTest.cpp b/src/JMTest.cpp deleted file mode 100644 index 1f2877af5..000000000 --- a/src/JMTest.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "JMTest.h" -#include - -JMTest jMTest; - -JMTest::JMTest() : concurrency::OSThread("JMTest") {} - -int32_t JMTest::runOnce() -{ - DEBUG_MSG("JMTest::runOnce()\n"); - - return (1000); -} - diff --git a/src/JMTest.h b/src/JMTest.h deleted file mode 100644 index dfb87345c..000000000 --- a/src/JMTest.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -#include "concurrency/OSThread.h" -#include "configuration.h" -#include -#include - - -class JMTest : private concurrency::OSThread -{ - - public: - JMTest(); - - protected: - - virtual int32_t runOnce(); -}; - -extern JMTest jMTest; diff --git a/src/main.cpp b/src/main.cpp index 077a9e2dd..5808e3fa1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -517,6 +517,10 @@ void setup() // Initialize Wifi initWifi(forceSoftAP); + // Start web server thread. + //webServerThread = new WebServerThread(); + + if (!rIf) recordCriticalError(CriticalErrorCode_NoRadio); else @@ -577,7 +581,7 @@ void loop() #endif // TODO: This should go into a thread handled by FreeRTOS. - handleWebResponse(); + //handleWebResponse(); service.loop(); diff --git a/src/mesh/wifi/WebServerThread.cpp b/src/mesh/wifi/WebServerThread.cpp index 2bf0f79c7..32fb5a385 100644 --- a/src/mesh/wifi/WebServerThread.cpp +++ b/src/mesh/wifi/WebServerThread.cpp @@ -1,7 +1,7 @@ #include "mesh/wifi/WebServerThread.h" #include -WebServerThread webServerThread; +WebServerThread *webServerThread; WebServerThread::WebServerThread() : concurrency::OSThread("WebServerThread") {} diff --git a/src/mesh/wifi/WebServerThread.h b/src/mesh/wifi/WebServerThread.h index 43e357f13..f57afb751 100644 --- a/src/mesh/wifi/WebServerThread.h +++ b/src/mesh/wifi/WebServerThread.h @@ -17,4 +17,4 @@ class WebServerThread : private concurrency::OSThread virtual int32_t runOnce(); }; -extern WebServerThread webServerThread; +extern WebServerThread *webServerThread; From cfcb00b9437da8182aefe892fb7fbfb5e06e2655 Mon Sep 17 00:00:00 2001 From: Jm Date: Fri, 8 Jan 2021 20:43:51 -0800 Subject: [PATCH 6/7] that's enough for tonight. web server is in its own thread, needs to be further optimized but it works enough. next is to refactor. --- src/airtime.cpp | 2 +- src/airtime.h | 2 +- src/main.cpp | 4 +++- src/mesh/RadioLibInterface.cpp | 9 ++++++--- src/mesh/wifi/WebServerThread.cpp | 7 +++++-- 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/airtime.cpp b/src/airtime.cpp index 5c8eb67fd..66f4a0a57 100644 --- a/src/airtime.cpp +++ b/src/airtime.cpp @@ -3,7 +3,7 @@ #define periodsToLog 48 -AirTime airTime; +AirTime *airTime; // A reminder that there are 3600 seconds in an hour so I don't have // to keep googling it. diff --git a/src/airtime.h b/src/airtime.h index d79e8829b..439670010 100644 --- a/src/airtime.h +++ b/src/airtime.h @@ -51,4 +51,4 @@ class AirTime : private concurrency::OSThread virtual int32_t runOnce(); }; -extern AirTime airTime; \ No newline at end of file +extern AirTime *airTime; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 5808e3fa1..4bf110ad6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -518,8 +518,10 @@ void setup() initWifi(forceSoftAP); // Start web server thread. - //webServerThread = new WebServerThread(); + webServerThread = new WebServerThread(); + // Start airtime logger thread. + airTime = new AirTime(); if (!rIf) recordCriticalError(CriticalErrorCode_NoRadio); diff --git a/src/mesh/RadioLibInterface.cpp b/src/mesh/RadioLibInterface.cpp index b4c93ac92..0266614af 100644 --- a/src/mesh/RadioLibInterface.cpp +++ b/src/mesh/RadioLibInterface.cpp @@ -97,7 +97,8 @@ ErrorCode RadioLibInterface::send(MeshPacket *p) // Count the packet toward our TX airtime utilization. // We only count it if it can be added to the TX queue. - airTime.logAirtime(TX_LOG, xmitMsec); + airTime->logAirtime(TX_LOG, xmitMsec); + //airTime.logAirtime(TX_LOG, xmitMsec); // We want all sending/receiving to be done by our daemon thread, We use a delay here because this packet might have been sent // in response to a packet we just received. So we want to make sure the other side has had a chance to reconfigure its radio @@ -216,7 +217,8 @@ void RadioLibInterface::handleReceiveInterrupt() size_t length = iface->getPacketLength(); xmitMsec = getPacketTime(length); - airTime.logAirtime(RX_ALL_LOG, xmitMsec); + airTime->logAirtime(RX_ALL_LOG, xmitMsec); + //airTime.logAirtime(RX_ALL_LOG, xmitMsec); int state = iface->readData(radiobuf, length); if (state != ERR_NONE) { @@ -258,7 +260,8 @@ void RadioLibInterface::handleReceiveInterrupt() printPacket("Lora RX", mp); xmitMsec = getPacketTime(mp); - airTime.logAirtime(RX_LOG, xmitMsec); + airTime->logAirtime(RX_LOG, xmitMsec); + //airTime.logAirtime(RX_LOG, xmitMsec); deliverToReceiver(mp); } diff --git a/src/mesh/wifi/WebServerThread.cpp b/src/mesh/wifi/WebServerThread.cpp index 32fb5a385..991fd6d92 100644 --- a/src/mesh/wifi/WebServerThread.cpp +++ b/src/mesh/wifi/WebServerThread.cpp @@ -1,4 +1,5 @@ #include "mesh/wifi/WebServerThread.h" +#include "meshwifi/meshhttp.h" #include WebServerThread *webServerThread; @@ -7,8 +8,10 @@ WebServerThread::WebServerThread() : concurrency::OSThread("WebServerThread") {} int32_t WebServerThread::runOnce() { - DEBUG_MSG("WebServerThread::runOnce()\n"); + //DEBUG_MSG("WebServerThread::runOnce()\n"); + handleWebResponse(); - return (1000 * 1); + // Loop every 5ms. + return (5); } From d458f673be870976263896c4ca9105e2bb13b406 Mon Sep 17 00:00:00 2001 From: Jm Date: Fri, 8 Jan 2021 22:25:44 -0800 Subject: [PATCH 7/7] 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) {}