From cb0452964e13a9a44d1e688f9f1f8275b15896b5 Mon Sep 17 00:00:00 2001 From: fishbone-git Date: Tue, 18 Feb 2020 21:28:46 +0100 Subject: [PATCH] bidirectional running lights effect --- wled00/FX.cpp | 18 ++++++++++++++++-- wled00/FX.h | 11 +++++++---- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index eb043522..bbc63cc4 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -426,13 +426,15 @@ uint16_t WS2812FX::mode_theater_chase_rainbow(void) { /* * Running lights effect with smooth sine transition base. */ -uint16_t WS2812FX::running_base(bool saw) { +uint16_t WS2812FX::running_base(bool saw, bool dual=false) { uint8_t x_scale = SEGMENT.intensity >> 2; uint32_t counter = (now * SEGMENT.speed) >> 9; for(uint16_t i = 0; i < SEGLEN; i++) { uint8_t s = 0; + uint8_t t = 0; uint8_t a = i*x_scale - counter; + uint8_t b = (SEGLEN-1-i)*x_scale - counter; if (saw) { if (a < 16) { @@ -442,12 +444,24 @@ uint16_t WS2812FX::running_base(bool saw) { } } s = sin8(a); - setPixelColor(i, color_blend(color_from_palette(i, true, PALETTE_SOLID_WRAP, 0), SEGCOLOR(1), s)); + t = sin8(b); + uint32_t ca = color_blend(color_from_palette(i, true, PALETTE_SOLID_WRAP, 0), SEGCOLOR(1), s); + uint32_t cb = color_blend(color_from_palette(i, true, PALETTE_SOLID_WRAP, 2), SEGCOLOR(1), t); + uint32_t cl = dual ? color_blend(ca, cb, 127) : ca; + setPixelColor(i, cl); } return FRAMETIME; } +/* + * Running lights in opposite directions. + */ +uint16_t WS2812FX::mode_running_dual(void) { + return running_base(false, true); +} + + /* * Running lights effect with smooth sine transition. */ diff --git a/wled00/FX.h b/wled00/FX.h index abfc11d3..1efbb59b 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -91,7 +91,7 @@ #define IS_REVERSE ((SEGMENT.options & REVERSE ) == REVERSE ) #define IS_SELECTED ((SEGMENT.options & SELECTED) == SELECTED ) -#define MODE_COUNT 101 +#define MODE_COUNT 102 #define FX_MODE_STATIC 0 #define FX_MODE_BLINK 1 @@ -194,6 +194,7 @@ #define FX_MODE_PERCENT 98 #define FX_MODE_RIPPLE_RAINBOW 99 #define FX_MODE_HEARTBEAT 100 +#define FX_MODE_RUNNING_DUAL 101 class WS2812FX { typedef uint16_t (WS2812FX::*mode_ptr)(void); @@ -383,6 +384,7 @@ class WS2812FX { _mode[FX_MODE_PERCENT] = &WS2812FX::mode_percent; _mode[FX_MODE_RIPPLE_RAINBOW] = &WS2812FX::mode_ripple_rainbow; _mode[FX_MODE_HEARTBEAT] = &WS2812FX::mode_heartbeat; + _mode[FX_MODE_RUNNING_DUAL] = &WS2812FX::mode_running_dual; _brightness = DEFAULT_BRIGHTNESS; currentPalette = CRGBPalette16(CRGB::Black); @@ -568,7 +570,8 @@ class WS2812FX { mode_plasma(void), mode_percent(void), mode_ripple_rainbow(void), - mode_heartbeat(void); + mode_heartbeat(void), + mode_running_dual(void); private: @@ -607,7 +610,7 @@ class WS2812FX { color_wipe(bool, bool), scan(bool), theater_chase(uint32_t, uint32_t, bool), - running_base(bool), + running_base(bool,bool), larson_scanner(bool), sinelon_base(bool,bool), dissolve(uint32_t), @@ -650,7 +653,7 @@ const char JSON_mode_names[] PROGMEM = R"=====([ "Noise 1","Noise 2","Noise 3","Noise 4","Colortwinkles","Lake","Meteor","Meteor Smooth","Railway","Ripple", "Twinklefox","Twinklecat","Halloween Eyes","Solid Pattern","Solid Pattern Tri","Spots","Spots Fade","Glitter","Candle","Fireworks Starburst", "Fireworks 1D","Bouncing Balls","Sinelon","Sinelon Dual","Sinelon Rainbow","Popcorn","Drip","Plasma","Percent","Ripple Rainbow", -"Heartbeat" +"Heartbeat","Running Dual" ])=====";