From f290ec619714463213eecc2887a16024433d85d5 Mon Sep 17 00:00:00 2001 From: Patrick Balsiger Date: Thu, 8 Nov 2018 13:46:17 +0100 Subject: [PATCH 1/7] remove network from activation phase --- platformio.ini | 4 +- src/MeshNet.cpp | 20 ++++---- src/MeshNet.h | 3 +- src/Plugin.h | 8 ++-- src/Sprocket.cpp | 12 ++--- src/Sprocket.h | 5 +- src/WiFiNet.cpp | 13 +++-- src/base/MeshSprocket.h | 10 ++-- src/examples/mesh/MeshApp.h | 18 +++---- src/examples/mesh/main.cpp | 2 +- src/examples/standalone/WiFiApp.h | 10 ++-- src/examples/standalone/main.cpp | 2 +- .../{MeshManPlugin.cpp => MeshManPlugin.cpp_} | 2 +- src/plugins/MeshNetworkPlugin.cpp | 48 +++++++++++++++++++ src/plugins/NetworkPlugin.cpp | 28 +++++++++++ .../{OtaTcpPlugin.cpp => OtaTcpPlugin.cpp_} | 2 +- src/plugins/WebConfigPlugin.cpp | 5 +- src/plugins/{WebSO.h => WebServerConfig.h} | 7 +-- src/plugins/WebServerPlugin.cpp | 5 +- 19 files changed, 138 insertions(+), 66 deletions(-) rename src/plugins/{MeshManPlugin.cpp => MeshManPlugin.cpp_} (98%) create mode 100644 src/plugins/MeshNetworkPlugin.cpp create mode 100644 src/plugins/NetworkPlugin.cpp rename src/plugins/{OtaTcpPlugin.cpp => OtaTcpPlugin.cpp_} (98%) rename src/plugins/{WebSO.h => WebServerConfig.h} (50%) diff --git a/platformio.ini b/platformio.ini index db1c121..b14fc3e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -8,8 +8,8 @@ ; Please visit documentation for the other options and examples ; http://docs.platformio.org/page/projectconf.html -[platformio] -env_default = mesh +;[platformio] +;env_default = mesh [common] framework = arduino diff --git a/src/MeshNet.cpp b/src/MeshNet.cpp index aa28adf..1be055f 100644 --- a/src/MeshNet.cpp +++ b/src/MeshNet.cpp @@ -13,30 +13,28 @@ MeshNet::MeshNet(MeshConfig cfg) : Network() { } Network* MeshNet::init(){ - Serial.println("init mesh"); config.fromFile("/config.json"); - //mesh.setDebugMsgTypes( ERROR | MESH_STATUS | CONNECTION | SYNC | COMMUNICATION | GENERAL | MSG_TYPES | REMOTE ); // all types on mesh.setDebugMsgTypes( config.debugTypes ); + return this; +} + +int MeshNet::connect(){ mesh.init( config.meshSSID, config.meshPassword, scheduler, config.meshPort, WIFI_AP_STA, config.channel ); - mesh.onNewConnection(bind(&MeshNet::newConnectionCallback, this, _1)); mesh.onChangedConnections(bind(&MeshNet::changedConnectionCallback, this)); mesh.onNodeTimeAdjusted(bind(&MeshNet::nodeTimeAdjustedCallback, this, _1)); - - connectStation(config.stationMode); - - return this; + if(config.stationMode){ + connectStation(); + } } -int MeshNet::connectStation(int doConnect) { - if(doConnect){ + +int MeshNet::connectStation() { Serial.println("connect station"); mesh.stationManual(config.stationSSID, config.stationPassword); mesh.setHostname(config.hostname.c_str()); return 1; - } - return 0; } void MeshNet::sendTo(uint32_t target, String msg){ mesh.sendSingle(target, msg); diff --git a/src/MeshNet.h b/src/MeshNet.h index 6ff9463..f4e2f6f 100644 --- a/src/MeshNet.h +++ b/src/MeshNet.h @@ -22,7 +22,8 @@ class MeshNet : public Network { MeshSprocketConfig config; MeshNet(MeshConfig cfg); Network* init(); - int connectStation(int); + int connect(); + int connectStation(); void configure(MeshSprocketConfig cfg); void update(); void newConnectionCallback(uint32_t nodeId); diff --git a/src/Plugin.h b/src/Plugin.h index bce5744..ce7e08e 100644 --- a/src/Plugin.h +++ b/src/Plugin.h @@ -9,10 +9,10 @@ class Plugin { public: Mediator* mediator; - virtual void activate(Scheduler*, Network*); - virtual void enable(){}; - virtual void disable(){}; - virtual void onMessage(SprocketMessage msg){}; + virtual void activate(Scheduler*); + virtual void enable(){} + virtual void disable(){} + virtual void onMessage(SprocketMessage msg){} Plugin* mediate(Mediator* m) { mediator = m; return this; diff --git a/src/Sprocket.cpp b/src/Sprocket.cpp index 27c942e..797f359 100644 --- a/src/Sprocket.cpp +++ b/src/Sprocket.cpp @@ -18,9 +18,9 @@ Sprocket* Sprocket::init(SprocketConfig cfg){ Sprocket* Sprocket::activate() { return activate(&scheduler); } -Sprocket* Sprocket::activate(Scheduler* scheduler, Network* network) { +Sprocket* Sprocket::activate(Scheduler* scheduler) { // setup plugins - activatePlugins(scheduler, network); + activatePlugins(scheduler); return this; } @@ -30,7 +30,7 @@ Sprocket* Sprocket::join(Network& net){ //net.onReceive(bind(&Sprocket::dispatch,this, _1, _2)); net.connect(); network = net; - return activate(&scheduler, &net); + return activate(&scheduler); } Sprocket* Sprocket::addTask(Task& tsk){ @@ -57,8 +57,8 @@ void Sprocket::addPlugin(Plugin* p){ plugins.push_back(p); } -void Sprocket::activatePlugins(Scheduler* scheduler, Network* network){ +void Sprocket::activatePlugins(Scheduler* scheduler){ for(Plugin* p : plugins){ - p->activate(scheduler, network); + p->activate(scheduler); } -} \ No newline at end of file +} diff --git a/src/Sprocket.h b/src/Sprocket.h index 56388af..18eaf5f 100644 --- a/src/Sprocket.h +++ b/src/Sprocket.h @@ -37,12 +37,11 @@ class Sprocket : public Mediator { Sprocket* addTask(Task&); virtual void loop(); virtual Sprocket* activate(); - virtual Sprocket* activate(Scheduler*) { return this; } - virtual Sprocket* activate(Scheduler*, Network*); + virtual Sprocket* activate(Scheduler*); virtual void dispatch( uint32_t from, String &msg ); void addPlugin(Plugin* p); - void activatePlugins(Scheduler* scheduler, Network* network); + void activatePlugins(Scheduler* scheduler); void dispatchMessageToPlugins(SprocketMessage msg); }; diff --git a/src/WiFiNet.cpp b/src/WiFiNet.cpp index e2e7a68..9f64390 100644 --- a/src/WiFiNet.cpp +++ b/src/WiFiNet.cpp @@ -22,14 +22,12 @@ Network* WiFiNet::init() { return this; } int WiFiNet::connect(){ - if(config.valid){ - WiFi.hostname(config.hostname); - Serial.println("Hostname: " + config.hostname); - if(!connectStation()) { - createAccessPoint(); - } - startDNS(); + WiFi.hostname(config.hostname); + Serial.println("Hostname: " + config.hostname); + if(!connectStation()) { + createAccessPoint(); } + startDNS(); return 1; } @@ -41,6 +39,7 @@ int WiFiNet::connectStation(){ WiFi.begin(config.stationSSID.c_str(), config.stationPassword.c_str()); Serial.println("connect to " + config.stationSSID); + // TODO use tasks while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); diff --git a/src/base/MeshSprocket.h b/src/base/MeshSprocket.h index 40a6ef2..3155612 100644 --- a/src/base/MeshSprocket.h +++ b/src/base/MeshSprocket.h @@ -23,10 +23,10 @@ class MeshSprocket : public Sprocket { } - Sprocket* activate(Scheduler* scheduler, Network* network) { - Sprocket::activate(scheduler, network); - net = static_cast(network); - net->onReceive(bind(&MeshSprocket::dispatch,this, _1, _2)); + Sprocket* activate(Scheduler* scheduler) { + Sprocket::activate(scheduler); + //net = static_cast(network); + //net->onReceive(bind(&MeshSprocket::dispatch,this, _1, _2)); return this; } using Sprocket::activate; @@ -42,7 +42,7 @@ class MeshSprocket : public Sprocket { } void loop() { - net->update(); + //net->update(); scheduler.execute(); } }; diff --git a/src/examples/mesh/MeshApp.h b/src/examples/mesh/MeshApp.h index d7cbec7..2559c36 100644 --- a/src/examples/mesh/MeshApp.h +++ b/src/examples/mesh/MeshApp.h @@ -4,11 +4,11 @@ #include #include #include -#include -#include +#include +//#include #include #include -#include +//#include #include "Mediator.h" using namespace std; @@ -20,17 +20,17 @@ class MeshApp : public MeshSprocket { public: Task heartbeatTask; - MeshApp(SprocketConfig cfg, OtaConfig otaCfg, WebServerConfig webCfg) : MeshSprocket(cfg) { - addPlugin(new OtaTcpPlugin(otaCfg)); + MeshApp(SprocketConfig cfg, /* OtaConfig otaCfg, */ WebServerConfig webCfg) : MeshSprocket(cfg) { + //addPlugin(new OtaTcpPlugin(otaCfg)); addPlugin(new WebServerPlugin(webCfg, &WEBSERVER)); addPlugin(new WebConfigPlugin(&WEBSERVER)); - addPlugin(new MeshManPlugin(&WEBSERVER)); + //addPlugin(new MeshManPlugin(&WEBSERVER)); subscribe("mesh/heartbeat", bind(&MeshApp::messageHandler, this, _1)); } - Sprocket* activate(Scheduler* scheduler, Network* network) { + Sprocket* activate(Scheduler* scheduler) { // call parent method that enables dispatching and plugins - MeshSprocket::activate(scheduler, network); + MeshSprocket::activate(scheduler); // add a task that sends stuff to the mesh heartbeatTask.set(TASK_SECOND * 5, TASK_FOREVER, bind(&MeshApp::heartbeat, this, net)); @@ -51,7 +51,7 @@ class MeshApp : public MeshSprocket { msg.topic = "mesh/heartbeat"; msg.type = SprocketMessage::APP; String msgStr = msg.toJsonString(); - network->mesh.sendBroadcast(msgStr, true); + //network->mesh.sendBroadcast(msgStr, true); //String mMsg = String("hoi"); //publish("mediatorMsg", "hi mediator"); } diff --git a/src/examples/mesh/main.cpp b/src/examples/mesh/main.cpp index 1b985dd..bdb4262 100644 --- a/src/examples/mesh/main.cpp +++ b/src/examples/mesh/main.cpp @@ -10,7 +10,7 @@ MeshNet net({ }); MeshApp sprocket( { STARTUP_DELAY, SERIAL_BAUD_RATE }, - { OTA_PORT, OTA_PASSWORD }, + /* { OTA_PORT, OTA_PASSWORD }, */ { WEB_CONTEXT_PATH, WEB_DOC_ROOT, WEB_DEFAULT_FILE } ); diff --git a/src/examples/standalone/WiFiApp.h b/src/examples/standalone/WiFiApp.h index 46f31ae..d552537 100644 --- a/src/examples/standalone/WiFiApp.h +++ b/src/examples/standalone/WiFiApp.h @@ -4,8 +4,8 @@ #include #include -#include -#include +#include +//#include #include #include #include "Mediator.h" @@ -19,15 +19,15 @@ class WiFiApp : public Sprocket { public: Scheduler* ts; Task someTask; - WiFiApp(SprocketConfig cfg, OtaConfig otaCfg, WebServerConfig webCfg) : Sprocket(cfg) { + WiFiApp(SprocketConfig cfg, /* OtaConfig otaCfg, */ WebServerConfig webCfg) : Sprocket(cfg) { //addPlugin(new OtaTcpPlugin(otaCfg)); addPlugin(new WebServerPlugin(webCfg, &WEBSERVER)); addPlugin(new WebConfigPlugin(&WEBSERVER)); ts = new Scheduler(); } - Sprocket* activate(Scheduler* scheduler, Network* network) { - Sprocket::activate(ts, network); + Sprocket* activate(Scheduler* scheduler) { + Sprocket::activate(ts); Serial.println("activate WiFiApp"); // add a task someTask.set(TASK_SECOND, TASK_FOREVER, [](){ diff --git a/src/examples/standalone/main.cpp b/src/examples/standalone/main.cpp index 7f263f2..b20bccc 100644 --- a/src/examples/standalone/main.cpp +++ b/src/examples/standalone/main.cpp @@ -15,7 +15,7 @@ WiFiNet net(SPROCKET_MODE,STATION_SSID, STATION_PASSWORD,AP_SSID, AP_PASSWORD,HOSTNAME,CONNECT_TIMEOUT); WiFiApp sprocket( { STARTUP_DELAY, SERIAL_BAUD_RATE }, - { OTA_PORT, OTA_PASSWORD }, + /* { OTA_PORT, OTA_PASSWORD }, */ { WEB_CONTEXT_PATH, WEB_DOC_ROOT, WEB_DEFAULT_FILE } ); diff --git a/src/plugins/MeshManPlugin.cpp b/src/plugins/MeshManPlugin.cpp_ similarity index 98% rename from src/plugins/MeshManPlugin.cpp rename to src/plugins/MeshManPlugin.cpp_ index 324907f..8f4d881 100644 --- a/src/plugins/MeshManPlugin.cpp +++ b/src/plugins/MeshManPlugin.cpp_ @@ -5,7 +5,7 @@ #include "ArduinoOTA.h" #include "MeshNet.h" #include "Plugin.h" -#include +#include #include #include diff --git a/src/plugins/MeshNetworkPlugin.cpp b/src/plugins/MeshNetworkPlugin.cpp new file mode 100644 index 0000000..8521f7b --- /dev/null +++ b/src/plugins/MeshNetworkPlugin.cpp @@ -0,0 +1,48 @@ +#ifndef __MESH_NETWORK_PLUGIN__ +#define __MESH_NETWORK_PLUGIN__ + +#define _TASK_PRIORITY + +#include "TaskSchedulerDeclarations.h" +#include "Plugin.h" +#include +#include +#include "plugins/NetworkPlugin.cpp" +#include + +using namespace std; +using namespace std::placeholders; + +class MeshNetworkPlugin : public NetworkPlugin +{ + private: + Scheduler *meshScheduler; + + public: + MeshNetworkPlugin(MeshConfig cfg) + { + network = new MeshNet(cfg); + } + + void activate(Scheduler *userScheduler) + { + userScheduler->setHighPriorityScheduler(meshScheduler); + network->onReceive(bind(&MeshNetworkPlugin::dispatch, this, _1, _2)); + // TODO base subscribers + NetworkPlugin::activate(meshScheduler); + } + void dispatch(uint32_t from, String &msg) + { + SprocketMessage sMsg; + sMsg.fromJsonString(msg); + if (sMsg.valid) + { + sMsg.from = String(from); + publish(sMsg.topic, sMsg.payload); + return; + } + publish("mesh/message", msg); + } +}; + +#endif \ No newline at end of file diff --git a/src/plugins/NetworkPlugin.cpp b/src/plugins/NetworkPlugin.cpp new file mode 100644 index 0000000..530e0b2 --- /dev/null +++ b/src/plugins/NetworkPlugin.cpp @@ -0,0 +1,28 @@ +#ifndef __NETWORK_PLUGIN__ +#define __NETWORK_PLUGIN__ + +#include "TaskSchedulerDeclarations.h" +#include "Plugin.h" +#include "Network.h" + +class NetworkPlugin : public Plugin +{ + protected: + Network *network; + + public: + NetworkPlugin() {} + NetworkPlugin(Network *net) + { + network = net; + } + + void activate(Scheduler *userScheduler) + { + Serial.println("join network"); + network->init(userScheduler); + network->connect(); + } +}; + +#endif \ No newline at end of file diff --git a/src/plugins/OtaTcpPlugin.cpp b/src/plugins/OtaTcpPlugin.cpp_ similarity index 98% rename from src/plugins/OtaTcpPlugin.cpp rename to src/plugins/OtaTcpPlugin.cpp_ index 746f828..6fcc6f1 100644 --- a/src/plugins/OtaTcpPlugin.cpp +++ b/src/plugins/OtaTcpPlugin.cpp_ @@ -26,7 +26,7 @@ class OtaTcpPlugin : public Plugin { } void connectUpdateNetwork() { Serial.println("OTA connect to update-network"); - net->connectStation(1); + net->connectStation(); } void enable() { Serial.println("OTA enable"); diff --git a/src/plugins/WebConfigPlugin.cpp b/src/plugins/WebConfigPlugin.cpp index 7118b2b..ba56945 100644 --- a/src/plugins/WebConfigPlugin.cpp +++ b/src/plugins/WebConfigPlugin.cpp @@ -5,7 +5,8 @@ #include "TaskSchedulerDeclarations.h" #include "ArduinoOTA.h" #include "Plugin.h" -#include +#include +#include using namespace std; using namespace std::placeholders; @@ -19,7 +20,7 @@ class WebConfigPlugin : public Plugin { server = webServer; server->serveStatic("/config.json", SPIFFS, "config.json"); } - void activate(Scheduler* userScheduler, Network* network){ + void activate(Scheduler* userScheduler){ server->on("/heap", HTTP_GET, [](AsyncWebServerRequest *request){ Serial.println("GET /heap"); request->send(200, "text/plain", String(ESP.getFreeHeap())); diff --git a/src/plugins/WebSO.h b/src/plugins/WebServerConfig.h similarity index 50% rename from src/plugins/WebSO.h rename to src/plugins/WebServerConfig.h index 3a34072..7f58009 100644 --- a/src/plugins/WebSO.h +++ b/src/plugins/WebServerConfig.h @@ -1,8 +1,5 @@ -#ifndef __SHARED_PLUGINS__ -#define __SHARED_PLUGINS__ - -#include -extern AsyncWebServer WEBSERVER; +#ifndef __WEB_SERVER_CONFIG__ +#define __WEB_SERVER_CONFIG__ struct WebServerConfig { const char* contextPath; diff --git a/src/plugins/WebServerPlugin.cpp b/src/plugins/WebServerPlugin.cpp index 6758e9a..54bf060 100644 --- a/src/plugins/WebServerPlugin.cpp +++ b/src/plugins/WebServerPlugin.cpp @@ -2,9 +2,10 @@ #define __WEB_SERVER_PLUGIN__ #include +#include #include "TaskSchedulerDeclarations.h" #include "Plugin.h" -#include +#include using namespace std; using namespace std::placeholders; @@ -18,7 +19,7 @@ class WebServerPlugin : public Plugin { config = cfg; server = webServer; } - void activate(Scheduler* userScheduler, Network* network){ + void activate(Scheduler* userScheduler){ server->serveStatic(config.contextPath, SPIFFS, config.docRoot).setDefaultFile(config.defaultFile); // TODO add auth if configured // server->setAuthentication("user", "pass"); From c75c4f24f30ce0d99f7bdf12c9de061483f79369 Mon Sep 17 00:00:00 2001 From: Patrick Balsiger Date: Thu, 8 Nov 2018 13:58:07 +0100 Subject: [PATCH 2/7] create scheduler instance --- src/Sprocket.cpp | 13 +++++++------ src/Sprocket.h | 5 ++++- src/examples/mesh/main.cpp | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/Sprocket.cpp b/src/Sprocket.cpp index 797f359..db94b88 100644 --- a/src/Sprocket.cpp +++ b/src/Sprocket.cpp @@ -13,10 +13,11 @@ Sprocket* Sprocket::init(SprocketConfig cfg){ delay(cfg.startupDelay); Serial.begin(cfg.serialBaudRate); SPIFFS.begin(); + scheduler = new Scheduler(); return this; } Sprocket* Sprocket::activate() { - return activate(&scheduler); + return activate(scheduler); } Sprocket* Sprocket::activate(Scheduler* scheduler) { // setup plugins @@ -24,23 +25,23 @@ Sprocket* Sprocket::activate(Scheduler* scheduler) { return this; } +// TODO check if we want to remove network from sprocket and handle everything via plugins Sprocket* Sprocket::join(Network& net){ Serial.println("join network"); - net.init(&scheduler); - //net.onReceive(bind(&Sprocket::dispatch,this, _1, _2)); + net.init(scheduler); net.connect(); network = net; - return activate(&scheduler); + return activate(scheduler); } Sprocket* Sprocket::addTask(Task& tsk){ - scheduler.addTask(tsk); + scheduler->addTask(tsk); tsk.enable(); return this; } void Sprocket::loop(){ - scheduler.execute(); + scheduler->execute(); } void Sprocket::dispatch( uint32_t from, String &msg ) { diff --git a/src/Sprocket.h b/src/Sprocket.h index 18eaf5f..ae27737 100644 --- a/src/Sprocket.h +++ b/src/Sprocket.h @@ -1,6 +1,9 @@ #ifndef __SPROCKET_H__ #define __SPROCKET_H__ +#define _TASK_SLEEP_ON_IDLE_RUN +#define _TASK_STD_FUNCTION + #include //#include #include @@ -23,7 +26,7 @@ class Sprocket : public Mediator { protected: // TODO move scheduler out of Sprocket // => see difference between standalone and mesh sprochet usage of scheduler - Scheduler scheduler; + Scheduler* scheduler; Network network; private: SprocketMessage currentMessage; diff --git a/src/examples/mesh/main.cpp b/src/examples/mesh/main.cpp index bdb4262..5399158 100644 --- a/src/examples/mesh/main.cpp +++ b/src/examples/mesh/main.cpp @@ -15,7 +15,7 @@ MeshApp sprocket( ); void setup() { - sprocket.join(net); + //sprocket.join(net); } void loop() { From fe31397b2bf83ffabcfdf059cccc6f8c27c0160a Mon Sep 17 00:00:00 2001 From: Patrick Balsiger Date: Thu, 8 Nov 2018 14:48:17 +0100 Subject: [PATCH 3/7] adapt mesh app to use mesh plugin --- src/MeshNet.cpp | 4 ++-- src/MeshNet.h | 2 +- src/Network.h | 2 +- src/Plugin.h | 4 ++++ src/Sprocket.h | 2 +- src/base/MeshSprocket.h | 2 +- src/examples/mesh/MeshApp.h | 37 ++++++++++++------------------- src/examples/mesh/config.h | 1 + src/examples/mesh/main.cpp | 26 ++++++++++------------ src/plugins/MeshNetworkPlugin.cpp | 10 ++++++--- 10 files changed, 44 insertions(+), 46 deletions(-) diff --git a/src/MeshNet.cpp b/src/MeshNet.cpp index 1be055f..81adecc 100644 --- a/src/MeshNet.cpp +++ b/src/MeshNet.cpp @@ -40,8 +40,8 @@ void MeshNet::sendTo(uint32_t target, String msg){ mesh.sendSingle(target, msg); } -void MeshNet::broadcast(String msg){ - mesh.sendBroadcast(msg); +void MeshNet::broadcast(String msg, bool self){ + mesh.sendBroadcast(msg, self); } void MeshNet::update(){ diff --git a/src/MeshNet.h b/src/MeshNet.h index f4e2f6f..f36b738 100644 --- a/src/MeshNet.h +++ b/src/MeshNet.h @@ -29,7 +29,7 @@ class MeshNet : public Network { void newConnectionCallback(uint32_t nodeId); void changedConnectionCallback(); void nodeTimeAdjustedCallback(int32_t offset); - void broadcast(String msg); + void broadcast(String msg, bool self = false); void sendTo(uint32_t target, String msg); void onReceive(std::function); int isConnected(){ diff --git a/src/Network.h b/src/Network.h index 62bbec9..f40d4ed 100644 --- a/src/Network.h +++ b/src/Network.h @@ -16,7 +16,7 @@ class Network { virtual int connectStation() { return 0; }; virtual int isConnected(){ return 0; }; virtual void update() {}; - virtual void broadcast(String msg){}; + virtual void broadcast(String msg, bool self = false){}; virtual void sendTo(uint32_t target, String msg) {}; virtual void onReceive(std::function) {}; Network* setScheduler(Scheduler* s) { diff --git a/src/Plugin.h b/src/Plugin.h index ce7e08e..5bbeaf3 100644 --- a/src/Plugin.h +++ b/src/Plugin.h @@ -1,6 +1,10 @@ #ifndef __SPROCKET_PLUGIN__ #define __SPROCKET_PLUGIN__ +#define _TASK_SLEEP_ON_IDLE_RUN +#define _TASK_STD_FUNCTION +#define _TASK_PRIORITY + #include #include #include diff --git a/src/Sprocket.h b/src/Sprocket.h index ae27737..8660a6c 100644 --- a/src/Sprocket.h +++ b/src/Sprocket.h @@ -3,6 +3,7 @@ #define _TASK_SLEEP_ON_IDLE_RUN #define _TASK_STD_FUNCTION +#define _TASK_PRIORITY #include //#include @@ -45,7 +46,6 @@ class Sprocket : public Mediator { void addPlugin(Plugin* p); void activatePlugins(Scheduler* scheduler); - void dispatchMessageToPlugins(SprocketMessage msg); }; #endif \ No newline at end of file diff --git a/src/base/MeshSprocket.h b/src/base/MeshSprocket.h index 3155612..938dfc7 100644 --- a/src/base/MeshSprocket.h +++ b/src/base/MeshSprocket.h @@ -43,7 +43,7 @@ class MeshSprocket : public Sprocket { void loop() { //net->update(); - scheduler.execute(); + scheduler->execute(); } }; diff --git a/src/examples/mesh/MeshApp.h b/src/examples/mesh/MeshApp.h index 2559c36..575228a 100644 --- a/src/examples/mesh/MeshApp.h +++ b/src/examples/mesh/MeshApp.h @@ -1,14 +1,12 @@ #ifndef __MESH_APP__ #define __MESH_APP__ -#include -#include +#include #include +#include #include -//#include #include #include -//#include #include "Mediator.h" using namespace std; @@ -16,48 +14,41 @@ using namespace std::placeholders; AsyncWebServer WEBSERVER(80); -class MeshApp : public MeshSprocket { +class MeshApp : public Sprocket { public: Task heartbeatTask; - MeshApp(SprocketConfig cfg, /* OtaConfig otaCfg, */ WebServerConfig webCfg) : MeshSprocket(cfg) { - //addPlugin(new OtaTcpPlugin(otaCfg)); + MeshApp(SprocketConfig cfg, MeshConfig meshCfg, WebServerConfig webCfg) : Sprocket(cfg) { + addPlugin(new MeshNetworkPlugin(meshCfg)); addPlugin(new WebServerPlugin(webCfg, &WEBSERVER)); addPlugin(new WebConfigPlugin(&WEBSERVER)); - //addPlugin(new MeshManPlugin(&WEBSERVER)); - subscribe("mesh/heartbeat", bind(&MeshApp::messageHandler, this, _1)); + subscribe("device/heartbeat", bind(&MeshApp::messageHandler, this, _1)); } Sprocket* activate(Scheduler* scheduler) { - // call parent method that enables dispatching and plugins - MeshSprocket::activate(scheduler); - + Serial.println("activate MeshApp"); + Sprocket::activate(scheduler); // add a task that sends stuff to the mesh - heartbeatTask.set(TASK_SECOND * 5, TASK_FOREVER, bind(&MeshApp::heartbeat, this, net)); + heartbeatTask.set(TASK_SECOND * 5, TASK_FOREVER, bind(&MeshApp::heartbeat, this)); addTask(heartbeatTask); return this; - } using MeshSprocket::activate; + } using Sprocket::activate; void messageHandler(String msg){ Serial.println(String("MeshApp: ") + msg); } - void heartbeat(MeshNet* network){ - SprocketMessage msg; // = { "wirelos", "broadcast", "local", "alive", 0, }; + void heartbeat(){ + SprocketMessage msg; msg.domain = "wirelos"; msg.to = "broadcast"; msg.payload = "alive"; - msg.topic = "mesh/heartbeat"; + msg.topic = "device/heartbeat"; msg.type = SprocketMessage::APP; String msgStr = msg.toJsonString(); - //network->mesh.sendBroadcast(msgStr, true); - //String mMsg = String("hoi"); - //publish("mediatorMsg", "hi mediator"); + publish("mesh/broadcast", msgStr); } - //void onMessage( uint32_t from, String &msg ) { - // Serial.printf("MeshApp onMessage: received from %u msg=%s\n", from, msg.c_str()); - //} }; #endif \ No newline at end of file diff --git a/src/examples/mesh/config.h b/src/examples/mesh/config.h index e1a48a5..2ac92af 100644 --- a/src/examples/mesh/config.h +++ b/src/examples/mesh/config.h @@ -4,6 +4,7 @@ // Scheduler config #define _TASK_SLEEP_ON_IDLE_RUN #define _TASK_STD_FUNCTION +#define _TASK_PRIORITY // Chip config #define SERIAL_BAUD_RATE 115200 diff --git a/src/examples/mesh/main.cpp b/src/examples/mesh/main.cpp index 5399158..91a9f1c 100644 --- a/src/examples/mesh/main.cpp +++ b/src/examples/mesh/main.cpp @@ -1,24 +1,22 @@ #include "config.h" -#include "MeshNet.h" #include "MeshApp.h" -MeshNet net({ - SPROCKET_MODE, WIFI_CHANNEL, - MESH_PORT, MESH_PREFIX, MESH_PASSWORD, - STATION_SSID, STATION_PASSWORD, HOSTNAME, - MESH_DEBUG_TYPES -}); MeshApp sprocket( - { STARTUP_DELAY, SERIAL_BAUD_RATE }, - /* { OTA_PORT, OTA_PASSWORD }, */ - { WEB_CONTEXT_PATH, WEB_DOC_ROOT, WEB_DEFAULT_FILE } -); + {STARTUP_DELAY, SERIAL_BAUD_RATE}, + {SPROCKET_MODE, WIFI_CHANNEL, + MESH_PORT, MESH_PREFIX, MESH_PASSWORD, + STATION_SSID, STATION_PASSWORD, HOSTNAME, + MESH_DEBUG_TYPES}, + {WEB_CONTEXT_PATH, WEB_DOC_ROOT, WEB_DEFAULT_FILE}); -void setup() { - //sprocket.join(net); +void setup() +{ + delay(3000); + sprocket.activate(); } -void loop() { +void loop() +{ sprocket.loop(); yield(); } \ No newline at end of file diff --git a/src/plugins/MeshNetworkPlugin.cpp b/src/plugins/MeshNetworkPlugin.cpp index 8521f7b..c6a4897 100644 --- a/src/plugins/MeshNetworkPlugin.cpp +++ b/src/plugins/MeshNetworkPlugin.cpp @@ -1,10 +1,8 @@ #ifndef __MESH_NETWORK_PLUGIN__ #define __MESH_NETWORK_PLUGIN__ -#define _TASK_PRIORITY - -#include "TaskSchedulerDeclarations.h" #include "Plugin.h" +#include "TaskSchedulerDeclarations.h" #include #include #include "plugins/NetworkPlugin.cpp" @@ -22,6 +20,7 @@ class MeshNetworkPlugin : public NetworkPlugin MeshNetworkPlugin(MeshConfig cfg) { network = new MeshNet(cfg); + meshScheduler = new Scheduler(); } void activate(Scheduler *userScheduler) @@ -29,8 +28,13 @@ class MeshNetworkPlugin : public NetworkPlugin userScheduler->setHighPriorityScheduler(meshScheduler); network->onReceive(bind(&MeshNetworkPlugin::dispatch, this, _1, _2)); // TODO base subscribers + subscribe("mesh/broadcast", bind(&MeshNetworkPlugin::broadcast, this, _1)); NetworkPlugin::activate(meshScheduler); } + void broadcast(String msg) + { + network->broadcast(msg, true); + } void dispatch(uint32_t from, String &msg) { SprocketMessage sMsg; From 12b9a7b5097403da3651fc97841d02268e5a75e1 Mon Sep 17 00:00:00 2001 From: Patrick Balsiger Date: Thu, 8 Nov 2018 14:59:28 +0100 Subject: [PATCH 4/7] remove mqtt example, instantiate scheduler and activate plugins in base activation method --- platformio.ini | 12 -- src/Sprocket.cpp | 7 +- src/examples/mesh/MeshApp.h | 66 ++++++----- .../meshMqttBridge/MqttMeshBridge.cpp | 112 ------------------ src/examples/meshMqttBridge/config.h | 29 ----- src/examples/meshMqttBridge/main.cpp | 24 ---- 6 files changed, 38 insertions(+), 212 deletions(-) delete mode 100644 src/examples/meshMqttBridge/MqttMeshBridge.cpp delete mode 100644 src/examples/meshMqttBridge/config.h delete mode 100644 src/examples/meshMqttBridge/main.cpp diff --git a/platformio.ini b/platformio.ini index b14fc3e..ab16b02 100644 --- a/platformio.ini +++ b/platformio.ini @@ -61,18 +61,6 @@ lib_deps = ${common.lib_deps} ESPAsyncTCP ;upload_port = 192.168.1.247 -[env:meshMqttBridge] -src_filter = +<*> - + -platform = espressif8266 -board = esp12e -upload_speed = ${common.upload_speed} -monitor_baud = ${common.monitor_baud} -framework = ${common.framework} -lib_deps = ${common.lib_deps} - painlessMesh - PubSubClient - - [env:standalone] src_filter = +<*> - + platform = ${common.platform} diff --git a/src/Sprocket.cpp b/src/Sprocket.cpp index db94b88..619781f 100644 --- a/src/Sprocket.cpp +++ b/src/Sprocket.cpp @@ -13,15 +13,14 @@ Sprocket* Sprocket::init(SprocketConfig cfg){ delay(cfg.startupDelay); Serial.begin(cfg.serialBaudRate); SPIFFS.begin(); - scheduler = new Scheduler(); return this; } Sprocket* Sprocket::activate() { + scheduler = new Scheduler(); + activatePlugins(scheduler); return activate(scheduler); } -Sprocket* Sprocket::activate(Scheduler* scheduler) { - // setup plugins - activatePlugins(scheduler); +Sprocket* Sprocket::activate(Scheduler* s) { return this; } diff --git a/src/examples/mesh/MeshApp.h b/src/examples/mesh/MeshApp.h index 575228a..5305b14 100644 --- a/src/examples/mesh/MeshApp.h +++ b/src/examples/mesh/MeshApp.h @@ -14,41 +14,45 @@ using namespace std::placeholders; AsyncWebServer WEBSERVER(80); -class MeshApp : public Sprocket { - public: - Task heartbeatTask; +class MeshApp : public Sprocket +{ + public: + Task heartbeatTask; - MeshApp(SprocketConfig cfg, MeshConfig meshCfg, WebServerConfig webCfg) : Sprocket(cfg) { - addPlugin(new MeshNetworkPlugin(meshCfg)); - addPlugin(new WebServerPlugin(webCfg, &WEBSERVER)); - addPlugin(new WebConfigPlugin(&WEBSERVER)); - subscribe("device/heartbeat", bind(&MeshApp::messageHandler, this, _1)); - } + MeshApp(SprocketConfig cfg, MeshConfig meshCfg, WebServerConfig webCfg) : Sprocket(cfg) + { + addPlugin(new MeshNetworkPlugin(meshCfg)); + addPlugin(new WebServerPlugin(webCfg, &WEBSERVER)); + addPlugin(new WebConfigPlugin(&WEBSERVER)); + subscribe("device/heartbeat", bind(&MeshApp::messageHandler, this, _1)); + } - Sprocket* activate(Scheduler* scheduler) { - Serial.println("activate MeshApp"); - Sprocket::activate(scheduler); - // add a task that sends stuff to the mesh - heartbeatTask.set(TASK_SECOND * 5, TASK_FOREVER, bind(&MeshApp::heartbeat, this)); - addTask(heartbeatTask); - - return this; - } using Sprocket::activate; + Sprocket *activate(Scheduler *scheduler) + { + // add a task that sends stuff to the mesh + heartbeatTask.set(TASK_SECOND * 5, TASK_FOREVER, bind(&MeshApp::heartbeat, this)); + addTask(heartbeatTask); + Serial.println("MeshApp activated"); + return this; + } + using Sprocket::activate; - void messageHandler(String msg){ - Serial.println(String("MeshApp: ") + msg); - } + void messageHandler(String msg) + { + Serial.println(String("MeshApp: ") + msg); + } - void heartbeat(){ - SprocketMessage msg; - msg.domain = "wirelos"; - msg.to = "broadcast"; - msg.payload = "alive"; - msg.topic = "device/heartbeat"; - msg.type = SprocketMessage::APP; - String msgStr = msg.toJsonString(); - publish("mesh/broadcast", msgStr); - } + void heartbeat() + { + SprocketMessage msg; + msg.domain = "wirelos"; + msg.to = "broadcast"; + msg.payload = "alive"; + msg.topic = "device/heartbeat"; + msg.type = SprocketMessage::APP; + String msgStr = msg.toJsonString(); + publish("mesh/broadcast", msgStr); + } }; #endif \ No newline at end of file diff --git a/src/examples/meshMqttBridge/MqttMeshBridge.cpp b/src/examples/meshMqttBridge/MqttMeshBridge.cpp deleted file mode 100644 index 9c775e8..0000000 --- a/src/examples/meshMqttBridge/MqttMeshBridge.cpp +++ /dev/null @@ -1,112 +0,0 @@ -#ifndef __MESH_MQTT_BRIDGE_APP__ -#define __MESH_MQTT_BRIDGE_APP__ - -#include -#include -#include -#include "Sprocket.h" -#include "MeshNet.h" - -#define MQTT_TOPIC_FROM "mesh/from/" -#define MQTT_TOPIC_FROM_GATEWAY "mesh/from/gateway" -#define MQTT_TOPIC_TO_ALL "mesh/to/#" - -using namespace std; -using namespace std::placeholders; - -struct MqttConfig { - const char* clientName; - const char* brokerHost; - int brokerPort; - const char* topicRoot; -}; - -class MqttMeshBridge : public Sprocket { - public: - MeshNet* net; - PubSubClient* client; - WiFiClient wifiClient; - Task connectTask; - Task processTask; - MqttConfig mqttConfig; - - MqttMeshBridge(SprocketConfig sprktCfg, MqttConfig cfg) : Sprocket(sprktCfg) { - mqttConfig = cfg; - } - - Sprocket* activate(Scheduler* scheduler){ - enableConnectTask(scheduler); - enableProcessTask(scheduler); - return this; - } - - Sprocket* activate(Scheduler* scheduler, Network* network) { - Serial.println("activate MQTT bridge"); - net = static_cast(network); - net->mesh.onReceive(bind(&MqttMeshBridge::receivedCallback,this, _1, _2)); - client = new PubSubClient(mqttConfig.brokerHost, mqttConfig.brokerPort, bind(&MqttMeshBridge::mqttCallback, this, _1, _2, _3), wifiClient); - return activate(scheduler); - } - - private: - void enableConnectTask(Scheduler* scheduler) { - connectTask.set(TASK_SECOND * 5, TASK_FOREVER, bind(&MqttMeshBridge::connect, this)); - scheduler->addTask(connectTask); - connectTask.enable(); - } - - void enableProcessTask(Scheduler* scheduler) { - processTask.set(TASK_MILLISECOND * 5, TASK_FOREVER, bind(&MqttMeshBridge::process, this)); - scheduler->addTask(processTask); - processTask.enable(); - } - - void process(){ - client->loop(); - } - - void connect() { - if (!client->connected()) { - if (client->connect(mqttConfig.clientName)) { - Serial.println("MQTT connected"); - client->publish(MQTT_TOPIC_FROM_GATEWAY,"Ready!"); - client->subscribe(MQTT_TOPIC_TO_ALL); - } - } - } - - void receivedCallback( uint32_t from, String &msg ) { - Serial.printf("bridge: Received from %u msg=%s\n", from, msg.c_str()); - String topic = MQTT_TOPIC_FROM + String(from); - client->publish(topic.c_str(), msg.c_str()); - } - - void mqttCallback(char* topic, uint8_t* payload, unsigned int length) { - char* cleanPayload = (char*)malloc(length+1); - payload[length] = '\0'; - memcpy(cleanPayload, payload, length+1); - String msg = String(cleanPayload); - free(cleanPayload); - - int topicRootLength = String(mqttConfig.topicRoot).length(); - String targetStr = String(topic).substring(topicRootLength + 4); - - if(targetStr == "gateway"){ - if(msg == "getNodes") { - client->publish(MQTT_TOPIC_FROM_GATEWAY, net->mesh.subConnectionJson().c_str()); - } - } else if(targetStr == "broadcast") { - net->mesh.sendBroadcast(msg); - } else { - uint32_t target = strtoul(targetStr.c_str(), NULL, 10); - if(net->mesh.isConnected(target)){ - net->mesh.sendSingle(target, msg); - } else { - client->publish(MQTT_TOPIC_FROM_GATEWAY, "Client not connected!"); - } - } - } - -}; - -#endif \ No newline at end of file diff --git a/src/examples/meshMqttBridge/config.h b/src/examples/meshMqttBridge/config.h deleted file mode 100644 index 5a10475..0000000 --- a/src/examples/meshMqttBridge/config.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef __BRIDGE_CONFIG__ -#define __BRIDGE_CONFIG__ - -// Scheduler config -#define _TASK_SLEEP_ON_IDLE_RUN -#define _TASK_STD_FUNCTION - -// Chip config -#define SERIAL_BAUD_RATE 115200 -#define STARTUP_DELAY 3000 - -// Mesh config -#define STATION_MODE 1 -#define WIFI_CHANNEL 11 -#define MESH_PORT 5555 -#define MESH_PREFIX "whateverYouLike" -#define MESH_PASSWORD "somethingSneaky" -#define STATION_SSID "Th1ngs4P" -#define STATION_PASSWORD "th3r31sn0sp00n" -#define HOSTNAME "mqtt-bridge" -#define MESH_DEBUG_TYPES ERROR | STARTUP | CONNECTION - -// Bridge config -#define MQTT_CLIENT_NAME HOSTNAME -#define MQTT_BROKER "citadel.lan" -#define MQTT_PORT 1883 -#define MQTT_TOPIC_ROOT "mesh" - -#endif \ No newline at end of file diff --git a/src/examples/meshMqttBridge/main.cpp b/src/examples/meshMqttBridge/main.cpp deleted file mode 100644 index 46f0fce..0000000 --- a/src/examples/meshMqttBridge/main.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include "config.h" -#include "MeshNet.h" -#include "MqttMeshBridge.cpp" - -MeshNet net({ - STATION_MODE, WIFI_CHANNEL, - MESH_PORT, MESH_PREFIX, MESH_PASSWORD, - STATION_SSID, STATION_PASSWORD, HOSTNAME, - MESH_DEBUG_TYPES -}); - -MqttMeshBridge sprocket( - { STARTUP_DELAY, SERIAL_BAUD_RATE }, - { MQTT_CLIENT_NAME, MQTT_BROKER, MQTT_PORT, MQTT_TOPIC_ROOT } -); - -void setup() { - sprocket.join(net); -} - -void loop() { - sprocket.loop(); - yield(); -} \ No newline at end of file From 7273ee6a0bf0380fe530abee5631a1c48156c3eb Mon Sep 17 00:00:00 2001 From: Patrick Balsiger Date: Thu, 8 Nov 2018 15:25:17 +0100 Subject: [PATCH 5/7] cleanup examples, build and ci --- .gitlab-ci.yml | 7 ++-- platformio.ini | 14 ++----- src/MeshNet.cpp | 1 + src/examples/standalone/WiFiApp.h | 46 ---------------------- src/examples/standalone/main.cpp | 30 -------------- src/examples/wifi/WiFiApp.h | 24 +++++++++++ src/examples/{standalone => wifi}/config.h | 1 + src/examples/wifi/main.cpp | 28 +++++++++++++ src/examples/{mesh => wifiMesh}/MeshApp.h | 10 +---- src/examples/{mesh => wifiMesh}/README.md | 0 src/examples/{mesh => wifiMesh}/config.h | 0 src/examples/{mesh => wifiMesh}/main.cpp | 3 +- src/plugins/MeshNetworkPlugin.cpp | 2 +- src/plugins/WebServerConfig.h | 1 + 14 files changed, 65 insertions(+), 102 deletions(-) delete mode 100644 src/examples/standalone/WiFiApp.h delete mode 100644 src/examples/standalone/main.cpp create mode 100644 src/examples/wifi/WiFiApp.h rename src/examples/{standalone => wifi}/config.h (96%) create mode 100644 src/examples/wifi/main.cpp rename src/examples/{mesh => wifiMesh}/MeshApp.h (75%) rename src/examples/{mesh => wifiMesh}/README.md (100%) rename src/examples/{mesh => wifiMesh}/config.h (100%) rename src/examples/{mesh => wifiMesh}/main.cpp (80%) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 33506d2..c5d1bc8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -34,11 +34,10 @@ firmware-build: stage: build image: python:2.7-stretch script: - - pio run -t clean + - pio run --target clean - pio run --environment basic - - pio run --environment mesh - - pio run --environment meshMqttBridge - - pio run --environment standalone + - pio run --environment wifi + - pio run --environment wifiMesh artifacts: paths: - .pioenvs/*/firmware.* diff --git a/platformio.ini b/platformio.ini index ab16b02..4c386fc 100644 --- a/platformio.ini +++ b/platformio.ini @@ -46,8 +46,8 @@ monitor_baud = ${common.monitor_baud} framework = ${common.framework} lib_deps = ${common.lib_deps} -[env:mesh] -src_filter = +<*> - + +[env:wifiMesh] +src_filter = +<*> - + platform = ${common.platform} board = ${common.board} upload_speed = ${common.upload_speed} @@ -55,19 +55,13 @@ monitor_baud = ${common.monitor_baud} framework = ${common.framework} lib_deps = ${common.lib_deps} painlessMesh - ESP8266mDNS - ArduinoOTA - ESP Async WebServer - ESPAsyncTCP -;upload_port = 192.168.1.247 -[env:standalone] -src_filter = +<*> - + +[env:wifi] +src_filter = +<*> - + platform = ${common.platform} board = ${common.board} upload_speed = ${common.upload_speed} monitor_baud = ${common.monitor_baud} framework = ${common.framework} lib_deps = ${common.lib_deps} - ArduinoOTA ESP Async WebServer \ No newline at end of file diff --git a/src/MeshNet.cpp b/src/MeshNet.cpp index 81adecc..42c08ce 100644 --- a/src/MeshNet.cpp +++ b/src/MeshNet.cpp @@ -28,6 +28,7 @@ int MeshNet::connect(){ if(config.stationMode){ connectStation(); } + return 1; } int MeshNet::connectStation() { diff --git a/src/examples/standalone/WiFiApp.h b/src/examples/standalone/WiFiApp.h deleted file mode 100644 index d552537..0000000 --- a/src/examples/standalone/WiFiApp.h +++ /dev/null @@ -1,46 +0,0 @@ - -#ifndef __WIFI_APP__ -#define __WIFI_APP__ - -#include -#include -#include -//#include -#include -#include -#include "Mediator.h" - -using namespace std; -using namespace std::placeholders; - -AsyncWebServer WEBSERVER(80); - -class WiFiApp : public Sprocket { - public: - Scheduler* ts; - Task someTask; - WiFiApp(SprocketConfig cfg, /* OtaConfig otaCfg, */ WebServerConfig webCfg) : Sprocket(cfg) { - //addPlugin(new OtaTcpPlugin(otaCfg)); - addPlugin(new WebServerPlugin(webCfg, &WEBSERVER)); - addPlugin(new WebConfigPlugin(&WEBSERVER)); - ts = new Scheduler(); - } - - Sprocket* activate(Scheduler* scheduler) { - Sprocket::activate(ts); - Serial.println("activate WiFiApp"); - // add a task - someTask.set(TASK_SECOND, TASK_FOREVER, [](){ - Serial.println("do stuff in task"); - }); - //addTask(someTask); - return this; - } using Sprocket::activate; - void loop(){ - //Sprocket::loop(); - ts->execute(); - yield(); - } -}; - -#endif \ No newline at end of file diff --git a/src/examples/standalone/main.cpp b/src/examples/standalone/main.cpp deleted file mode 100644 index b20bccc..0000000 --- a/src/examples/standalone/main.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include "config.h" -#include "WiFiNet.h" -#include "WiFiApp.h" - -/* WiFiConfig wifiCfg = { - .stationMode=SPROCKET_MODE, - .stationSSID=STATION_SSID, - .stationPassword=STATION_PASSWORD, - .apSSID=AP_SSID, - .apPassword=AP_PASSWORD, - .hostname=HOSTNAME, - .connectTimeout=CONNECT_TIMEOUT -}; */ - -WiFiNet net(SPROCKET_MODE,STATION_SSID, STATION_PASSWORD,AP_SSID, AP_PASSWORD,HOSTNAME,CONNECT_TIMEOUT); -WiFiApp sprocket( - { STARTUP_DELAY, SERIAL_BAUD_RATE }, - /* { OTA_PORT, OTA_PASSWORD }, */ - { WEB_CONTEXT_PATH, WEB_DOC_ROOT, WEB_DEFAULT_FILE } -); - -void setup() { - delay(3000); - sprocket.join(net); -} - -void loop() { - sprocket.loop(); - yield(); -} \ No newline at end of file diff --git a/src/examples/wifi/WiFiApp.h b/src/examples/wifi/WiFiApp.h new file mode 100644 index 0000000..ab0c1f5 --- /dev/null +++ b/src/examples/wifi/WiFiApp.h @@ -0,0 +1,24 @@ + +#ifndef __WIFI_APP__ +#define __WIFI_APP__ + +#include +#include +#include +#include +#include + +using namespace std; +using namespace std::placeholders; + +class WiFiApp : public Sprocket { + public: + AsyncWebServer* server; + WiFiApp(SprocketConfig cfg, WebServerConfig webCfg) : Sprocket(cfg) { + server = new AsyncWebServer(webCfg.port); + addPlugin(new WebServerPlugin(webCfg, server)); + addPlugin(new WebConfigPlugin(server)); + } +}; + +#endif \ No newline at end of file diff --git a/src/examples/standalone/config.h b/src/examples/wifi/config.h similarity index 96% rename from src/examples/standalone/config.h rename to src/examples/wifi/config.h index 6e39aeb..1ce975a 100644 --- a/src/examples/standalone/config.h +++ b/src/examples/wifi/config.h @@ -27,5 +27,6 @@ #define WEB_CONTEXT_PATH "/" #define WEB_DOC_ROOT "/www" #define WEB_DEFAULT_FILE "index.html" +#define WEB_SERVER_PORT 80 #endif \ No newline at end of file diff --git a/src/examples/wifi/main.cpp b/src/examples/wifi/main.cpp new file mode 100644 index 0000000..8e300df --- /dev/null +++ b/src/examples/wifi/main.cpp @@ -0,0 +1,28 @@ +#include "config.h" +#include "WiFiNet.h" +#include "WiFiApp.h" + +WiFiNet wifi( + SPROCKET_MODE, + STATION_SSID, + STATION_PASSWORD, + AP_SSID, + AP_PASSWORD, + HOSTNAME, + CONNECT_TIMEOUT); +WiFiApp sprocket( + {STARTUP_DELAY, SERIAL_BAUD_RATE}, + {WEB_CONTEXT_PATH, WEB_DOC_ROOT, WEB_DEFAULT_FILE, WEB_SERVER_PORT}); + +void setup() +{ + delay(3000); + wifi.connect(); + sprocket.activate(); +} + +void loop() +{ + sprocket.loop(); + yield(); +} \ No newline at end of file diff --git a/src/examples/mesh/MeshApp.h b/src/examples/wifiMesh/MeshApp.h similarity index 75% rename from src/examples/mesh/MeshApp.h rename to src/examples/wifiMesh/MeshApp.h index 5305b14..e3a272f 100644 --- a/src/examples/mesh/MeshApp.h +++ b/src/examples/wifiMesh/MeshApp.h @@ -4,26 +4,18 @@ #include #include #include -#include -#include -#include -#include "Mediator.h" using namespace std; using namespace std::placeholders; -AsyncWebServer WEBSERVER(80); - class MeshApp : public Sprocket { public: Task heartbeatTask; - MeshApp(SprocketConfig cfg, MeshConfig meshCfg, WebServerConfig webCfg) : Sprocket(cfg) + MeshApp(SprocketConfig cfg, MeshConfig meshCfg) : Sprocket(cfg) { addPlugin(new MeshNetworkPlugin(meshCfg)); - addPlugin(new WebServerPlugin(webCfg, &WEBSERVER)); - addPlugin(new WebConfigPlugin(&WEBSERVER)); subscribe("device/heartbeat", bind(&MeshApp::messageHandler, this, _1)); } diff --git a/src/examples/mesh/README.md b/src/examples/wifiMesh/README.md similarity index 100% rename from src/examples/mesh/README.md rename to src/examples/wifiMesh/README.md diff --git a/src/examples/mesh/config.h b/src/examples/wifiMesh/config.h similarity index 100% rename from src/examples/mesh/config.h rename to src/examples/wifiMesh/config.h diff --git a/src/examples/mesh/main.cpp b/src/examples/wifiMesh/main.cpp similarity index 80% rename from src/examples/mesh/main.cpp rename to src/examples/wifiMesh/main.cpp index 91a9f1c..009c280 100644 --- a/src/examples/mesh/main.cpp +++ b/src/examples/wifiMesh/main.cpp @@ -6,8 +6,7 @@ MeshApp sprocket( {SPROCKET_MODE, WIFI_CHANNEL, MESH_PORT, MESH_PREFIX, MESH_PASSWORD, STATION_SSID, STATION_PASSWORD, HOSTNAME, - MESH_DEBUG_TYPES}, - {WEB_CONTEXT_PATH, WEB_DOC_ROOT, WEB_DEFAULT_FILE}); + MESH_DEBUG_TYPES}); void setup() { diff --git a/src/plugins/MeshNetworkPlugin.cpp b/src/plugins/MeshNetworkPlugin.cpp index c6a4897..87757ba 100644 --- a/src/plugins/MeshNetworkPlugin.cpp +++ b/src/plugins/MeshNetworkPlugin.cpp @@ -27,8 +27,8 @@ class MeshNetworkPlugin : public NetworkPlugin { userScheduler->setHighPriorityScheduler(meshScheduler); network->onReceive(bind(&MeshNetworkPlugin::dispatch, this, _1, _2)); - // TODO base subscribers subscribe("mesh/broadcast", bind(&MeshNetworkPlugin::broadcast, this, _1)); + // TODO mesh/sendTo NetworkPlugin::activate(meshScheduler); } void broadcast(String msg) diff --git a/src/plugins/WebServerConfig.h b/src/plugins/WebServerConfig.h index 7f58009..70c2433 100644 --- a/src/plugins/WebServerConfig.h +++ b/src/plugins/WebServerConfig.h @@ -5,6 +5,7 @@ struct WebServerConfig { const char* contextPath; const char* docRoot; const char* defaultFile; + int port; }; #endif \ No newline at end of file From a8e0d9037e9861e1ac7d6e2de571a52cc8d8fc72 Mon Sep 17 00:00:00 2001 From: Patrick Balsiger Date: Thu, 8 Nov 2018 15:34:12 +0100 Subject: [PATCH 6/7] remove unused, move files --- src/MeshNet.h | 2 +- src/{base => }/MeshSprocketConfig.h | 0 src/Plugin.h | 2 +- src/{base => }/SprocketMessage.h | 0 src/base/MeshSprocket.h | 50 ----------------------------- src/plugins/MeshNetworkPlugin.cpp | 2 +- 6 files changed, 3 insertions(+), 53 deletions(-) rename src/{base => }/MeshSprocketConfig.h (100%) rename src/{base => }/SprocketMessage.h (100%) delete mode 100644 src/base/MeshSprocket.h diff --git a/src/MeshNet.h b/src/MeshNet.h index f36b738..5da24c0 100644 --- a/src/MeshNet.h +++ b/src/MeshNet.h @@ -11,7 +11,7 @@ #include #include "Network.h" #include "MeshConfig.h" -#include "base/MeshSprocketConfig.h" +#include "MeshSprocketConfig.h" using namespace std; using namespace std::placeholders; diff --git a/src/base/MeshSprocketConfig.h b/src/MeshSprocketConfig.h similarity index 100% rename from src/base/MeshSprocketConfig.h rename to src/MeshSprocketConfig.h diff --git a/src/Plugin.h b/src/Plugin.h index 5bbeaf3..9c83644 100644 --- a/src/Plugin.h +++ b/src/Plugin.h @@ -7,7 +7,7 @@ #include #include -#include +#include #include class Plugin { diff --git a/src/base/SprocketMessage.h b/src/SprocketMessage.h similarity index 100% rename from src/base/SprocketMessage.h rename to src/SprocketMessage.h diff --git a/src/base/MeshSprocket.h b/src/base/MeshSprocket.h deleted file mode 100644 index 938dfc7..0000000 --- a/src/base/MeshSprocket.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef __MESH_SPROCKET__ -#define __MESH_SPROCKET__ - -#define DEBUG_ESP_OTA -#include -#include -#include -#include -#include -#include -#include "config.h" -#include "utils_print.h" - -using namespace std; -using namespace std::placeholders; - -class MeshSprocket : public Sprocket { - public: - MeshNet* net; - - MeshSprocket(){}; - MeshSprocket(SprocketConfig cfg) : Sprocket(cfg) { - - } - - Sprocket* activate(Scheduler* scheduler) { - Sprocket::activate(scheduler); - //net = static_cast(network); - //net->onReceive(bind(&MeshSprocket::dispatch,this, _1, _2)); - - return this; - } using Sprocket::activate; - - // TODO transmit SprocketMessage - virtual void dispatch( uint32_t from, String &msg ) { - SprocketMessage sMsg; - sMsg.fromJsonString(msg); - if(sMsg.valid){ - sMsg.from = from; - publish(sMsg.topic, sMsg.payload); - } - } - - void loop() { - //net->update(); - scheduler->execute(); - } -}; - -#endif \ No newline at end of file diff --git a/src/plugins/MeshNetworkPlugin.cpp b/src/plugins/MeshNetworkPlugin.cpp index 87757ba..1b4c571 100644 --- a/src/plugins/MeshNetworkPlugin.cpp +++ b/src/plugins/MeshNetworkPlugin.cpp @@ -6,7 +6,7 @@ #include #include #include "plugins/NetworkPlugin.cpp" -#include +#include using namespace std; using namespace std::placeholders; From b63b75b47fd7ad6dbd2c12ef69b35d5b8e717b4f Mon Sep 17 00:00:00 2001 From: Patrick Balsiger Date: Thu, 8 Nov 2018 15:46:46 +0100 Subject: [PATCH 7/7] remove join method as everything is handled via activate, remove commented code --- src/JsonStruct.h | 10 ---------- src/Sprocket.cpp | 14 +------------- src/Sprocket.h | 3 +-- 3 files changed, 2 insertions(+), 25 deletions(-) diff --git a/src/JsonStruct.h b/src/JsonStruct.h index cee2114..6b21a7d 100644 --- a/src/JsonStruct.h +++ b/src/JsonStruct.h @@ -16,10 +16,8 @@ struct JsonStruct { virtual void fromJsonObject(JsonObject& json); virtual int verifyJsonObject(JsonObject& json){ return json.success(); - //&& json.containsKey(JSON_DOMAIN) }; String toJsonString(){ - //StaticJsonBuffer<200> StringjsonBuffer; DynamicJsonBuffer jsonBuffer(JSON_ARRAY_SIZE(300)); JsonObject& root = jsonBuffer.createObject(); mapJsonObject(root); @@ -44,7 +42,6 @@ struct JsonStruct { // Map a json object to this struct. // Parse a json string and map parsed object void fromJsonString(String& str){ - //StaticJsonBuffer<200> jsonBuffer; DynamicJsonBuffer jsonBuffer(JSON_ARRAY_SIZE(300)); JsonObject& json = jsonBuffer.parseObject(str); valid = verifyJsonObject(json); @@ -56,13 +53,6 @@ struct JsonStruct { void fromFile(const char* path) { File configFile = SPIFFS.open(path, "r"); String cfgFileStr = configFile.readString(); - - // Allocate a buffer to store contents of the file. - //size_t size = configFile.size(); - //std::unique_ptr buf(new char[size]); - //configFile.readBytes(buf.get(), size); - //StaticJsonBuffer<1024> jsonBuffer; - //JsonObject& json = jsonBuffer.parseObject(buf.get()); DynamicJsonBuffer jsonBuffer; JsonObject& json = jsonBuffer.parseObject(cfgFileStr); diff --git a/src/Sprocket.cpp b/src/Sprocket.cpp index 619781f..7a63ec0 100644 --- a/src/Sprocket.cpp +++ b/src/Sprocket.cpp @@ -13,25 +13,13 @@ Sprocket* Sprocket::init(SprocketConfig cfg){ delay(cfg.startupDelay); Serial.begin(cfg.serialBaudRate); SPIFFS.begin(); + scheduler = new Scheduler(); return this; } Sprocket* Sprocket::activate() { - scheduler = new Scheduler(); activatePlugins(scheduler); return activate(scheduler); } -Sprocket* Sprocket::activate(Scheduler* s) { - return this; -} - -// TODO check if we want to remove network from sprocket and handle everything via plugins -Sprocket* Sprocket::join(Network& net){ - Serial.println("join network"); - net.init(scheduler); - net.connect(); - network = net; - return activate(scheduler); -} Sprocket* Sprocket::addTask(Task& tsk){ scheduler->addTask(tsk); diff --git a/src/Sprocket.h b/src/Sprocket.h index 8660a6c..b192f2a 100644 --- a/src/Sprocket.h +++ b/src/Sprocket.h @@ -37,11 +37,10 @@ class Sprocket : public Mediator { Sprocket(); Sprocket(SprocketConfig); Sprocket* init(SprocketConfig); - Sprocket* join(Network&); Sprocket* addTask(Task&); virtual void loop(); virtual Sprocket* activate(); - virtual Sprocket* activate(Scheduler*); + virtual Sprocket* activate(Scheduler*) { return this; }; virtual void dispatch( uint32_t from, String &msg ); void addPlugin(Plugin* p);