bidirectional running lights effect
This commit is contained in:
parent
9c3e7b9ec0
commit
cb0452964e
@ -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.
|
||||
*/
|
||||
|
11
wled00/FX.h
11
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"
|
||||
])=====";
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user