Fix Chase Effects at high speeds + "Two Dots" Effect at low speeds (#659)
This commit is contained in:
parent
06a5c1a798
commit
d69a2f1514
@ -693,6 +693,8 @@ uint16_t WS2812FX::mode_android(void) {
|
|||||||
uint16_t WS2812FX::chase(uint32_t color1, uint32_t color2, uint32_t color3, bool dopalette) {
|
uint16_t WS2812FX::chase(uint32_t color1, uint32_t color2, uint32_t color3, bool dopalette) {
|
||||||
uint16_t counter = now * (SEGMENT.speed >> 3) + 1;
|
uint16_t counter = now * (SEGMENT.speed >> 3) + 1;
|
||||||
uint16_t a = counter * SEGLEN >> 16;
|
uint16_t a = counter * SEGLEN >> 16;
|
||||||
|
SEGENV.step = a;
|
||||||
|
if (SEGENV.call == 0) SEGENV.aux1 = a;
|
||||||
// Use intensity setting to vary chase up to 1/2 string length
|
// Use intensity setting to vary chase up to 1/2 string length
|
||||||
uint16_t b = (a + 1 + (SEGMENT.intensity * SEGLEN >> 10)) % SEGLEN;
|
uint16_t b = (a + 1 + (SEGMENT.intensity * SEGLEN >> 10)) % SEGLEN;
|
||||||
uint16_t c = (b + 1 + (SEGMENT.intensity * SEGLEN >> 10)) % SEGLEN;
|
uint16_t c = (b + 1 + (SEGMENT.intensity * SEGLEN >> 10)) % SEGLEN;
|
||||||
@ -703,6 +705,26 @@ uint16_t WS2812FX::chase(uint32_t color1, uint32_t color2, uint32_t color3, bool
|
|||||||
setPixelColor(b, color2);
|
setPixelColor(b, color2);
|
||||||
setPixelColor(c, color3);
|
setPixelColor(c, color3);
|
||||||
|
|
||||||
|
if (a > SEGENV.aux1) { // when speed is too fast, this catches the gaps
|
||||||
|
for (uint16_t i = SEGENV.aux1; i < a ; i++) {
|
||||||
|
setPixelColor(i, color1);
|
||||||
|
uint16_t b1 = (i + 1 + (SEGMENT.intensity * SEGLEN >> 10)) % SEGLEN;
|
||||||
|
uint16_t c1 = (b1 + 1 + (SEGMENT.intensity * SEGLEN >> 10)) % SEGLEN;
|
||||||
|
setPixelColor(b1, color2);
|
||||||
|
setPixelColor(c1, color3);
|
||||||
|
}
|
||||||
|
} else if (a < SEGENV.aux1 && a < 10) { // this is for the start of the strip
|
||||||
|
for (uint16_t i = 0; i < a ; i++) {
|
||||||
|
setPixelColor(i, color1);
|
||||||
|
uint16_t b1 = (i + 1 + (SEGMENT.intensity * SEGLEN >> 10)) % SEGLEN;
|
||||||
|
uint16_t c1 = (b1 + 1 + (SEGMENT.intensity * SEGLEN >> 10)) % SEGLEN;
|
||||||
|
setPixelColor(b1, color2);
|
||||||
|
setPixelColor(c1, color3);
|
||||||
|
SEGENV.step = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SEGENV.aux1 = a++;
|
||||||
|
|
||||||
return FRAMETIME;
|
return FRAMETIME;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1188,20 +1210,23 @@ uint16_t WS2812FX::police_base(uint32_t color1, uint32_t color2)
|
|||||||
if (idexR >= SEGLEN) idexR = 0;
|
if (idexR >= SEGLEN) idexR = 0;
|
||||||
|
|
||||||
uint16_t topindex = SEGLEN >> 1;
|
uint16_t topindex = SEGLEN >> 1;
|
||||||
uint16_t idexB = idexR + topindex;
|
uint16_t idexB = (idexR > topindex) ? idexR - topindex : idexR + topindex;
|
||||||
if (SEGENV.call == 0) SEGENV.aux0 = idexR;
|
if (SEGENV.call == 0) SEGENV.aux0 = idexR;
|
||||||
|
|
||||||
if (idexR > topindex) idexB -= SEGLEN;
|
|
||||||
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 (SEGENV.aux0 == idexR) {
|
||||||
|
setPixelColor(idexR, color1);
|
||||||
|
setPixelColor(idexB, color2);
|
||||||
|
} else {
|
||||||
uint8_t gap = (SEGENV.aux0 < idexR)? idexR - SEGENV.aux0:SEGLEN - SEGENV.aux0 + idexR;
|
uint8_t gap = (SEGENV.aux0 < idexR)? idexR - SEGENV.aux0:SEGLEN - SEGENV.aux0 + idexR;
|
||||||
for (uint8_t i = 0; i < gap ; i++) {
|
for (uint8_t i = 0; i <= gap ; i++) {
|
||||||
if ((idexR - i) < 0) idexR = SEGLEN-1 + i;
|
if ((idexR - i) < 0) idexR = SEGLEN-1 + i;
|
||||||
if ((idexB - i) < 0) idexB = SEGLEN-1 + i;
|
if ((idexB - i) < 0) idexB = SEGLEN-1 + i;
|
||||||
setPixelColor(idexR-i, color1);
|
setPixelColor(idexR-i, color1);
|
||||||
setPixelColor(idexB-i, color2);
|
setPixelColor(idexB-i, color2);
|
||||||
}
|
}
|
||||||
SEGENV.aux0 = idexR;
|
SEGENV.aux0 = idexR;
|
||||||
|
}
|
||||||
|
|
||||||
return FRAMETIME;
|
return FRAMETIME;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user