diff --git a/wled00/FX.cpp b/wled00/FX.cpp index eec9192bb..d64e6f80e 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -445,28 +445,45 @@ 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 a = i*x_scale - counter; + uint16_t a = i*x_scale - counter; if (saw) { + a &= 0xFF; if (a < 16) { a = 192 + a*8; } else { a = map(a,16,255,64,192); } + a = 255 - a; } - s = sin8(a); - setPixelColor(i, color_blend(color_from_palette(i, true, PALETTE_SOLID_WRAP, 0), SEGCOLOR(1), s)); + uint8_t s = dual ? sin_gap(a) : sin8(a); + uint32_t ca = color_blend(SEGCOLOR(1), color_from_palette(i, true, PALETTE_SOLID_WRAP, 0), s); + if (dual) { + uint16_t b = (SEGLEN-1-i)*x_scale - counter; + uint8_t t = sin_gap(b); + uint32_t cb = color_blend(SEGCOLOR(1), color_from_palette(i, true, PALETTE_SOLID_WRAP, 2), t); + ca = color_blend(ca, cb, 127); + } + setPixelColor(i, ca); } return FRAMETIME; } +/* + * Running lights in opposite directions. + * Idea: Make the gap width controllable with a third slider in the future + */ +uint16_t WS2812FX::mode_running_dual(void) { + return running_base(false, true); +} + + /* * Running lights effect with smooth sine transition. */ @@ -1335,14 +1352,6 @@ uint16_t WS2812FX::tricolor_chase(uint32_t color1, uint32_t color2) { } -/* - * Alternating white/red/black pixels running. PLACEHOLDER - */ -uint16_t WS2812FX::mode_circus_combustus(void) { - return tricolor_chase(RED, WHITE); -} - - /* * Tricolor chase mode */ diff --git a/wled00/FX.h b/wled00/FX.h index 2cd4b688d..62de9b491 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -168,7 +168,7 @@ #define FX_MODE_POLICE_ALL 49 #define FX_MODE_TWO_DOTS 50 #define FX_MODE_TWO_AREAS 51 -#define FX_MODE_CIRCUS_COMBUSTUS 52 +#define FX_MODE_RUNNING_DUAL 52 #define FX_MODE_HALLOWEEN 53 #define FX_MODE_TRICOLOR_CHASE 54 #define FX_MODE_TRICOLOR_WIPE 55 @@ -505,7 +505,7 @@ class WS2812FX { _mode[FX_MODE_POLICE_ALL] = &WS2812FX::mode_police_all; _mode[FX_MODE_TWO_DOTS] = &WS2812FX::mode_two_dots; _mode[FX_MODE_TWO_AREAS] = &WS2812FX::mode_two_areas; - _mode[FX_MODE_CIRCUS_COMBUSTUS] = &WS2812FX::mode_circus_combustus; + _mode[FX_MODE_RUNNING_DUAL] = &WS2812FX::mode_running_dual; _mode[FX_MODE_HALLOWEEN] = &WS2812FX::mode_halloween; _mode[FX_MODE_TRICOLOR_CHASE] = &WS2812FX::mode_tricolor_chase; _mode[FX_MODE_TRICOLOR_WIPE] = &WS2812FX::mode_tricolor_wipe; @@ -636,6 +636,7 @@ class WS2812FX { getColorOrder(void), gamma8(uint8_t), gamma8_cal(uint8_t, float), + sin_gap(uint16_t), get_random_wheel_index(uint8_t); int8_t @@ -729,7 +730,7 @@ class WS2812FX { mode_police_all(void), mode_two_dots(void), mode_two_areas(void), - mode_circus_combustus(void), + mode_running_dual(void), mode_bicolor_chase(void), mode_tricolor_chase(void), mode_tricolor_wipe(void), @@ -829,7 +830,7 @@ class WS2812FX { dynamic(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), @@ -884,7 +885,7 @@ const char JSON_mode_names[] PROGMEM = R"=====([ "Sparkle","Sparkle Dark","Sparkle+","Strobe","Strobe Rainbow","Strobe Mega","Blink Rainbow","Android","Chase","Chase Random", "Chase Rainbow","Chase Flash","Chase Flash Rnd","Rainbow Runner","Colorful","Traffic Light","Sweep Random","Running 2","Aurora","Stream", "Scanner","Lighthouse","Fireworks","Rain","Tetrix","Fire Flicker","Gradient","Loading","Police","Police All", -"Two Dots","Two Areas","Circus","Halloween","Tri Chase","Tri Wipe","Tri Fade","Lightning","ICU","Multi Comet", +"Two Dots","Two Areas","Running Dual","Halloween","Tri Chase","Tri Wipe","Tri Fade","Lightning","ICU","Multi Comet", "Scanner Dual","Stream 2","Oscillate","Pride 2015","Juggle","Palette","Fire 2012","Colorwaves","Bpm","Fill Noise", "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", diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index 9e0e7990e..df69532f0 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -738,6 +738,12 @@ uint16_t WS2812FX::triwave16(uint16_t in) return 0xFFFF - (in - 0x8000)*2; } +uint8_t WS2812FX::sin_gap(uint16_t in) { + if (in & 0x100) return 0; + //if (in > 255) return 0; + return sin8(in + 192); //correct phase shift of sine so that it starts and stops at 0 +} + /* * Generates a tristate square wave w/ attac & decay * @param x input value 0-255