diff --git a/NeoPatterns.cpp b/NeoPatterns.cpp index b19f3ca..c4defa1 100644 --- a/NeoPatterns.cpp +++ b/NeoPatterns.cpp @@ -46,6 +46,9 @@ void NeoPatterns::Update() { case ICON: IconUpdate(); break; + case TEXT: + TextUpdate(); + break; case PLASMA: PlasmaUpdate(); break; @@ -471,6 +474,76 @@ void NeoPatterns::IconComplete() PlasmaColorStretch = SavedPlasmaColorStretch; } +/****************** Text ******************/ + +void NeoPatterns::Text(String text, uint8_t interval) +{ + // Save last effect, should be called after completion again + SavedPattern = ActivePattern; + SavedInterval = Interval; + SavedTotalSteps = TotalSteps; + SavedIndex = Index; + SavedColor1 = Color1; + SavedDirection = Direction; + SavedPlasmaPhase = PlasmaPhase; + SavedPlasmaPhaseIncrement = PlasmaPhaseIncrement; + SavedPlasmaColorStretch = PlasmaColorStretch; + ActivePattern = TEXT; + Interval = interval; + // textlength*8 + TotalSteps = text.length()*8; + Index = TotalSteps; + Text1 = text; + // FontChar = fontchar; + Direction = REVERSE; + Color1 = 255*255*255; + textposition=0; + charposition=0; +} + +void NeoPatterns::TextUpdate() +{ + // textposition++; + charposition++; + if (charposition == 9) + { + charposition = 0; + textposition++; + } + uint8_t FontChar = Text1[textposition]; + + for (int i = 0; i < numPixels(); i++) { + uint64_t mask = 1LL << (uint64_t)i; + if ( (font[FontChar]&mask) == 0) { + setPixelColor(numToPos(i), Color(0, 0, 0)); //bit is 0 at pos i + } else { + uint8_t _r = (uint8_t)(Color1 >> 16); + uint8_t _g = (uint8_t)(Color1 >> 8); + uint8_t _b = (uint8_t)Color1; + setPixelColor(numToPos(i), Color(_r, _g, _b)); //bit is 1 at pos i + } + } + show(); + Increment(); +} + +void NeoPatterns::TextComplete() +{ + // Reload last effect + ActivePattern = SavedPattern; + Interval = SavedInterval; + TotalSteps = SavedTotalSteps; + Index = SavedIndex; + Color1 = SavedColor1; + Direction = SavedDirection; + PlasmaPhase = SavedPlasmaPhase; + PlasmaPhaseIncrement = SavedPlasmaPhaseIncrement; + PlasmaColorStretch = SavedPlasmaColorStretch; +} + + +/****************** Plasma ******************/ + // Based upon https://github.com/johncarl81/neopixelplasma void NeoPatterns::Plasma(float phase, float phaseIncrement, float colorStretch, uint8_t interval) { @@ -708,7 +781,3 @@ uint32_t NeoPatterns::parseColor(String value) { } return 0; } - - - - diff --git a/NeoPatterns.h b/NeoPatterns.h index c818cc5..0db15c0 100644 --- a/NeoPatterns.h +++ b/NeoPatterns.h @@ -2,7 +2,7 @@ #include "font.h" // Pattern types supported: -enum pattern { NONE, RAINBOW_CYCLE, THEATER_CHASE, COLOR_WIPE, SCANNER, FADE, RANDOM_FADE, SMOOTH, ICON, RANDOM_FADE_SINGLE, PLASMA, FILL, RANDOM }; +enum pattern { NONE, RAINBOW_CYCLE, THEATER_CHASE, COLOR_WIPE, SCANNER, FADE, RANDOM_FADE, SMOOTH, ICON, TEXT, RANDOM_FADE_SINGLE, PLASMA, FILL, RANDOM }; // Patern directions supported: enum direction { FORWARD, REVERSE }; @@ -36,6 +36,9 @@ class NeoPatterns : public Adafruit_NeoPixel void Icon(uint8_t fontchar, String iconcolor = "#FFFFFF", uint8_t interval = 30); void IconUpdate(); void IconComplete(); + void Text(String text, uint8_t interval = 80); + void TextUpdate(); + void TextComplete(); void Plasma(float phase = 0, float phaseIncrement = 0.08, float colorStretch = 0.11, uint8_t interval = 60); // 0.08 and 0.11 // 0.03 und 0.3 void PlasmaUpdate(); @@ -89,6 +92,10 @@ class NeoPatterns : public Adafruit_NeoPixel uint8_t *pixelG_buffer; uint8_t *pixelB_buffer; + uint8_t textposition; + uint8_t charposition; + String Text1; + uint8_t FontChar; float PlasmaPhase; diff --git a/esp-pixelbox.ino b/esp-pixelbox.ino index 97cf476..ece1780 100644 --- a/esp-pixelbox.ino +++ b/esp-pixelbox.ino @@ -152,7 +152,6 @@ bool onSetEffect(const HomieRange& range, const String& value) { bool onSetIcon(const HomieRange& range, const String& value) { stopAfterCompletion = true; - String _iconname = value; if (value[0] == '#') { //color given strip.Icon(value.substring(7)[0], value.substring(0, 6)); } @@ -162,6 +161,13 @@ bool onSetIcon(const HomieRange& range, const String& value) { homieNode.setProperty("icon").send(value); } +bool onSetText(const HomieRange& range, const String& value) { + stopAfterCompletion = true; + strip.Text(value); + homieNode.setProperty("text").send(value); +} + + bool onSetClear(const HomieRange& range, const String& value) { strip.None(); strip.clear(); @@ -194,6 +200,7 @@ void setup() { homieNode.advertiseRange("color", 0, 1).settable(onSetColor); homieNode.advertise("brightness").settable(onSetBrightness); homieNode.advertise("effect").settable(onSetEffect); + homieNode.advertise("text").settable(onSetText); homieNode.advertise("clear").settable(onSetClear); homieNode.advertise("length").settable(onSetLength); homieNode.advertise("icon").settable(onSetIcon); @@ -229,5 +236,3 @@ void loop() { Homie.loop(); ArduinoOTA.handle(); } - -