diff --git a/wled00/WS2812FX.cpp b/wled00/WS2812FX.cpp
index f4de14e86..1e76594df 100644
--- a/wled00/WS2812FX.cpp
+++ b/wled00/WS2812FX.cpp
@@ -40,7 +40,6 @@
#include "WS2812FX.h"
-#include "FastLED.h"
#include "palettes.h"
void WS2812FX::init(bool supportWhite, uint16_t countPixels, bool skipFirst)
@@ -90,6 +89,12 @@ void WS2812FX::clear()
bus->ClearTo(RgbColor(0));
}
+bool WS2812FX::modeUsesLock(uint8_t m)
+{
+ if (m == FX_MODE_FIRE_2012 || m == FX_MODE_COLORTWINKLE) return true;
+ return false;
+}
+
void WS2812FX::setPixelColor(uint16_t n, uint32_t c) {
uint8_t w = (c >> 24) & 0xFF;
uint8_t r = (c >> 16) & 0xFF;
@@ -100,7 +105,7 @@ void WS2812FX::setPixelColor(uint16_t n, uint32_t c) {
void WS2812FX::setPixelColor(uint16_t i, byte r, byte g, byte b, byte w)
{
- if (_locked[i] && SEGMENT.mode != FX_MODE_FIRE_2012) return;
+ if (_locked[i] && !modeUsesLock(SEGMENT.mode)) return;
if (_reverseMode) i = _length - 1 -i;
if (IS_REVERSE) i = SEGMENT.stop - (i - SEGMENT.start); //reverse just individual segment
if (!_cronixieMode)
@@ -177,7 +182,7 @@ void WS2812FX::trigger() {
void WS2812FX::setMode(uint8_t m) {
RESET_RUNTIME;
- bool ua = _segments[0].mode == FX_MODE_FIRE_2012 && m != FX_MODE_FIRE_2012;
+ bool ua = modeUsesLock(_segments[0].mode) && !modeUsesLock(m);
_segments[0].mode = constrain(m, 0, MODE_COUNT - 1);
if (ua) unlockAll();
setBrightness(_brightness);
@@ -318,7 +323,7 @@ void WS2812FX::resetSegments() {
void WS2812FX::setIndividual(uint16_t i, uint32_t col)
{
- if (SEGMENT.mode == FX_MODE_FIRE_2012) return;
+ if (modeUsesLock(SEGMENT.mode)) return;
if (i >= 0 && i < _length)
{
_locked[i] = false;
@@ -340,13 +345,13 @@ void WS2812FX::setRange(uint16_t i, uint16_t i2, uint32_t col)
void WS2812FX::lock(uint16_t i)
{
- if (SEGMENT.mode == FX_MODE_FIRE_2012) return;
+ if (modeUsesLock(SEGMENT.mode)) return;
if (i >= 0 && i < _length) _locked[i] = true;
}
void WS2812FX::lockRange(uint16_t i, uint16_t i2)
{
- if (SEGMENT.mode == FX_MODE_FIRE_2012) return;
+ if (modeUsesLock(SEGMENT.mode)) return;
for (uint16_t x = i; x <= i2; x++)
{
if (i >= 0 && i < _length) _locked[i] = true;
@@ -355,13 +360,13 @@ void WS2812FX::lockRange(uint16_t i, uint16_t i2)
void WS2812FX::unlock(uint16_t i)
{
- if (SEGMENT.mode == FX_MODE_FIRE_2012) return;
+ if (modeUsesLock(SEGMENT.mode)) return;
if (i >= 0 && i < _length) _locked[i] = false;
}
void WS2812FX::unlockRange(uint16_t i, uint16_t i2)
{
- if (SEGMENT.mode == FX_MODE_FIRE_2012) return;
+ if (modeUsesLock(SEGMENT.mode)) return;
for (uint16_t x = i; x < i2; x++)
{
if (x >= 0 && x < _length) _locked[x] = false;
@@ -377,7 +382,7 @@ void WS2812FX::setTransitionMode(bool t)
{
SEGMENT_RUNTIME.trans_act = (t) ? 1:2;
if (!t) return;
- unsigned long waitMax = millis() + 20; //refresh after 20 seconds if transition enabled
+ unsigned long waitMax = millis() + 20; //refresh after 20 ms if transition enabled
if (SEGMENT.mode == FX_MODE_STATIC && SEGMENT_RUNTIME.next_time > waitMax) SEGMENT_RUNTIME.next_time = waitMax;
}
@@ -2051,6 +2056,15 @@ uint16_t WS2812FX::mode_lightning(void)
}
+CRGB WS2812FX::fastled_from_col(uint32_t color)
+{
+ CRGB fastled_col;
+ fastled_col.red = (color >> 16 & 0xFF);
+ fastled_col.green = (color >> 8 & 0xFF);
+ fastled_col.blue = (color & 0xFF);
+ return fastled_col;
+}
+
// Pride2015
// Animated, ever-changing rainbows.
// by Mark Kriegsman: https://gist.github.com/kriegsman/964de772d64c502760e5
@@ -2085,11 +2099,7 @@ uint16_t WS2812FX::mode_pride_2015(void)
bri8 += (255 - brightdepth);
CRGB newcolor = CHSV( hue8, sat8, bri8);
-
- uint32_t color = getPixelColor(i);
- fastled_col.red = (color >> 16 & 0xFF);
- fastled_col.green = (color >> 8 & 0xFF);
- fastled_col.blue = (color & 0xFF);
+ fastled_col = fastled_from_col(getPixelColor(i));
nblend( fastled_col, newcolor, 64);
setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue);
@@ -2107,10 +2117,7 @@ uint16_t WS2812FX::mode_juggle(void){
byte dothue = 0;
for ( byte i = 0; i < 8; i++) {
uint16_t index = SEGMENT.start + beatsin16(i + 7, 0, SEGMENT_LENGTH -1);
- uint32_t color = getPixelColor(index);
- fastled_col.red = (color >> 16 & 0xFF);
- fastled_col.green = (color >> 8 & 0xFF);
- fastled_col.blue = (color & 0xFF);
+ fastled_col = fastled_from_col(getPixelColor(index));
fastled_col |= CHSV(dothue, 220, 255);
setPixelColor(index, fastled_col.red, fastled_col.green, fastled_col.blue);
dothue += 32;
@@ -2161,17 +2168,11 @@ void WS2812FX::handle_palette(void)
_lastPaletteChange = millis();
} break;}
case 2: {//primary color only
- CRGB prim;
- prim.red = (SEGMENT.colors[0] >> 16 & 0xFF);
- prim.green = (SEGMENT.colors[0] >> 8 & 0xFF);
- prim.blue = (SEGMENT.colors[0] & 0xFF);
+ CRGB prim = fastled_from_col(SEGMENT.colors[0]);
targetPalette = CRGBPalette16(prim); break;}
case 3: {//based on primary
//considering performance implications
- CRGB prim;
- prim.red = (SEGMENT.colors[0] >> 16 & 0xFF);
- prim.green = (SEGMENT.colors[0] >> 8 & 0xFF);
- prim.blue = (SEGMENT.colors[0] & 0xFF);
+ CRGB prim = fastled_from_col(SEGMENT.colors[0]);
CHSV prim_hsv = rgb2hsv_approximate(prim);
targetPalette = CRGBPalette16(
CHSV(prim_hsv.h, prim_hsv.s, prim_hsv.v), //color itself
@@ -2180,24 +2181,12 @@ void WS2812FX::handle_palette(void)
CHSV(prim_hsv.h, prim_hsv.s, prim_hsv.v)); //color itself
break;}
case 4: {//primary + secondary
- CRGB prim;
- prim.red = (SEGMENT.colors[0] >> 16 & 0xFF);
- prim.green = (SEGMENT.colors[0] >> 8 & 0xFF);
- prim.blue = (SEGMENT.colors[0] & 0xFF);
- CRGB sec;
- sec.red = (SEGMENT.colors[1] >> 16 & 0xFF);
- sec.green = (SEGMENT.colors[1] >> 8 & 0xFF);
- sec.blue = (SEGMENT.colors[1] & 0xFF);
+ CRGB prim = fastled_from_col(SEGMENT.colors[0]);
+ CRGB sec = fastled_from_col(SEGMENT.colors[1]);
targetPalette = CRGBPalette16(sec,prim); break;}
case 5: {//based on primary + secondary
- CRGB prim;
- prim.red = (SEGMENT.colors[0] >> 16 & 0xFF);
- prim.green = (SEGMENT.colors[0] >> 8 & 0xFF);
- prim.blue = (SEGMENT.colors[0] & 0xFF);
- CRGB sec;
- sec.red = (SEGMENT.colors[1] >> 16 & 0xFF);
- sec.green = (SEGMENT.colors[1] >> 8 & 0xFF);
- sec.blue = (SEGMENT.colors[1] & 0xFF);
+ CRGB prim = fastled_from_col(SEGMENT.colors[0]);
+ CRGB sec = fastled_from_col(SEGMENT.colors[1]);
targetPalette = CRGBPalette16(sec,prim,CRGB::White); break;}
case 6: //Party colors
targetPalette = PartyColors_p; break;
@@ -2359,11 +2348,7 @@ uint16_t WS2812FX::mode_colorwaves(void)
index = scale8( index, 240);
CRGB newcolor = ColorFromPalette(currentPalette, index, bri8);
-
- uint32_t color = getPixelColor(i);
- fastled_col.red = (color >> 16 & 0xFF);
- fastled_col.green = (color >> 8 & 0xFF);
- fastled_col.blue = (color & 0xFF);
+ fastled_col = fastled_from_col(getPixelColor(i));
nblend(fastled_col, newcolor, 128);
setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue);
@@ -2497,3 +2482,47 @@ uint16_t WS2812FX::mode_noise16_4(void)
}
return 20;
}
+
+
+uint16_t WS2812FX::mode_colortwinkle()
+{
+ CRGB fastled_col, prev;
+ fract8 fadeUpAmount = 8 + (SEGMENT.speed/4), fadeDownAmount = 5 + (SEGMENT.speed/7);
+ for( uint16_t i = SEGMENT.start; i <= SEGMENT.stop; i++) {
+ fastled_col = fastled_from_col(getPixelColor(i));
+ prev = fastled_col;
+ if(_locked[i]) {
+ CRGB incrementalColor = fastled_col;
+ incrementalColor.nscale8_video( fadeUpAmount);
+ fastled_col += incrementalColor;
+
+ if( fastled_col.red == 255 || fastled_col.green == 255 || fastled_col.blue == 255) {
+ _locked[i] = false;
+ }
+ setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue);
+
+ if (fastled_from_col(getPixelColor(i)) == prev) //fix "stuck" pixels
+ {
+ fastled_col += fastled_col;
+ setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue);
+ }
+ } else {
+ fastled_col.nscale8( 255 - fadeDownAmount);
+ setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue);
+ }
+ }
+
+ if( random8() <= SEGMENT.intensity ) {
+ for (uint8_t times = 0; times < 5; times++) //attempt to spawn a new pixel 5 times
+ {
+ int i = SEGMENT.start + random16(SEGMENT_LENGTH);
+ if(getPixelColor(i) == 0) {
+ fastled_col = ColorFromPalette( currentPalette, random8(), 64, NOBLEND);
+ _locked[i] = true;
+ setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue);
+ return 20; //only spawn 1 new pixel per frame
+ }
+ }
+ }
+ return 20;
+}
diff --git a/wled00/WS2812FX.h b/wled00/WS2812FX.h
index c33576ca1..30f44b4fd 100644
--- a/wled00/WS2812FX.h
+++ b/wled00/WS2812FX.h
@@ -40,6 +40,7 @@
#define WS2812FX_h
#include "NpbWrapper.h"
+#include "FastLED.h"
#define DEFAULT_BRIGHTNESS (uint8_t)50
#define DEFAULT_MODE (uint8_t)0
@@ -82,7 +83,7 @@
#define REVERSE (uint8_t)0x80
#define IS_REVERSE ((SEGMENT.options & REVERSE) == REVERSE)
-#define MODE_COUNT 74
+#define MODE_COUNT 75
#define FX_MODE_STATIC 0
#define FX_MODE_BLINK 1
@@ -159,6 +160,7 @@
#define FX_MODE_NOISE16_2 71
#define FX_MODE_NOISE16_3 72
#define FX_MODE_NOISE16_4 73
+#define FX_MODE_COLORTWINKLE 74
class WS2812FX {
typedef uint16_t (WS2812FX::*mode_ptr)(void);
@@ -261,6 +263,7 @@ class WS2812FX {
_mode[FX_MODE_NOISE16_2] = &WS2812FX::mode_noise16_2;
_mode[FX_MODE_NOISE16_3] = &WS2812FX::mode_noise16_3;
_mode[FX_MODE_NOISE16_4] = &WS2812FX::mode_noise16_4;
+ _mode[FX_MODE_COLORTWINKLE] = &WS2812FX::mode_colortwinkle;
_brightness = DEFAULT_BRIGHTNESS;
_running = false;
@@ -434,16 +437,20 @@ class WS2812FX {
mode_noise16_2(void),
mode_noise16_3(void),
mode_noise16_4(void),
+ mode_colortwinkle(void),
mode_lightning(void);
private:
NeoPixelWrapper *bus;
+
+ CRGB fastled_from_col(uint32_t);
uint16_t _length;
uint16_t _rand16seed;
uint8_t _brightness;
void handle_palette(void);
+ bool modeUsesLock(uint8_t);
double
_cronixieSecMultiplier;
diff --git a/wled00/data/index.htm b/wled00/data/index.htm
index 106e8778b..b0640d448 100644
--- a/wled00/data/index.htm
+++ b/wled00/data/index.htm
@@ -192,10 +192,10 @@
function SwFX(s)
{
var n=Cf.TX.selectedIndex+s;
- if (n==-1||n==74) return;
+ if (n==-1||n==75) return;
Cf.TX.selectedIndex =n;
if (n < 0) Cf.TX.selectedIndex = 0;
- if (n > 73) Cf.TX.selectedIndex = 65;
+ if (n > 74) Cf.TX.selectedIndex = 65;
GX();
}
function TgHSB()
@@ -660,6 +660,7 @@
Noise 16 2 (71)
Noise 16 3 (72)
Noise 16 4 (73)
+ Colortwinkle (74)
Set secondary color to
White
diff --git a/wled00/data/index_mobile.htm b/wled00/data/index_mobile.htm
index b47b9bfd8..3eb7e5c83 100644
--- a/wled00/data/index_mobile.htm
+++ b/wled00/data/index_mobile.htm
@@ -432,7 +432,8 @@
Noise 16 1
Noise 16 2
Noise 16 3
-Noise 16 4
+Noise 16 4
+Colortwinkle
Go to top
FastLED Palette (Effects 56-73)
Default
diff --git a/wled00/htmls00.h b/wled00/htmls00.h
index 036b6e8d7..485d3d7ec 100644
--- a/wled00/htmls00.h
+++ b/wled00/htmls00.h
@@ -3,7 +3,7 @@
*/
#ifndef WLED_DISABLE_MOBILE_UI
const char PAGE_indexM[] PROGMEM = R"=====(
-WLED 0.8.1 Loading WLED UI...
Presets
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Cycle Range
+
)=====";
//head1 (css)
@@ -123,7 +123,7 @@ Effect Panel
-Solid (0) Blink (1) Breath (2) Wipe (3) Wipe Random (4) Color R (5) Sweep (6) Dynamic (7) Colorloop (8) Rainbow (9) Scan (10) Scan x2 (11) Fade (12) Chase (13) Chase Cl (14) Running (15) Twinkle (16) Twinkle R (17) Twinkle Fade (18) Twinkle RF (19) Sparkle (20) Sparkle Inv (21) Sparkle Inv+ (22) Strobe (23) Strobe Cl (24) Strobe + (25) Blink Cl (26) Android (27) Chase (28) Chase R (29) Chase Rainbow (30) Chase Flash (31) Chase RF (32) Chase Cl Inv (33) Colorful (34) Traffic Light (35) Sweep R(36) Running 2 (37) Red/Blue (38) Running R (39) Scanner (40) Lighthouse (41) Fireworks (42) Fireworks R (43) Christmas (44) Fire Flicker (45) Gradient (46) Loading (47) Wipe IO (48) Wipe II (49) Wipe OO (50) Wipe OI (51) Circus (52) Halloween (53) Tricolor Chase (54) Tricolor Wipe (55) Tricolor Fade (56) Lighting (57) ICU (58) Multi Comet (59) Scanner x2 (60) Random Chase (61) Oscillate (62) Pride 2015 (63) Juggle (64) Palette (65) Fire 2012 (66) Colorwaves (67) BPM (68) Fill Noise 8 (69) Noise 16 1 (70) Noise 16 2 (71) Noise 16 3 (72) Noise 16 4 (73)
+Solid (0) Blink (1) Breath (2) Wipe (3) Wipe Random (4) Color R (5) Sweep (6) Dynamic (7) Colorloop (8) Rainbow (9) Scan (10) Scan x2 (11) Fade (12) Chase (13) Chase Cl (14) Running (15) Twinkle (16) Twinkle R (17) Twinkle Fade (18) Twinkle RF (19) Sparkle (20) Sparkle Inv (21) Sparkle Inv+ (22) Strobe (23) Strobe Cl (24) Strobe + (25) Blink Cl (26) Android (27) Chase (28) Chase R (29) Chase Rainbow (30) Chase Flash (31) Chase RF (32) Chase Cl Inv (33) Colorful (34) Traffic Light (35) Sweep R(36) Running 2 (37) Red/Blue (38) Running R (39) Scanner (40) Lighthouse (41) Fireworks (42) Fireworks R (43) Christmas (44) Fire Flicker (45) Gradient (46) Loading (47) Wipe IO (48) Wipe II (49) Wipe OO (50) Wipe OI (51) Circus (52) Halloween (53) Tricolor Chase (54) Tricolor Wipe (55) Tricolor Fade (56) Lighting (57) ICU (58) Multi Comet (59) Scanner x2 (60) Random Chase (61) Oscillate (62) Pride 2015 (63) Juggle (64) Palette (65) Fire 2012 (66) Colorwaves (67) BPM (68) Fill Noise 8 (69) Noise 16 1 (70) Noise 16 2 (71) Noise 16 3 (72) Noise 16 4 (73) Colortwinkle (74)
Set secondary color to
White
diff --git a/wled00/wled00.ino b/wled00/wled00.ino
index d156cd831..0ad3f703d 100644
--- a/wled00/wled00.ino
+++ b/wled00/wled00.ino
@@ -63,7 +63,7 @@
//version code in format yymmddb (b = daily build)
-#define VERSION 1811012
+#define VERSION 1811041
char versionString[] = "0.8.1";
diff --git a/wled00/wled07_notify.ino b/wled00/wled07_notify.ino
index 367a9a974..1a3e76141 100644
--- a/wled00/wled07_notify.ino
+++ b/wled00/wled07_notify.ino
@@ -206,6 +206,7 @@ void handleNotifications()
if (udpIn[1] == 0)
{
realtimeActive = false;
+ return;
} else {
arlsLock(udpIn[1]*1000);
}