Various improvements

UI Quick color selectors
UI PC mode
Different Heartbeat effect
PoliceAll improvements
Clarified sync settings
This commit is contained in:
cschwinne 2020-02-18 18:52:47 +01:00
parent 9e62db5237
commit 1fd0383f69
6 changed files with 2547 additions and 2487 deletions

View File

@ -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,19 +1230,31 @@ 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
for (uint8_t i=0; i <= size; i++) { if (all) { //different algo, ensuring immediate fill
setPixelColor(idexR+i, color1); if (idexB > idexR) {
setPixelColor(idexB+i, color2); fill(color2);
} for (uint16_t i = idexR; i < idexB; i++) setPixelColor(i, color1);
if (SEGENV.aux0 != idexR) { } else {
uint8_t gap = (SEGENV.aux0 < idexR)? idexR - SEGENV.aux0:SEGLEN - SEGENV.aux0 + idexR; fill(color1);
for (uint8_t i = 0; i <= gap ; i++) { for (uint16_t i = idexB; i < idexR; i++) setPixelColor(i, color2);
if ((idexR - i) < 0) idexR = SEGLEN-1 + i; }
if ((idexB - i) < 0) idexB = SEGLEN-1 + i; } else { //regular dot-only mode
setPixelColor(idexR-i, color1); uint8_t size = 1 + SEGMENT.intensity >> 3;
setPixelColor(idexB-i, color2); if (size > SEGLEN/2) size = 1+ SEGLEN/2;
for (uint8_t i=0; i <= size; i++) {
setPixelColor(idexR+i, color1);
setPixelColor(idexB+i, color2);
}
if (SEGENV.aux0 != idexR) {
uint8_t gap = (SEGENV.aux0 < idexR)? idexR - SEGENV.aux0:SEGLEN - SEGENV.aux0 + idexR;
for (uint8_t i = 0; i <= gap ; i++) {
if ((idexR - i) < 0) idexR = SEGLEN-1 + i;
if ((idexB - i) < 0) idexB = SEGLEN-1 + i;
setPixelColor(idexR-i, color1);
setPixelColor(idexB-i, 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);
} }
@ -3087,8 +3098,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++) {
@ -3122,41 +3133,28 @@ uint16_t WS2812FX::mode_percent(void) {
} }
uint16_t WS2812FX::mode_heartbeat(void) { uint16_t WS2812FX::mode_heartbeat(void) {
static unsigned long lastBeat = 0;
static bool secondBeatActive = false;
uint8_t bpm = 40 + (SEGMENT.speed >> 4); uint8_t bpm = 40 + (SEGMENT.speed >> 4);
uint32_t msPerBeat = (60000 / bpm); uint32_t msPerBeat = (60000 / bpm);
uint32_t secondBeat = (msPerBeat / 3); uint32_t secondBeat = (msPerBeat / 3);
// Get and translate the segment's size option uint32_t bri_lower = SEGENV.aux1;
uint8_t size = 2 << ((SEGMENT.options >> 1) & 0x03); // 2,4,8,16 bri_lower = bri_lower * 2042 / (2048 + SEGMENT.intensity);
SEGENV.aux1 = bri_lower;
// copy pixels from the middle of the segment to the edges unsigned long beatTimer = millis() - SEGENV.step;
uint16_t bytesPerPixelBlock = size * 4; if((beatTimer > secondBeat) && !SEGENV.aux0) { // time for the second beat?
uint16_t centerOffset = (SEGLEN / 2) * 4; SEGENV.aux1 = UINT16_MAX; //full bri
uint16_t byteCount = centerOffset - bytesPerPixelBlock; SEGENV.aux0 = 1;
memmove(bus->GetPixels(), bus->GetPixels() + bytesPerPixelBlock, byteCount);
memmove(bus->GetPixels() + centerOffset + bytesPerPixelBlock, bus->GetPixels() + centerOffset, byteCount);
fade_out(255 - SEGMENT.intensity);
unsigned long beatTimer = millis() - lastBeat;
if((beatTimer > secondBeat) && !secondBeatActive) { // time for the second beat?
uint16_t startLed = (SEGLEN / 2) - size;
for (uint16_t i = startLed; i < startLed + (size * 2); i++) {
setPixelColor(i, SEGMENT.colors[0]);
}
secondBeatActive = 1;
} }
if(beatTimer > msPerBeat) { // time to reset the beat timer? if(beatTimer > msPerBeat) { // time to reset the beat timer?
uint16_t startLed = (SEGLEN / 2) - size; SEGENV.aux1 = UINT16_MAX; //full bri
for (uint16_t i = startLed; i < startLed + (size * 2); i++) { SEGENV.aux0 = 0;
setPixelColor(i, SEGMENT.colors[0]); SEGENV.step = millis();
} }
secondBeatActive = 0;
lastBeat = 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; return FRAMETIME;
} }

View File

@ -381,8 +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_HEARTBEAT] = &WS2812FX::mode_heartbeat;
_mode[FX_MODE_RIPPLE_RAINBOW] = &WS2812FX::mode_ripple_rainbow; _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);
@ -614,7 +614,7 @@ class WS2812FX {
chase(uint32_t, uint32_t, uint32_t, bool), chase(uint32_t, uint32_t, uint32_t, bool),
gradient_base(bool), gradient_base(bool),
ripple_base(bool), ripple_base(bool),
police_base(uint32_t, uint32_t), 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),

File diff suppressed because one or more lines are too long

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -90,7 +90,7 @@
#endif #endif
//version code in format yymmddb (b = daily build) //version code in format yymmddb (b = daily build)
#define VERSION 2002172 #define VERSION 2002181
char versionString[] = "0.9.1"; char versionString[] = "0.9.1";