From 99dbd8379b9097bd19fde2634e63b5faf6da1aaf Mon Sep 17 00:00:00 2001 From: Patrick Balsiger Date: Mon, 5 Nov 2018 14:57:49 +0100 Subject: [PATCH] externalize pixel stuff, add pixel instance to plugin, remove old code --- data/www/gradients.json | 4 ++++ lib/NeoPattern/NeoPattern.cpp | 5 +++++ src/IlluCat.h | 31 ++----------------------------- src/PixelPlugin.cpp | 34 +++++++++++++++++++++++++++++++++- src/PixelPlugin.h | 10 ++++++++++ src/config.h | 2 ++ src/wifi/main.cpp | 1 + src/wifiMesh/main.cpp | 1 + 8 files changed, 58 insertions(+), 30 deletions(-) diff --git a/data/www/gradients.json b/data/www/gradients.json index d184f8d..2b8556f 100644 --- a/data/www/gradients.json +++ b/data/www/gradients.json @@ -3,6 +3,10 @@ "text": "None", "value": ["#000000", "#000000"] }, + { + "text": "Stadler", + "value": ["#0B3F75", "#0B3F75"] + }, { "text": "Blu", "value": ["#00416A", "#E4E5E6"] diff --git a/lib/NeoPattern/NeoPattern.cpp b/lib/NeoPattern/NeoPattern.cpp index d72042f..aa61c85 100644 --- a/lib/NeoPattern/NeoPattern.cpp +++ b/lib/NeoPattern/NeoPattern.cpp @@ -66,6 +66,7 @@ class NeoPattern : public Adafruit_NeoPixel frameBuffer = (uint8_t *)malloc(768); OnComplete = callback; TotalSteps = numPixels(); + begin(); } NeoPattern(uint16_t pixels, uint8_t pin, uint8_t type) @@ -73,6 +74,7 @@ class NeoPattern : public Adafruit_NeoPixel { frameBuffer = (uint8_t *)malloc(768); TotalSteps = numPixels(); + begin(); } void handleStream(uint8_t *data, size_t len) @@ -386,6 +388,9 @@ class NeoPattern : public Adafruit_NeoPixel return Color(WheelPos * 3, 255 - WheelPos * 3, 0); } } + /** + * Effects from https://www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/ + */ void Fire(int Cooling, int Sparking) { byte heat[numPixels()]; diff --git a/src/IlluCat.h b/src/IlluCat.h index 4baadcf..a6b2b95 100644 --- a/src/IlluCat.h +++ b/src/IlluCat.h @@ -25,12 +25,7 @@ using namespace std::placeholders; class IlluCat : public Sprocket { public: - NeoPattern* pixels; - NeoPatternDto defaultState; - NeoPatternDto state; AsyncWebServer* server; - - NeoPixelConfig pixelConfig; SprocketConfig sprocketConfig; OtaConfig otaConfig; WebServerConfig webConfig; @@ -45,42 +40,20 @@ class IlluCat : public Sprocket { Sprocket* activate(Scheduler* scheduler, Network* network) { - // load config files from SPIFFS - if(SPIFFS.begin()){ - pixelConfig.fromFile("/pixelConfig.json"); - // FIXME actualy store and load state to use as initial animation - defaultState.fromFile("/pixelState.json"); - state = defaultState; - } - - // initialize services - pixels = new NeoPattern(pixelConfig.length, pixelConfig.pin, NEO_GRB + NEO_KHZ800); server = new AsyncWebServer(80); - defaultAnimation(); - - // add plugins // TODO how can any type of API be linked to another one? // TODO add HTTP OTA instead of TCP //addPlugin(new OtaTcpPlugin(otaConfig)); addPlugin(new WebServerPlugin(webConfig, server)); addPlugin(new WebConfigPlugin(server)); addPlugin(new WebApi(server, 1)); - // TODO pixel streaming - addPlugin(new PixelPlugin(pixelConfig, pixels)); - + // setup web stuff - server->serveStatic("/pixelConfig.json", SPIFFS, "pixelConfig.json"); + server->serveStatic(PIXEL_CONFIG_FILE, SPIFFS, "pixelConfig.json"); return Sprocket::activate(scheduler, network); } using Sprocket::activate; - virtual void scanningAnimation() { - pixels->Scanner(pixels->Wheel(COLOR_NOT_CONNECTED), pixelConfig.updateInterval); - } - virtual void defaultAnimation() { - pixels->RainbowCycle(pixelConfig.updateInterval); - } - // TODO move to Sprocket virtual void dispatch( uint32_t from, String &msg ) { currentMessage.fromJsonString(msg); diff --git a/src/PixelPlugin.cpp b/src/PixelPlugin.cpp index 8869362..f9dab05 100644 --- a/src/PixelPlugin.cpp +++ b/src/PixelPlugin.cpp @@ -4,10 +4,42 @@ PixelPlugin::PixelPlugin(NeoPixelConfig cfg, NeoPattern *neoPattern) { pixelConfig = cfg; pixels = neoPattern; - pixels->begin(); + applyConfig(pixelConfig); + defaultAnimation(); +} + +PixelPlugin::PixelPlugin(NeoPattern *neoPattern) +{ + pixels = neoPattern; + loadConfigFromFile(); + applyConfig(pixelConfig); + defaultAnimation(); +} + +PixelPlugin::PixelPlugin() +{ + loadConfigFromFile(); + pixels = new NeoPattern(pixelConfig.length, pixelConfig.pin, NEO_GRB + NEO_KHZ800); + applyConfig(pixelConfig); + defaultAnimation(); +} + +void PixelPlugin::loadConfigFromFile(){ + if (SPIFFS.begin()){ + pixelConfig.fromFile(PIXEL_CONFIG_FILE); + } +} + +void PixelPlugin::applyConfig(NeoPixelConfig cfg) +{ pixels->setBrightness(pixelConfig.brightness); } +void PixelPlugin::defaultAnimation() { + pixels->RainbowCycle(pixelConfig.updateInterval); + animate(); +} + void PixelPlugin::activate(Scheduler *userScheduler, Network *network) { subscribe("pixels/colorWheel", bind(&PixelPlugin::colorWheel, this, _1)); diff --git a/src/PixelPlugin.h b/src/PixelPlugin.h index 937ec2c..e1a727d 100644 --- a/src/PixelPlugin.h +++ b/src/PixelPlugin.h @@ -14,6 +14,10 @@ using namespace std; using namespace std::placeholders; +#ifndef PIXEL_CONFIG_FILE +#define PIXEL_CONFIG_FILE "/pixelConfig.json" +#endif + class PixelPlugin : public Plugin { private: NeoPixelConfig pixelConfig; @@ -22,7 +26,13 @@ class PixelPlugin : public Plugin { public: Task animation; PixelPlugin(NeoPixelConfig cfg, NeoPattern* neoPattern); + PixelPlugin(NeoPattern *neoPattern); + PixelPlugin(); + void loadConfigFromFile(); + void applyConfig(NeoPixelConfig cfg); + void applyConfigFromFile(); void activate(Scheduler* userScheduler, Network* network); + void defaultAnimation(); void setState(String msg); void colorWheel(String msg); void setTotalSteps(String msg); diff --git a/src/config.h b/src/config.h index b8025ea..ba28385 100644 --- a/src/config.h +++ b/src/config.h @@ -25,6 +25,8 @@ #define MESH_DEBUG_TYPES ERROR | STARTUP | CONNECTION //ERROR | MESH_STATUS | CONNECTION | SYNC | COMMUNICATION | GENERAL | MSG_TYPES | REMOTE +#define PIXEL_CONFIG_FILE "/pixelConfig.json" + // OTA config #define OTA_PORT 8266 #define OTA_PASSWORD "" diff --git a/src/wifi/main.cpp b/src/wifi/main.cpp index 2b751c7..4f22af0 100644 --- a/src/wifi/main.cpp +++ b/src/wifi/main.cpp @@ -18,6 +18,7 @@ IlluCat sprocket( ); void setup() { + sprocket.addPlugin(new PixelPlugin()); sprocket.join(net); } diff --git a/src/wifiMesh/main.cpp b/src/wifiMesh/main.cpp index a9b7f0a..4e9e5c4 100644 --- a/src/wifiMesh/main.cpp +++ b/src/wifiMesh/main.cpp @@ -15,6 +15,7 @@ MeshCat sprocket( ); void setup() { + sprocket.addPlugin(new PixelPlugin()); sprocket.join(net); }