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 @@ +

Set secondary color to 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...

    WLED

    FX 2nd Color

    Sync Lights

    White Channel

    Master Brightness



     
     
     
     

     
     
     
     

    Edit Presets

    Presets

    1
    2
    3
    4

    5
    6
    7
    8

    9
    10
    11
    12

    13
    14
    15
    16

    Cycle Mode

    Cycle Range

    Preset Duration

    Color Transition

    FX Speed

    FX Intensity

    + )====="; //head1 (css) @@ -123,7 +123,7 @@ Effect Panel



    -

    Set secondary color to 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); }