From 18491f5f4362830378c88ddc3e6a8628337d44df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bla=C5=BE=20Kristan?= Date: Mon, 27 Jan 2025 21:22:38 +0100 Subject: [PATCH 01/11] Remove obsolete effects - Dissolve Random - Dual Larson Scanner - Sinelon Dual - Sinelon Rainbow - Ripple Rainbow - Solid Glitter - Dynamic Smooth --- package-lock.json | 4 +- wled00/FX.cpp | 356 ++++++++++++++++++++++++++-------------------- wled00/FX.h | 14 +- 3 files changed, 214 insertions(+), 160 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0afeeaafd8..c81072cfc6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "wled", - "version": "0.16.0-dev", + "version": "0.16.0-alpha", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "wled", - "version": "0.16.0-dev", + "version": "0.16.0-alpha", "license": "ISC", "dependencies": { "clean-css": "^5.3.3", diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 8d3e71b94d..238ec36697 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -362,14 +362,14 @@ static const char _data_FX_MODE_DYNAMIC[] PROGMEM = "Dynamic@!,!,,,,Smooth;;!"; /* * effect "Dynamic" with smooth color-fading */ -uint16_t mode_dynamic_smooth(void) { - bool old = SEGMENT.check1; - SEGMENT.check1 = true; - mode_dynamic(); - SEGMENT.check1 = old; - return FRAMETIME; - } -static const char _data_FX_MODE_DYNAMIC_SMOOTH[] PROGMEM = "Dynamic Smooth@!,!;;!"; +//uint16_t mode_dynamic_smooth(void) { +// bool old = SEGMENT.check1; +// SEGMENT.check1 = true; +// mode_dynamic(); +// SEGMENT.check1 = old; +// return FRAMETIME; +//} +//static const char _data_FX_MODE_DYNAMIC_SMOOTH[] PROGMEM = "Dynamic Smooth@!,!;;!"; /* @@ -506,7 +506,10 @@ static uint16_t running(uint32_t color1, uint32_t color2, bool theatre = false) for (unsigned i = 0; i < SEGLEN; i++) { uint32_t col = color2; - if (usePalette) color1 = SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0); + if (usePalette) { + unsigned palIdx = SEGMENT.check1 ? (i+it)%SEGLEN : i; + color1 = SEGMENT.color_from_palette(palIdx, true, SEGMENT.check1, 0); + } if (theatre) { if ((i % width) == SEGENV.aux0) col = color1; } else { @@ -531,7 +534,7 @@ static uint16_t running(uint32_t color1, uint32_t color2, bool theatre = false) uint16_t mode_theater_chase(void) { return running(SEGCOLOR(0), SEGCOLOR(1), true); } -static const char _data_FX_MODE_THEATER_CHASE[] PROGMEM = "Theater@!,Gap size;!,!;!"; +static const char _data_FX_MODE_THEATER_CHASE[] PROGMEM = "Theater@!,Gap size,,,,Animate palette;!,!;!;;o1=0"; /* @@ -541,7 +544,7 @@ static const char _data_FX_MODE_THEATER_CHASE[] PROGMEM = "Theater@!,Gap size;!, uint16_t mode_theater_chase_rainbow(void) { return running(SEGMENT.color_wheel(SEGENV.step), SEGCOLOR(1), true); } -static const char _data_FX_MODE_THEATER_CHASE_RAINBOW[] PROGMEM = "Theater Rainbow@!,Gap size;,!;!"; +static const char _data_FX_MODE_THEATER_CHASE_RAINBOW[] PROGMEM = "Theater Rainbow@!,Gap size;,!;!;;o1=0"; /* @@ -550,6 +553,7 @@ static const char _data_FX_MODE_THEATER_CHASE_RAINBOW[] PROGMEM = "Theater Rainb static uint16_t running_base(bool saw, bool dual=false) { unsigned x_scale = SEGMENT.intensity >> 2; uint32_t counter = (strip.now * SEGMENT.speed) >> 9; + const bool moving = SEGMENT.check1; for (unsigned i = 0; i < SEGLEN; i++) { unsigned a = i*x_scale - counter; @@ -563,12 +567,13 @@ static uint16_t running_base(bool saw, bool dual=false) { } a = 255 - a; } - uint8_t s = dual ? sin_gap(a) : sin8_t(a); - uint32_t ca = color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0), s); + unsigned palIdx = moving ? (i+counter)%SEGLEN : i; + uint8_t s = dual ? sin_gap(a) : sin8(a); + uint32_t ca = color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(palIdx, true, moving, 0), s); if (dual) { unsigned b = (SEGLEN-1-i)*x_scale - counter; uint8_t t = sin_gap(b); - uint32_t cb = color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 2), t); + uint32_t cb = color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(palIdx, true, moving, 2), t); ca = color_blend(ca, cb, uint8_t(127)); } SEGMENT.setPixelColor(i, ca); @@ -585,7 +590,7 @@ static uint16_t running_base(bool saw, bool dual=false) { uint16_t mode_running_dual(void) { return running_base(false, true); } -static const char _data_FX_MODE_RUNNING_DUAL[] PROGMEM = "Running Dual@!,Wave width;L,!,R;!"; +static const char _data_FX_MODE_RUNNING_DUAL[] PROGMEM = "Running Dual@!,Wave width,,,,Animate palette;L,!,R;!;;o1=0"; /* @@ -594,7 +599,7 @@ static const char _data_FX_MODE_RUNNING_DUAL[] PROGMEM = "Running Dual@!,Wave wi uint16_t mode_running_lights(void) { return running_base(false); } -static const char _data_FX_MODE_RUNNING_LIGHTS[] PROGMEM = "Running@!,Wave width;!,!;!"; +static const char _data_FX_MODE_RUNNING_LIGHTS[] PROGMEM = "Running@!,Wave width,,,,Animate palette;!,!;!;;o1=0"; /* @@ -603,7 +608,7 @@ static const char _data_FX_MODE_RUNNING_LIGHTS[] PROGMEM = "Running@!,Wave width uint16_t mode_saw(void) { return running_base(true); } -static const char _data_FX_MODE_SAW[] PROGMEM = "Saw@!,Width;!,!;!"; +static const char _data_FX_MODE_SAW[] PROGMEM = "Saw@!,Width,,,,Animate palette;!,!;!;;o1=0"; /* @@ -699,10 +704,10 @@ static const char _data_FX_MODE_DISSOLVE[] PROGMEM = "Dissolve@Repeat speed,Diss /* * Blink several LEDs on and then off in random colors */ -uint16_t mode_dissolve_random(void) { - return dissolve(SEGMENT.color_wheel(hw_random8())); -} -static const char _data_FX_MODE_DISSOLVE_RANDOM[] PROGMEM = "Dissolve Rnd@Repeat speed,Dissolve speed;,!;!"; +//uint16_t mode_dissolve_random(void) { +// return dissolve(SEGMENT.color_wheel(hw_random8())); +//} +//static const char _data_FX_MODE_DISSOLVE_RANDOM[] PROGMEM = "Dissolve Rnd@Repeat speed,Dissolve speed;,!;!"; /* @@ -710,11 +715,13 @@ static const char _data_FX_MODE_DISSOLVE_RANDOM[] PROGMEM = "Dissolve Rnd@Repeat * Inspired by www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/ */ uint16_t mode_sparkle(void) { - if (!SEGMENT.check2) for (unsigned i = 0; i < SEGLEN; i++) { - SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 1)); - } uint32_t cycleTime = 10 + (255 - SEGMENT.speed)*2; uint32_t it = strip.now / cycleTime; + const bool moving = SEGMENT.check1; + if (!SEGMENT.check2) for(unsigned i = 0; i < SEGLEN; i++) { + unsigned palIdx = moving ? (i+it)%SEGLEN : i; + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(palIdx, true, moving, 1)); + } if (it != SEGENV.step) { SEGENV.aux0 = hw_random16(SEGLEN); // aux0 stores the random led index @@ -724,7 +731,7 @@ uint16_t mode_sparkle(void) { SEGMENT.setPixelColor(SEGENV.aux0, SEGCOLOR(0)); return FRAMETIME; } -static const char _data_FX_MODE_SPARKLE[] PROGMEM = "Sparkle@!,,,,,,Overlay;!,!;!;;m12=0"; +static const char _data_FX_MODE_SPARKLE[] PROGMEM = "Sparkle@!,,,,,Animate palette,Overlay;!,!;!;;m12=0,01=0"; /* @@ -732,8 +739,12 @@ static const char _data_FX_MODE_SPARKLE[] PROGMEM = "Sparkle@!,,,,,,Overlay;!,!; * Inspired by www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/ */ uint16_t mode_flash_sparkle(void) { + uint32_t cycleTime = 10 + (255 - SEGMENT.speed)*2; + uint32_t it = strip.now / cycleTime; + const bool moving = SEGMENT.check1; if (!SEGMENT.check2) for (unsigned i = 0; i < SEGLEN; i++) { - SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); + unsigned palIdx = moving ? (i+it)%SEGLEN : i; + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(palIdx, true, moving, 0)); } if (strip.now - SEGENV.aux0 > SEGENV.step) { @@ -745,7 +756,7 @@ uint16_t mode_flash_sparkle(void) { } return FRAMETIME; } -static const char _data_FX_MODE_FLASH_SPARKLE[] PROGMEM = "Sparkle Dark@!,!,,,,,Overlay;Bg,Fx;!;;m12=0"; +static const char _data_FX_MODE_FLASH_SPARKLE[] PROGMEM = "Sparkle Dark@!,!,,,,Animate palette,Overlay;Bg,Fx;!;;m12=0"; /* @@ -753,8 +764,12 @@ static const char _data_FX_MODE_FLASH_SPARKLE[] PROGMEM = "Sparkle Dark@!,!,,,,, * Inspired by www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/ */ uint16_t mode_hyper_sparkle(void) { + uint32_t cycleTime = 10 + (255 - SEGMENT.speed)*2; + uint32_t it = strip.now / cycleTime; + const bool moving = SEGMENT.check1; if (!SEGMENT.check2) for (unsigned i = 0; i < SEGLEN; i++) { - SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); + unsigned palIdx = moving ? (i+it)%SEGLEN : i; + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(palIdx, true, moving, 0)); } if (strip.now - SEGENV.aux0 > SEGENV.step) { @@ -769,15 +784,19 @@ uint16_t mode_hyper_sparkle(void) { } return FRAMETIME; } -static const char _data_FX_MODE_HYPER_SPARKLE[] PROGMEM = "Sparkle+@!,!,,,,,Overlay;Bg,Fx;!;;m12=0"; +static const char _data_FX_MODE_HYPER_SPARKLE[] PROGMEM = "Sparkle+@!,!,,,,Animate palette,Overlay;Bg,Fx;!;;m12=0"; /* * Strobe effect with different strobe count and pause, controlled by speed. */ uint16_t mode_multi_strobe(void) { + uint32_t cycleTime = 10 + (255 - SEGMENT.speed)*2; + uint32_t it = strip.now / cycleTime; + const bool moving = SEGMENT.check1; for (unsigned i = 0; i < SEGLEN; i++) { - SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 1)); + unsigned palIdx = moving ? (i+it)%SEGLEN : i; + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(palIdx, true, moving, 1)); } SEGENV.aux0 = 50 + 20*(uint16_t)(255-SEGMENT.speed); @@ -799,7 +818,7 @@ uint16_t mode_multi_strobe(void) { return FRAMETIME; } -static const char _data_FX_MODE_MULTI_STROBE[] PROGMEM = "Strobe Mega@!,!;!,!;!;01"; +static const char _data_FX_MODE_MULTI_STROBE[] PROGMEM = "Strobe Mega@!,!,,,,Animate palette;!,!;!;01;o1=0"; /* @@ -1057,8 +1076,12 @@ uint16_t mode_chase_flash(void) { if (SEGLEN <= 1) return mode_static(); unsigned flash_step = SEGENV.call % ((FLASH_COUNT * 2) + 1); + uint32_t cycleTime = 10 + (255 - SEGMENT.speed)*2; + uint32_t it = strip.now / cycleTime; + const bool moving = SEGMENT.check1; for (unsigned i = 0; i < SEGLEN; i++) { - SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); + unsigned palIdx = moving ? (i+it)%SEGLEN : i; + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(palIdx, true, moving, 0)); } unsigned delay = 10 + ((30 * (uint16_t)(255 - SEGMENT.speed)) / SEGLEN); @@ -1077,7 +1100,7 @@ uint16_t mode_chase_flash(void) { } return delay; } -static const char _data_FX_MODE_CHASE_FLASH[] PROGMEM = "Chase Flash@!;Bg,Fx;!"; +static const char _data_FX_MODE_CHASE_FLASH[] PROGMEM = "Chase Flash@!,,,,,Animate palette;Bg,Fx;!;;o1=0"; /* @@ -1194,12 +1217,16 @@ uint16_t mode_larson_scanner(void) { } else { + uint32_t cycleTime = 10 + (255 - SEGMENT.speed)*2; + uint32_t it = strip.now / cycleTime; + const bool moving = SEGMENT.check1; // paint as many pixels as needed for (unsigned i = SEGENV.aux1; i < index; i++) { unsigned j = (SEGENV.aux0) ? i : SEGLEN - 1 - i; - uint32_t c = SEGMENT.color_from_palette(j, true, PALETTE_SOLID_WRAP, 0); + unsigned palIdx = moving ? (j+it)%SEGLEN : j; + uint32_t c = SEGMENT.color_from_palette(palIdx, true, moving, 0); SEGMENT.setPixelColor(j, c); - if (SEGMENT.check1) { + if (SEGMENT.check3) { SEGMENT.setPixelColor(SEGLEN - 1 - j, SEGCOLOR(2) ? SEGCOLOR(2) : c); } } @@ -1207,17 +1234,18 @@ uint16_t mode_larson_scanner(void) { } return FRAMETIME; } -static const char _data_FX_MODE_LARSON_SCANNER[] PROGMEM = "Scanner@!,Trail,Delay,,,Dual,Bi-delay;!,!,!;!;;m12=0,c1=0"; +static const char _data_FX_MODE_LARSON_SCANNER[] PROGMEM = "Scanner@!,Trail,Delay,,,Animate palette,Bi-delay,Dual;!,!,!;!;;m12=0,c1=0,o1=0,o3=0"; /* * Creates two Larson scanners moving in opposite directions * Custom mode by Keith Lord: https://github.com/kitesurfer1404/WS2812FX/blob/master/src/custom/DualLarson.h */ -uint16_t mode_dual_larson_scanner(void){ - SEGMENT.check1 = true; - return mode_larson_scanner(); -} -static const char _data_FX_MODE_DUAL_LARSON_SCANNER[] PROGMEM = "Scanner Dual@!,Trail,Delay,,,Dual,Bi-delay;!,!,!;!;;m12=0,c1=0"; +//uint16_t mode_dual_larson_scanner(void){ +// SEGMENT.check3 = true; +// return mode_larson_scanner(); +//} +//static const char _data_FX_MODE_DUAL_LARSON_SCANNER[] PROGMEM = "Scanner Dual@!,Trail,Delay,,,Animate palette,Bi-delay;!,!,!;!;;m12=0,c1=0,o3=1"; + /* * Firing comets from one end. "Lighthouse" @@ -2144,7 +2172,7 @@ uint16_t mode_fire_2012() { // Step 4. Map from heat cells to LED colors for (unsigned j = 0; j < SEGLEN; j++) { - SEGMENT.setPixelColor(indexToVStrip(j, stripNr), ColorFromPalette(SEGPALETTE, min(heat[j], byte(240)), 255, NOBLEND)); + SEGMENT.setPixelColor(indexToVStrip(j, stripNr), ColorFromPalette(SEGPALETTE, heat[j], 255, LINEARBLEND_NOWRAP)); } } }; @@ -2348,59 +2376,76 @@ uint16_t mode_meteor() { byte* trail = SEGENV.data; const unsigned meteorSize = 1 + SEGLEN / 20; // 5% - uint16_t meteorstart; - if(meteorSmooth) meteorstart = map((SEGENV.step >> 6 & 0xFF), 0, 255, 0, SEGLEN -1); - else { - unsigned counter = strip.now * ((SEGMENT.speed >> 2) + 8); - meteorstart = (counter * SEGLEN) >> 16; - } + unsigned counter = strip.now * ((SEGMENT.speed >> 2) +8); + uint16_t in = counter * SEGLEN >> 16; + const bool gradient = SEGMENT.check1; const int max = SEGMENT.palette==5 || !SEGMENT.check1 ? 240 : 255; // fade all leds to colors[1] in LEDs one step for (unsigned i = 0; i < SEGLEN; i++) { - uint32_t col; - if (hw_random8() <= 255 - SEGMENT.intensity) { - if(meteorSmooth) { - if (trail[i] > 0) { - int change = trail[i] + 4 - hw_random8(24); //change each time between -20 and +4 - trail[i] = constrain(change, 0, max); - } - col = SEGMENT.check1 ? SEGMENT.color_from_palette(i, true, false, 0, trail[i]) : SEGMENT.color_from_palette(trail[i], false, true, 255); - } - else { - trail[i] = scale8(trail[i], 128 + hw_random8(127)); - int index = trail[i]; - int idx = 255; - int bri = SEGMENT.palette==35 || SEGMENT.palette==36 ? 255 : trail[i]; - if (!SEGMENT.check1) { - idx = 0; - index = map(i,0,SEGLEN,0,max); - bri = trail[i]; - } - col = SEGMENT.color_from_palette(index, false, false, idx, bri); // full brightness for Fire + if (random8() <= 255 - SEGMENT.intensity) { + int meteorTrailDecay = 128 + hw_random8(127); + trail[i] = scale8(trail[i], meteorTrailDecay); + int index = trail[i]; + int idx = 255; + int bri = SEGMENT.palette==35 || SEGMENT.palette==36 ? 255 : trail[i]; + if (!gradient) { + idx = 0; + index = map(i,0,SEGLEN,0,max); + bri = trail[i]; } - SEGMENT.setPixelColor(i, col); + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(index, false, false, idx, bri)); // full brightness for Fire } } // draw meteor for (unsigned j = 0; j < meteorSize; j++) { - unsigned index = (meteorstart + j) % SEGLEN; - if(meteorSmooth) { - trail[index] = max; - uint32_t col = SEGMENT.check1 ? SEGMENT.color_from_palette(index, true, false, 0, trail[index]) : SEGMENT.color_from_palette(trail[index], false, true, 255); - SEGMENT.setPixelColor(index, col); + int index = (in + j) % SEGLEN; + int idx = 255; + int i = trail[index] = max; + if (!gradient) { + i = map(index,0,SEGLEN,0,max); + idx = 0; } - else{ - int idx = 255; - int i = trail[index] = max; - if (!SEGMENT.check1) { - i = map(index,0,SEGLEN,0,max); - idx = 0; - } - uint32_t col = SEGMENT.color_from_palette(i, false, false, idx, 255); // full brightness - SEGMENT.setPixelColor(index, col); + SEGMENT.setPixelColor(index, SEGMENT.color_from_palette(i, false, false, idx, 255)); // full brightness + } + + return FRAMETIME; +} +static const char _data_FX_MODE_METEOR[] PROGMEM = "Meteor@!,Trail,,,,Gradient;!;!;1"; + + +// smooth meteor effect +// send a meteor from begining to to the end of the strip with a trail that randomly decays. +// adapted from https://www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/#LEDStripEffectMeteorRain +uint16_t mode_meteor_smooth() { + if (SEGLEN <= 1) return mode_static(); + if (!SEGENV.allocateData(SEGLEN)) return mode_static(); //allocation failed + + byte* trail = SEGENV.data; + + const unsigned meteorSize = 1+ SEGLEN / 20; // 5% + uint16_t in = map((SEGENV.step >> 6 & 0xFF), 0, 255, 0, SEGLEN -1); + const bool gradient = SEGMENT.check1; + + const int max = SEGMENT.palette==5 || !gradient ? 240 : 255; + // fade all leds to colors[1] in LEDs one step + for (unsigned i = 0; i < SEGLEN; i++) { + if (/*trail[i] != 0 &&*/ hw_random8() <= 255 - SEGMENT.intensity) { + int change = trail[i] + 4 - hw_random8(24); //change each time between -20 and +4 + trail[i] = constrain(change, 0, max); + SEGMENT.setPixelColor(i, gradient ? SEGMENT.color_from_palette(i, true, false, 0, trail[i]) : SEGMENT.color_from_palette(trail[i], false, true, 255)); + } + } + + // draw meteor + for (unsigned j = 0; j < meteorSize; j++) { + unsigned index = in + j; + if (index >= SEGLEN) { + index -= SEGLEN; } + trail[index] = max; + SEGMENT.setPixelColor(index, gradient ? SEGMENT.color_from_palette(index, true, false, 0, trail[index]) : SEGMENT.color_from_palette(trail[index], false, true, 255)); } SEGENV.step += SEGMENT.speed +1; @@ -2513,19 +2558,7 @@ static uint16_t ripple_base(uint8_t blurAmount = 0) { uint16_t mode_ripple(void) { if (SEGLEN <= 1) return mode_static(); - if(SEGMENT.custom1 || SEGMENT.check2) // blur or overlay - SEGMENT.fade_out(250); - else - SEGMENT.fill(SEGCOLOR(1)); - - return ripple_base(SEGMENT.custom1>>1); -} -static const char _data_FX_MODE_RIPPLE[] PROGMEM = "Ripple@!,Wave #,Blur,,,,Overlay;,!;!;12;c1=0"; - - -uint16_t mode_ripple_rainbow(void) { - if (SEGLEN <= 1) return mode_static(); - if (SEGENV.call ==0) { + if (SEGENV.call == 0) { SEGENV.aux0 = hw_random8(); SEGENV.aux1 = hw_random8(); } @@ -2536,10 +2569,30 @@ uint16_t mode_ripple_rainbow(void) { } else { SEGENV.aux0--; } - SEGMENT.fill(color_blend(SEGMENT.color_wheel(SEGENV.aux0),BLACK,uint8_t(235))); + if (!SEGMENT.check2) SEGMENT.fill(SEGMENT.check1 ? color_blend(SEGMENT.color_wheel(SEGENV.aux0),BLACK,uint8_t(240)) : SEGCOLOR(1)); + else SEGMENT.fade_out(250); return ripple_base(); } -static const char _data_FX_MODE_RIPPLE_RAINBOW[] PROGMEM = "Ripple Rainbow@!,Wave #;;!;12"; +static const char _data_FX_MODE_RIPPLE[] PROGMEM = "Ripple@!,Waves,,,,Palette BG,Overlay;,!;!;12;o1=0"; + + +//uint16_t mode_ripple_rainbow(void) { +// if (SEGLEN <= 1) return mode_static(); +// if (SEGENV.call ==0) { +// SEGENV.aux0 = hw_random8(); +// SEGENV.aux1 = hw_random8(); +// } +// if (SEGENV.aux0 == SEGENV.aux1) { +// SEGENV.aux1 = hw_random8(); +// } else if (SEGENV.aux1 > SEGENV.aux0) { +// SEGENV.aux0++; +// } else { +// SEGENV.aux0--; +// } +// SEGMENT.fill(color_blend(SEGMENT.color_wheel(SEGENV.aux0),BLACK,uint8_t(235))); +// return ripple_base(); +//} +//static const char _data_FX_MODE_RIPPLE_RAINBOW[] PROGMEM = "Ripple Rainbow@!,Waves;;!;12"; // TwinkleFOX by Mark Kriegsman: https://gist.github.com/kriegsman/756ea6dcae8e30845b5a @@ -3119,8 +3172,10 @@ static const char _data_FX_MODE_ROLLINGBALLS[] PROGMEM = "Rolling Balls@!,# of b /* * Sinelon stolen from FASTLED examples */ -static uint16_t sinelon_base(bool dual, bool rainbow=false) { +uint16_t mode_sinelon() { if (SEGLEN <= 1) return mode_static(); + const bool rainbow = SEGMENT.check1; + const bool dual = SEGMENT.check3; SEGMENT.fade_out(SEGMENT.intensity); unsigned pos = beatsin16_t(SEGMENT.speed/10,0,SEGLEN-1); if (SEGENV.call == 0) SEGENV.aux0 = pos; @@ -3153,61 +3208,52 @@ static uint16_t sinelon_base(bool dual, bool rainbow=false) { return FRAMETIME; } +//uint16_t mode_sinelon(void) { +// return sinelon_base(false); +//} +static const char _data_FX_MODE_SINELON[] PROGMEM = "Sinelon@!,Trail,,,,Rainbow,,Dual;!,!,!;!"; -uint16_t mode_sinelon(void) { - return sinelon_base(false); -} -static const char _data_FX_MODE_SINELON[] PROGMEM = "Sinelon@!,Trail;!,!,!;!"; - - -uint16_t mode_sinelon_dual(void) { - return sinelon_base(true); -} -static const char _data_FX_MODE_SINELON_DUAL[] PROGMEM = "Sinelon Dual@!,Trail;!,!,!;!"; - +//uint16_t mode_sinelon_dual(void) { +// return sinelon_base(true); +//} +//static const char _data_FX_MODE_SINELON_DUAL[] PROGMEM = "Sinelon Dual@!,Trail;!,!,!;!"; -uint16_t mode_sinelon_rainbow(void) { - return sinelon_base(false, true); -} -static const char _data_FX_MODE_SINELON_RAINBOW[] PROGMEM = "Sinelon Rainbow@!,Trail;,,!;!"; +//uint16_t mode_sinelon_rainbow(void) { +// return sinelon_base(false, true); +//} +//static const char _data_FX_MODE_SINELON_RAINBOW[] PROGMEM = "Sinelon Rainbow@!,Trail;,,!;!"; -// utility function that will add random glitter to SEGMENT -void glitter_base(uint8_t intensity, uint32_t col = ULTRAWHITE) { - if (intensity > hw_random8()) SEGMENT.setPixelColor(hw_random16(SEGLEN), col); -} - //Glitter with palette background, inspired by https://gist.github.com/kriegsman/062e10f7f07ba8518af6 uint16_t mode_glitter() { if (!SEGMENT.check2) { // use "* Color 1" palette for solid background (replacing "Solid glitter") unsigned counter = 0; if (SEGMENT.speed != 0) { + // animate palette counter = (strip.now * ((SEGMENT.speed >> 3) +1)) & 0xFFFF; counter = counter >> 8; } - - bool noWrap = (strip.paletteBlend == 2 || (strip.paletteBlend == 0 && SEGMENT.speed == 0)); for (unsigned i = 0; i < SEGLEN; i++) { unsigned colorIndex = (i * 255 / SEGLEN) - counter; - if (noWrap) colorIndex = map(colorIndex, 0, 255, 0, 240); //cut off blend at palette "end" SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(colorIndex, false, true, 255)); } } - glitter_base(SEGMENT.intensity, SEGCOLOR(2) ? SEGCOLOR(2) : ULTRAWHITE); + if (SEGMENT.intensity > hw_random8()) SEGMENT.setPixelColor(hw_random16(SEGLEN), SEGCOLOR(2) ? SEGCOLOR(2) : ULTRAWHITE); return FRAMETIME; } static const char _data_FX_MODE_GLITTER[] PROGMEM = "Glitter@!,!,,,,,Overlay;,,Glitter color;!;;pal=11,m12=0"; //pixels //Solid colour background with glitter (can be replaced by Glitter) -uint16_t mode_solid_glitter() -{ - SEGMENT.fill(SEGCOLOR(0)); - glitter_base(SEGMENT.intensity, SEGCOLOR(2) ? SEGCOLOR(2) : ULTRAWHITE); - return FRAMETIME; -} -static const char _data_FX_MODE_SOLID_GLITTER[] PROGMEM = "Solid Glitter@,!;Bg,,Glitter color;;;m12=0"; +//uint16_t mode_solid_glitter() +//{ +// SEGMENT.fill(SEGCOLOR(0)); +// glitter_base(SEGMENT.intensity, SEGCOLOR(2) ? SEGCOLOR(2) : ULTRAWHITE); +// return FRAMETIME; +//} +//static const char _data_FX_MODE_SOLID_GLITTER[] PROGMEM = "Solid Glitter@,!;Bg,,Glitter color;;;m12=0"; + //each needs 20 bytes //Spark type is used for popcorn, 1D fireworks, and drip @@ -3764,11 +3810,12 @@ uint16_t mode_tetrix(void) { // the following functions will not work on virtual strips: fill(), fade_out(), fadeToBlack(), blur() struct virtualStrip { static void runStrip(size_t stripNr, Tetris *drop) { + const bool oneColor = SEGMENT.check1; // initialize dropping on first call or segment full if (SEGENV.call == 0) { drop->stack = 0; // reset brick stack size - drop->step = strip.now + 2000; // start by fading out strip - if (SEGMENT.check1) drop->col = 0;// use only one color from palette + drop->step = strip.now + 2000; // start by fading out strip + if (oneColor) drop->col = 0; // use only one color from palette } if (drop->step == 0) { // init brick @@ -3779,7 +3826,7 @@ uint16_t mode_tetrix(void) { speed = map(speed, 1, 255, 5000, 250); // time taken for full (SEGLEN) drop drop->speed = float(SEGLEN * FRAMETIME) / float(speed); // set speed drop->pos = SEGLEN; // start at end of segment (no need to subtract 1) - if (!SEGMENT.check1) drop->col = hw_random8(0,15)<<4; // limit color choices so there is enough HUE gap + if (!oneColor) drop->col = hw_random8(0,15)<<4; // limit color choices so there is enough HUE gap drop->step = 1; // drop state (0 init, 1 forming, 2 falling) drop->brick = (SEGMENT.intensity ? (SEGMENT.intensity>>5)+1 : hw_random8(1,5)) * (1+(SEGLEN>>6)); // size of brick } @@ -3813,7 +3860,7 @@ uint16_t mode_tetrix(void) { } else { drop->stack = 0; // reset brick stack size drop->step = 0; // proceed with next brick - if (SEGMENT.check1) drop->col += 8; // gradually increase palette index + if (oneColor) drop->col += 8; // gradually increase palette index } } } @@ -3861,6 +3908,7 @@ uint16_t mode_percent(void) { percent = constrain(percent, 0, 200); unsigned active_leds = (percent < 100) ? roundf(SEGLEN * percent / 100.0f) : roundf(SEGLEN * (200 - percent) / 100.0f); + const bool oneColor = SEGMENT.check1; unsigned size = (1 + ((SEGMENT.speed * SEGLEN) >> 11)); if (SEGMENT.speed == 255) size = 255; @@ -3868,7 +3916,7 @@ uint16_t mode_percent(void) { if (percent <= 100) { for (unsigned i = 0; i < SEGLEN; i++) { if (i < SEGENV.aux1) { - if (SEGMENT.check1) + if (oneColor) SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(map(percent,0,100,0,255), false, false, 0)); else SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); @@ -3883,7 +3931,7 @@ uint16_t mode_percent(void) { SEGMENT.setPixelColor(i, SEGCOLOR(1)); } else { - if (SEGMENT.check1) + if (oneColor) SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(map(percent,100,200,255,0), false, false, 0)); else SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); @@ -4819,7 +4867,7 @@ uint16_t mode_wavesins(void) { uint8_t bri = sin8_t(strip.now/4 + i * SEGMENT.intensity); uint8_t index = beatsin8_t(SEGMENT.speed, SEGMENT.custom1, SEGMENT.custom1+SEGMENT.custom2, 0, i * (SEGMENT.custom3<<3)); // custom3 is reduced resolution slider //SEGMENT.setPixelColor(i, ColorFromPalette(SEGPALETTE, index, bri, LINEARBLEND)); - SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(index, false, PALETTE_SOLID_WRAP, 0, bri)); + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(index, false, true, 0, bri)); } return FRAMETIME; @@ -4862,20 +4910,21 @@ uint16_t mode_2DBlackHole(void) { // By: Stepko https://editor.soulma const int cols = SEG_W; const int rows = SEG_H; int x, y; + const bool oneColor = SEGMENT.check1; SEGMENT.fadeToBlackBy(16 + (SEGMENT.speed>>3)); // create fading trails unsigned long t = strip.now/128; // timebase // outer stars for (size_t i = 0; i < 8; i++) { - x = beatsin8_t(SEGMENT.custom1>>3, 0, cols - 1, 0, ((i % 2) ? 128 : 0) + t * i); - y = beatsin8_t(SEGMENT.intensity>>3, 0, rows - 1, 0, ((i % 2) ? 192 : 64) + t * i); - SEGMENT.addPixelColorXY(x, y, SEGMENT.color_from_palette(i*32, false, PALETTE_SOLID_WRAP, SEGMENT.check1?0:255)); + x = beatsin8(SEGMENT.custom1>>3, 0, cols - 1, 0, ((i % 2) ? 128 : 0) + t * i); + y = beatsin8(SEGMENT.intensity>>3, 0, rows - 1, 0, ((i % 2) ? 192 : 64) + t * i); + SEGMENT.addPixelColorXY(x, y, SEGMENT.color_from_palette(i*32, false, PALETTE_SOLID_WRAP, oneColor?0:255)); } // inner stars for (size_t i = 0; i < 4; i++) { - x = beatsin8_t(SEGMENT.custom2>>3, cols/4, cols - 1 - cols/4, 0, ((i % 2) ? 128 : 0) + t * i); - y = beatsin8_t(SEGMENT.custom3 , rows/4, rows - 1 - rows/4, 0, ((i % 2) ? 192 : 64) + t * i); - SEGMENT.addPixelColorXY(x, y, SEGMENT.color_from_palette(255-i*64, false, PALETTE_SOLID_WRAP, SEGMENT.check1?0:255)); + x = beatsin8(SEGMENT.custom2>>3, cols/4, cols - 1 - cols/4, 0, ((i % 2) ? 128 : 0) + t * i); + y = beatsin8(SEGMENT.custom3 , rows/4, rows - 1 - rows/4, 0, ((i % 2) ? 192 : 64) + t * i); + SEGMENT.addPixelColorXY(x, y, SEGMENT.color_from_palette(255-i*64, false, PALETTE_SOLID_WRAP, oneColor?0:255)); } // central white dot SEGMENT.setPixelColorXY(cols/2, rows/2, WHITE); @@ -4900,8 +4949,8 @@ uint16_t mode_2DColoredBursts() { // By: ldirko https://editor.so SEGENV.aux0 = 0; // start with red hue } - bool dot = SEGMENT.check3; - bool grad = SEGMENT.check1; + const bool dot = SEGMENT.check3; + const bool grad = SEGMENT.check1; byte numLines = SEGMENT.intensity/16 + 1; @@ -10183,7 +10232,8 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_SAW, &mode_saw, _data_FX_MODE_SAW); addEffect(FX_MODE_TWINKLE, &mode_twinkle, _data_FX_MODE_TWINKLE); addEffect(FX_MODE_DISSOLVE, &mode_dissolve, _data_FX_MODE_DISSOLVE); - addEffect(FX_MODE_DISSOLVE_RANDOM, &mode_dissolve_random, _data_FX_MODE_DISSOLVE_RANDOM); + //addEffect(FX_MODE_DISSOLVE_RANDOM, &mode_dissolve_random, _data_FX_MODE_DISSOLVE_RANDOM); + addEffect(FX_MODE_SPARKLE, &mode_sparkle, _data_FX_MODE_SPARKLE); addEffect(FX_MODE_FLASH_SPARKLE, &mode_flash_sparkle, _data_FX_MODE_FLASH_SPARKLE); addEffect(FX_MODE_HYPER_SPARKLE, &mode_hyper_sparkle, _data_FX_MODE_HYPER_SPARKLE); addEffect(FX_MODE_STROBE, &mode_strobe, _data_FX_MODE_STROBE); @@ -10224,7 +10274,8 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_TRICOLOR_FADE, &mode_tricolor_fade, _data_FX_MODE_TRICOLOR_FADE); addEffect(FX_MODE_LIGHTNING, &mode_lightning, _data_FX_MODE_LIGHTNING); addEffect(FX_MODE_ICU, &mode_icu, _data_FX_MODE_ICU); - addEffect(FX_MODE_DUAL_LARSON_SCANNER, &mode_dual_larson_scanner, _data_FX_MODE_DUAL_LARSON_SCANNER); + addEffect(FX_MODE_MULTI_COMET, &mode_multi_comet, _data_FX_MODE_MULTI_COMET); + //addEffect(FX_MODE_DUAL_LARSON_SCANNER, &mode_dual_larson_scanner, _data_FX_MODE_DUAL_LARSON_SCANNER); addEffect(FX_MODE_RANDOM_CHASE, &mode_random_chase, _data_FX_MODE_RANDOM_CHASE); addEffect(FX_MODE_OSCILLATE, &mode_oscillate, _data_FX_MODE_OSCILLATE); addEffect(FX_MODE_JUGGLE, &mode_juggle, _data_FX_MODE_JUGGLE); @@ -10265,14 +10316,17 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_POPCORN, &mode_popcorn, _data_FX_MODE_POPCORN); addEffect(FX_MODE_DRIP, &mode_drip, _data_FX_MODE_DRIP); addEffect(FX_MODE_SINELON, &mode_sinelon, _data_FX_MODE_SINELON); - addEffect(FX_MODE_SINELON_DUAL, &mode_sinelon_dual, _data_FX_MODE_SINELON_DUAL); - addEffect(FX_MODE_SINELON_RAINBOW, &mode_sinelon_rainbow, _data_FX_MODE_SINELON_RAINBOW); + //addEffect(FX_MODE_SINELON_DUAL, &mode_sinelon_dual, _data_FX_MODE_SINELON_DUAL); + //addEffect(FX_MODE_SINELON_RAINBOW, &mode_sinelon_rainbow, _data_FX_MODE_SINELON_RAINBOW); + addEffect(FX_MODE_POPCORN, &mode_popcorn, _data_FX_MODE_POPCORN); + addEffect(FX_MODE_DRIP, &mode_drip, _data_FX_MODE_DRIP); addEffect(FX_MODE_PLASMA, &mode_plasma, _data_FX_MODE_PLASMA); addEffect(FX_MODE_PERCENT, &mode_percent, _data_FX_MODE_PERCENT); - addEffect(FX_MODE_RIPPLE_RAINBOW, &mode_ripple_rainbow, _data_FX_MODE_RIPPLE_RAINBOW); + //addEffect(FX_MODE_RIPPLE_RAINBOW, &mode_ripple_rainbow, _data_FX_MODE_RIPPLE_RAINBOW); addEffect(FX_MODE_HEARTBEAT, &mode_heartbeat, _data_FX_MODE_HEARTBEAT); addEffect(FX_MODE_PACIFICA, &mode_pacifica, _data_FX_MODE_PACIFICA); addEffect(FX_MODE_CANDLE_MULTI, &mode_candle_multi, _data_FX_MODE_CANDLE_MULTI); + //addEffect(FX_MODE_SOLID_GLITTER, &mode_solid_glitter, _data_FX_MODE_SOLID_GLITTER); addEffect(FX_MODE_SUNRISE, &mode_sunrise, _data_FX_MODE_SUNRISE); addEffect(FX_MODE_PHASED, &mode_phased, _data_FX_MODE_PHASED); addEffect(FX_MODE_TWINKLEUP, &mode_twinkleup, _data_FX_MODE_TWINKLEUP); @@ -10284,7 +10338,7 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_WASHING_MACHINE, &mode_washing_machine, _data_FX_MODE_WASHING_MACHINE); addEffect(FX_MODE_BLENDS, &mode_blends, _data_FX_MODE_BLENDS); addEffect(FX_MODE_TV_SIMULATOR, &mode_tv_simulator, _data_FX_MODE_TV_SIMULATOR); - addEffect(FX_MODE_DYNAMIC_SMOOTH, &mode_dynamic_smooth, _data_FX_MODE_DYNAMIC_SMOOTH); + //addEffect(FX_MODE_DYNAMIC_SMOOTH, &mode_dynamic_smooth, _data_FX_MODE_DYNAMIC_SMOOTH); // --- 1D audio effects --- addEffect(FX_MODE_PIXELS, &mode_pixels, _data_FX_MODE_PIXELS); diff --git a/wled00/FX.h b/wled00/FX.h index 3544e1fa7f..20c85a13c9 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -151,7 +151,7 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_SAW 16 #define FX_MODE_TWINKLE 17 #define FX_MODE_DISSOLVE 18 -#define FX_MODE_DISSOLVE_RANDOM 19 // candidate for removal (use Dissolve with with check 3) +//#define FX_MODE_DISSOLVE_RANDOM 19 // candidate for removal (use Dissolve with with check 3) #define FX_MODE_SPARKLE 20 #define FX_MODE_FLASH_SPARKLE 21 #define FX_MODE_HYPER_SPARKLE 22 @@ -192,7 +192,7 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_LIGHTNING 57 #define FX_MODE_ICU 58 #define FX_MODE_MULTI_COMET 59 -#define FX_MODE_DUAL_LARSON_SCANNER 60 // candidate for removal (use Scanner with with check 1) +//#define FX_MODE_DUAL_LARSON_SCANNER 60 // candidate for removal (use Scanner with with check 1) #define FX_MODE_RANDOM_CHASE 61 #define FX_MODE_OSCILLATE 62 #define FX_MODE_PRIDE_2015 63 @@ -225,17 +225,17 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_EXPLODING_FIREWORKS 90 #define FX_MODE_BOUNCINGBALLS 91 #define FX_MODE_SINELON 92 -#define FX_MODE_SINELON_DUAL 93 -#define FX_MODE_SINELON_RAINBOW 94 +//#define FX_MODE_SINELON_DUAL 93 // candidate for removal (use sinelon) +//#define FX_MODE_SINELON_RAINBOW 94 // candidate for removal (use sinelon) #define FX_MODE_POPCORN 95 #define FX_MODE_DRIP 96 #define FX_MODE_PLASMA 97 #define FX_MODE_PERCENT 98 -#define FX_MODE_RIPPLE_RAINBOW 99 +//#define FX_MODE_RIPPLE_RAINBOW 99 // candidate for removal (use ripple) #define FX_MODE_HEARTBEAT 100 #define FX_MODE_PACIFICA 101 #define FX_MODE_CANDLE_MULTI 102 -#define FX_MODE_SOLID_GLITTER 103 // candidate for removal (use glitter) +//#define FX_MODE_SOLID_GLITTER 103 // candidate for removal (use glitter) #define FX_MODE_SUNRISE 104 #define FX_MODE_PHASED 105 #define FX_MODE_TWINKLEUP 106 @@ -249,7 +249,7 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_2DPLASMAROTOZOOM 114 // was Candy Cane prior to 0.14 (use Chase 2) #define FX_MODE_BLENDS 115 #define FX_MODE_TV_SIMULATOR 116 -#define FX_MODE_DYNAMIC_SMOOTH 117 // candidate for removal (check3 in dynamic) +//#define FX_MODE_DYNAMIC_SMOOTH 117 // candidate for removal (check3 in dynamic) // new 0.14 2D effects #define FX_MODE_2DSPACESHIPS 118 //gap fill From d4bd7301951fa41837a2c10678276d249cfb09c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bla=C5=BE=20Kristan?= Date: Mon, 3 Feb 2025 14:55:59 +0100 Subject: [PATCH 02/11] Remove additional effects --- wled00/FX.cpp | 145 ++++++++++++-------------------------------------- wled00/FX.h | 10 ++-- 2 files changed, 38 insertions(+), 117 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 238ec36697..5b7174b554 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -359,19 +359,6 @@ uint16_t mode_dynamic(void) { static const char _data_FX_MODE_DYNAMIC[] PROGMEM = "Dynamic@!,!,,,,Smooth;;!"; -/* - * effect "Dynamic" with smooth color-fading - */ -//uint16_t mode_dynamic_smooth(void) { -// bool old = SEGMENT.check1; -// SEGMENT.check1 = true; -// mode_dynamic(); -// SEGMENT.check1 = old; -// return FRAMETIME; -//} -//static const char _data_FX_MODE_DYNAMIC_SMOOTH[] PROGMEM = "Dynamic Smooth@!,!;;!"; - - /* * Does the "standby-breathing" of well known i-Devices. */ @@ -411,10 +398,11 @@ static const char _data_FX_MODE_FADE[] PROGMEM = "Fade@!;!,!;!;01"; /* - * Scan mode parent function + * Runs a single pixel back and forth. */ -uint16_t scan(bool dual) { +uint16_t mode_scan(void) { if (SEGLEN <= 1) return mode_static(); + const bool dual = SEGMENT.check3; uint32_t cycleTime = 750 + (255 - SEGMENT.speed)*150; uint32_t perc = strip.now % cycleTime; int prog = (perc * 65535) / cycleTime; @@ -439,24 +427,7 @@ uint16_t scan(bool dual) { return FRAMETIME; } - - -/* - * Runs a single pixel back and forth. - */ -uint16_t mode_scan(void) { - return scan(false); -} -static const char _data_FX_MODE_SCAN[] PROGMEM = "Scan@!,# of dots,,,,,Overlay;!,!,!;!"; - - -/* - * Runs two pixel back and forth in opposite directions. - */ -uint16_t mode_dual_scan(void) { - return scan(true); -} -static const char _data_FX_MODE_DUAL_SCAN[] PROGMEM = "Scan Dual@!,# of dots,,,,,Overlay;!,!,!;!"; +static const char _data_FX_MODE_SCAN[] PROGMEM = "Scan@!,Size,,,,,Overlay,Dual;!,!,!;!;1;o1=0"; /* @@ -496,27 +467,31 @@ static const char _data_FX_MODE_RAINBOW_CYCLE[] PROGMEM = "Rainbow@!,Size;;!"; /* - * Alternating pixels running function. + * Alternating pixels running function / Theatre-style crawling lights. + * Inspired by the Adafruit examples. */ -static uint16_t running(uint32_t color1, uint32_t color2, bool theatre = false) { +uint16_t mode_theater_chase() { + const bool animate = SEGMENT.check1; + const bool theatre = SEGMENT.check3; int width = (theatre ? 3 : 1) + (SEGMENT.intensity >> 4); // window uint32_t cycleTime = 50 + (255 - SEGMENT.speed); uint32_t it = strip.now / cycleTime; - bool usePalette = color1 == SEGCOLOR(0); for (unsigned i = 0; i < SEGLEN; i++) { - uint32_t col = color2; - if (usePalette) { - unsigned palIdx = SEGMENT.check1 ? (i+it)%SEGLEN : i; - color1 = SEGMENT.color_from_palette(palIdx, true, SEGMENT.check1, 0); + uint32_t c1 = SEGMENT.color_from_palette(i, true, false, 0); + uint32_t c2 = SEGCOLOR(1); + if (animate) { + c1 = SEGMENT.color_wheel(SEGENV.step); // sets moving palette and rainbow for default + //unsigned palIdx = animate ? (i+it)%SEGLEN : i; + //c1 = SEGMENT.color_from_palette(palIdx, true, animate, 0); } if (theatre) { - if ((i % width) == SEGENV.aux0) col = color1; + if ((i % width) == SEGENV.aux0) c2 = c1; } else { int pos = (i % (width<<1)); - if ((pos < SEGENV.aux0-width) || ((pos >= SEGENV.aux0) && (pos < SEGENV.aux0+width))) col = color1; + if ((pos < SEGENV.aux0-width) || ((pos >= SEGENV.aux0) && (pos < SEGENV.aux0+width))) c2 = c1; } - SEGMENT.setPixelColor(i,col); + SEGMENT.setPixelColor(i,c2); } if (it != SEGENV.step) { @@ -525,32 +500,15 @@ static uint16_t running(uint32_t color1, uint32_t color2, bool theatre = false) } return FRAMETIME; } - - -/* - * Theatre-style crawling lights. - * Inspired by the Adafruit examples. - */ -uint16_t mode_theater_chase(void) { - return running(SEGCOLOR(0), SEGCOLOR(1), true); -} -static const char _data_FX_MODE_THEATER_CHASE[] PROGMEM = "Theater@!,Gap size,,,,Animate palette;!,!;!;;o1=0"; - - -/* - * Theatre-style crawling lights with rainbow effect. - * Inspired by the Adafruit examples. - */ -uint16_t mode_theater_chase_rainbow(void) { - return running(SEGMENT.color_wheel(SEGENV.step), SEGCOLOR(1), true); -} -static const char _data_FX_MODE_THEATER_CHASE_RAINBOW[] PROGMEM = "Theater Rainbow@!,Gap size;,!;!;;o1=0"; +static const char _data_FX_MODE_THEATER_CHASE[] PROGMEM = "Theater@!,Gap size,,,,Animate palette,,Chase;!,!;!;;o1=0,o3=0"; /* * Running lights effect with smooth sine transition base. + * Idea: Make the gap width controllable with a third slider in the future */ -static uint16_t running_base(bool saw, bool dual=false) { +static uint16_t running_base(bool saw) { + const bool dual = SEGMENT.check3; unsigned x_scale = SEGMENT.intensity >> 2; uint32_t counter = (strip.now * SEGMENT.speed) >> 9; const bool moving = SEGMENT.check1; @@ -582,24 +540,13 @@ static uint16_t running_base(bool saw, bool dual=false) { return FRAMETIME; } - -/* - * Running lights in opposite directions. - * Idea: Make the gap width controllable with a third slider in the future - */ -uint16_t mode_running_dual(void) { - return running_base(false, true); -} -static const char _data_FX_MODE_RUNNING_DUAL[] PROGMEM = "Running Dual@!,Wave width,,,,Animate palette;L,!,R;!;;o1=0"; - - /* * Running lights effect with smooth sine transition. */ uint16_t mode_running_lights(void) { return running_base(false); } -static const char _data_FX_MODE_RUNNING_LIGHTS[] PROGMEM = "Running@!,Wave width,,,,Animate palette;!,!;!;;o1=0"; +static const char _data_FX_MODE_RUNNING_LIGHTS[] PROGMEM = "Running@!,Wave width,,,,Animate palette,,Dual;!,!;!;;o1=0"; /* @@ -608,7 +555,7 @@ static const char _data_FX_MODE_RUNNING_LIGHTS[] PROGMEM = "Running@!,Wave width uint16_t mode_saw(void) { return running_base(true); } -static const char _data_FX_MODE_SAW[] PROGMEM = "Saw@!,Width,,,,Animate palette;!,!;!;;o1=0"; +static const char _data_FX_MODE_SAW[] PROGMEM = "Saw@!,Width,,,,Animate palette;!,!;!;;o1=0,o3=0"; /* @@ -1139,15 +1086,6 @@ uint16_t mode_chase_flash_random(void) { static const char _data_FX_MODE_CHASE_FLASH_RANDOM[] PROGMEM = "Chase Flash Rnd@!;!,!;!"; -/* - * Alternating color/sec pixels running. - */ -uint16_t mode_running_color(void) { - return running(SEGCOLOR(0), SEGCOLOR(1)); -} -static const char _data_FX_MODE_RUNNING_COLOR[] PROGMEM = "Chase 2@!,Width;!,!;!"; - - /* * Random colored pixels running. ("Stream") */ @@ -3334,13 +3272,9 @@ static const char _data_FX_MODE_POPCORN[] PROGMEM = "Popcorn@!,!,,,,,Overlay;!,! //Inspired by https://github.com/avanhanegem/ArduinoCandleEffectNeoPixel //and https://cpldcpu.wordpress.com/2016/01/05/reverse-engineering-a-real-candle/ -uint16_t candle(bool multi) -{ - if (multi && SEGLEN > 1) { - //allocate segment data - unsigned dataSize = max(1, (int)SEGLEN -1) *3; //max. 1365 pixels (ESP8266) - if (!SEGENV.allocateData(dataSize)) return candle(false); //allocation failed - } +uint16_t mode_candle() { + const unsigned dataSize = max(1, (int)SEGLEN -1) *3; //max. 1365 pixels (ESP8266) + const bool multi = SEGMENT.check3 && SEGLEN > 1 && SEGENV.allocateData(dataSize); //max. flicker range controlled by intensity unsigned valrange = SEGMENT.intensity; @@ -3407,20 +3341,7 @@ uint16_t candle(bool multi) return FRAMETIME_FIXED; } - - -uint16_t mode_candle() -{ - return candle(false); -} -static const char _data_FX_MODE_CANDLE[] PROGMEM = "Candle@!,!;!,!;!;01;sx=96,ix=224,pal=0"; - - -uint16_t mode_candle_multi() -{ - return candle(true); -} -static const char _data_FX_MODE_CANDLE_MULTI[] PROGMEM = "Candle Multi@!,!;!,!;!;;sx=96,ix=224,pal=0"; +static const char _data_FX_MODE_CANDLE[] PROGMEM = "Candle@!,!,,,,,,Multi;!,!;!;01;sx=96,ix=224,pal=0,o3=1"; #ifdef WLED_PS_DONT_REPLACE_FX /* @@ -10224,10 +10145,10 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_RAINBOW, &mode_rainbow, _data_FX_MODE_RAINBOW); addEffect(FX_MODE_RAINBOW_CYCLE, &mode_rainbow_cycle, _data_FX_MODE_RAINBOW_CYCLE); addEffect(FX_MODE_SCAN, &mode_scan, _data_FX_MODE_SCAN); - addEffect(FX_MODE_DUAL_SCAN, &mode_dual_scan, _data_FX_MODE_DUAL_SCAN); + //addEffect(FX_MODE_DUAL_SCAN, &mode_dual_scan, _data_FX_MODE_DUAL_SCAN); addEffect(FX_MODE_FADE, &mode_fade, _data_FX_MODE_FADE); addEffect(FX_MODE_THEATER_CHASE, &mode_theater_chase, _data_FX_MODE_THEATER_CHASE); - addEffect(FX_MODE_THEATER_CHASE_RAINBOW, &mode_theater_chase_rainbow, _data_FX_MODE_THEATER_CHASE_RAINBOW); + //addEffect(FX_MODE_THEATER_CHASE_RAINBOW, &mode_theater_chase_rainbow, _data_FX_MODE_THEATER_CHASE_RAINBOW); addEffect(FX_MODE_RUNNING_LIGHTS, &mode_running_lights, _data_FX_MODE_RUNNING_LIGHTS); addEffect(FX_MODE_SAW, &mode_saw, _data_FX_MODE_SAW); addEffect(FX_MODE_TWINKLE, &mode_twinkle, _data_FX_MODE_TWINKLE); @@ -10250,7 +10171,7 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_COLORFUL, &mode_colorful, _data_FX_MODE_COLORFUL); addEffect(FX_MODE_TRAFFIC_LIGHT, &mode_traffic_light, _data_FX_MODE_TRAFFIC_LIGHT); addEffect(FX_MODE_COLOR_SWEEP_RANDOM, &mode_color_sweep_random, _data_FX_MODE_COLOR_SWEEP_RANDOM); - addEffect(FX_MODE_RUNNING_COLOR, &mode_running_color, _data_FX_MODE_RUNNING_COLOR); + //addEffect(FX_MODE_RUNNING_COLOR, &mode_running_color, _data_FX_MODE_RUNNING_COLOR); addEffect(FX_MODE_AURORA, &mode_aurora, _data_FX_MODE_AURORA); addEffect(FX_MODE_RUNNING_RANDOM, &mode_running_random, _data_FX_MODE_RUNNING_RANDOM); addEffect(FX_MODE_LARSON_SCANNER, &mode_larson_scanner, _data_FX_MODE_LARSON_SCANNER); @@ -10265,7 +10186,7 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_FAIRY, &mode_fairy, _data_FX_MODE_FAIRY); addEffect(FX_MODE_TWO_DOTS, &mode_two_dots, _data_FX_MODE_TWO_DOTS); addEffect(FX_MODE_FAIRYTWINKLE, &mode_fairytwinkle, _data_FX_MODE_FAIRYTWINKLE); - addEffect(FX_MODE_RUNNING_DUAL, &mode_running_dual, _data_FX_MODE_RUNNING_DUAL); + //addEffect(FX_MODE_RUNNING_DUAL, &mode_running_dual, _data_FX_MODE_RUNNING_DUAL); #ifdef WLED_ENABLE_GIF addEffect(FX_MODE_IMAGE, &mode_image, _data_FX_MODE_IMAGE); #endif @@ -10325,7 +10246,7 @@ void WS2812FX::setupEffectData() { //addEffect(FX_MODE_RIPPLE_RAINBOW, &mode_ripple_rainbow, _data_FX_MODE_RIPPLE_RAINBOW); addEffect(FX_MODE_HEARTBEAT, &mode_heartbeat, _data_FX_MODE_HEARTBEAT); addEffect(FX_MODE_PACIFICA, &mode_pacifica, _data_FX_MODE_PACIFICA); - addEffect(FX_MODE_CANDLE_MULTI, &mode_candle_multi, _data_FX_MODE_CANDLE_MULTI); + //addEffect(FX_MODE_CANDLE_MULTI, &mode_candle_multi, _data_FX_MODE_CANDLE_MULTI); //addEffect(FX_MODE_SOLID_GLITTER, &mode_solid_glitter, _data_FX_MODE_SOLID_GLITTER); addEffect(FX_MODE_SUNRISE, &mode_sunrise, _data_FX_MODE_SUNRISE); addEffect(FX_MODE_PHASED, &mode_phased, _data_FX_MODE_PHASED); diff --git a/wled00/FX.h b/wled00/FX.h index 20c85a13c9..e71c1e6ab1 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -143,10 +143,10 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_RAINBOW 8 #define FX_MODE_RAINBOW_CYCLE 9 #define FX_MODE_SCAN 10 -#define FX_MODE_DUAL_SCAN 11 +//#define FX_MODE_DUAL_SCAN 11 // candidate for removal (use Scan) #define FX_MODE_FADE 12 #define FX_MODE_THEATER_CHASE 13 -#define FX_MODE_THEATER_CHASE_RAINBOW 14 +//#define FX_MODE_THEATER_CHASE_RAINBOW 14 // candidate for removal (use Theater) #define FX_MODE_RUNNING_LIGHTS 15 #define FX_MODE_SAW 16 #define FX_MODE_TWINKLE 17 @@ -169,7 +169,7 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_COLORFUL 34 #define FX_MODE_TRAFFIC_LIGHT 35 #define FX_MODE_COLOR_SWEEP_RANDOM 36 -#define FX_MODE_RUNNING_COLOR 37 +//#define FX_MODE_RUNNING_COLOR 37 // candidate for removal (use Theater) #define FX_MODE_AURORA 38 #define FX_MODE_RUNNING_RANDOM 39 #define FX_MODE_LARSON_SCANNER 40 @@ -184,7 +184,7 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_FAIRY 49 //was Police All prior to 0.13.0-b6 (use "Two Dots" with Red/Blue and full intensity) #define FX_MODE_TWO_DOTS 50 #define FX_MODE_FAIRYTWINKLE 51 //was Two Areas prior to 0.13.0-b6 (use "Two Dots" with full intensity) -#define FX_MODE_RUNNING_DUAL 52 +//#define FX_MODE_RUNNING_DUAL 52 // candidate for removal (use Running) #define FX_MODE_IMAGE 53 #define FX_MODE_TRICOLOR_CHASE 54 #define FX_MODE_TRICOLOR_WIPE 55 @@ -234,7 +234,7 @@ extern byte realtimeMode; // used in getMappedPixelIndex() //#define FX_MODE_RIPPLE_RAINBOW 99 // candidate for removal (use ripple) #define FX_MODE_HEARTBEAT 100 #define FX_MODE_PACIFICA 101 -#define FX_MODE_CANDLE_MULTI 102 +//#define FX_MODE_CANDLE_MULTI 102 // candidate for removal (use candle with multi select) //#define FX_MODE_SOLID_GLITTER 103 // candidate for removal (use glitter) #define FX_MODE_SUNRISE 104 #define FX_MODE_PHASED 105 From 88d5d926ceea8e0afbc046af71dd8f764c4ca291 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bla=C5=BE=20Kristan?= Date: Mon, 3 Feb 2025 19:55:00 +0100 Subject: [PATCH 03/11] Simplify Chase 3 --- wled00/FX.cpp | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 5b7174b554..853694caf1 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -1527,7 +1527,7 @@ static const char _data_FX_MODE_FAIRYTWINKLE[] PROGMEM = "Fairytwinkle@!,!;!,!;! /* * Tricolor chase function */ -uint16_t tricolor_chase(uint32_t color1, uint32_t color2) { +uint16_t mode_tricolor_chase(void) { uint32_t cycleTime = 50 + ((255 - SEGMENT.speed)<<1); uint32_t it = strip.now / cycleTime; // iterator unsigned width = (1 + (SEGMENT.intensity>>4)); // value of 1-16 for each colour @@ -1536,22 +1536,14 @@ uint16_t tricolor_chase(uint32_t color1, uint32_t color2) { for (unsigned i = 0; i < SEGLEN; i++, index++) { if (index > (width*3)-1) index = 0; - uint32_t color = color1; + uint32_t color = SEGCOLOR(2); if (index > (width<<1)-1) color = SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 1); - else if (index > width-1) color = color2; + else if (index > width-1) color = SEGCOLOR(0); SEGMENT.setPixelColor(SEGLEN - i -1, color); } return FRAMETIME; } - - -/* - * Tricolor chase mode - */ -uint16_t mode_tricolor_chase(void) { - return tricolor_chase(SEGCOLOR(2), SEGCOLOR(0)); -} static const char _data_FX_MODE_TRICOLOR_CHASE[] PROGMEM = "Chase 3@!,Size;1,2,3;!"; From 171d78ccbb8f5de58e066c45ef85f1a6851136a3 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Wed, 19 Feb 2025 06:06:10 +0100 Subject: [PATCH 04/11] Merge fixes --- wled00/FX.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 853694caf1..003d765a1b 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -526,7 +526,7 @@ static uint16_t running_base(bool saw) { a = 255 - a; } unsigned palIdx = moving ? (i+counter)%SEGLEN : i; - uint8_t s = dual ? sin_gap(a) : sin8(a); + uint8_t s = dual ? sin_gap(a) : sin8_t(a); uint32_t ca = color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(palIdx, true, moving, 0), s); if (dual) { unsigned b = (SEGLEN-1-i)*x_scale - counter; @@ -4829,14 +4829,14 @@ uint16_t mode_2DBlackHole(void) { // By: Stepko https://editor.soulma unsigned long t = strip.now/128; // timebase // outer stars for (size_t i = 0; i < 8; i++) { - x = beatsin8(SEGMENT.custom1>>3, 0, cols - 1, 0, ((i % 2) ? 128 : 0) + t * i); - y = beatsin8(SEGMENT.intensity>>3, 0, rows - 1, 0, ((i % 2) ? 192 : 64) + t * i); + x = beatsin8_t(SEGMENT.custom1>>3, 0, cols - 1, 0, ((i % 2) ? 128 : 0) + t * i); + y = beatsin8_t(SEGMENT.intensity>>3, 0, rows - 1, 0, ((i % 2) ? 192 : 64) + t * i); SEGMENT.addPixelColorXY(x, y, SEGMENT.color_from_palette(i*32, false, PALETTE_SOLID_WRAP, oneColor?0:255)); } // inner stars for (size_t i = 0; i < 4; i++) { - x = beatsin8(SEGMENT.custom2>>3, cols/4, cols - 1 - cols/4, 0, ((i % 2) ? 128 : 0) + t * i); - y = beatsin8(SEGMENT.custom3 , rows/4, rows - 1 - rows/4, 0, ((i % 2) ? 192 : 64) + t * i); + x = beatsin8_t(SEGMENT.custom2>>3, cols/4, cols - 1 - cols/4, 0, ((i % 2) ? 128 : 0) + t * i); + y = beatsin8_t(SEGMENT.custom3 , rows/4, rows - 1 - rows/4, 0, ((i % 2) ? 192 : 64) + t * i); SEGMENT.addPixelColorXY(x, y, SEGMENT.color_from_palette(255-i*64, false, PALETTE_SOLID_WRAP, oneColor?0:255)); } // central white dot From c084979d95d15da4e2032c468e842cb57f3204da Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Wed, 19 Feb 2025 08:05:31 +0100 Subject: [PATCH 05/11] added some more consolidations, merge fixes, updated FX list comments --- wled00/FX.cpp | 212 ++++++++++++++++---------------------------------- wled00/FX.h | 62 +++++++-------- 2 files changed, 98 insertions(+), 176 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 003d765a1b..afa4db9ec8 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -507,15 +507,15 @@ static const char _data_FX_MODE_THEATER_CHASE[] PROGMEM = "Theater@!,Gap size,,, * Running lights effect with smooth sine transition base. * Idea: Make the gap width controllable with a third slider in the future */ -static uint16_t running_base(bool saw) { - const bool dual = SEGMENT.check3; +static uint16_t mode_running_lights() { + const bool dual = SEGMENT.check2; unsigned x_scale = SEGMENT.intensity >> 2; uint32_t counter = (strip.now * SEGMENT.speed) >> 9; const bool moving = SEGMENT.check1; for (unsigned i = 0; i < SEGLEN; i++) { unsigned a = i*x_scale - counter; - if (saw) { + if (SEGMENT.check3) { // Saw mode a &= 0xFF; if (a < 16) { @@ -539,23 +539,7 @@ static uint16_t running_base(bool saw) { return FRAMETIME; } - -/* - * Running lights effect with smooth sine transition. - */ -uint16_t mode_running_lights(void) { - return running_base(false); -} -static const char _data_FX_MODE_RUNNING_LIGHTS[] PROGMEM = "Running@!,Wave width,,,,Animate palette,,Dual;!,!;!;;o1=0"; - - -/* - * Running lights effect with sawtooth transition. - */ -uint16_t mode_saw(void) { - return running_base(true); -} -static const char _data_FX_MODE_SAW[] PROGMEM = "Saw@!,Width,,,,Animate palette;!,!;!;;o1=0,o3=0"; +static const char _data_FX_MODE_RUNNING_LIGHTS[] PROGMEM = "Running@!,Width,,,,Animate palette,Dual,Saw;L,!,R;!"; /* @@ -1174,16 +1158,6 @@ uint16_t mode_larson_scanner(void) { } static const char _data_FX_MODE_LARSON_SCANNER[] PROGMEM = "Scanner@!,Trail,Delay,,,Animate palette,Bi-delay,Dual;!,!,!;!;;m12=0,c1=0,o1=0,o3=0"; -/* - * Creates two Larson scanners moving in opposite directions - * Custom mode by Keith Lord: https://github.com/kitesurfer1404/WS2812FX/blob/master/src/custom/DualLarson.h - */ -//uint16_t mode_dual_larson_scanner(void){ -// SEGMENT.check3 = true; -// return mode_larson_scanner(); -//} -//static const char _data_FX_MODE_DUAL_LARSON_SCANNER[] PROGMEM = "Scanner Dual@!,Trail,Delay,,,Animate palette,Bi-delay;!,!,!;!;;m12=0,c1=0,o3=1"; - /* * Firing comets from one end. "Lighthouse" @@ -2306,76 +2280,59 @@ uint16_t mode_meteor() { byte* trail = SEGENV.data; const unsigned meteorSize = 1 + SEGLEN / 20; // 5% - unsigned counter = strip.now * ((SEGMENT.speed >> 2) +8); - uint16_t in = counter * SEGLEN >> 16; - const bool gradient = SEGMENT.check1; + uint16_t meteorstart; + if(meteorSmooth) meteorstart = map((SEGENV.step >> 6 & 0xFF), 0, 255, 0, SEGLEN -1); + else { + unsigned counter = strip.now * ((SEGMENT.speed >> 2) + 8); + meteorstart = (counter * SEGLEN) >> 16; + } const int max = SEGMENT.palette==5 || !SEGMENT.check1 ? 240 : 255; // fade all leds to colors[1] in LEDs one step for (unsigned i = 0; i < SEGLEN; i++) { - if (random8() <= 255 - SEGMENT.intensity) { - int meteorTrailDecay = 128 + hw_random8(127); - trail[i] = scale8(trail[i], meteorTrailDecay); - int index = trail[i]; - int idx = 255; - int bri = SEGMENT.palette==35 || SEGMENT.palette==36 ? 255 : trail[i]; - if (!gradient) { - idx = 0; - index = map(i,0,SEGLEN,0,max); - bri = trail[i]; + uint32_t col; + if (hw_random8() <= 255 - SEGMENT.intensity) { + if(meteorSmooth) { + if (trail[i] > 0) { + int change = trail[i] + 4 - hw_random8(24); //change each time between -20 and +4 + trail[i] = constrain(change, 0, max); + } + col = SEGMENT.check1 ? SEGMENT.color_from_palette(i, true, false, 0, trail[i]) : SEGMENT.color_from_palette(trail[i], false, true, 255); } - SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(index, false, false, idx, bri)); // full brightness for Fire + else { + trail[i] = scale8(trail[i], 128 + hw_random8(127)); + int index = trail[i]; + int idx = 255; + int bri = SEGMENT.palette==35 || SEGMENT.palette==36 ? 255 : trail[i]; + if (!SEGMENT.check1) { + idx = 0; + index = map(i,0,SEGLEN,0,max); + bri = trail[i]; + } + col = SEGMENT.color_from_palette(index, false, false, idx, bri); // full brightness for Fire + } + SEGMENT.setPixelColor(i, col); } } // draw meteor for (unsigned j = 0; j < meteorSize; j++) { - int index = (in + j) % SEGLEN; - int idx = 255; - int i = trail[index] = max; - if (!gradient) { - i = map(index,0,SEGLEN,0,max); - idx = 0; - } - SEGMENT.setPixelColor(index, SEGMENT.color_from_palette(i, false, false, idx, 255)); // full brightness - } - - return FRAMETIME; -} -static const char _data_FX_MODE_METEOR[] PROGMEM = "Meteor@!,Trail,,,,Gradient;!;!;1"; - - -// smooth meteor effect -// send a meteor from begining to to the end of the strip with a trail that randomly decays. -// adapted from https://www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/#LEDStripEffectMeteorRain -uint16_t mode_meteor_smooth() { - if (SEGLEN <= 1) return mode_static(); - if (!SEGENV.allocateData(SEGLEN)) return mode_static(); //allocation failed - - byte* trail = SEGENV.data; - - const unsigned meteorSize = 1+ SEGLEN / 20; // 5% - uint16_t in = map((SEGENV.step >> 6 & 0xFF), 0, 255, 0, SEGLEN -1); - const bool gradient = SEGMENT.check1; - - const int max = SEGMENT.palette==5 || !gradient ? 240 : 255; - // fade all leds to colors[1] in LEDs one step - for (unsigned i = 0; i < SEGLEN; i++) { - if (/*trail[i] != 0 &&*/ hw_random8() <= 255 - SEGMENT.intensity) { - int change = trail[i] + 4 - hw_random8(24); //change each time between -20 and +4 - trail[i] = constrain(change, 0, max); - SEGMENT.setPixelColor(i, gradient ? SEGMENT.color_from_palette(i, true, false, 0, trail[i]) : SEGMENT.color_from_palette(trail[i], false, true, 255)); + unsigned index = (meteorstart + j) % SEGLEN; + if(meteorSmooth) { + trail[index] = max; + uint32_t col = SEGMENT.check1 ? SEGMENT.color_from_palette(index, true, false, 0, trail[index]) : SEGMENT.color_from_palette(trail[index], false, true, 255); + SEGMENT.setPixelColor(index, col); } - } - - // draw meteor - for (unsigned j = 0; j < meteorSize; j++) { - unsigned index = in + j; - if (index >= SEGLEN) { - index -= SEGLEN; + else{ + int idx = 255; + int i = trail[index] = max; + if (!SEGMENT.check1) { + i = map(index,0,SEGLEN,0,max); + idx = 0; + } + uint32_t col = SEGMENT.color_from_palette(i, false, false, idx, 255); // full brightness + SEGMENT.setPixelColor(index, col); } - trail[index] = max; - SEGMENT.setPixelColor(index, gradient ? SEGMENT.color_from_palette(index, true, false, 0, trail[index]) : SEGMENT.color_from_palette(trail[index], false, true, 255)); } SEGENV.step += SEGMENT.speed +1; @@ -2432,7 +2389,8 @@ typedef struct Ripple { #else #define MAX_RIPPLES 100 #endif -static uint16_t ripple_base(uint8_t blurAmount = 0) { +uint16_t mode_ripple() { + if (SEGLEN <= 1) return mode_static(); unsigned maxRipples = min(1 + (int)(SEGLEN >> 2), MAX_RIPPLES); // 56 max for 16 segment ESP8266 unsigned dataSize = sizeof(ripple) * maxRipples; @@ -2440,6 +2398,21 @@ static uint16_t ripple_base(uint8_t blurAmount = 0) { Ripple* ripples = reinterpret_cast(SEGENV.data); + + if (SEGENV.call == 0) { + SEGENV.aux0 = SEGENV.aux1 = hw_random8(); + } + if (SEGENV.aux0 == SEGENV.aux1) { + SEGENV.aux1 = hw_random8(); + } else if (SEGENV.aux1 > SEGENV.aux0) { + SEGENV.aux0++; + } else { + SEGENV.aux0--; + } + if(SEGMENT.custom1 || SEGMENT.check2) // blur or overlay + SEGMENT.fade_out(250); + else SEGMENT.fill(SEGMENT.check1 ? color_blend(SEGMENT.color_wheel(SEGENV.aux0),BLACK,uint8_t(235)) : SEGCOLOR(1)); + //draw wave for (unsigned i = 0; i < maxRipples; i++) { unsigned ripplestate = ripples[i].state; @@ -2480,49 +2453,13 @@ static uint16_t ripple_base(uint8_t blurAmount = 0) { } } } - SEGMENT.blur(blurAmount); + SEGMENT.blur(SEGMENT.custom1>>1); return FRAMETIME; } +static const char _data_FX_MODE_RIPPLE[] PROGMEM = "Ripple@!,Waves,Blur,,,Rainbow,Overlay;,!;!;12;c1=0"; #undef MAX_RIPPLES -uint16_t mode_ripple(void) { - if (SEGLEN <= 1) return mode_static(); - if (SEGENV.call == 0) { - SEGENV.aux0 = hw_random8(); - SEGENV.aux1 = hw_random8(); - } - if (SEGENV.aux0 == SEGENV.aux1) { - SEGENV.aux1 = hw_random8(); - } else if (SEGENV.aux1 > SEGENV.aux0) { - SEGENV.aux0++; - } else { - SEGENV.aux0--; - } - if (!SEGMENT.check2) SEGMENT.fill(SEGMENT.check1 ? color_blend(SEGMENT.color_wheel(SEGENV.aux0),BLACK,uint8_t(240)) : SEGCOLOR(1)); - else SEGMENT.fade_out(250); - return ripple_base(); -} -static const char _data_FX_MODE_RIPPLE[] PROGMEM = "Ripple@!,Waves,,,,Palette BG,Overlay;,!;!;12;o1=0"; - - -//uint16_t mode_ripple_rainbow(void) { -// if (SEGLEN <= 1) return mode_static(); -// if (SEGENV.call ==0) { -// SEGENV.aux0 = hw_random8(); -// SEGENV.aux1 = hw_random8(); -// } -// if (SEGENV.aux0 == SEGENV.aux1) { -// SEGENV.aux1 = hw_random8(); -// } else if (SEGENV.aux1 > SEGENV.aux0) { -// SEGENV.aux0++; -// } else { -// SEGENV.aux0--; -// } -// SEGMENT.fill(color_blend(SEGMENT.color_wheel(SEGENV.aux0),BLACK,uint8_t(235))); -// return ripple_base(); -//} -//static const char _data_FX_MODE_RIPPLE_RAINBOW[] PROGMEM = "Ripple Rainbow@!,Waves;;!;12"; // TwinkleFOX by Mark Kriegsman: https://gist.github.com/kriegsman/756ea6dcae8e30845b5a @@ -3105,7 +3042,7 @@ static const char _data_FX_MODE_ROLLINGBALLS[] PROGMEM = "Rolling Balls@!,# of b uint16_t mode_sinelon() { if (SEGLEN <= 1) return mode_static(); const bool rainbow = SEGMENT.check1; - const bool dual = SEGMENT.check3; + const bool dual = SEGMENT.check2; SEGMENT.fade_out(SEGMENT.intensity); unsigned pos = beatsin16_t(SEGMENT.speed/10,0,SEGLEN-1); if (SEGENV.call == 0) SEGENV.aux0 = pos; @@ -3137,21 +3074,7 @@ uint16_t mode_sinelon() { return FRAMETIME; } - -//uint16_t mode_sinelon(void) { -// return sinelon_base(false); -//} -static const char _data_FX_MODE_SINELON[] PROGMEM = "Sinelon@!,Trail,,,,Rainbow,,Dual;!,!,!;!"; - -//uint16_t mode_sinelon_dual(void) { -// return sinelon_base(true); -//} -//static const char _data_FX_MODE_SINELON_DUAL[] PROGMEM = "Sinelon Dual@!,Trail;!,!,!;!"; - -//uint16_t mode_sinelon_rainbow(void) { -// return sinelon_base(false, true); -//} -//static const char _data_FX_MODE_SINELON_RAINBOW[] PROGMEM = "Sinelon Rainbow@!,Trail;,,!;!"; +static const char _data_FX_MODE_SINELON[] PROGMEM = "Sinelon@!,Trail,,,,Rainbow,Dual;!,!,!;!"; //Glitter with palette background, inspired by https://gist.github.com/kriegsman/062e10f7f07ba8518af6 @@ -10142,7 +10065,7 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_THEATER_CHASE, &mode_theater_chase, _data_FX_MODE_THEATER_CHASE); //addEffect(FX_MODE_THEATER_CHASE_RAINBOW, &mode_theater_chase_rainbow, _data_FX_MODE_THEATER_CHASE_RAINBOW); addEffect(FX_MODE_RUNNING_LIGHTS, &mode_running_lights, _data_FX_MODE_RUNNING_LIGHTS); - addEffect(FX_MODE_SAW, &mode_saw, _data_FX_MODE_SAW); + //addEffect(FX_MODE_SAW, &mode_saw, _data_FX_MODE_SAW); addEffect(FX_MODE_TWINKLE, &mode_twinkle, _data_FX_MODE_TWINKLE); addEffect(FX_MODE_DISSOLVE, &mode_dissolve, _data_FX_MODE_DISSOLVE); //addEffect(FX_MODE_DISSOLVE_RANDOM, &mode_dissolve_random, _data_FX_MODE_DISSOLVE_RANDOM); @@ -10187,7 +10110,6 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_TRICOLOR_FADE, &mode_tricolor_fade, _data_FX_MODE_TRICOLOR_FADE); addEffect(FX_MODE_LIGHTNING, &mode_lightning, _data_FX_MODE_LIGHTNING); addEffect(FX_MODE_ICU, &mode_icu, _data_FX_MODE_ICU); - addEffect(FX_MODE_MULTI_COMET, &mode_multi_comet, _data_FX_MODE_MULTI_COMET); //addEffect(FX_MODE_DUAL_LARSON_SCANNER, &mode_dual_larson_scanner, _data_FX_MODE_DUAL_LARSON_SCANNER); addEffect(FX_MODE_RANDOM_CHASE, &mode_random_chase, _data_FX_MODE_RANDOM_CHASE); addEffect(FX_MODE_OSCILLATE, &mode_oscillate, _data_FX_MODE_OSCILLATE); diff --git a/wled00/FX.h b/wled00/FX.h index e71c1e6ab1..3c73a8336b 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -143,16 +143,16 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_RAINBOW 8 #define FX_MODE_RAINBOW_CYCLE 9 #define FX_MODE_SCAN 10 -//#define FX_MODE_DUAL_SCAN 11 // candidate for removal (use Scan) +//#define FX_MODE_DUAL_SCAN 11 // removed in 0.16, use Scan with check #define FX_MODE_FADE 12 #define FX_MODE_THEATER_CHASE 13 -//#define FX_MODE_THEATER_CHASE_RAINBOW 14 // candidate for removal (use Theater) +//#define FX_MODE_THEATER_CHASE_RAINBOW 14 // removed in 0.16, use Theater with check #define FX_MODE_RUNNING_LIGHTS 15 -#define FX_MODE_SAW 16 +//#define FX_MODE_SAW 16 // removed in 0.16, use Running with with check 3 #define FX_MODE_TWINKLE 17 #define FX_MODE_DISSOLVE 18 -//#define FX_MODE_DISSOLVE_RANDOM 19 // candidate for removal (use Dissolve with with check 3) -#define FX_MODE_SPARKLE 20 +//#define FX_MODE_DISSOLVE_RANDOM 19 // removed in 0.16, use Dissolve with with check 3 +#define FX_MODE_SPARKLE 20 // alternative: PS Sparkler #define FX_MODE_FLASH_SPARKLE 21 #define FX_MODE_HYPER_SPARKLE 22 #define FX_MODE_STROBE 23 @@ -169,7 +169,7 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_COLORFUL 34 #define FX_MODE_TRAFFIC_LIGHT 35 #define FX_MODE_COLOR_SWEEP_RANDOM 36 -//#define FX_MODE_RUNNING_COLOR 37 // candidate for removal (use Theater) +//#define FX_MODE_RUNNING_COLOR 37 // removed in 0.16, use Theater #define FX_MODE_AURORA 38 #define FX_MODE_RUNNING_RANDOM 39 #define FX_MODE_LARSON_SCANNER 40 @@ -180,25 +180,25 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_FIRE_FLICKER 45 #define FX_MODE_GRADIENT 46 #define FX_MODE_LOADING 47 -#define FX_MODE_ROLLINGBALLS 48 //was Police before 0.14 +#define FX_MODE_ROLLINGBALLS 48 // alternative: PS Pinball with checkmark "rolling" #define FX_MODE_FAIRY 49 //was Police All prior to 0.13.0-b6 (use "Two Dots" with Red/Blue and full intensity) #define FX_MODE_TWO_DOTS 50 #define FX_MODE_FAIRYTWINKLE 51 //was Two Areas prior to 0.13.0-b6 (use "Two Dots" with full intensity) -//#define FX_MODE_RUNNING_DUAL 52 // candidate for removal (use Running) +//#define FX_MODE_RUNNING_DUAL 52 // removed in 0.16, use Running with with check 2 #define FX_MODE_IMAGE 53 #define FX_MODE_TRICOLOR_CHASE 54 #define FX_MODE_TRICOLOR_WIPE 55 #define FX_MODE_TRICOLOR_FADE 56 #define FX_MODE_LIGHTNING 57 #define FX_MODE_ICU 58 -#define FX_MODE_MULTI_COMET 59 -//#define FX_MODE_DUAL_LARSON_SCANNER 60 // candidate for removal (use Scanner with with check 1) +#define FX_MODE_MULTI_COMET 59 // alternative: PS Pinball with gravity set to 0 +//#define FX_MODE_DUAL_LARSON_SCANNER 60 // removed in 0.16, use Scanner with check 3 #define FX_MODE_RANDOM_CHASE 61 #define FX_MODE_OSCILLATE 62 #define FX_MODE_PRIDE_2015 63 #define FX_MODE_JUGGLE 64 #define FX_MODE_PALETTE 65 -#define FX_MODE_FIRE_2012 66 +#define FX_MODE_FIRE_2012 66 // alternative: PS Fire (1D and 2D) #define FX_MODE_COLORWAVES 67 #define FX_MODE_BPM 68 #define FX_MODE_FILLNOISE8 69 @@ -219,23 +219,23 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_TRI_STATIC_PATTERN 84 #define FX_MODE_SPOTS 85 #define FX_MODE_SPOTS_FADE 86 -#define FX_MODE_GLITTER 87 +#define FX_MODE_GLITTER 87 // alternative: PS Sparkler #define FX_MODE_CANDLE 88 -#define FX_MODE_STARBURST 89 -#define FX_MODE_EXPLODING_FIREWORKS 90 +#define FX_MODE_STARBURST 89 // alternative: PS Starburst +#define FX_MODE_EXPLODING_FIREWORKS 90 // alternative: PS Fireworks (1D and 2D) #define FX_MODE_BOUNCINGBALLS 91 #define FX_MODE_SINELON 92 -//#define FX_MODE_SINELON_DUAL 93 // candidate for removal (use sinelon) -//#define FX_MODE_SINELON_RAINBOW 94 // candidate for removal (use sinelon) +//#define FX_MODE_SINELON_DUAL 93 // removed in 0.16, use Sinelon with check 2 +//#define FX_MODE_SINELON_RAINBOW 94 // removed in 0.16, use Sinelon with check 1 #define FX_MODE_POPCORN 95 #define FX_MODE_DRIP 96 #define FX_MODE_PLASMA 97 #define FX_MODE_PERCENT 98 -//#define FX_MODE_RIPPLE_RAINBOW 99 // candidate for removal (use ripple) +//#define FX_MODE_RIPPLE_RAINBOW 99 // removed in 0.16, use Sinelon with check 1 #define FX_MODE_HEARTBEAT 100 #define FX_MODE_PACIFICA 101 -//#define FX_MODE_CANDLE_MULTI 102 // candidate for removal (use candle with multi select) -//#define FX_MODE_SOLID_GLITTER 103 // candidate for removal (use glitter) +//#define FX_MODE_CANDLE_MULTI 102 // removed in 0.16, use Candle with check 3 +//#define FX_MODE_SOLID_GLITTER 103 // removed in 0.16, use Glitter #define FX_MODE_SUNRISE 104 #define FX_MODE_PHASED 105 #define FX_MODE_TWINKLEUP 106 @@ -244,24 +244,24 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_PHASEDNOISE 109 #define FX_MODE_FLOW 110 #define FX_MODE_CHUNCHUN 111 -#define FX_MODE_DANCING_SHADOWS 112 +#define FX_MODE_DANCING_SHADOWS 112 // alternative: PS Dancing Shadows #define FX_MODE_WASHING_MACHINE 113 #define FX_MODE_2DPLASMAROTOZOOM 114 // was Candy Cane prior to 0.14 (use Chase 2) #define FX_MODE_BLENDS 115 #define FX_MODE_TV_SIMULATOR 116 -//#define FX_MODE_DYNAMIC_SMOOTH 117 // candidate for removal (check3 in dynamic) +//#define FX_MODE_DYNAMIC_SMOOTH 117 // removed in 0.16, use Danamic with check3 // new 0.14 2D effects -#define FX_MODE_2DSPACESHIPS 118 //gap fill -#define FX_MODE_2DCRAZYBEES 119 //gap fill -#define FX_MODE_2DGHOSTRIDER 120 //gap fill -#define FX_MODE_2DBLOBS 121 //gap fill -#define FX_MODE_2DSCROLLTEXT 122 //gap fill -#define FX_MODE_2DDRIFTROSE 123 //gap fill -#define FX_MODE_2DDISTORTIONWAVES 124 //gap fill -#define FX_MODE_2DSOAP 125 //gap fill -#define FX_MODE_2DOCTOPUS 126 //gap fill -#define FX_MODE_2DWAVINGCELL 127 //gap fill +#define FX_MODE_2DSPACESHIPS 118 +#define FX_MODE_2DCRAZYBEES 119 +#define FX_MODE_2DGHOSTRIDER 120 // alternative: PS Ghost Rider +#define FX_MODE_2DBLOBS 121 // alternative: PS Blobs +#define FX_MODE_2DSCROLLTEXT 122 +#define FX_MODE_2DDRIFTROSE 123 +#define FX_MODE_2DDISTORTIONWAVES 124 +#define FX_MODE_2DSOAP 125 +#define FX_MODE_2DOCTOPUS 126 +#define FX_MODE_2DWAVINGCELL 127 // WLED-SR effects (SR compatible IDs !!!) #define FX_MODE_PIXELS 128 From 14f55cdedffb7db3709ee5d45e89c0ae94902ee2 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Sat, 22 Feb 2025 13:28:37 +0100 Subject: [PATCH 06/11] parameter renaming and some cleanup --- wled00/FX.cpp | 47 +++++++++++++++-------------------------------- wled00/FX.h | 6 +++--- 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index afa4db9ec8..6c3c3d6f44 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -500,7 +500,7 @@ uint16_t mode_theater_chase() { } return FRAMETIME; } -static const char _data_FX_MODE_THEATER_CHASE[] PROGMEM = "Theater@!,Gap size,,,,Animate palette,,Chase;!,!;!;;o1=0,o3=0"; +static const char _data_FX_MODE_THEATER_CHASE[] PROGMEM = "Theater@!,Gap size,,,,Rainbow,,Theater;!,!;!;;o1=0,o3=1"; /* @@ -539,7 +539,7 @@ static uint16_t mode_running_lights() { return FRAMETIME; } -static const char _data_FX_MODE_RUNNING_LIGHTS[] PROGMEM = "Running@!,Width,,,,Animate palette,Dual,Saw;L,!,R;!"; +static const char _data_FX_MODE_RUNNING_LIGHTS[] PROGMEM = "Running@!,Width,,,,Rainbow,Dual,Saw;L,!,R;!"; /* @@ -579,12 +579,13 @@ static const char _data_FX_MODE_TWINKLE[] PROGMEM = "Twinkle@!,!;!,!;!;;m12=0"; /* - * Dissolve function + * Dissolve function: Blink several LEDs on and then off */ -uint16_t dissolve(uint32_t color) { +uint16_t mode_dissolve(void) { unsigned dataSize = sizeof(uint32_t) * SEGLEN; if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed uint32_t* pixels = reinterpret_cast(SEGENV.data); + uint32_t color = SEGMENT.check1 ? SEGMENT.color_wheel(hw_random8()) : SEGCOLOR(0); if (SEGENV.call == 0) { for (unsigned i = 0; i < SEGLEN; i++) pixels[i] = SEGCOLOR(1); @@ -621,26 +622,8 @@ uint16_t dissolve(uint32_t color) { return FRAMETIME; } - - -/* - * Blink several LEDs on and then off - */ -uint16_t mode_dissolve(void) { - return dissolve(SEGMENT.check1 ? SEGMENT.color_wheel(hw_random8()) : SEGCOLOR(0)); -} static const char _data_FX_MODE_DISSOLVE[] PROGMEM = "Dissolve@Repeat speed,Dissolve speed,,,,Random;!,!;!"; - -/* - * Blink several LEDs on and then off in random colors - */ -//uint16_t mode_dissolve_random(void) { -// return dissolve(SEGMENT.color_wheel(hw_random8())); -//} -//static const char _data_FX_MODE_DISSOLVE_RANDOM[] PROGMEM = "Dissolve Rnd@Repeat speed,Dissolve speed;,!;!"; - - /* * Blinks one LED at a time. * Inspired by www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/ @@ -662,7 +645,7 @@ uint16_t mode_sparkle(void) { SEGMENT.setPixelColor(SEGENV.aux0, SEGCOLOR(0)); return FRAMETIME; } -static const char _data_FX_MODE_SPARKLE[] PROGMEM = "Sparkle@!,,,,,Animate palette,Overlay;!,!;!;;m12=0,01=0"; +static const char _data_FX_MODE_SPARKLE[] PROGMEM = "Sparkle@!,,,,,Move,Overlay;!,!;!;;m12=0,01=0"; /* @@ -687,7 +670,7 @@ uint16_t mode_flash_sparkle(void) { } return FRAMETIME; } -static const char _data_FX_MODE_FLASH_SPARKLE[] PROGMEM = "Sparkle Dark@!,!,,,,Animate palette,Overlay;Bg,Fx;!;;m12=0"; +static const char _data_FX_MODE_FLASH_SPARKLE[] PROGMEM = "Sparkle Dark@!,!,,,,Move,Overlay;Bg,Fx;!;;m12=0"; /* @@ -715,7 +698,7 @@ uint16_t mode_hyper_sparkle(void) { } return FRAMETIME; } -static const char _data_FX_MODE_HYPER_SPARKLE[] PROGMEM = "Sparkle+@!,!,,,,Animate palette,Overlay;Bg,Fx;!;;m12=0"; +static const char _data_FX_MODE_HYPER_SPARKLE[] PROGMEM = "Sparkle+@!,!,,,,Move,Overlay;Bg,Fx;!;;m12=0"; /* @@ -749,7 +732,7 @@ uint16_t mode_multi_strobe(void) { return FRAMETIME; } -static const char _data_FX_MODE_MULTI_STROBE[] PROGMEM = "Strobe Mega@!,!,,,,Animate palette;!,!;!;01;o1=0"; +static const char _data_FX_MODE_MULTI_STROBE[] PROGMEM = "Strobe Mega@!,!,,,,Move;!,!;!;01;o1=0"; /* @@ -1031,7 +1014,7 @@ uint16_t mode_chase_flash(void) { } return delay; } -static const char _data_FX_MODE_CHASE_FLASH[] PROGMEM = "Chase Flash@!,,,,,Animate palette;Bg,Fx;!;;o1=0"; +static const char _data_FX_MODE_CHASE_FLASH[] PROGMEM = "Chase Flash@!,,,,,Animate BG;Bg,Fx;!;;o1=0"; /* @@ -1156,7 +1139,7 @@ uint16_t mode_larson_scanner(void) { } return FRAMETIME; } -static const char _data_FX_MODE_LARSON_SCANNER[] PROGMEM = "Scanner@!,Trail,Delay,,,Animate palette,Bi-delay,Dual;!,!,!;!;;m12=0,c1=0,o1=0,o3=0"; +static const char _data_FX_MODE_LARSON_SCANNER[] PROGMEM = "Scanner@!,Trail,Delay,,,Shift palette,Bi-delay,Dual;!,!,!;!;;m12=0,c1=0,o1=0,o3=0"; /* @@ -3256,7 +3239,7 @@ uint16_t mode_candle() { return FRAMETIME_FIXED; } -static const char _data_FX_MODE_CANDLE[] PROGMEM = "Candle@!,!,,,,,,Multi;!,!;!;01;sx=96,ix=224,pal=0,o3=1"; +static const char _data_FX_MODE_CANDLE[] PROGMEM = "Candle@!,!,,,,,,Multi;!,!;!;01;sx=96,ix=224,pal=0"; #ifdef WLED_PS_DONT_REPLACE_FX /* @@ -10124,7 +10107,7 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_COLORTWINKLE, &mode_colortwinkle, _data_FX_MODE_COLORTWINKLE); addEffect(FX_MODE_LAKE, &mode_lake, _data_FX_MODE_LAKE); addEffect(FX_MODE_METEOR, &mode_meteor, _data_FX_MODE_METEOR); - //addEffect(FX_MODE_METEOR_SMOOTH, &mode_meteor_smooth, _data_FX_MODE_METEOR_SMOOTH); // merged with mode_meteor + //addEffect(FX_MODE_METEOR_SMOOTH, &mode_meteor_smooth, _data_FX_MODE_METEOR_SMOOTH); // merged with mode_meteor addEffect(FX_MODE_RAILWAY, &mode_railway, _data_FX_MODE_RAILWAY); addEffect(FX_MODE_RIPPLE, &mode_ripple, _data_FX_MODE_RIPPLE); addEffect(FX_MODE_TWINKLEFOX, &mode_twinklefox, _data_FX_MODE_TWINKLEFOX); @@ -10136,11 +10119,11 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_SPOTS_FADE, &mode_spots_fade, _data_FX_MODE_SPOTS_FADE); addEffect(FX_MODE_COMET, &mode_comet, _data_FX_MODE_COMET); #ifdef WLED_PS_DONT_REPLACE_FX - addEffect(FX_MODE_MULTI_COMET, &mode_multi_comet, _data_FX_MODE_MULTI_COMET); + addEffect(FX_MODE_MULTI_COMET, &mode_multi_comet, _data_FX_MODE_MULTI_COMET); addEffect(FX_MODE_ROLLINGBALLS, &rolling_balls, _data_FX_MODE_ROLLINGBALLS); addEffect(FX_MODE_SPARKLE, &mode_sparkle, _data_FX_MODE_SPARKLE); addEffect(FX_MODE_GLITTER, &mode_glitter, _data_FX_MODE_GLITTER); - addEffect(FX_MODE_SOLID_GLITTER, &mode_solid_glitter, _data_FX_MODE_SOLID_GLITTER); + //addEffect(FX_MODE_SOLID_GLITTER, &mode_solid_glitter, _data_FX_MODE_SOLID_GLITTER); addEffect(FX_MODE_STARBURST, &mode_starburst, _data_FX_MODE_STARBURST); addEffect(FX_MODE_DANCING_SHADOWS, &mode_dancing_shadows, _data_FX_MODE_DANCING_SHADOWS); addEffect(FX_MODE_FIRE_2012, &mode_fire_2012, _data_FX_MODE_FIRE_2012); diff --git a/wled00/FX.h b/wled00/FX.h index 3c73a8336b..66bb0a2f73 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -146,7 +146,7 @@ extern byte realtimeMode; // used in getMappedPixelIndex() //#define FX_MODE_DUAL_SCAN 11 // removed in 0.16, use Scan with check #define FX_MODE_FADE 12 #define FX_MODE_THEATER_CHASE 13 -//#define FX_MODE_THEATER_CHASE_RAINBOW 14 // removed in 0.16, use Theater with check +//#define FX_MODE_THEATER_CHASE_RAINBOW 14 // removed in 0.16, use Theater with check 1 #define FX_MODE_RUNNING_LIGHTS 15 //#define FX_MODE_SAW 16 // removed in 0.16, use Running with with check 3 #define FX_MODE_TWINKLE 17 @@ -169,7 +169,7 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_COLORFUL 34 #define FX_MODE_TRAFFIC_LIGHT 35 #define FX_MODE_COLOR_SWEEP_RANDOM 36 -//#define FX_MODE_RUNNING_COLOR 37 // removed in 0.16, use Theater +//#define FX_MODE_RUNNING_COLOR 37 // removed in 0.16, use Theater without check 3 #define FX_MODE_AURORA 38 #define FX_MODE_RUNNING_RANDOM 39 #define FX_MODE_LARSON_SCANNER 40 @@ -231,7 +231,7 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_DRIP 96 #define FX_MODE_PLASMA 97 #define FX_MODE_PERCENT 98 -//#define FX_MODE_RIPPLE_RAINBOW 99 // removed in 0.16, use Sinelon with check 1 +//#define FX_MODE_RIPPLE_RAINBOW 99 // removed in 0.16, use Ripple with check 1 #define FX_MODE_HEARTBEAT 100 #define FX_MODE_PACIFICA 101 //#define FX_MODE_CANDLE_MULTI 102 // removed in 0.16, use Candle with check 3 From 1b7c51a070041dda1201dd24c40358a96b9b1ab8 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Sun, 12 Oct 2025 20:13:39 +0200 Subject: [PATCH 07/11] add legacy mapping, add warning if using legacy FX, fixed ripple FX also - updated FX.h descriptions to match - removed now redundant "Overlay" checkmarks - tested with all FX and workig as intended - renaming sliders in PS Sparkler --- wled00/FX.cpp | 86 ++++++++++++++++++++++------------------- wled00/FX.h | 18 ++++----- wled00/FX_fcn.cpp | 91 ++++++++++++++++++++++++++++++++++++++++++++ wled00/const.h | 2 + wled00/data/index.js | 3 ++ wled00/fcn_declare.h | 2 + wled00/json.cpp | 2 + 7 files changed, 155 insertions(+), 49 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 84274dd79d..2ef979b839 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -460,7 +460,7 @@ uint16_t mode_scan(void) { int size = 1 + ((SEGMENT.intensity * SEGLEN) >> 9); int ledIndex = (prog * ((SEGLEN *2) - size *2)) >> 16; - if (!SEGMENT.check2) SEGMENT.fill(SEGCOLOR(1)); + SEGMENT.fill(SEGCOLOR(1)); int led_offset = ledIndex - (SEGLEN - size); led_offset = abs(led_offset); @@ -478,7 +478,7 @@ uint16_t mode_scan(void) { return FRAMETIME; } -static const char _data_FX_MODE_SCAN[] PROGMEM = "Scan@!,Size,,,,,Overlay,Dual;!,!,!;!;1;o1=0"; +static const char _data_FX_MODE_SCAN[] PROGMEM = "Scan@!,Size,,,,,,Dual;!,!,!;!;1;o1=0"; /* @@ -523,20 +523,20 @@ static const char _data_FX_MODE_RAINBOW_CYCLE[] PROGMEM = "Rainbow@!,Size;;!"; */ uint16_t mode_theater_chase() { const bool animate = SEGMENT.check1; - const bool theatre = SEGMENT.check3; - int width = (theatre ? 3 : 1) + (SEGMENT.intensity >> 4); // window + const bool theater = !SEGMENT.check3; // use chase if check3 = true + int width = (theater ? 3 : 1) + (SEGMENT.intensity >> 4); // window uint32_t cycleTime = 50 + (255 - SEGMENT.speed); uint32_t it = strip.now / cycleTime; for (unsigned i = 0; i < SEGLEN; i++) { - uint32_t c1 = SEGMENT.color_from_palette(i, true, false, 0); + uint32_t c1 = SEGMENT.color_from_palette(i, true, true, 0); uint32_t c2 = SEGCOLOR(1); if (animate) { c1 = SEGMENT.color_wheel(SEGENV.step); // sets moving palette and rainbow for default //unsigned palIdx = animate ? (i+it)%SEGLEN : i; //c1 = SEGMENT.color_from_palette(palIdx, true, animate, 0); } - if (theatre) { + if (theater) { if ((i % width) == SEGENV.aux0) c2 = c1; } else { int pos = (i % (width<<1)); @@ -546,12 +546,12 @@ uint16_t mode_theater_chase() { } if (it != SEGENV.step) { - SEGENV.aux0 = (SEGENV.aux0 +1) % (theatre ? width : (width<<1)); + SEGENV.aux0 = (SEGENV.aux0 +1) % (theater ? width : (width<<1)); SEGENV.step = it; } return FRAMETIME; } -static const char _data_FX_MODE_THEATER_CHASE[] PROGMEM = "Theater@!,Gap size,,,,Rainbow,,Theater;!,!;!;;o1=0,o3=1"; +static const char _data_FX_MODE_THEATER_CHASE[] PROGMEM = "Theater@!,Gap size,,,,Rainbow,,Chase;!,!;!;;"; /* @@ -1163,14 +1163,14 @@ uint16_t mode_larson_scanner(void) { uint32_t cycleTime = 10 + (255 - SEGMENT.speed)*2; uint32_t it = strip.now / cycleTime; - const bool moving = SEGMENT.check1; + const bool moving = SEGMENT.check3; // paint as many pixels as needed for (unsigned i = SEGENV.aux1; i < index; i++) { unsigned j = (SEGENV.aux0) ? i : SEGLEN - 1 - i; unsigned palIdx = moving ? (j+it)%SEGLEN : j; uint32_t c = SEGMENT.color_from_palette(palIdx, true, moving, 0); SEGMENT.setPixelColor(j, c); - if (SEGMENT.check3) { + if (SEGMENT.check1) { SEGMENT.setPixelColor(SEGLEN - 1 - j, SEGCOLOR(2) ? SEGCOLOR(2) : c); } } @@ -1178,7 +1178,7 @@ uint16_t mode_larson_scanner(void) { } return FRAMETIME; } -static const char _data_FX_MODE_LARSON_SCANNER[] PROGMEM = "Scanner@!,Trail,Delay,,,Shift palette,Bi-delay,Dual;!,!,!;!;;m12=0,c1=0,o1=0,o3=0"; +static const char _data_FX_MODE_LARSON_SCANNER[] PROGMEM = "Scanner@!,Trail,Delay,,,Dual,Bi-delay,Move;!,!,!;!;;m12=0,c1=0,o1=0,o3=0"; /* @@ -1369,7 +1369,7 @@ uint16_t mode_two_dots() { unsigned offset = it % SEGLEN; unsigned width = ((SEGLEN*(SEGMENT.intensity+1))>>9); //max width is half the strip if (!width) width = 1; - if (!SEGMENT.check2) SEGMENT.fill(SEGCOLOR(2)); + SEGMENT.fill(SEGCOLOR(2)); const uint32_t color1 = SEGCOLOR(0); const uint32_t color2 = (SEGCOLOR(1) == SEGCOLOR(2)) ? color1 : SEGCOLOR(1); for (unsigned i = 0; i < width; i++) { @@ -1380,7 +1380,7 @@ uint16_t mode_two_dots() { } return FRAMETIME; } -static const char _data_FX_MODE_TWO_DOTS[] PROGMEM = "Two Dots@!,Dot size,,,,,Overlay;1,2,Bg;!"; +static const char _data_FX_MODE_TWO_DOTS[] PROGMEM = "Two Dots@!,Dot size,,,,,;1,2,Bg;!"; /* @@ -1550,7 +1550,7 @@ uint16_t mode_icu(void) { unsigned dest = SEGENV.step & 0xFFFF; unsigned space = (SEGMENT.intensity >> 3) +2; - if (!SEGMENT.check2) SEGMENT.fill(SEGCOLOR(1)); + SEGMENT.fill(SEGCOLOR(1)); byte pindex = map(dest, 0, SEGLEN-SEGLEN/space, 0, 255); uint32_t col = SEGMENT.color_from_palette(pindex, false, false, 0); @@ -1581,7 +1581,7 @@ uint16_t mode_icu(void) { return SPEED_FORMULA_L; } -static const char _data_FX_MODE_ICU[] PROGMEM = "ICU@!,!,,,,,Overlay;!,!;!"; +static const char _data_FX_MODE_ICU[] PROGMEM = "ICU@!,!,,,,,;!,!;!"; /* @@ -1821,7 +1821,7 @@ uint16_t mode_lightning(void) { SEGENV.aux0 = 200; //200ms delay after leader } - if (!SEGMENT.check2) SEGMENT.fill(SEGCOLOR(1)); + SEGMENT.fill(SEGCOLOR(1)); if (SEGENV.aux1 > 3 && !(SEGENV.aux1 & 0x01)) { //flash on even number >2 for (unsigned i = ledstart; i < ledstart + ledlen; i++) @@ -1846,7 +1846,7 @@ uint16_t mode_lightning(void) { } return FRAMETIME; } -static const char _data_FX_MODE_LIGHTNING[] PROGMEM = "Lightning@!,!,,,,,Overlay;!,!;!"; +static const char _data_FX_MODE_LIGHTNING[] PROGMEM = "Lightning@!,!,,,,,;!,!;!"; // combined function from original pride and colorwaves uint16_t mode_colorwaves_pride_base(bool isPride2015) { @@ -2421,7 +2421,6 @@ uint16_t mode_ripple() { Ripple* ripples = reinterpret_cast(SEGENV.data); - if (SEGENV.call == 0) { SEGENV.aux0 = SEGENV.aux1 = hw_random8(); } @@ -2432,10 +2431,17 @@ uint16_t mode_ripple() { } else { SEGENV.aux0--; } - if(SEGMENT.custom1 || SEGMENT.check2) // blur or overlay - SEGMENT.fade_out(250); - else SEGMENT.fill(SEGMENT.check1 ? color_blend(SEGMENT.color_wheel(SEGENV.aux0),BLACK,uint8_t(235)) : SEGCOLOR(1)); - + if (SEGMENT.custom1) { // blur + SEGMENT.fade_out(250-(SEGMENT.custom1>>5)); // fade out to background color + } else { + uint32_t rgbclr; + if(SEGMENT.check1) { // rainbow background + hsv2rgb(CHSV32((uint16_t)(SEGENV.aux0<<7), 255, 100), rgbclr); + } else { + rgbclr = SEGCOLOR(1); + } + SEGMENT.fill(rgbclr); + } //draw wave for (unsigned i = 0; i < maxRipples; i++) { unsigned ripplestate = ripples[i].state; @@ -2479,7 +2485,7 @@ uint16_t mode_ripple() { SEGMENT.blur(SEGMENT.custom1>>1); return FRAMETIME; } -static const char _data_FX_MODE_RIPPLE[] PROGMEM = "Ripple@!,Waves,Blur,,,Rainbow,Overlay;,!;!;12;c1=0"; +static const char _data_FX_MODE_RIPPLE[] PROGMEM = "Ripple@!,Waves,Blur,,,Rainbow;,!;!;12;c1=0"; #undef MAX_RIPPLES @@ -2657,7 +2663,7 @@ uint16_t mode_halloween_eyes() if (!SEGENV.allocateData(sizeof(EyeData))) return mode_static(); //allocation failed EyeData& data = *reinterpret_cast(SEGENV.data); - if (!SEGMENT.check2) SEGMENT.fill(SEGCOLOR(1)); //fill background + SEGMENT.fill(SEGCOLOR(1)); data.state = static_cast(data.state % eyeState::count); unsigned duration = max(uint16_t{1u}, data.duration); @@ -2779,7 +2785,7 @@ uint16_t mode_halloween_eyes() return FRAMETIME; } -static const char _data_FX_MODE_HALLOWEEN_EYES[] PROGMEM = "Halloween Eyes@Eye off time,Eye on time,,,,,Overlay;!,!;!;12"; +static const char _data_FX_MODE_HALLOWEEN_EYES[] PROGMEM = "Halloween Eyes@Eye off time,Eye on time,,,,,;!,!;!;12"; //Speed slider sets amount of LEDs lit, intensity sets unlit @@ -2833,7 +2839,7 @@ static const char _data_FX_MODE_TRI_STATIC_PATTERN[] PROGMEM = "Solid Pattern Tr static uint16_t spots_base(uint16_t threshold) { if (SEGLEN <= 1) return mode_static(); - if (!SEGMENT.check2) SEGMENT.fill(SEGCOLOR(1)); + SEGMENT.fill(SEGCOLOR(1)); unsigned maxZones = SEGLEN >> 2; unsigned zones = 1 + ((SEGMENT.intensity * maxZones) >> 8); @@ -2863,7 +2869,7 @@ uint16_t mode_spots() { return spots_base((255 - SEGMENT.speed) << 8); } -static const char _data_FX_MODE_SPOTS[] PROGMEM = "Spots@Spread,Width,,,,,Overlay;!,!;!"; +static const char _data_FX_MODE_SPOTS[] PROGMEM = "Spots@Spread,Width,,,,,;!,!;!"; //Intensity slider sets number of "lights", LEDs per light fade in and out @@ -2874,7 +2880,7 @@ uint16_t mode_spots_fade() unsigned tr = (t >> 1) + (t >> 2); return spots_base(tr); } -static const char _data_FX_MODE_SPOTS_FADE[] PROGMEM = "Spots Fade@Spread,Width,,,,,Overlay;!,!;!"; +static const char _data_FX_MODE_SPOTS_FADE[] PROGMEM = "Spots Fade@Spread,Width,,,,,;!,!;!"; //each needs 12 bytes typedef struct Ball { @@ -2896,7 +2902,7 @@ uint16_t mode_bouncing_balls(void) { Ball* balls = reinterpret_cast(SEGENV.data); - if (!SEGMENT.check2) SEGMENT.fill(SEGCOLOR(2) ? BLACK : SEGCOLOR(1)); + SEGMENT.fill(SEGCOLOR(2) ? BLACK : SEGCOLOR(1)); // virtualStrip idea by @ewowi (Ewoud Wijma) // requires virtual strip # to be embedded into upper 16 bits of index in setPixelColor() @@ -2957,7 +2963,7 @@ uint16_t mode_bouncing_balls(void) { return FRAMETIME; } -static const char _data_FX_MODE_BOUNCINGBALLS[] PROGMEM = "Bouncing Balls@Gravity,# of balls,,,,,Overlay;!,!,!;!;1;m12=1"; //bar +static const char _data_FX_MODE_BOUNCINGBALLS[] PROGMEM = "Bouncing Balls@Gravity,# of balls,,,,,;!,!,!;!;1;m12=1"; //bar #ifdef WLED_PS_DONT_REPLACE_FX /* @@ -3001,7 +3007,7 @@ static uint16_t rolling_balls(void) { if (SEGMENT.check3) SEGMENT.fade_out(250); // 2-8 pixel trails (optional) else { - if (!SEGMENT.check2) SEGMENT.fill(hasCol2 ? BLACK : SEGCOLOR(1)); // don't fill with background color if user wants to see trails + SEGMENT.fill(hasCol2 ? BLACK : SEGCOLOR(1)); // don't fill with background color if user wants to see trails } for (unsigned i = 0; i < numBalls; i++) { @@ -3058,7 +3064,7 @@ static uint16_t rolling_balls(void) { return FRAMETIME; } -static const char _data_FX_MODE_ROLLINGBALLS[] PROGMEM = "Rolling Balls@!,# of balls,,,,Collide,Overlay,Trails;!,!,!;!;1;m12=1"; //bar +static const char _data_FX_MODE_ROLLINGBALLS[] PROGMEM = "Rolling Balls@!,# of balls,,,,Collide,,Trails;!,!,!;!;1;m12=1"; //bar #endif // WLED_PS_DONT_REPLACE_FX /* @@ -3105,7 +3111,7 @@ static const char _data_FX_MODE_SINELON[] PROGMEM = "Sinelon@!,Trail,,,,Rainbow, //Glitter with palette background, inspired by https://gist.github.com/kriegsman/062e10f7f07ba8518af6 uint16_t mode_glitter() { - if (!SEGMENT.check2) { // use "* Color 1" palette for solid background (replacing "Solid glitter") + if (!SEGMENT.check2) { // use "* Color 1" palette for solid background (replacing "Solid glitter") TODO: check this and remove "overlay" if not needed (or replace with proper name) unsigned counter = 0; if (SEGMENT.speed != 0) { // animate palette @@ -3159,7 +3165,7 @@ uint16_t mode_popcorn(void) { Spark* popcorn = reinterpret_cast(SEGENV.data); bool hasCol2 = SEGCOLOR(2); - if (!SEGMENT.check2) SEGMENT.fill(hasCol2 ? BLACK : SEGCOLOR(1)); + SEGMENT.fill(hasCol2 ? BLACK : SEGCOLOR(1)); struct virtualStrip { static void runStrip(uint16_t stripNr, Spark* popcorn, unsigned usablePopcorns) { @@ -3206,7 +3212,7 @@ uint16_t mode_popcorn(void) { return FRAMETIME; } -static const char _data_FX_MODE_POPCORN[] PROGMEM = "Popcorn@!,!,,,,,Overlay;!,!,!;!;;m12=1"; //bar +static const char _data_FX_MODE_POPCORN[] PROGMEM = "Popcorn@!,!,,,,,;!,!,!;!;;m12=1"; //bar //values close to 100 produce 5Hz flicker, which looks very candle-y //Inspired by https://github.com/avanhanegem/ArduinoCandleEffectNeoPixel @@ -3350,7 +3356,7 @@ uint16_t mode_starburst(void) { } } - if (!SEGMENT.check2) SEGMENT.fill(SEGCOLOR(1)); + SEGMENT.fill(SEGCOLOR(1)); for (unsigned j=0; j(SEGENV.data); - if (!SEGMENT.check2) SEGMENT.fill(SEGCOLOR(1)); + SEGMENT.fill(SEGCOLOR(1)); struct virtualStrip { static void runStrip(uint16_t stripNr, Spark* drops) { @@ -3641,7 +3647,7 @@ uint16_t mode_drip(void) return FRAMETIME; } -static const char _data_FX_MODE_DRIP[] PROGMEM = "Drip@Gravity,# of drips,,,,,Overlay;!,!;!;;m12=1"; //bar +static const char _data_FX_MODE_DRIP[] PROGMEM = "Drip@Gravity,# of drips,,,,,;!,!;!;;m12=1"; //bar /* * Tetris or Stacking (falling bricks) Effect @@ -9646,7 +9652,7 @@ uint16_t mode_particleSparkler(void) { return FRAMETIME; } -static const char _data_FX_MODE_PS_SPARKLER[] PROGMEM = "PS Sparkler@Move,!,Saturation,Blur,Sparklers,Slide,Bounce,Large;,!;!;1;pal=0,sx=255,c1=0,c2=0,c3=6"; +static const char _data_FX_MODE_PS_SPARKLER[] PROGMEM = "PS Sparkler@!,Glow,Saturation,Blur,Sparklers,Slide,Bounce,Large;,!;!;1;pal=0,sx=255,c1=0,c2=0,c3=6"; /* Particle based Hourglass, particles falling at defined intervals diff --git a/wled00/FX.h b/wled00/FX.h index 17328d7cc4..514fc36eb3 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -164,7 +164,7 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_RAINBOW 8 #define FX_MODE_RAINBOW_CYCLE 9 #define FX_MODE_SCAN 10 -//#define FX_MODE_DUAL_SCAN 11 // removed in 0.16, use Scan with check +//#define FX_MODE_DUAL_SCAN 11 // removed in 0.16, use Scan with check 3 #define FX_MODE_FADE 12 #define FX_MODE_THEATER_CHASE 13 //#define FX_MODE_THEATER_CHASE_RAINBOW 14 // removed in 0.16, use Theater with check 1 @@ -172,7 +172,7 @@ extern byte realtimeMode; // used in getMappedPixelIndex() //#define FX_MODE_SAW 16 // removed in 0.16, use Running with with check 3 #define FX_MODE_TWINKLE 17 #define FX_MODE_DISSOLVE 18 -//#define FX_MODE_DISSOLVE_RANDOM 19 // removed in 0.16, use Dissolve with with check 3 +//#define FX_MODE_DISSOLVE_RANDOM 19 // removed in 0.16, use Dissolve with with check 1 #define FX_MODE_SPARKLE 20 // alternative: PS Sparkler #define FX_MODE_FLASH_SPARKLE 21 #define FX_MODE_HYPER_SPARKLE 22 @@ -190,7 +190,7 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_COLORFUL 34 #define FX_MODE_TRAFFIC_LIGHT 35 #define FX_MODE_COLOR_SWEEP_RANDOM 36 -//#define FX_MODE_RUNNING_COLOR 37 // removed in 0.16, use Theater without check 3 +//#define FX_MODE_RUNNING_COLOR 37 // removed in 0.16, use Theater with check 3 #define FX_MODE_AURORA 38 #define FX_MODE_RUNNING_RANDOM 39 #define FX_MODE_LARSON_SCANNER 40 @@ -213,7 +213,7 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_LIGHTNING 57 #define FX_MODE_ICU 58 #define FX_MODE_MULTI_COMET 59 // alternative: PS Pinball with gravity set to 0 -//#define FX_MODE_DUAL_LARSON_SCANNER 60 // removed in 0.16, use Scanner with check 3 +//#define FX_MODE_DUAL_LARSON_SCANNER 60 // removed in 0.16, use Scanner with check 1 #define FX_MODE_RANDOM_CHASE 61 #define FX_MODE_OSCILLATE 62 #define FX_MODE_PRIDE_2015 63 @@ -230,7 +230,7 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_COLORTWINKLE 74 #define FX_MODE_LAKE 75 #define FX_MODE_METEOR 76 -//#define FX_MODE_METEOR_SMOOTH 77 // replaced by Meteor +//#define FX_MODE_METEOR_SMOOTH 77 // removed in 0.16, use Meteor with with check 3 #define FX_MODE_COPY 77 #define FX_MODE_RAILWAY 78 #define FX_MODE_RIPPLE 79 @@ -241,7 +241,7 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_TRI_STATIC_PATTERN 84 #define FX_MODE_SPOTS 85 #define FX_MODE_SPOTS_FADE 86 -#define FX_MODE_GLITTER 87 // alternative: PS Sparkler +#define FX_MODE_GLITTER 87 // optional in 0.16, use PS Sparker with s=255, i=0, c1&c2=0, c3 = speed, add to background overlay #define FX_MODE_CANDLE 88 #define FX_MODE_STARBURST 89 // alternative: PS Starburst #define FX_MODE_EXPLODING_FIREWORKS 90 // alternative: PS Fireworks (1D and 2D) @@ -253,11 +253,11 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_DRIP 96 #define FX_MODE_PLASMA 97 #define FX_MODE_PERCENT 98 -//#define FX_MODE_RIPPLE_RAINBOW 99 // removed in 0.16, use Ripple with check 1 +//#define FX_MODE_RIPPLE_RAINBOW 99 // removed in 0.16, use Ripple with check 1 and no blur (c1=0) #define FX_MODE_HEARTBEAT 100 #define FX_MODE_PACIFICA 101 //#define FX_MODE_CANDLE_MULTI 102 // removed in 0.16, use Candle with check 3 -//#define FX_MODE_SOLID_GLITTER 103 // removed in 0.16, use Glitter +//#define FX_MODE_SOLID_GLITTER 103 // removed in 0.16, use PS Sparkler with s=255, i=0, c1&c2=0, c3 = speed #define FX_MODE_SUNRISE 104 #define FX_MODE_PHASED 105 #define FX_MODE_TWINKLEUP 106 @@ -271,7 +271,7 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_2DPLASMAROTOZOOM 114 // was Candy Cane prior to 0.14 (use Chase 2) #define FX_MODE_BLENDS 115 #define FX_MODE_TV_SIMULATOR 116 -//#define FX_MODE_DYNAMIC_SMOOTH 117 // removed in 0.16, use Danamic with check3 +//#define FX_MODE_DYNAMIC_SMOOTH 117 // removed in 0.16, use Danamic with check1 // new 0.14 2D effects #define FX_MODE_2DSPACESHIPS 118 diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index 2d98dc0447..ed3a876d0a 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -2046,6 +2046,97 @@ bool WS2812FX::deserializeMap(unsigned n) { return (customMappingSize > 0); } +void remapLegacyEffect(uint8_t effectId, Segment &seg) +{ + // remap legacy effect IDs to current ones and set appropriate flags and sliders + // see FX.h and FX.cpp PR #4573 + // set user warning if using legacy effect IDs + int warning = WARN_LEGACY_FX; + switch (effectId) { + // Dual Scan -> Scan with check3 + case 11: // FX_MODE_DUAL_SCAN + seg.setMode(10); // FX_MODE_SCAN + seg.check3 = 1; + break; + // Theater Chase Rainbow -> Theater with check1 + case 14: // FX_MODE_THEATER_CHASE_RAINBOW + seg.setMode(13); // FX_MODE_THEATER_CHASE + seg.check1 = 1; + break; + // Saw -> Running Lights with check3 + case 16: // FX_MODE_SAW + seg.setMode(15); // FX_MODE_RUNNING_LIGHTS + seg.check3 = 1; + break; + // Dissolve Random -> Dissolve with check3 + case 19: // FX_MODE_DISSOLVE_RANDOM + seg.setMode(18); // FX_MODE_DISSOLVE + seg.check1 = 1; + break; + // Running Color (Chase 2) -> Theater with check3 + case 37: // FX_MODE_RUNNING_COLOR + seg.setMode(13); // FX_MODE_THEATER_CHASE + seg.check3 = 1; + break; + // Running Dual -> Running Lights with check2 + case 52: // FX_MODE_RUNNING_DUAL + seg.setMode(15); // FX_MODE_RUNNING_LIGHTS + seg.check2 = 1; + break; + // Dual Larson Scanner -> Larson Scanner with check1 + case 60: // FX_MODE_DUAL_LARSON_SCANNER + seg.setMode(40); // FX_MODE_LARSON_SCANNER + seg.check1 = 1; + break; + // Meteor Smooth -> Meteor with check3 + case 77: // FX_MODE_METEOR_SMOOTH + seg.setMode(76); // FX_MODE_METEOR + seg.check3 = 1; + break; + // Sinelon Dual -> Sinelon with check2 + case 93: // FX_MODE_SINELON_DUAL + seg.setMode(92); // FX_MODE_SINELON + seg.check2 = 1; + break; + // Sinelon Rainbow -> Sinelon with check1 + case 94: // FX_MODE_SINELON_RAINBOW + seg.setMode(92); // FX_MODE_SINELON + seg.check1 = 1; + break; + // Ripple Rainbow -> Ripple with check1 + case 99: // FX_MODE_RIPPLE_RAINBOW + seg.setMode(79); // FX_MODE_RIPPLE + seg.check1 = 1; + seg.custom1 = 0; + break; + // Candle Multi -> Candle with check3 + case 102: // FX_MODE_CANDLE_MULTI + seg.setMode(88); // FX_MODE_CANDLE + seg.check3 = 1; + break; + // Solid Glitter -> PS Sparkler with s=255, i=0, c1&c2=0, c3 = speed + case 103: // FX_MODE_SOLID_GLITTER + seg.setMode(206); // FX_MODE_PSSPARKLER + seg.custom1 = 0; + seg.custom2 = 0; + seg.custom3 = seg.speed; // copy set speed to custom3 + seg.speed = 255; // now override speed + seg.intensity = 0; + break; + // Dynamic Smooth -> Dynamic with check1 + case 117: // FX_MODE_DYNAMIC_SMOOTH + seg.setMode(7); // FX_MODE_DYNAMIC + seg.check1 = 1; + break; + + default: + // no remapping needed + warning = ERR_NONE; + break; + } + if (warning) + errorFlag = warning; // inform user on UI +} const char JSON_mode_names[] PROGMEM = R"=====(["FX names moved"])====="; const char JSON_palette_names[] PROGMEM = R"=====([ diff --git a/wled00/const.h b/wled00/const.h index 8891dfcaee..8291fb5f01 100644 --- a/wled00/const.h +++ b/wled00/const.h @@ -438,6 +438,8 @@ static_assert(WLED_MAX_BUSSES <= 32, "WLED_MAX_BUSSES exceeds hard limit"); #define ERR_OVERTEMP 30 // An attached temperature sensor has measured above threshold temperature (not implemented) #define ERR_OVERCURRENT 31 // An attached current sensor has measured a current above the threshold (not implemented) #define ERR_UNDERVOLT 32 // An attached voltmeter has measured a voltage below the threshold (not implemented) +//warning codes (non-fatal) +#define WARN_LEGACY_FX 200 // Effect is legacy and mapped to a new ID // Timer mode types #define NL_MODE_SET 0 //After nightlight time elapsed, set to target brightness diff --git a/wled00/data/index.js b/wled00/data/index.js index 2514f03fb1..f151f9597a 100644 --- a/wled00/data/index.js +++ b/wled00/data/index.js @@ -1550,6 +1550,9 @@ function readState(s,command=false) case 19: errstr = "A filesystem error has occured."; break; + case 200: + errstr = "Using deprecated FX! Please update your preset."; + break; } showToast('Error ' + s.error + ": " + errstr, true); } diff --git a/wled00/fcn_declare.h b/wled00/fcn_declare.h index 1d81655d6d..f9f5362fad 100644 --- a/wled00/fcn_declare.h +++ b/wled00/fcn_declare.h @@ -227,6 +227,8 @@ void savePreset(byte index, const char* pname = nullptr, JsonObject saveobj = Js inline void saveTemporaryPreset() {savePreset(255);}; void deletePreset(byte index); bool getPresetName(byte index, String& name); +// legacy effect remapping, can be removed in 0.17 +void remapLegacyEffect(uint8_t effectId, Segment &seg); //remote.cpp void handleWiZdata(uint8_t *incomingData, size_t len); diff --git a/wled00/json.cpp b/wled00/json.cpp index d2b771c590..f749519cee 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -300,6 +300,8 @@ static bool deserializeSegment(JsonObject elem, byte it, byte presetId = 0) seg.check2 = getBoolVal(elem["o2"], seg.check2); seg.check3 = getBoolVal(elem["o3"], seg.check3); + remapLegacyEffect(fx, seg); //TODO: check if this is working + uint8_t blend = seg.blendMode; getVal(elem["bm"], blend, 0, 15); // we can't pass reference to bitfield seg.blendMode = constrain(blend, 0, 15); From 7f244e89d4a95afc6d5c99a4a365064989089773 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Mon, 13 Oct 2025 07:58:16 +0200 Subject: [PATCH 08/11] consolidate blink/strobe variants into a single Blink FX --- wled00/FX.cpp | 66 ++++++++++------------------------------------- wled00/FX.h | 16 ++++++------ wled00/FX_fcn.cpp | 15 +++++++++++ 3 files changed, 37 insertions(+), 60 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 2ef979b839..bd19f30400 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -179,72 +179,37 @@ static const char _data_FX_MODE_COPY[] PROGMEM = "Copy Segment@,Color shift,Ligh /* - * Blink/strobe function - * Alternate between color1 and color2 - * if(strobe == true) then create a strobe effect + * Blink/strobe Effect + * Alternate between palette color(s) and color2 */ -uint16_t blink(uint32_t color1, uint32_t color2, bool strobe, bool do_palette) { +uint16_t mode_blink(void) { uint32_t cycleTime = (255 - SEGMENT.speed)*20; uint32_t onTime = FRAMETIME; - if (!strobe) onTime += ((cycleTime * SEGMENT.intensity) >> 8); + onTime += ((cycleTime * SEGMENT.intensity) >> 8); cycleTime += FRAMETIME*2; uint32_t it = strip.now / cycleTime; uint32_t rem = strip.now % cycleTime; bool on = false; - if (it != SEGENV.step //new iteration, force on state for one frame, even if set time is too brief - || rem <= onTime) { + if (it != SEGENV.step || rem <= onTime) { // on new iteration, force on state for one frame, even if set time is too brief on = true; } SEGENV.step = it; //save previous iteration - uint32_t color = on ? color1 : color2; - if (color == color1 && do_palette) - { - for (unsigned i = 0; i < SEGLEN; i++) { - SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); + if (on) { + if(SEGMENT.check1) { + SEGMENT.fill(SEGMENT.color_wheel(SEGENV.call & 0xFF)); // single color, cycling through the palette + } else { + for (unsigned i = 0; i < SEGLEN; i++) { + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, false, 0)); // palette gradient + } } - } else SEGMENT.fill(color); + } else SEGMENT.fill(SEGCOLOR(1)); return FRAMETIME; } - - -/* - * Normal blinking. Intensity sets duty cycle. - */ -uint16_t mode_blink(void) { - return blink(SEGCOLOR(0), SEGCOLOR(1), false, true); -} -static const char _data_FX_MODE_BLINK[] PROGMEM = "Blink@!,Duty cycle;!,!;!;01"; - - -/* - * Classic Blink effect. Cycling through the rainbow. - */ -uint16_t mode_blink_rainbow(void) { - return blink(SEGMENT.color_wheel(SEGENV.call & 0xFF), SEGCOLOR(1), false, false); -} -static const char _data_FX_MODE_BLINK_RAINBOW[] PROGMEM = "Blink Rainbow@Frequency,Blink duration;!,!;!;01"; - - -/* - * Classic Strobe effect. - */ -uint16_t mode_strobe(void) { - return blink(SEGCOLOR(0), SEGCOLOR(1), true, true); -} -static const char _data_FX_MODE_STROBE[] PROGMEM = "Strobe@!;!,!;!;01"; - - -/* - * Classic Strobe effect. Cycling through the rainbow. - */ -uint16_t mode_strobe_rainbow(void) { - return blink(SEGMENT.color_wheel(SEGENV.call & 0xFF), SEGCOLOR(1), true, false); -} -static const char _data_FX_MODE_STROBE_RAINBOW[] PROGMEM = "Strobe Rainbow@!;,!;!;01"; +static const char _data_FX_MODE_BLINK[] PROGMEM = "Blink@!,Interval,,,,Cycle;!,!;!;01"; /* @@ -10634,10 +10599,7 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_SPARKLE, &mode_sparkle, _data_FX_MODE_SPARKLE); addEffect(FX_MODE_FLASH_SPARKLE, &mode_flash_sparkle, _data_FX_MODE_FLASH_SPARKLE); addEffect(FX_MODE_HYPER_SPARKLE, &mode_hyper_sparkle, _data_FX_MODE_HYPER_SPARKLE); - addEffect(FX_MODE_STROBE, &mode_strobe, _data_FX_MODE_STROBE); - addEffect(FX_MODE_STROBE_RAINBOW, &mode_strobe_rainbow, _data_FX_MODE_STROBE_RAINBOW); addEffect(FX_MODE_MULTI_STROBE, &mode_multi_strobe, _data_FX_MODE_MULTI_STROBE); - addEffect(FX_MODE_BLINK_RAINBOW, &mode_blink_rainbow, _data_FX_MODE_BLINK_RAINBOW); addEffect(FX_MODE_ANDROID, &mode_android, _data_FX_MODE_ANDROID); addEffect(FX_MODE_CHASE_COLOR, &mode_chase_color, _data_FX_MODE_CHASE_COLOR); addEffect(FX_MODE_CHASE_RANDOM, &mode_chase_random, _data_FX_MODE_CHASE_RANDOM); diff --git a/wled00/FX.h b/wled00/FX.h index 514fc36eb3..77302bfd71 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -169,17 +169,17 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_THEATER_CHASE 13 //#define FX_MODE_THEATER_CHASE_RAINBOW 14 // removed in 0.16, use Theater with check 1 #define FX_MODE_RUNNING_LIGHTS 15 -//#define FX_MODE_SAW 16 // removed in 0.16, use Running with with check 3 +//#define FX_MODE_SAW 16 // removed in 0.16, use Running with check 3 #define FX_MODE_TWINKLE 17 #define FX_MODE_DISSOLVE 18 -//#define FX_MODE_DISSOLVE_RANDOM 19 // removed in 0.16, use Dissolve with with check 1 +//#define FX_MODE_DISSOLVE_RANDOM 19 // removed in 0.16, use Dissolve with check 1 #define FX_MODE_SPARKLE 20 // alternative: PS Sparkler #define FX_MODE_FLASH_SPARKLE 21 #define FX_MODE_HYPER_SPARKLE 22 -#define FX_MODE_STROBE 23 -#define FX_MODE_STROBE_RAINBOW 24 +//#define FX_MODE_STROBE 23 // removed in 0.16, use Blink with intensity = 0 +//#define FX_MODE_STROBE_RAINBOW 24 // removed in 0.16, use Blink with check 1 & intensity = 0 #define FX_MODE_MULTI_STROBE 25 -#define FX_MODE_BLINK_RAINBOW 26 +//#define FX_MODE_BLINK_RAINBOW 26 // removed in 0.16, use Blink with check 1 #define FX_MODE_ANDROID 27 #define FX_MODE_CHASE_COLOR 28 #define FX_MODE_CHASE_RANDOM 29 @@ -205,7 +205,7 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_FAIRY 49 //was Police All prior to 0.13.0-b6 (use "Two Dots" with Red/Blue and full intensity) #define FX_MODE_TWO_DOTS 50 #define FX_MODE_FAIRYTWINKLE 51 //was Two Areas prior to 0.13.0-b6 (use "Two Dots" with full intensity) -//#define FX_MODE_RUNNING_DUAL 52 // removed in 0.16, use Running with with check 2 +//#define FX_MODE_RUNNING_DUAL 52 // removed in 0.16, use Running with check 2 #define FX_MODE_IMAGE 53 #define FX_MODE_TRICOLOR_CHASE 54 #define FX_MODE_TRICOLOR_WIPE 55 @@ -230,7 +230,7 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_COLORTWINKLE 74 #define FX_MODE_LAKE 75 #define FX_MODE_METEOR 76 -//#define FX_MODE_METEOR_SMOOTH 77 // removed in 0.16, use Meteor with with check 3 +//#define FX_MODE_METEOR_SMOOTH 77 // removed in 0.16, use Meteor with check 3 #define FX_MODE_COPY 77 #define FX_MODE_RAILWAY 78 #define FX_MODE_RIPPLE 79 @@ -271,7 +271,7 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_2DPLASMAROTOZOOM 114 // was Candy Cane prior to 0.14 (use Chase 2) #define FX_MODE_BLENDS 115 #define FX_MODE_TV_SIMULATOR 116 -//#define FX_MODE_DYNAMIC_SMOOTH 117 // removed in 0.16, use Danamic with check1 +//#define FX_MODE_DYNAMIC_SMOOTH 117 // removed in 0.16, use Dynamic with check1 // new 0.14 2D effects #define FX_MODE_2DSPACESHIPS 118 diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index ed3a876d0a..1a60c89de2 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -2073,6 +2073,21 @@ void remapLegacyEffect(uint8_t effectId, Segment &seg) seg.setMode(18); // FX_MODE_DISSOLVE seg.check1 = 1; break; + // Strobe Rainbow -> Blink with i=0, o1=1 + case 24: // FX_MODE_STROBE_RAINBOW + seg.check1 = 1; + // fallthrough + // Strobe -> Blink with i=0 + case 23: // FX_MODE_STROBE + seg.setMode(1); // FX_MODE_BLINK + seg.intensity = 0; + break; + // Strobe -> Blink with i=0 + case 26: // FX_MODE_BLINK_RAINBOW + seg.setMode(1); // FX_MODE_BLINK + seg.check1 = 1; + break; + // Running Color (Chase 2) -> Theater with check3 case 37: // FX_MODE_RUNNING_COLOR seg.setMode(13); // FX_MODE_THEATER_CHASE From a37f077986e285ab12ef7fe39fa696ecfd1e460e Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Mon, 13 Oct 2025 08:06:21 +0200 Subject: [PATCH 09/11] typo --- wled00/FX.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wled00/FX.h b/wled00/FX.h index 77302bfd71..ead2c6fddb 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -241,7 +241,7 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_TRI_STATIC_PATTERN 84 #define FX_MODE_SPOTS 85 #define FX_MODE_SPOTS_FADE 86 -#define FX_MODE_GLITTER 87 // optional in 0.16, use PS Sparker with s=255, i=0, c1&c2=0, c3 = speed, add to background overlay +#define FX_MODE_GLITTER 87 // optional in 0.16, use PS Sparkler with s=255, i=0, c1&c2=0, c3 = speed, add to background overlay #define FX_MODE_CANDLE 88 #define FX_MODE_STARBURST 89 // alternative: PS Starburst #define FX_MODE_EXPLODING_FIREWORKS 90 // alternative: PS Fireworks (1D and 2D) From a866fff99efd93473594411876c94ec9e6079374 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Mon, 13 Oct 2025 19:52:51 +0200 Subject: [PATCH 10/11] consolidate wipeX and sweepX effecs into Sweep with checkmarks - also simplified get_random_wheel_index() --- wled00/FX.cpp | 70 ++++++----------------------------------------- wled00/FX.h | 6 ++-- wled00/FX_fcn.cpp | 15 +++++++++- wled00/util.cpp | 10 ++----- 4 files changed, 27 insertions(+), 74 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index bd19f30400..86ca31be4c 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -213,12 +213,12 @@ static const char _data_FX_MODE_BLINK[] PROGMEM = "Blink@!,Interval,,,,Cycle;!,! /* - * Color wipe function - * LEDs are turned on (color1) in sequence, then turned off (color2) in sequence. - * if (bool rev == true) then LEDs are turned off in reverse order + * Lights all LEDs one after another or in reverse. Can use random colors from palette. */ -uint16_t color_wipe(bool rev, bool useRandomColors) { +uint16_t mode_color_wipe(void) { if (SEGLEN <= 1) return mode_static(); + bool useRandomColors = SEGMENT.check1; + bool rev = SEGMENT.check2; uint32_t cycleTime = 750 + (255 - SEGMENT.speed)*150; uint32_t perc = strip.now % cycleTime; unsigned prog = (perc * 65535) / cycleTime; @@ -246,9 +246,6 @@ uint16_t color_wipe(bool rev, bool useRandomColors) { } unsigned ledIndex = (prog * SEGLEN) >> 15; - uint16_t rem = (prog * SEGLEN) * 2; //mod 0xFFFF by truncating - rem /= (SEGMENT.intensity +1); - if (rem > 255) rem = 255; uint32_t col1 = useRandomColors? SEGMENT.color_wheel(SEGENV.aux1) : SEGCOLOR(1); for (unsigned i = 0; i < SEGLEN; i++) @@ -262,49 +259,14 @@ uint16_t color_wipe(bool rev, bool useRandomColors) { } else { SEGMENT.setPixelColor(index, back? col0 : col1); - if (i == ledIndex) SEGMENT.setPixelColor(index, color_blend(back? col0 : col1, back? col1 : col0, uint8_t(rem))); } } return FRAMETIME; } - - -/* - * Lights all LEDs one after another. - */ -uint16_t mode_color_wipe(void) { - return color_wipe(false, false); -} -static const char _data_FX_MODE_COLOR_WIPE[] PROGMEM = "Wipe@!,!;!,!;!"; - - -/* - * Lights all LEDs one after another. Turns off opposite - */ -uint16_t mode_color_sweep(void) { - return color_wipe(true, false); -} -static const char _data_FX_MODE_COLOR_SWEEP[] PROGMEM = "Sweep@!,!;!,!;!"; - - -/* - * Turns all LEDs after each other to a random color. - * Then starts over with another color. - */ -uint16_t mode_color_wipe_random(void) { - return color_wipe(false, true); -} -static const char _data_FX_MODE_COLOR_WIPE_RANDOM[] PROGMEM = "Wipe Random@!;;!"; - - -/* - * Random color introduced alternating from start and end of strip. - */ -uint16_t mode_color_sweep_random(void) { - return color_wipe(true, true); -} -static const char _data_FX_MODE_COLOR_SWEEP_RANDOM[] PROGMEM = "Sweep Random@!;;!"; - +static const char _data_FX_MODE_COLOR_WIPE[] PROGMEM = "Wipe@!,,,,,Random,Sweep;!,!;!"; +// Wipe Random: use Wipe with check 1 +// Sweep use Wipe with check 2 +// Sweep Random: use Wipe with check 1 and check 2 /* * Lights all LEDs up in one random color. Then switches them @@ -10580,22 +10542,16 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_BLINK, &mode_blink, _data_FX_MODE_BLINK); addEffect(FX_MODE_BREATH, &mode_breath, _data_FX_MODE_BREATH); addEffect(FX_MODE_COLOR_WIPE, &mode_color_wipe, _data_FX_MODE_COLOR_WIPE); - addEffect(FX_MODE_COLOR_WIPE_RANDOM, &mode_color_wipe_random, _data_FX_MODE_COLOR_WIPE_RANDOM); addEffect(FX_MODE_RANDOM_COLOR, &mode_random_color, _data_FX_MODE_RANDOM_COLOR); - addEffect(FX_MODE_COLOR_SWEEP, &mode_color_sweep, _data_FX_MODE_COLOR_SWEEP); addEffect(FX_MODE_DYNAMIC, &mode_dynamic, _data_FX_MODE_DYNAMIC); addEffect(FX_MODE_RAINBOW, &mode_rainbow, _data_FX_MODE_RAINBOW); addEffect(FX_MODE_RAINBOW_CYCLE, &mode_rainbow_cycle, _data_FX_MODE_RAINBOW_CYCLE); addEffect(FX_MODE_SCAN, &mode_scan, _data_FX_MODE_SCAN); - //addEffect(FX_MODE_DUAL_SCAN, &mode_dual_scan, _data_FX_MODE_DUAL_SCAN); addEffect(FX_MODE_FADE, &mode_fade, _data_FX_MODE_FADE); addEffect(FX_MODE_THEATER_CHASE, &mode_theater_chase, _data_FX_MODE_THEATER_CHASE); - //addEffect(FX_MODE_THEATER_CHASE_RAINBOW, &mode_theater_chase_rainbow, _data_FX_MODE_THEATER_CHASE_RAINBOW); addEffect(FX_MODE_RUNNING_LIGHTS, &mode_running_lights, _data_FX_MODE_RUNNING_LIGHTS); - //addEffect(FX_MODE_SAW, &mode_saw, _data_FX_MODE_SAW); addEffect(FX_MODE_TWINKLE, &mode_twinkle, _data_FX_MODE_TWINKLE); addEffect(FX_MODE_DISSOLVE, &mode_dissolve, _data_FX_MODE_DISSOLVE); - //addEffect(FX_MODE_DISSOLVE_RANDOM, &mode_dissolve_random, _data_FX_MODE_DISSOLVE_RANDOM); addEffect(FX_MODE_SPARKLE, &mode_sparkle, _data_FX_MODE_SPARKLE); addEffect(FX_MODE_FLASH_SPARKLE, &mode_flash_sparkle, _data_FX_MODE_FLASH_SPARKLE); addEffect(FX_MODE_HYPER_SPARKLE, &mode_hyper_sparkle, _data_FX_MODE_HYPER_SPARKLE); @@ -10609,8 +10565,6 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_CHASE_RAINBOW_WHITE, &mode_chase_rainbow_white, _data_FX_MODE_CHASE_RAINBOW_WHITE); addEffect(FX_MODE_COLORFUL, &mode_colorful, _data_FX_MODE_COLORFUL); addEffect(FX_MODE_TRAFFIC_LIGHT, &mode_traffic_light, _data_FX_MODE_TRAFFIC_LIGHT); - addEffect(FX_MODE_COLOR_SWEEP_RANDOM, &mode_color_sweep_random, _data_FX_MODE_COLOR_SWEEP_RANDOM); - //addEffect(FX_MODE_RUNNING_COLOR, &mode_running_color, _data_FX_MODE_RUNNING_COLOR); addEffect(FX_MODE_AURORA, &mode_aurora, _data_FX_MODE_AURORA); addEffect(FX_MODE_RUNNING_RANDOM, &mode_running_random, _data_FX_MODE_RUNNING_RANDOM); addEffect(FX_MODE_LARSON_SCANNER, &mode_larson_scanner, _data_FX_MODE_LARSON_SCANNER); @@ -10625,7 +10579,6 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_FAIRY, &mode_fairy, _data_FX_MODE_FAIRY); addEffect(FX_MODE_TWO_DOTS, &mode_two_dots, _data_FX_MODE_TWO_DOTS); addEffect(FX_MODE_FAIRYTWINKLE, &mode_fairytwinkle, _data_FX_MODE_FAIRYTWINKLE); - //addEffect(FX_MODE_RUNNING_DUAL, &mode_running_dual, _data_FX_MODE_RUNNING_DUAL); #ifdef WLED_ENABLE_GIF addEffect(FX_MODE_IMAGE, &mode_image, _data_FX_MODE_IMAGE); #endif @@ -10634,7 +10587,6 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_TRICOLOR_FADE, &mode_tricolor_fade, _data_FX_MODE_TRICOLOR_FADE); addEffect(FX_MODE_LIGHTNING, &mode_lightning, _data_FX_MODE_LIGHTNING); addEffect(FX_MODE_ICU, &mode_icu, _data_FX_MODE_ICU); - //addEffect(FX_MODE_DUAL_LARSON_SCANNER, &mode_dual_larson_scanner, _data_FX_MODE_DUAL_LARSON_SCANNER); addEffect(FX_MODE_RANDOM_CHASE, &mode_random_chase, _data_FX_MODE_RANDOM_CHASE); addEffect(FX_MODE_OSCILLATE, &mode_oscillate, _data_FX_MODE_OSCILLATE); addEffect(FX_MODE_JUGGLE, &mode_juggle, _data_FX_MODE_JUGGLE); @@ -10675,17 +10627,12 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_POPCORN, &mode_popcorn, _data_FX_MODE_POPCORN); addEffect(FX_MODE_DRIP, &mode_drip, _data_FX_MODE_DRIP); addEffect(FX_MODE_SINELON, &mode_sinelon, _data_FX_MODE_SINELON); - //addEffect(FX_MODE_SINELON_DUAL, &mode_sinelon_dual, _data_FX_MODE_SINELON_DUAL); - //addEffect(FX_MODE_SINELON_RAINBOW, &mode_sinelon_rainbow, _data_FX_MODE_SINELON_RAINBOW); addEffect(FX_MODE_POPCORN, &mode_popcorn, _data_FX_MODE_POPCORN); addEffect(FX_MODE_DRIP, &mode_drip, _data_FX_MODE_DRIP); addEffect(FX_MODE_PLASMA, &mode_plasma, _data_FX_MODE_PLASMA); addEffect(FX_MODE_PERCENT, &mode_percent, _data_FX_MODE_PERCENT); - //addEffect(FX_MODE_RIPPLE_RAINBOW, &mode_ripple_rainbow, _data_FX_MODE_RIPPLE_RAINBOW); addEffect(FX_MODE_HEARTBEAT, &mode_heartbeat, _data_FX_MODE_HEARTBEAT); addEffect(FX_MODE_PACIFICA, &mode_pacifica, _data_FX_MODE_PACIFICA); - //addEffect(FX_MODE_CANDLE_MULTI, &mode_candle_multi, _data_FX_MODE_CANDLE_MULTI); - //addEffect(FX_MODE_SOLID_GLITTER, &mode_solid_glitter, _data_FX_MODE_SOLID_GLITTER); addEffect(FX_MODE_SUNRISE, &mode_sunrise, _data_FX_MODE_SUNRISE); addEffect(FX_MODE_PHASED, &mode_phased, _data_FX_MODE_PHASED); addEffect(FX_MODE_TWINKLEUP, &mode_twinkleup, _data_FX_MODE_TWINKLEUP); @@ -10697,7 +10644,6 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_WASHING_MACHINE, &mode_washing_machine, _data_FX_MODE_WASHING_MACHINE); addEffect(FX_MODE_BLENDS, &mode_blends, _data_FX_MODE_BLENDS); addEffect(FX_MODE_TV_SIMULATOR, &mode_tv_simulator, _data_FX_MODE_TV_SIMULATOR); - //addEffect(FX_MODE_DYNAMIC_SMOOTH, &mode_dynamic_smooth, _data_FX_MODE_DYNAMIC_SMOOTH); // --- 1D audio effects --- addEffect(FX_MODE_PIXELS, &mode_pixels, _data_FX_MODE_PIXELS); diff --git a/wled00/FX.h b/wled00/FX.h index ead2c6fddb..86d7a73209 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -157,9 +157,9 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_BLINK 1 #define FX_MODE_BREATH 2 #define FX_MODE_COLOR_WIPE 3 -#define FX_MODE_COLOR_WIPE_RANDOM 4 +//#define FX_MODE_COLOR_WIPE_RANDOM 4 // removed in 0.16, use Color Wipe with check 1 #define FX_MODE_RANDOM_COLOR 5 -#define FX_MODE_COLOR_SWEEP 6 +//#define FX_MODE_COLOR_SWEEP 6 // removed in 0.16, use Wipe with check 2 #define FX_MODE_DYNAMIC 7 #define FX_MODE_RAINBOW 8 #define FX_MODE_RAINBOW_CYCLE 9 @@ -189,7 +189,7 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define FX_MODE_CHASE_RAINBOW_WHITE 33 #define FX_MODE_COLORFUL 34 #define FX_MODE_TRAFFIC_LIGHT 35 -#define FX_MODE_COLOR_SWEEP_RANDOM 36 +//#define FX_MODE_COLOR_SWEEP_RANDOM 36 // removed in 0.16, use Wipe with check 1 and check 2 //#define FX_MODE_RUNNING_COLOR 37 // removed in 0.16, use Theater with check 3 #define FX_MODE_AURORA 38 #define FX_MODE_RUNNING_RANDOM 39 diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index 1a60c89de2..b517cc8fa9 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -2053,6 +2053,20 @@ void remapLegacyEffect(uint8_t effectId, Segment &seg) // set user warning if using legacy effect IDs int warning = WARN_LEGACY_FX; switch (effectId) { + // Wipe Random -> Wipe with check1 + case 4: // FX_MODE_COLOR_WIPE_RANDOM + seg.setMode(3); // FX_MODE_COLOR_WIPE + seg.check1 = 1; + break; + // Sweep Random -> Wipe with check1 and check2 + case 36: // FX_MODE_COLOR_SWEEP_RANDOM + seg.check1 = 1; + // fallthrough + // Sweep -> Wipe with check2 + case 6: // FX_MODE_COLOR_SWEEP + seg.setMode(3); // FX_MODE_COLOR_WIPE + seg.check2 = 1; + break; // Dual Scan -> Scan with check3 case 11: // FX_MODE_DUAL_SCAN seg.setMode(10); // FX_MODE_SCAN @@ -2087,7 +2101,6 @@ void remapLegacyEffect(uint8_t effectId, Segment &seg) seg.setMode(1); // FX_MODE_BLINK seg.check1 = 1; break; - // Running Color (Chase 2) -> Theater with check3 case 37: // FX_MODE_RUNNING_COLOR seg.setMode(13); // FX_MODE_THEATER_CHASE diff --git a/wled00/util.cpp b/wled00/util.cpp index ca57712014..23384deb08 100644 --- a/wled00/util.cpp +++ b/wled00/util.cpp @@ -592,14 +592,8 @@ void enumerateLedmaps() { * Returns a new, random color wheel index with a minimum distance of 42 from pos. */ uint8_t get_random_wheel_index(uint8_t pos) { - uint8_t r = 0, x = 0, y = 0, d = 0; - while (d < 42) { - r = hw_random8(); - x = abs(pos - r); - y = 255 - x; - d = MIN(x, y); - } - return r; + uint8_t offset = hw_random8(172); // 256 - 2*42 + return (pos + 42 + offset); } // float version of map() From 9299a07e47e5f592198e1c9ec1753d1f3414285d Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Mon, 13 Oct 2025 20:41:54 +0200 Subject: [PATCH 11/11] remove duplicates --- wled00/FX.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 86ca31be4c..34c7a635cb 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -10552,7 +10552,6 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_RUNNING_LIGHTS, &mode_running_lights, _data_FX_MODE_RUNNING_LIGHTS); addEffect(FX_MODE_TWINKLE, &mode_twinkle, _data_FX_MODE_TWINKLE); addEffect(FX_MODE_DISSOLVE, &mode_dissolve, _data_FX_MODE_DISSOLVE); - addEffect(FX_MODE_SPARKLE, &mode_sparkle, _data_FX_MODE_SPARKLE); addEffect(FX_MODE_FLASH_SPARKLE, &mode_flash_sparkle, _data_FX_MODE_FLASH_SPARKLE); addEffect(FX_MODE_HYPER_SPARKLE, &mode_hyper_sparkle, _data_FX_MODE_HYPER_SPARKLE); addEffect(FX_MODE_MULTI_STROBE, &mode_multi_strobe, _data_FX_MODE_MULTI_STROBE); @@ -10627,8 +10626,6 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_POPCORN, &mode_popcorn, _data_FX_MODE_POPCORN); addEffect(FX_MODE_DRIP, &mode_drip, _data_FX_MODE_DRIP); addEffect(FX_MODE_SINELON, &mode_sinelon, _data_FX_MODE_SINELON); - addEffect(FX_MODE_POPCORN, &mode_popcorn, _data_FX_MODE_POPCORN); - addEffect(FX_MODE_DRIP, &mode_drip, _data_FX_MODE_DRIP); addEffect(FX_MODE_PLASMA, &mode_plasma, _data_FX_MODE_PLASMA); addEffect(FX_MODE_PERCENT, &mode_percent, _data_FX_MODE_PERCENT); addEffect(FX_MODE_HEARTBEAT, &mode_heartbeat, _data_FX_MODE_HEARTBEAT);