mirror of
https://github.com/wled/WLED.git
synced 2025-07-29 05:36:41 +00:00
commit
036bd07e72
@ -80,6 +80,7 @@ arduino_core_2_6_2 = espressif8266@2.3.1
|
|||||||
arduino_core_stage = https://github.com/platformio/platform-espressif8266.git#feature/stage
|
arduino_core_stage = https://github.com/platformio/platform-espressif8266.git#feature/stage
|
||||||
platform = ${common:esp8266.arduino_core_2_6_2}
|
platform = ${common:esp8266.arduino_core_2_6_2}
|
||||||
build_flags =
|
build_flags =
|
||||||
|
-D ESP8266
|
||||||
-D PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH
|
-D PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH
|
||||||
-Wl,-Teagle.flash.4m1m.ld ;;;; Required for core > v2.5.0 or staging version 4MB Flash 3MB SPIFFs
|
-Wl,-Teagle.flash.4m1m.ld ;;;; Required for core > v2.5.0 or staging version 4MB Flash 3MB SPIFFs
|
||||||
|
|
||||||
@ -127,6 +128,8 @@ build_flags =
|
|||||||
${common:esp8266.build_flags}
|
${common:esp8266.build_flags}
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${common.lib_deps_external}
|
${common.lib_deps_external}
|
||||||
|
lib_compat_mode = strict
|
||||||
|
lib_ignore = AsynTCP
|
||||||
|
|
||||||
[env:d1_mini]
|
[env:d1_mini]
|
||||||
board = d1_mini
|
board = d1_mini
|
||||||
@ -139,6 +142,8 @@ build_flags =
|
|||||||
${common:esp8266.build_flags}
|
${common:esp8266.build_flags}
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${common.lib_deps_external}
|
${common.lib_deps_external}
|
||||||
|
lib_compat_mode = strict
|
||||||
|
lib_ignore = AsynTCP
|
||||||
|
|
||||||
[env:esp01_1m]
|
[env:esp01_1m]
|
||||||
board = esp01_1m
|
board = esp01_1m
|
||||||
@ -153,6 +158,8 @@ build_flags =
|
|||||||
-D WLED_DISABLE_INFRARED
|
-D WLED_DISABLE_INFRARED
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${common.lib_deps_external}
|
${common.lib_deps_external}
|
||||||
|
lib_compat_mode = strict
|
||||||
|
lib_ignore = AsynTCP
|
||||||
|
|
||||||
[env:esp01]
|
[env:esp01]
|
||||||
board = esp01
|
board = esp01
|
||||||
@ -166,6 +173,8 @@ build_flags =
|
|||||||
-D WLED_DISABLE_INFRARED
|
-D WLED_DISABLE_INFRARED
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${common.lib_deps_external}
|
${common.lib_deps_external}
|
||||||
|
lib_compat_mode = strict
|
||||||
|
lib_ignore = AsynTCP
|
||||||
|
|
||||||
[env:esp07]
|
[env:esp07]
|
||||||
board = esp07
|
board = esp07
|
||||||
@ -178,6 +187,8 @@ build_flags =
|
|||||||
${common:esp8266.build_flags}
|
${common:esp8266.build_flags}
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${common.lib_deps_external}
|
${common.lib_deps_external}
|
||||||
|
lib_compat_mode = strict
|
||||||
|
lib_ignore = AsynTCP
|
||||||
|
|
||||||
# see: http://docs.platformio.org/en/latest/platforms/espressif32.html
|
# see: http://docs.platformio.org/en/latest/platforms/espressif32.html
|
||||||
[env:esp32dev]
|
[env:esp32dev]
|
||||||
@ -193,6 +204,7 @@ lib_deps =
|
|||||||
${common.lib_deps_external}
|
${common.lib_deps_external}
|
||||||
lib_ignore =
|
lib_ignore =
|
||||||
ESPAsyncUDP
|
ESPAsyncUDP
|
||||||
|
lib_compat_mode = strict
|
||||||
|
|
||||||
[env:esp8285_4CH_MagicHome]
|
[env:esp8285_4CH_MagicHome]
|
||||||
board = esp8285
|
board = esp8285
|
||||||
@ -207,6 +219,8 @@ build_flags =
|
|||||||
-D WLED_USE_ANALOG_LEDS
|
-D WLED_USE_ANALOG_LEDS
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${common.lib_deps_external}
|
${common.lib_deps_external}
|
||||||
|
lib_compat_mode = strict
|
||||||
|
lib_ignore = AsynTCP
|
||||||
|
|
||||||
[env:esp8285_4CH_H801]
|
[env:esp8285_4CH_H801]
|
||||||
board = esp8285
|
board = esp8285
|
||||||
@ -222,6 +236,8 @@ build_flags =
|
|||||||
-D WLED_USE_H801
|
-D WLED_USE_H801
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${common.lib_deps_external}
|
${common.lib_deps_external}
|
||||||
|
lib_compat_mode = strict
|
||||||
|
lib_ignore = AsynTCP
|
||||||
|
|
||||||
[env:esp8285_5CH_H801]
|
[env:esp8285_5CH_H801]
|
||||||
board = esp8285
|
board = esp8285
|
||||||
@ -238,4 +254,6 @@ build_flags =
|
|||||||
-D WLED_ENABLE_5CH_LEDS
|
-D WLED_ENABLE_5CH_LEDS
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${common.lib_deps_external}
|
${common.lib_deps_external}
|
||||||
|
lib_compat_mode = strict
|
||||||
|
lib_ignore = AsynTCP
|
||||||
|
|
||||||
|
103
wled00/FX.cpp
103
wled00/FX.cpp
@ -1219,11 +1219,10 @@ uint16_t WS2812FX::mode_loading(void) {
|
|||||||
|
|
||||||
|
|
||||||
//American Police Light with all LEDs Red and Blue
|
//American Police Light with all LEDs Red and Blue
|
||||||
uint16_t WS2812FX::police_base(uint32_t color1, uint32_t color2)
|
uint16_t WS2812FX::police_base(uint32_t color1, uint32_t color2, bool all)
|
||||||
{
|
{
|
||||||
uint16_t counter = now * ((SEGMENT.speed >> 2) +1);
|
uint16_t counter = now * ((SEGMENT.speed >> 2) +1);
|
||||||
uint16_t idexR = (counter * SEGLEN) >> 16;
|
uint16_t idexR = (counter * SEGLEN) >> 16;
|
||||||
uint8_t size = 1 + SEGMENT.intensity >> 3;
|
|
||||||
if (idexR >= SEGLEN) idexR = 0;
|
if (idexR >= SEGLEN) idexR = 0;
|
||||||
|
|
||||||
uint16_t topindex = SEGLEN >> 1;
|
uint16_t topindex = SEGLEN >> 1;
|
||||||
@ -1231,6 +1230,17 @@ uint16_t WS2812FX::police_base(uint32_t color1, uint32_t color2)
|
|||||||
if (SEGENV.call == 0) SEGENV.aux0 = idexR;
|
if (SEGENV.call == 0) SEGENV.aux0 = idexR;
|
||||||
if (idexB >= SEGLEN) idexB = 0; //otherwise overflow on odd number of LEDs
|
if (idexB >= SEGLEN) idexB = 0; //otherwise overflow on odd number of LEDs
|
||||||
|
|
||||||
|
if (all) { //different algo, ensuring immediate fill
|
||||||
|
if (idexB > idexR) {
|
||||||
|
fill(color2);
|
||||||
|
for (uint16_t i = idexR; i < idexB; i++) setPixelColor(i, color1);
|
||||||
|
} else {
|
||||||
|
fill(color1);
|
||||||
|
for (uint16_t i = idexB; i < idexR; i++) setPixelColor(i, color2);
|
||||||
|
}
|
||||||
|
} else { //regular dot-only mode
|
||||||
|
uint8_t size = 1 + SEGMENT.intensity >> 3;
|
||||||
|
if (size > SEGLEN/2) size = 1+ SEGLEN/2;
|
||||||
for (uint8_t i=0; i <= size; i++) {
|
for (uint8_t i=0; i <= size; i++) {
|
||||||
setPixelColor(idexR+i, color1);
|
setPixelColor(idexR+i, color1);
|
||||||
setPixelColor(idexB+i, color2);
|
setPixelColor(idexB+i, color2);
|
||||||
@ -1245,6 +1255,7 @@ uint16_t WS2812FX::police_base(uint32_t color1, uint32_t color2)
|
|||||||
}
|
}
|
||||||
SEGENV.aux0 = idexR;
|
SEGENV.aux0 = idexR;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return FRAMETIME;
|
return FRAMETIME;
|
||||||
}
|
}
|
||||||
@ -1253,7 +1264,7 @@ uint16_t WS2812FX::police_base(uint32_t color1, uint32_t color2)
|
|||||||
//American Police Light with all LEDs Red and Blue
|
//American Police Light with all LEDs Red and Blue
|
||||||
uint16_t WS2812FX::mode_police_all()
|
uint16_t WS2812FX::mode_police_all()
|
||||||
{
|
{
|
||||||
return police_base(RED, BLUE);
|
return police_base(RED, BLUE, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1262,14 +1273,14 @@ uint16_t WS2812FX::mode_police()
|
|||||||
{
|
{
|
||||||
fill(SEGCOLOR(1));
|
fill(SEGCOLOR(1));
|
||||||
|
|
||||||
return police_base(RED, BLUE);
|
return police_base(RED, BLUE, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//Police All with custom colors
|
//Police All with custom colors
|
||||||
uint16_t WS2812FX::mode_two_areas()
|
uint16_t WS2812FX::mode_two_areas()
|
||||||
{
|
{
|
||||||
return police_base(SEGCOLOR(0), SEGCOLOR(1));
|
return police_base(SEGCOLOR(0), SEGCOLOR(1), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1279,7 +1290,7 @@ uint16_t WS2812FX::mode_two_dots()
|
|||||||
fill(SEGCOLOR(2));
|
fill(SEGCOLOR(2));
|
||||||
uint32_t color2 = (SEGCOLOR(1) == SEGCOLOR(2)) ? SEGCOLOR(0) : SEGCOLOR(1);
|
uint32_t color2 = (SEGCOLOR(1) == SEGCOLOR(2)) ? SEGCOLOR(0) : SEGCOLOR(1);
|
||||||
|
|
||||||
return police_base(SEGCOLOR(0), color2);
|
return police_base(SEGCOLOR(0), color2, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1327,22 +1338,23 @@ uint16_t WS2812FX::mode_tricolor_chase(void) {
|
|||||||
*/
|
*/
|
||||||
uint16_t WS2812FX::mode_icu(void) {
|
uint16_t WS2812FX::mode_icu(void) {
|
||||||
uint16_t dest = SEGENV.step & 0xFFFF;
|
uint16_t dest = SEGENV.step & 0xFFFF;
|
||||||
|
uint8_t space = (SEGMENT.intensity >> 3) +2;
|
||||||
|
|
||||||
fill(SEGCOLOR(1));
|
fill(SEGCOLOR(1));
|
||||||
|
|
||||||
byte pindex = map(dest, 0, SEGLEN/2, 0, 255);
|
byte pindex = map(dest, 0, SEGLEN-SEGLEN/space, 0, 255);
|
||||||
uint32_t col = color_from_palette(pindex, false, false, 0);
|
uint32_t col = color_from_palette(pindex, false, false, 0);
|
||||||
|
|
||||||
setPixelColor(dest, col);
|
setPixelColor(dest, col);
|
||||||
setPixelColor( dest + SEGLEN/2, col);
|
setPixelColor(dest + SEGLEN/space, col);
|
||||||
|
|
||||||
if(SEGENV.aux0 == dest) { // pause between eye movements
|
if(SEGENV.aux0 == dest) { // pause between eye movements
|
||||||
if(random8(6) == 0) { // blink once in a while
|
if(random8(6) == 0) { // blink once in a while
|
||||||
setPixelColor(dest, SEGCOLOR(1));
|
setPixelColor(dest, SEGCOLOR(1));
|
||||||
setPixelColor( dest + SEGLEN/2, SEGCOLOR(1));
|
setPixelColor(dest + SEGLEN/space, SEGCOLOR(1));
|
||||||
return 200;
|
return 200;
|
||||||
}
|
}
|
||||||
SEGENV.aux0 = random16(SEGLEN/2);
|
SEGENV.aux0 = random16(SEGLEN-SEGLEN/space);
|
||||||
return 1000 + random16(2000);
|
return 1000 + random16(2000);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1355,7 +1367,7 @@ uint16_t WS2812FX::mode_icu(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setPixelColor(dest, col);
|
setPixelColor(dest, col);
|
||||||
setPixelColor(dest + SEGLEN/2, col);
|
setPixelColor(dest + SEGLEN/space, col);
|
||||||
|
|
||||||
return SPEED_FORMULA_L;
|
return SPEED_FORMULA_L;
|
||||||
}
|
}
|
||||||
@ -1451,13 +1463,14 @@ uint16_t WS2812FX::mode_tricolor_fade(void)
|
|||||||
*/
|
*/
|
||||||
uint16_t WS2812FX::mode_multi_comet(void)
|
uint16_t WS2812FX::mode_multi_comet(void)
|
||||||
{
|
{
|
||||||
uint32_t cycleTime = 20 + (2 * (uint32_t)(255 - SEGMENT.speed));
|
uint32_t cycleTime = 10 + (uint32_t)(255 - SEGMENT.speed);
|
||||||
uint32_t it = now / cycleTime;
|
uint32_t it = now / cycleTime;
|
||||||
if (SEGENV.step == it) return FRAMETIME;
|
if (SEGENV.step == it) return FRAMETIME;
|
||||||
|
if (!SEGENV.allocateData(sizeof(uint16_t) * 8)) return mode_static(); //allocation failed
|
||||||
|
|
||||||
fade_out(SEGMENT.intensity);
|
fade_out(SEGMENT.intensity);
|
||||||
|
|
||||||
static uint16_t comets[] = {UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX};
|
uint16_t* comets = reinterpret_cast<uint16_t*>(SEGENV.data);
|
||||||
|
|
||||||
for(uint8_t i=0; i < 8; i++) {
|
for(uint8_t i=0; i < 8; i++) {
|
||||||
if(comets[i] < SEGLEN) {
|
if(comets[i] < SEGLEN) {
|
||||||
@ -1566,7 +1579,7 @@ uint16_t WS2812FX::mode_oscillate(void)
|
|||||||
uint32_t color = BLACK;
|
uint32_t color = BLACK;
|
||||||
for(uint8_t j=0; j < numOscillators; j++) {
|
for(uint8_t j=0; j < numOscillators; j++) {
|
||||||
if(i >= oscillators[j].pos - oscillators[j].size && i <= oscillators[j].pos + oscillators[j].size) {
|
if(i >= oscillators[j].pos - oscillators[j].size && i <= oscillators[j].pos + oscillators[j].size) {
|
||||||
color = (color == BLACK) ? SEGMENT.colors[j] : color_blend(color, SEGMENT.colors[j], 128);
|
color = (color == BLACK) ? SEGCOLOR(j) : color_blend(color, SEGCOLOR(j), 128);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setPixelColor(i, color);
|
setPixelColor(i, color);
|
||||||
@ -2133,7 +2146,7 @@ typedef struct Ripple {
|
|||||||
uint16_t pos;
|
uint16_t pos;
|
||||||
} ripple;
|
} ripple;
|
||||||
|
|
||||||
uint16_t WS2812FX::mode_ripple()
|
uint16_t WS2812FX::ripple_base(bool rainbow)
|
||||||
{
|
{
|
||||||
uint16_t maxRipples = 1 + (SEGLEN >> 2);
|
uint16_t maxRipples = 1 + (SEGLEN >> 2);
|
||||||
if (maxRipples > 100) maxRipples = 100;
|
if (maxRipples > 100) maxRipples = 100;
|
||||||
@ -2143,7 +2156,24 @@ uint16_t WS2812FX::mode_ripple()
|
|||||||
|
|
||||||
Ripple* ripples = reinterpret_cast<Ripple*>(SEGENV.data);
|
Ripple* ripples = reinterpret_cast<Ripple*>(SEGENV.data);
|
||||||
|
|
||||||
|
// ranbow background or chosen background, all very dim.
|
||||||
|
if (rainbow) {
|
||||||
|
if (SEGENV.call ==0) {
|
||||||
|
SEGENV.aux0 = random8();
|
||||||
|
SEGENV.aux1 = random8();
|
||||||
|
}
|
||||||
|
if (SEGENV.aux0 == SEGENV.aux1) {
|
||||||
|
SEGENV.aux1 = random8();
|
||||||
|
}
|
||||||
|
else if (SEGENV.aux1 > SEGENV.aux0) {
|
||||||
|
SEGENV.aux0++;
|
||||||
|
} else {
|
||||||
|
SEGENV.aux0--;
|
||||||
|
}
|
||||||
|
fill(color_blend(color_wheel(SEGENV.aux0),BLACK,235));
|
||||||
|
} else {
|
||||||
fill(SEGCOLOR(1));
|
fill(SEGCOLOR(1));
|
||||||
|
}
|
||||||
|
|
||||||
//draw wave
|
//draw wave
|
||||||
for (uint16_t i = 0; i < maxRipples; i++)
|
for (uint16_t i = 0; i < maxRipples; i++)
|
||||||
@ -2188,6 +2218,15 @@ uint16_t WS2812FX::mode_ripple()
|
|||||||
return FRAMETIME;
|
return FRAMETIME;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t WS2812FX::mode_ripple(void) {
|
||||||
|
return ripple_base(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t WS2812FX::mode_ripple_rainbow(void) {
|
||||||
|
return ripple_base(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// TwinkleFOX by Mark Kriegsman: https://gist.github.com/kriegsman/756ea6dcae8e30845b5a
|
// TwinkleFOX by Mark Kriegsman: https://gist.github.com/kriegsman/756ea6dcae8e30845b5a
|
||||||
//
|
//
|
||||||
@ -3060,8 +3099,8 @@ uint16_t WS2812FX::mode_percent(void) {
|
|||||||
uint16_t active_leds = (percent < 100) ? SEGLEN * percent / 100.0
|
uint16_t active_leds = (percent < 100) ? SEGLEN * percent / 100.0
|
||||||
: SEGLEN * (200 - percent) / 100.0;
|
: SEGLEN * (200 - percent) / 100.0;
|
||||||
|
|
||||||
if (SEGENV.call == 0) SEGENV.step = 0;
|
uint8_t size = (1 + ((SEGMENT.speed * SEGLEN) >> 11));
|
||||||
uint8_t size = (1 + ((SEGMENT.speed * SEGLEN) >> 11)) & 0xFF ;
|
if (SEGMENT.speed == 255) size = 255;
|
||||||
|
|
||||||
if (percent < 100) {
|
if (percent < 100) {
|
||||||
for (uint16_t i = 0; i < SEGLEN; i++) {
|
for (uint16_t i = 0; i < SEGLEN; i++) {
|
||||||
@ -3093,3 +3132,33 @@ uint16_t WS2812FX::mode_percent(void) {
|
|||||||
|
|
||||||
return FRAMETIME;
|
return FRAMETIME;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
/ Modulates the brightness similar to a heartbeat
|
||||||
|
*/
|
||||||
|
uint16_t WS2812FX::mode_heartbeat(void) {
|
||||||
|
uint8_t bpm = 40 + (SEGMENT.speed >> 4);
|
||||||
|
uint32_t msPerBeat = (60000 / bpm);
|
||||||
|
uint32_t secondBeat = (msPerBeat / 3);
|
||||||
|
|
||||||
|
uint32_t bri_lower = SEGENV.aux1;
|
||||||
|
bri_lower = bri_lower * 2042 / (2048 + SEGMENT.intensity);
|
||||||
|
SEGENV.aux1 = bri_lower;
|
||||||
|
|
||||||
|
unsigned long beatTimer = millis() - SEGENV.step;
|
||||||
|
if((beatTimer > secondBeat) && !SEGENV.aux0) { // time for the second beat?
|
||||||
|
SEGENV.aux1 = UINT16_MAX; //full bri
|
||||||
|
SEGENV.aux0 = 1;
|
||||||
|
}
|
||||||
|
if(beatTimer > msPerBeat) { // time to reset the beat timer?
|
||||||
|
SEGENV.aux1 = UINT16_MAX; //full bri
|
||||||
|
SEGENV.aux0 = 0;
|
||||||
|
SEGENV.step = millis();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint16_t i = 0; i < SEGLEN; i++) {
|
||||||
|
setPixelColor(i, color_blend(color_from_palette(i, true, PALETTE_SOLID_WRAP, 0), SEGCOLOR(1), 255 - (SEGENV.aux1 >> 8)));
|
||||||
|
}
|
||||||
|
|
||||||
|
return FRAMETIME;
|
||||||
|
}
|
16
wled00/FX.h
16
wled00/FX.h
@ -91,7 +91,7 @@
|
|||||||
#define IS_REVERSE ((SEGMENT.options & REVERSE ) == REVERSE )
|
#define IS_REVERSE ((SEGMENT.options & REVERSE ) == REVERSE )
|
||||||
#define IS_SELECTED ((SEGMENT.options & SELECTED) == SELECTED )
|
#define IS_SELECTED ((SEGMENT.options & SELECTED) == SELECTED )
|
||||||
|
|
||||||
#define MODE_COUNT 99
|
#define MODE_COUNT 101
|
||||||
|
|
||||||
#define FX_MODE_STATIC 0
|
#define FX_MODE_STATIC 0
|
||||||
#define FX_MODE_BLINK 1
|
#define FX_MODE_BLINK 1
|
||||||
@ -192,6 +192,8 @@
|
|||||||
#define FX_MODE_DRIP 96
|
#define FX_MODE_DRIP 96
|
||||||
#define FX_MODE_PLASMA 97
|
#define FX_MODE_PLASMA 97
|
||||||
#define FX_MODE_PERCENT 98
|
#define FX_MODE_PERCENT 98
|
||||||
|
#define FX_MODE_RIPPLE_RAINBOW 99
|
||||||
|
#define FX_MODE_HEARTBEAT 100
|
||||||
|
|
||||||
class WS2812FX {
|
class WS2812FX {
|
||||||
typedef uint16_t (WS2812FX::*mode_ptr)(void);
|
typedef uint16_t (WS2812FX::*mode_ptr)(void);
|
||||||
@ -379,6 +381,8 @@ class WS2812FX {
|
|||||||
_mode[FX_MODE_DRIP] = &WS2812FX::mode_drip;
|
_mode[FX_MODE_DRIP] = &WS2812FX::mode_drip;
|
||||||
_mode[FX_MODE_PLASMA] = &WS2812FX::mode_plasma;
|
_mode[FX_MODE_PLASMA] = &WS2812FX::mode_plasma;
|
||||||
_mode[FX_MODE_PERCENT] = &WS2812FX::mode_percent;
|
_mode[FX_MODE_PERCENT] = &WS2812FX::mode_percent;
|
||||||
|
_mode[FX_MODE_RIPPLE_RAINBOW] = &WS2812FX::mode_ripple_rainbow;
|
||||||
|
_mode[FX_MODE_HEARTBEAT] = &WS2812FX::mode_heartbeat;
|
||||||
|
|
||||||
_brightness = DEFAULT_BRIGHTNESS;
|
_brightness = DEFAULT_BRIGHTNESS;
|
||||||
currentPalette = CRGBPalette16(CRGB::Black);
|
currentPalette = CRGBPalette16(CRGB::Black);
|
||||||
@ -562,7 +566,9 @@ class WS2812FX {
|
|||||||
mode_popcorn(void),
|
mode_popcorn(void),
|
||||||
mode_drip(void),
|
mode_drip(void),
|
||||||
mode_plasma(void),
|
mode_plasma(void),
|
||||||
mode_percent(void);
|
mode_percent(void),
|
||||||
|
mode_ripple_rainbow(void),
|
||||||
|
mode_heartbeat(void);
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -607,7 +613,8 @@ class WS2812FX {
|
|||||||
dissolve(uint32_t),
|
dissolve(uint32_t),
|
||||||
chase(uint32_t, uint32_t, uint32_t, bool),
|
chase(uint32_t, uint32_t, uint32_t, bool),
|
||||||
gradient_base(bool),
|
gradient_base(bool),
|
||||||
police_base(uint32_t, uint32_t),
|
ripple_base(bool),
|
||||||
|
police_base(uint32_t, uint32_t, bool),
|
||||||
running(uint32_t, uint32_t),
|
running(uint32_t, uint32_t),
|
||||||
tricolor_chase(uint32_t, uint32_t),
|
tricolor_chase(uint32_t, uint32_t),
|
||||||
twinklefox_base(bool),
|
twinklefox_base(bool),
|
||||||
@ -642,7 +649,8 @@ const char JSON_mode_names[] PROGMEM = R"=====([
|
|||||||
"Scanner Dual","Stream 2","Oscillate","Pride 2015","Juggle","Palette","Fire 2012","Colorwaves","Bpm","Fill Noise",
|
"Scanner Dual","Stream 2","Oscillate","Pride 2015","Juggle","Palette","Fire 2012","Colorwaves","Bpm","Fill Noise",
|
||||||
"Noise 1","Noise 2","Noise 3","Noise 4","Colortwinkles","Lake","Meteor","Meteor Smooth","Railway","Ripple",
|
"Noise 1","Noise 2","Noise 3","Noise 4","Colortwinkles","Lake","Meteor","Meteor Smooth","Railway","Ripple",
|
||||||
"Twinklefox","Twinklecat","Halloween Eyes","Solid Pattern","Solid Pattern Tri","Spots","Spots Fade","Glitter","Candle","Fireworks Starburst",
|
"Twinklefox","Twinklecat","Halloween Eyes","Solid Pattern","Solid Pattern Tri","Spots","Spots Fade","Glitter","Candle","Fireworks Starburst",
|
||||||
"Fireworks 1D","Bouncing Balls","Sinelon","Sinelon Dual","Sinelon Rainbow","Popcorn","Drip","Plasma","Percent"
|
"Fireworks 1D","Bouncing Balls","Sinelon","Sinelon Dual","Sinelon Rainbow","Popcorn","Drip","Plasma","Percent","Ripple Rainbow",
|
||||||
|
"Heartbeat"
|
||||||
])=====";
|
])=====";
|
||||||
|
|
||||||
|
|
||||||
|
@ -125,9 +125,12 @@ void WS2812FX::setPixelColor(uint16_t i, byte r, byte g, byte b, byte w)
|
|||||||
/* Set all the pixels in the group, ensuring _skipFirstMode is honored */
|
/* Set all the pixels in the group, ensuring _skipFirstMode is honored */
|
||||||
bool reversed = reverseMode ^ IS_REVERSE;
|
bool reversed = reverseMode ^ IS_REVERSE;
|
||||||
uint16_t realIndex = realPixelIndex(i);
|
uint16_t realIndex = realPixelIndex(i);
|
||||||
|
|
||||||
for (uint16_t j = 0; j < SEGMENT.grouping; j++) {
|
for (uint16_t j = 0; j < SEGMENT.grouping; j++) {
|
||||||
int16_t indexSet = realIndex + (reversed ? -j : j);
|
int16_t indexSet = realIndex + (reversed ? -j : j);
|
||||||
if (indexSet >= SEGMENT.start && indexSet < SEGMENT.stop) bus->SetPixelColor(indexSet + skip, col);
|
int16_t indexSetRev = indexSet;
|
||||||
|
if (reverseMode) indexSetRev = _length - 1 - indexSet;
|
||||||
|
if (indexSetRev >= SEGMENT.start && indexSetRev < SEGMENT.stop) bus->SetPixelColor(indexSet + skip, col);
|
||||||
}
|
}
|
||||||
} else { //live data, etc.
|
} else { //live data, etc.
|
||||||
if (reverseMode) i = _length - 1 - i;
|
if (reverseMode) i = _length - 1 - i;
|
||||||
|
@ -287,6 +287,15 @@ public:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t* GetPixels(void)
|
||||||
|
{
|
||||||
|
switch (_type) {
|
||||||
|
case NeoPixelType_Grb: return _pGrb->Pixels(); break;
|
||||||
|
case NeoPixelType_Grbw: return _pGrbw->Pixels(); break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
NeoPixelType _type;
|
NeoPixelType _type;
|
||||||
|
@ -103,7 +103,7 @@ td {
|
|||||||
|
|
||||||
.slider-icon
|
.slider-icon
|
||||||
{
|
{
|
||||||
transform: translateY(2px);
|
transform: translateY(3px);
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,7 +141,7 @@ td {
|
|||||||
.tab {
|
.tab {
|
||||||
background-color: #222;
|
background-color: #222;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
filter: drop-shadow(0px 0px 2px #000);
|
//filter: drop-shadow(0px 0px 2px #000);
|
||||||
}
|
}
|
||||||
|
|
||||||
.bot {
|
.bot {
|
||||||
@ -658,6 +658,12 @@ input[type=number]::-webkit-outer-spin-button {
|
|||||||
float: none;
|
float: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media all and (max-width: 1250px) {
|
||||||
|
#buttonPcm {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body onload="onLoad()">
|
<body onload="onLoad()">
|
||||||
@ -673,6 +679,7 @@ input[type=number]::-webkit-outer-spin-button {
|
|||||||
<button id="buttonSync" onclick="toggleSync()"><i class="icons"></i><p class="tab-label">Sync</p></button>
|
<button id="buttonSync" onclick="toggleSync()"><i class="icons"></i><p class="tab-label">Sync</p></button>
|
||||||
<button id="buttonSr" onclick="toggleLiveview()"><i class="icons"></i><p class="tab-label">Preview</p></button>
|
<button id="buttonSr" onclick="toggleLiveview()"><i class="icons"></i><p class="tab-label">Preview</p></button>
|
||||||
<button onclick="window.location.href = '/settings';"><i class="icons"></i><p class="tab-label">Config</p></button>
|
<button onclick="window.location.href = '/settings';"><i class="icons"></i><p class="tab-label">Config</p></button>
|
||||||
|
<button id="buttonPcm" onclick="togglePcMode()"><i class="icons"></i><p class="tab-label">PC Mode</p></button>
|
||||||
</div>
|
</div>
|
||||||
<div id="briwrap">
|
<div id="briwrap">
|
||||||
<p class="hd">Brightness</p>
|
<p class="hd">Brightness</p>
|
||||||
@ -833,6 +840,7 @@ var savedPresets = 0;
|
|||||||
var currentPreset = -1;
|
var currentPreset = -1;
|
||||||
var lastUpdate = 0;
|
var lastUpdate = 0;
|
||||||
var segCount = 0, ledCount = 0, lowestUnused = 0, maxSeg = 0;
|
var segCount = 0, ledCount = 0, lowestUnused = 0, maxSeg = 0;
|
||||||
|
var pcMode = false;
|
||||||
var d = document;
|
var d = document;
|
||||||
const ranges = RangeTouch.setup('input[type="range"]', {});
|
const ranges = RangeTouch.setup('input[type="range"]', {});
|
||||||
|
|
||||||
@ -872,10 +880,12 @@ function updateTablinks(tabI)
|
|||||||
for (i = 0; i < tablinks.length; i++) {
|
for (i = 0; i < tablinks.length; i++) {
|
||||||
tablinks[i].className = tablinks[i].className.replace(" active", "");
|
tablinks[i].className = tablinks[i].className.replace(" active", "");
|
||||||
}
|
}
|
||||||
|
if (pcMode) return;
|
||||||
tablinks[tabI].className += " active";
|
tablinks[tabI].className += " active";
|
||||||
}
|
}
|
||||||
|
|
||||||
function openTab(tabI) {
|
function openTab(tabI) {
|
||||||
|
if (pcMode) return;
|
||||||
var i, tabcontent, tablinks;
|
var i, tabcontent, tablinks;
|
||||||
iSlide = tabI;
|
iSlide = tabI;
|
||||||
_C.classList.toggle('smooth', false);
|
_C.classList.toggle('smooth', false);
|
||||||
@ -1035,7 +1045,7 @@ function requestJson(command, verbose = true) {
|
|||||||
e1 = d.getElementById('fxlist');
|
e1 = d.getElementById('fxlist');
|
||||||
e2 = d.getElementById('selectPalette');
|
e2 = d.getElementById('selectPalette');
|
||||||
|
|
||||||
url = command ? 'http://10.10.1.26/json/state':'http://10.10.1.26/json';
|
url = command ? '/json/state':'/json';
|
||||||
|
|
||||||
type = command ? 'post':'get';
|
type = command ? 'post':'get';
|
||||||
if (command)
|
if (command)
|
||||||
@ -1337,12 +1347,28 @@ function selectSlot(b) {
|
|||||||
updateTrail(d.getElementById('sliderW'));
|
updateTrail(d.getElementById('sliderW'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var lasth = 0;
|
||||||
|
function pC(col)
|
||||||
|
{
|
||||||
|
if (col == "rnd")
|
||||||
|
{
|
||||||
|
col = {h: 0, s: 0, v: 100};
|
||||||
|
col.s = Math.floor((Math.random() * 50) + 50);
|
||||||
|
do {
|
||||||
|
col.h = Math.floor(Math.random() * 360);
|
||||||
|
} while (Math.abs(col.h - lasth) < 50);
|
||||||
|
lasth = col.h;
|
||||||
|
}
|
||||||
|
cpick.color.set(col);
|
||||||
|
setColor(false);
|
||||||
|
}
|
||||||
|
|
||||||
function setColor(fromPicker) {
|
function setColor(fromPicker) {
|
||||||
var cd = d.getElementById('csl').children;
|
var cd = d.getElementById('csl').children;
|
||||||
if (fromPicker && cd[csel].style.backgroundColor == 'rgb(0, 0, 0)') cpick.color.setChannel('hsv', 'v', 100);
|
if (fromPicker && cd[csel].style.backgroundColor == 'rgb(0, 0, 0)') cpick.color.setChannel('hsv', 'v', 100);
|
||||||
cd[csel].style.backgroundColor = cpick.color.rgbString;
|
cd[csel].style.backgroundColor = cpick.color.rgbString;
|
||||||
whites[csel] = d.getElementById('sliderW').value;
|
whites[csel] = d.getElementById('sliderW').value;
|
||||||
col = cpick.color.rgb;
|
var col = cpick.color.rgb;
|
||||||
var obj = {"seg": {"col": [[col.r, col.g, col.b, whites[csel]],[],[]]}};
|
var obj = {"seg": {"col": [[col.r, col.g, col.b, whites[csel]],[],[]]}};
|
||||||
if (csel == 1) {
|
if (csel == 1) {
|
||||||
obj = {"seg": {"col": [[],[col.r, col.g, col.b, whites[csel]],[]]}};
|
obj = {"seg": {"col": [[],[col.r, col.g, col.b, whites[csel]],[]]}};
|
||||||
@ -1378,6 +1404,7 @@ let iSlide = 0, x0 = null, y0 = null, scrollS = 0, locked = false, w;
|
|||||||
function unify(e) { return e.changedTouches ? e.changedTouches[0] : e }
|
function unify(e) { return e.changedTouches ? e.changedTouches[0] : e }
|
||||||
|
|
||||||
function lock(e) {
|
function lock(e) {
|
||||||
|
if (pcMode) return;
|
||||||
var l = e.target.classList;
|
var l = e.target.classList;
|
||||||
if (l.contains('noslide') || l.contains('iro__wheel__saturation') || l.contains('iro__slider__value') || l.contains('iro__slider')) return;
|
if (l.contains('noslide') || l.contains('iro__wheel__saturation') || l.contains('iro__slider__value') || l.contains('iro__slider')) return;
|
||||||
x0 = unify(e).clientX;
|
x0 = unify(e).clientX;
|
||||||
@ -1388,7 +1415,7 @@ function lock(e) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function drag(e) {
|
function drag(e) {
|
||||||
if (!locked) return;
|
if (!locked || pcMode) return;
|
||||||
if (d.getElementsByClassName("tabcontent")[iSlide].scrollTop != scrollS) {
|
if (d.getElementsByClassName("tabcontent")[iSlide].scrollTop != scrollS) {
|
||||||
move(e); return;
|
move(e); return;
|
||||||
}
|
}
|
||||||
@ -1401,7 +1428,7 @@ function drag(e) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function move(e) {
|
function move(e) {
|
||||||
if(!locked) return;
|
if(!locked || pcMode) return;
|
||||||
var dx = unify(e).clientX - x0, s = Math.sign(dx),
|
var dx = unify(e).clientX - x0, s = Math.sign(dx),
|
||||||
f = +(s*dx/w).toFixed(2);
|
f = +(s*dx/w).toFixed(2);
|
||||||
|
|
||||||
@ -1421,6 +1448,23 @@ function size() {
|
|||||||
w = window.innerWidth;
|
w = window.innerWidth;
|
||||||
_C.style.setProperty('--tp', d.getElementById('top').clientHeight + "px");
|
_C.style.setProperty('--tp', d.getElementById('top').clientHeight + "px");
|
||||||
_C.style.setProperty('--bt', d.getElementById('bot').clientHeight + "px");
|
_C.style.setProperty('--bt', d.getElementById('bot').clientHeight + "px");
|
||||||
|
if (w < 1250) togglePcMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
function togglePcMode()
|
||||||
|
{
|
||||||
|
if (w < 1250 && !pcMode) return;
|
||||||
|
openTab(0);
|
||||||
|
pcMode = !pcMode;
|
||||||
|
if (w < 1250) pcMode = false;
|
||||||
|
updateTablinks(0);
|
||||||
|
d.getElementById('buttonPcm').className = (pcMode) ? "active":"";
|
||||||
|
if (pcMode)
|
||||||
|
{
|
||||||
|
_C.style.width = '100%';
|
||||||
|
} else {
|
||||||
|
_C.style.width = '400%';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size();
|
size();
|
||||||
|
@ -189,7 +189,16 @@ const char PAGE_settings_sync[] PROGMEM = R"=====(<!DOCTYPE html>
|
|||||||
<h2>Sync setup</h2>
|
<h2>Sync setup</h2>
|
||||||
<h3>Button setup</h3>
|
<h3>Button setup</h3>
|
||||||
On/Off button enabled: <input type="checkbox" name="BT"><br>
|
On/Off button enabled: <input type="checkbox" name="BT"><br>
|
||||||
Infrared receiver type (0 = disabled): <input name="IR" type="number" min="0" max="6" required><br>
|
Infrared remote:
|
||||||
|
<select name=IR>
|
||||||
|
<option value=0>Disabled</option>
|
||||||
|
<option value=1>24-key RGB</option>
|
||||||
|
<option value=2>24-key with CT</option>
|
||||||
|
<option value=3>40-key blue</option>
|
||||||
|
<option value=4>44-key RGB</option>
|
||||||
|
<option value=5>21-key RGB</option>
|
||||||
|
<option value=6>6-key black</option>
|
||||||
|
</select><br>
|
||||||
<a href="https://github.com/Aircoookie/WLED/wiki/Infrared-Control" target="_blank">IR info</a>
|
<a href="https://github.com/Aircoookie/WLED/wiki/Infrared-Control" target="_blank">IR info</a>
|
||||||
<h3>WLED Broadcast</h3>
|
<h3>WLED Broadcast</h3>
|
||||||
UDP Port: <input name="UP" type="number" min="1" max="65535" required><br>
|
UDP Port: <input name="UP" type="number" min="1" max="65535" required><br>
|
||||||
@ -207,12 +216,16 @@ Use E1.31 multicast: <input type="checkbox" name="EM"><br>
|
|||||||
E1.31 start universe: <input name="EU" type="number" min="1" max="63999" required><br>
|
E1.31 start universe: <input name="EU" type="number" min="1" max="63999" required><br>
|
||||||
<i>Reboot required.</i> Check out <a href="https://github.com/ahodges9/LedFx" target="_blank">LedFx</a>!<br>
|
<i>Reboot required.</i> Check out <a href="https://github.com/ahodges9/LedFx" target="_blank">LedFx</a>!<br>
|
||||||
DMX start address: <input name="DA" type="number" min="1" max="510" value="1" required><br>
|
DMX start address: <input name="DA" type="number" min="1" max="510" value="1" required><br>
|
||||||
DMX mode: <input name="DM" type="radio" value="0"> disabled<br>
|
DMX mode:
|
||||||
<input name="DM" type="radio" value="1"> Single RGB (3 Channels for all LEDs: Red Green Blue)<br>
|
<select name=DM>
|
||||||
<input name="DM" type="radio" value="2"> Single DRGB (4 Channels for all LEDs: Dimmer Red Green Blue)<br>
|
<option value=0>Disabled</option>
|
||||||
<input name="DM" type="radio" value="3"> Effect (11 Channels for properties: Dimmer FX Speed Intensity Palette PriR PriG PriB SecR SecG SecB)<br>
|
<option value=1>Single RGB</option>
|
||||||
<input name="DM" type="radio" value="4"> Multiple RGB (3 Channels for each LED: Red Green Blue)<br>
|
<option value=2>Single DRGB</option>
|
||||||
<input name="DM" type="radio" value="5"> Multiple DRGB (1+3 Channels for each LED: Dimmer R1 G1 B1 R2 G2 B2...)<br><br>
|
<option value=3>Effect</option>
|
||||||
|
<option value=4>Multi RGB</option>
|
||||||
|
<option value=5>Multi DRGB</option>
|
||||||
|
</select><br>
|
||||||
|
<a href="https://github.com/Aircoookie/WLED/wiki/E1.31-DMX" target="_blank">E1.31 info</a><br>
|
||||||
Timeout: <input name="ET" type="number" min="1" max="65000" required> ms<br>
|
Timeout: <input name="ET" type="number" min="1" max="65000" required> ms<br>
|
||||||
Force max brightness: <input type="checkbox" name="FB"><br>
|
Force max brightness: <input type="checkbox" name="FB"><br>
|
||||||
Disable realtime gamma correction: <input type="checkbox" name="RG"><br>
|
Disable realtime gamma correction: <input type="checkbox" name="RG"><br>
|
||||||
|
2937
wled00/html_ui.h
2937
wled00/html_ui.h
File diff suppressed because it is too large
Load Diff
@ -90,7 +90,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
//version code in format yymmddb (b = daily build)
|
//version code in format yymmddb (b = daily build)
|
||||||
#define VERSION 2002021
|
#define VERSION 2002181
|
||||||
|
|
||||||
char versionString[] = "0.9.1";
|
char versionString[] = "0.9.1";
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user