diff --git a/.vscode/settings.json b/.vscode/settings.json index acf27a5..30a0ad1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,6 @@ { "terminal.integrated.env.linux": { - "PATH": "/home/master/.platformio/penv/bin:/home/master/.platformio/penv:/home/master/bin:/home/master/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin", + "PATH": "/home/master/.platformio/penv/bin:/home/master/.platformio/penv:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl", "PLATFORMIO_CALLER": "vscode" }, "files.associations": { diff --git a/README.md b/README.md new file mode 100644 index 0000000..6d6c0a2 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# Sprocket Core + +## OTA over MQTT +https://github.com/Imroy/pubsubclient/blob/master/examples/ESP8266-OTA/ESP8266-OTA.ino \ No newline at end of file diff --git a/library.json b/library.json index 6ae6bb2..1ec316d 100644 --- a/library.json +++ b/library.json @@ -14,5 +14,12 @@ "url": "https://gitlab.com/wirelos/sprocket-core/" }, "frameworks": "arduino", - "platforms": "espressif8266" + "platforms": "espressif8266", + "examples": "examples/*", + "export": { + "exclude": + [ + "firmware/" + ] + } } \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index 9b9a1c6..0cdaa05 100644 --- a/platformio.ini +++ b/platformio.ini @@ -9,7 +9,7 @@ ; http://docs.platformio.org/page/projectconf.html [platformio] -env_default = meshMqttBridge +env_default = build [common] framework = arduino @@ -39,7 +39,7 @@ lib_deps = ${common.lib_deps} ;upload_port = 192.168.1.168 [env:basic] -src_filter = +<*> + - - +src_filter = +<*> - - + platform = ${common.platform} board = ${common.board} upload_speed = ${common.upload_speed} @@ -48,7 +48,7 @@ framework = ${common.framework} lib_deps = ${common.lib_deps} [env:mesh] -src_filter = +<*> + - - +src_filter = +<*> - - + platform = ${common.platform} board = ${common.board} upload_speed = ${common.upload_speed} @@ -58,7 +58,7 @@ lib_deps = ${common.lib_deps} painlessMesh [env:meshMqttBridge] -src_filter = +<*> + - - +src_filter = +<*> - - + platform = espressif8266 board = esp12e upload_speed = ${common.upload_speed} diff --git a/src/MeshNet.cpp b/src/MeshNet.cpp index 36abada..92ebfd6 100644 --- a/src/MeshNet.cpp +++ b/src/MeshNet.cpp @@ -24,9 +24,6 @@ Network* MeshNet::init(){ return this; } -Network* MeshNet::connect(){ - return this; -} void MeshNet::sendTo(uint32_t target, String msg){ mesh.sendSingle(target, msg); diff --git a/src/MeshNet.h b/src/MeshNet.h index 04b8f6c..1275655 100644 --- a/src/MeshNet.h +++ b/src/MeshNet.h @@ -27,7 +27,6 @@ class MeshNet : public Network { MeshNet(MeshConfig cfg); Network* init(); - Network* connect(); void broadcast(String msg); void sendTo(uint32_t target, String msg); diff --git a/src/Sprocket.h b/src/Sprocket.h index 5a84978..6d485b8 100644 --- a/src/Sprocket.h +++ b/src/Sprocket.h @@ -20,7 +20,7 @@ class Sprocket { Sprocket(SprocketConfig); Sprocket* init(SprocketConfig); Sprocket* join(Network&); - Sprocket* addTask(Task&); // REMOVE ?? + Sprocket* addTask(Task&); virtual void loop(); virtual Sprocket* activate(); virtual Sprocket* activate(Scheduler*) { return this; } diff --git a/src/examples/mesh/MeshApp.h b/src/examples/mesh/MeshApp.h index cedab31..8c8d28c 100644 --- a/src/examples/mesh/MeshApp.h +++ b/src/examples/mesh/MeshApp.h @@ -18,12 +18,12 @@ class MeshApp : public Sprocket { net->mesh.onReceive(bind(&MeshApp::receivedCallback,this, _1, _2)); // add a task that sends stuff to the mesh someTask.set(TASK_SECOND * 5, TASK_FOREVER, - bind(&MeshApp::advertise, this, net)); + bind(&MeshApp::heartbeat, this, net)); scheduler->addTask(someTask); someTask.enable(); } using Sprocket::activate; - void advertise(MeshNet* network){ + void heartbeat(MeshNet* network){ String msg = "{ \"payload \": 1 }"; network->broadcast(msg); } diff --git a/src/examples/mqttBridge/MqttMeshBridge.h b/src/examples/mqttBridge/MqttMeshBridge.h index 12733d1..9c775e8 100644 --- a/src/examples/mqttBridge/MqttMeshBridge.h +++ b/src/examples/mqttBridge/MqttMeshBridge.h @@ -34,16 +34,21 @@ class MqttMeshBridge : public Sprocket { mqttConfig = cfg; } - 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); + 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); diff --git a/src/examples/mqttBridge/config.h b/src/examples/mqttBridge/config.h index e01f91a..67b0c67 100644 --- a/src/examples/mqttBridge/config.h +++ b/src/examples/mqttBridge/config.h @@ -13,11 +13,11 @@ #define STATION_MODE 1 #define WIFI_CHANNEL 11 #define MESH_PORT 5555 -#define MESH_PREFIX "whateverYouLike" -#define MESH_PASSWORD "somethingSneaky" -#define STATION_SSID "tErAx1d" -#define STATION_PASSWORD "ramalamadingdong" -#define HOSTNAME "mqtt-mesh-bridge" +#define MESH_PREFIX "wirelos_contraption" +#define MESH_PASSWORD "th3r31sn0sp00n" +#define STATION_SSID "Th1ngs4P" +#define STATION_PASSWORD "th3r31sn0sp00n" +#define HOSTNAME "sprocket" #define MESH_DEBUG_TYPES ERROR | STARTUP | CONNECTION // Bridge config diff --git a/src/firmware/BaseSprocket.h b/src/firmware/BaseSprocket.h new file mode 100644 index 0000000..9cb0398 --- /dev/null +++ b/src/firmware/BaseSprocket.h @@ -0,0 +1,38 @@ +#ifndef __BASE_SPROCKET__ +#define __BASE_SPROCKET__ + +#include +#include + +using namespace std; +using namespace std::placeholders; + +// TODO remove someTask and replace with OTA stuff +class BaseSprocket : public Sprocket { + public: + Task someTask; + MeshNet* net; + BaseSprocket(SprocketConfig cfg) : Sprocket(cfg) { + + } + Sprocket* activate(Scheduler* scheduler, Network* network) { + net = static_cast(network); + net->mesh.onReceive(bind(&BaseSprocket::receivedCallback,this, _1, _2)); + // add a task that sends stuff to the mesh + someTask.set(TASK_SECOND * 5, TASK_FOREVER, + bind(&BaseSprocket::heartbeat, this, net)); + scheduler->addTask(someTask); + someTask.enable(); + } using Sprocket::activate; + + void heartbeat(MeshNet* network){ + String msg = "{ \"alive \": 1 }"; + network->broadcast(msg); + } + + virtual void receivedCallback( uint32_t from, String &msg ) { + Serial.printf("RECV %u = %s\n", from, msg.c_str()); + } +}; + +#endif \ No newline at end of file diff --git a/src/firmware/config.h b/src/firmware/config.h new file mode 100644 index 0000000..0a19cd1 --- /dev/null +++ b/src/firmware/config.h @@ -0,0 +1,28 @@ +#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 0 // 1 = connect to AP using STATION params +#define WIFI_CHANNEL 11 +#define MESH_PORT 5555 +#define MESH_PREFIX "wirelos_contraption" +#define MESH_PASSWORD "th3r31sn0sp00n" +#define STATION_SSID "Th1ngs4P" +#define STATION_PASSWORD "th3r31sn0sp00n" +#define HOSTNAME "sprocket" +#define MESH_DEBUG_TYPES ERROR | STARTUP | CONNECTION + +#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/firmware/main.cpp b/src/firmware/main.cpp new file mode 100644 index 0000000..ab78d91 --- /dev/null +++ b/src/firmware/main.cpp @@ -0,0 +1,23 @@ +#include "config.h" +#include "MeshNet.h" +#include "BaseSprocket.h" + +MeshNet net({ + STATION_MODE, WIFI_CHANNEL, + MESH_PORT, MESH_PREFIX, MESH_PASSWORD, + STATION_SSID, STATION_PASSWORD, HOSTNAME, + MESH_DEBUG_TYPES +}); + +BaseSprocket sprocket( + { STARTUP_DELAY, SERIAL_BAUD_RATE } +); + +void setup() { + sprocket.join(net); +} + +void loop() { + sprocket.loop(); + yield(); +} \ No newline at end of file