Refactored white to col[3]

Added Saw effect
This commit is contained in:
cschwinne 2019-02-05 21:53:39 +01:00
parent d1ce23c5ac
commit 9ca7ffa5a3
12 changed files with 124 additions and 147 deletions

View File

@ -889,13 +889,23 @@ uint16_t WS2812FX::mode_theater_chase_rainbow(void) {
/* /*
* Running lights effect with smooth sine transition. * Running lights effect with smooth sine transition base.
*/ */
uint16_t WS2812FX::mode_running_lights(void) { uint16_t WS2812FX::running_base(bool saw) {
uint8_t x_scale = SEGMENT.intensity >> 2; uint8_t x_scale = SEGMENT.intensity >> 2;
for(uint16_t i=0; i < SEGMENT_LENGTH; i++) { for(uint16_t i=0; i < SEGMENT_LENGTH; i++) {
uint8_t s = sin8(i*x_scale + (SEGMENT_RUNTIME.counter_mode_step >> 4)); uint8_t s = 0;
uint8_t a = i*x_scale - (SEGMENT_RUNTIME.counter_mode_step >> 4);
if (saw) {
if (a < 16)
{
a = 192 + a*8;
} else {
a = map(a,16,255,64,192);
}
}
s = sin8(a);
setPixelColor(SEGMENT.start + i, color_blend(SEGMENT.colors[1], color_from_palette(SEGMENT.start + i, true, PALETTE_SOLID_WRAP, 0), s)); setPixelColor(SEGMENT.start + i, color_blend(SEGMENT.colors[1], color_from_palette(SEGMENT.start + i, true, PALETTE_SOLID_WRAP, 0), s));
} }
SEGMENT_RUNTIME.counter_mode_step += SEGMENT.speed; SEGMENT_RUNTIME.counter_mode_step += SEGMENT.speed;
@ -904,42 +914,38 @@ uint16_t WS2812FX::mode_running_lights(void) {
/* /*
* twinkle function * Running lights effect with smooth sine transition.
*/ */
uint16_t WS2812FX::twinkle(uint32_t color) { uint16_t WS2812FX::mode_running_lights(void) {
return running_base(false);
}
/*
* Running lights effect with sawtooth transition.
*/
uint16_t WS2812FX::mode_saw(void) {
return running_base(true);
}
/*
* Blink several LEDs in random colors on, reset, repeat.
* Inspired by www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/
*/
uint16_t WS2812FX::mode_twinkle(void) {
if(SEGMENT_RUNTIME.counter_mode_step == 0) { if(SEGMENT_RUNTIME.counter_mode_step == 0) {
fill(SEGMENT.colors[1]); fill(SEGMENT.colors[1]);
SEGMENT_RUNTIME.counter_mode_step = map(SEGMENT.intensity, 0, 255, 1, SEGMENT_LENGTH); // make sure, at least one LED is on SEGMENT_RUNTIME.counter_mode_step = map(SEGMENT.intensity, 0, 255, 1, SEGMENT_LENGTH); // make sure, at least one LED is on
} }
uint16_t i = SEGMENT.start + random16(SEGMENT_LENGTH); uint16_t i = SEGMENT.start + random16(SEGMENT_LENGTH);
if (color == SEGMENT.colors[0]) setPixelColor(i, color_from_palette(i, true, PALETTE_SOLID_WRAP, 0));
{
setPixelColor(i, color_from_palette(i, true, PALETTE_SOLID_WRAP, 0));
} else {
setPixelColor(i, color);
}
SEGMENT_RUNTIME.counter_mode_step--; SEGMENT_RUNTIME.counter_mode_step--;
return 20 + (5 * (uint16_t)(255 - SEGMENT.speed)); return 20 + (5 * (uint16_t)(255 - SEGMENT.speed));
} }
/*
* Blink several LEDs on, reset, repeat.
* Inspired by www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/
*/
uint16_t WS2812FX::mode_twinkle(void) {
return twinkle(SEGMENT.colors[0]);
}
/*
* Blink several LEDs in random colors on, reset, repeat.
* Inspired by www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/
*/
uint16_t WS2812FX::mode_twinkle_random(void) {
return twinkle(color_wheel(random8()));
}
/* /*
* fade out function * fade out function

View File

@ -103,8 +103,8 @@
#define FX_MODE_THEATER_CHASE 13 #define FX_MODE_THEATER_CHASE 13
#define FX_MODE_THEATER_CHASE_RAINBOW 14 #define FX_MODE_THEATER_CHASE_RAINBOW 14
#define FX_MODE_RUNNING_LIGHTS 15 #define FX_MODE_RUNNING_LIGHTS 15
#define FX_MODE_TWINKLE 16 #define FX_MODE_SAW 16
#define FX_MODE_TWINKLE_RANDOM 17 #define FX_MODE_TWINKLE 17
#define FX_MODE_DISSOLVE 18 #define FX_MODE_DISSOLVE 18
#define FX_MODE_DISSOLVE_RANDOM 19 #define FX_MODE_DISSOLVE_RANDOM 19
#define FX_MODE_SPARKLE 20 #define FX_MODE_SPARKLE 20
@ -211,8 +211,8 @@ class WS2812FX {
_mode[FX_MODE_FADE] = &WS2812FX::mode_fade; _mode[FX_MODE_FADE] = &WS2812FX::mode_fade;
_mode[FX_MODE_THEATER_CHASE] = &WS2812FX::mode_theater_chase; _mode[FX_MODE_THEATER_CHASE] = &WS2812FX::mode_theater_chase;
_mode[FX_MODE_THEATER_CHASE_RAINBOW] = &WS2812FX::mode_theater_chase_rainbow; _mode[FX_MODE_THEATER_CHASE_RAINBOW] = &WS2812FX::mode_theater_chase_rainbow;
_mode[FX_MODE_SAW] = &WS2812FX::mode_saw;
_mode[FX_MODE_TWINKLE] = &WS2812FX::mode_twinkle; _mode[FX_MODE_TWINKLE] = &WS2812FX::mode_twinkle;
_mode[FX_MODE_TWINKLE_RANDOM] = &WS2812FX::mode_twinkle_random;
_mode[FX_MODE_DISSOLVE] = &WS2812FX::mode_dissolve; _mode[FX_MODE_DISSOLVE] = &WS2812FX::mode_dissolve;
_mode[FX_MODE_DISSOLVE_RANDOM] = &WS2812FX::mode_dissolve_random; _mode[FX_MODE_DISSOLVE_RANDOM] = &WS2812FX::mode_dissolve_random;
_mode[FX_MODE_SPARKLE] = &WS2812FX::mode_sparkle; _mode[FX_MODE_SPARKLE] = &WS2812FX::mode_sparkle;
@ -370,7 +370,7 @@ class WS2812FX {
color_wipe(uint32_t, uint32_t, bool , bool), color_wipe(uint32_t, uint32_t, bool , bool),
scan(bool), scan(bool),
theater_chase(uint32_t, uint32_t, bool), theater_chase(uint32_t, uint32_t, bool),
twinkle(uint32_t), running_base(bool),
dissolve(uint32_t), dissolve(uint32_t),
chase(uint32_t, uint32_t, uint32_t, uint8_t), chase(uint32_t, uint32_t, uint32_t, uint8_t),
gradient_base(bool), gradient_base(bool),
@ -400,8 +400,8 @@ class WS2812FX {
mode_rainbow(void), mode_rainbow(void),
mode_rainbow_cycle(void), mode_rainbow_cycle(void),
mode_running_lights(void), mode_running_lights(void),
mode_saw(void),
mode_twinkle(void), mode_twinkle(void),
mode_twinkle_random(void),
mode_dissolve(void), mode_dissolve(void),
mode_dissolve_random(void), mode_dissolve_random(void),
mode_sparkle(void), mode_sparkle(void),

View File

@ -78,7 +78,7 @@
//version code in format yymmddb (b = daily build) //version code in format yymmddb (b = daily build)
#define VERSION 1902051 #define VERSION 1902053
char versionString[] = "0.8.3-dev"; char versionString[] = "0.8.3-dev";
@ -122,10 +122,8 @@ bool autoRGBtoRGBW = false; //if RGBW enabled, calculate White
bool turnOnAtBoot = true; //turn on LEDs at power-up bool turnOnAtBoot = true; //turn on LEDs at power-up
byte bootPreset = 0; //save preset to load after power-up byte bootPreset = 0; //save preset to load after power-up
byte colS[]{255, 159, 0}; //default RGB color byte colS[]{255, 159, 0, 0}; //default RGB(W) color
byte colSecS[]{0, 0, 0}; //default RGB secondary color byte colSecS[]{0, 0, 0, 0}; //default RGB(W) secondary color
byte whiteS = 0; //default White channel
byte whiteSecS = 0; //default secondary White channel
byte briS = 127; //default brightness byte briS = 127; //default brightness
byte effectDefault = 0; byte effectDefault = 0;
byte effectSpeedDefault = 75; byte effectSpeedDefault = 75;
@ -246,16 +244,14 @@ uint16_t userVar0 = 0, userVar1 = 0;
//internal global variable declarations //internal global variable declarations
//color //color
byte col[]{255, 159, 0}; //target RGB color byte col[]{255, 159, 0, 0}; //target RGB(W) color
byte colOld[]{0, 0, 0}; //color before transition byte colOld[]{0, 0, 0, 0}; //color before transition
byte colT[]{0, 0, 0}; //current color byte colT[]{0, 0, 0, 0}; //current color
byte colIT[]{0, 0, 0}; //color that was last sent to LEDs byte colIT[]{0, 0, 0, 0}; //color that was last sent to LEDs
byte colSec[]{0, 0, 0}; byte colSec[]{0, 0, 0, 0};
byte colSecT[]{0, 0, 0}; byte colSecT[]{0, 0, 0, 0};
byte colSecOld[]{0, 0, 0}; byte colSecOld[]{0, 0, 0, 0};
byte colSecIT[]{0, 0, 0}; byte colSecIT[]{0, 0, 0, 0};
byte white = whiteS, whiteOld, whiteT, whiteIT;
byte whiteSec = whiteSecS, whiteSecOld, whiteSecT, whiteSecIT;
byte lastRandomIndex = 0; //used to save last random color so the new one is not the same byte lastRandomIndex = 0; //used to save last random color so the new one is not the same

View File

@ -129,7 +129,7 @@ void saveSettingsToEEPROM()
EEPROM.write(368, abs(arlsOffset)); EEPROM.write(368, abs(arlsOffset));
EEPROM.write(369, turnOnAtBoot); EEPROM.write(369, turnOnAtBoot);
EEPROM.write(370, useHSBDefault); EEPROM.write(370, useHSBDefault);
EEPROM.write(371, whiteS); EEPROM.write(371, colS[3]); //white default
EEPROM.write(372, useRGBW); EEPROM.write(372, useRGBW);
EEPROM.write(373, effectPaletteDefault); EEPROM.write(373, effectPaletteDefault);
EEPROM.write(374, strip.paletteFade); EEPROM.write(374, strip.paletteFade);
@ -141,7 +141,7 @@ void saveSettingsToEEPROM()
EEPROM.write(378, colSecS[0]); EEPROM.write(378, colSecS[0]);
EEPROM.write(379, colSecS[1]); EEPROM.write(379, colSecS[1]);
EEPROM.write(380, colSecS[2]); EEPROM.write(380, colSecS[2]);
EEPROM.write(381, whiteSecS); EEPROM.write(381, colSecS[3]);
EEPROM.write(382, strip.paletteBlend); EEPROM.write(382, strip.paletteBlend);
EEPROM.write(383, strip.colorOrder); EEPROM.write(383, strip.colorOrder);
@ -352,7 +352,7 @@ void loadSettingsFromEEPROM(bool first)
if (!EEPROM.read(367)) arlsOffset = -arlsOffset; if (!EEPROM.read(367)) arlsOffset = -arlsOffset;
turnOnAtBoot = EEPROM.read(369); turnOnAtBoot = EEPROM.read(369);
useHSBDefault = EEPROM.read(370); useHSBDefault = EEPROM.read(370);
whiteS = EEPROM.read(371); white = whiteS; colS[3] = EEPROM.read(371); col[3] = colS[3];
useRGBW = EEPROM.read(372); useRGBW = EEPROM.read(372);
effectPaletteDefault = EEPROM.read(373); effectPalette = effectPaletteDefault; effectPaletteDefault = EEPROM.read(373); effectPalette = effectPaletteDefault;
//374 - strip.paletteFade //374 - strip.paletteFade
@ -363,10 +363,10 @@ void loadSettingsFromEEPROM(bool first)
} }
//377 = lastEEPROMversion //377 = lastEEPROMversion
if (lastEEPROMversion > 1) { if (lastEEPROMversion > 1) {
colSecS[0] = EEPROM.read(378); colSec[0] = colSecS[0]; for (byte i=0; i<4; i++)
colSecS[1] = EEPROM.read(379); colSec[1] = colSecS[1]; {
colSecS[2] = EEPROM.read(380); colSec[2] = colSecS[2]; colSecS[i] = EEPROM.read(378+i); colSec[i] = colSecS[i];
whiteSecS = EEPROM.read(381); whiteSec = whiteSecS; }
} }
if (lastEEPROMversion > 3) { if (lastEEPROMversion > 3) {
effectIntensityDefault = EEPROM.read(326); effectIntensity = effectIntensityDefault; effectIntensityDefault = EEPROM.read(326); effectIntensity = effectIntensityDefault;
@ -538,14 +538,11 @@ bool applyPreset(byte index, bool loadBri = true, bool loadCol = true, bool load
if (loadBri) bri = EEPROM.read(i+1); if (loadBri) bri = EEPROM.read(i+1);
if (loadCol) if (loadCol)
{ {
col[0] = EEPROM.read(i+2); for (byte j=0; j<4; j++)
col[1] = EEPROM.read(i+3); {
col[2] = EEPROM.read(i+4); col[j] = EEPROM.read(i+j+2);
white = EEPROM.read(i+5); colSec[j] = EEPROM.read(i+j+6);
colSec[0] = EEPROM.read(i+6); }
colSec[1] = EEPROM.read(i+7);
colSec[2] = EEPROM.read(i+8);
whiteSec = EEPROM.read(i+9);
} }
if (loadFX) if (loadFX)
{ {
@ -564,14 +561,11 @@ void savePreset(byte index)
uint16_t i = 380 + index*20;//min400 uint16_t i = 380 + index*20;//min400
EEPROM.write(i, 1); EEPROM.write(i, 1);
EEPROM.write(i+1, bri); EEPROM.write(i+1, bri);
EEPROM.write(i+2, col[0]); for (uint16_t j=0; j<4; j++)
EEPROM.write(i+3, col[1]); {
EEPROM.write(i+4, col[2]); EEPROM.write(i+j+2, col[j]);
EEPROM.write(i+5, white); EEPROM.write(i+j+6, colSec[j]);
EEPROM.write(i+6, colSec[0]); }
EEPROM.write(i+7, colSec[1]);
EEPROM.write(i+8, colSec[2]);
EEPROM.write(i+9, whiteSec);
EEPROM.write(i+10, effectCurrent); EEPROM.write(i+10, effectCurrent);
EEPROM.write(i+11, effectSpeed); EEPROM.write(i+11, effectSpeed);

View File

@ -45,12 +45,12 @@ void XML_response(bool isHTTP, bool includeTheme)
oappendi(effectPalette); oappendi(effectPalette);
oappend("</fp><wv>"); oappend("</fp><wv>");
if (useRGBW && !autoRGBtoRGBW) { if (useRGBW && !autoRGBtoRGBW) {
oappendi(white); oappendi(col[3]);
} else { } else {
oappend("-1"); oappend("-1");
} }
oappend("</wv><ws>"); oappend("</wv><ws>");
oappendi(whiteSec); oappendi(colSec[3]);
oappend("</ws><md>"); oappend("</ws><md>");
oappendi(useHSB); oappendi(useHSB);
oappend("</md><cy>"); oappend("</md><cy>");
@ -216,11 +216,11 @@ void getSettingsJS(byte subPage)
sappend('c',"EW",useRGBW); sappend('c',"EW",useRGBW);
sappend('i',"CO",strip.colorOrder); sappend('i',"CO",strip.colorOrder);
sappend('c',"AW",autoRGBtoRGBW); sappend('c',"AW",autoRGBtoRGBW);
sappend('v',"CW",whiteS); sappend('v',"CW",colS[3]);
sappend('v',"SR",colSecS[0]); sappend('v',"SR",colSecS[0]);
sappend('v',"SG",colSecS[1]); sappend('v',"SG",colSecS[1]);
sappend('v',"SB",colSecS[2]); sappend('v',"SB",colSecS[2]);
sappend('v',"SW",whiteSecS); sappend('v',"SW",colSecS[3]);
sappend('c',"BO",turnOnAtBoot); sappend('c',"BO",turnOnAtBoot);
sappend('v',"BP",bootPreset); sappend('v',"BP",bootPreset);
sappend('v',"FX",effectDefault); sappend('v',"FX",effectDefault);

View File

@ -67,14 +67,11 @@ void handleSettingsSet(byte subPage)
//ignore settings and save current brightness, colors and fx as default //ignore settings and save current brightness, colors and fx as default
if (server.hasArg("IS")) if (server.hasArg("IS"))
{ {
colS[0] = col[0]; for (byte i=0; i<4; i++)
colS[1] = col[1]; {
colS[2] = col[2]; colS[i] = col[i];
colSecS[0] = colSec[0]; colSecS[i] = colSec[i];
colSecS[1] = colSec[1]; }
colSecS[2] = colSec[2];
whiteS = white;
whiteSecS = whiteSec;
briS = bri; briS = bri;
effectDefault = effectCurrent; effectDefault = effectCurrent;
effectSpeedDefault = effectSpeed; effectSpeedDefault = effectSpeed;
@ -87,8 +84,8 @@ void handleSettingsSet(byte subPage)
colSecS[0] = server.arg("SR").toInt(); colSecS[0] = server.arg("SR").toInt();
colSecS[1] = server.arg("SG").toInt(); colSecS[1] = server.arg("SG").toInt();
colSecS[2] = server.arg("SB").toInt(); colSecS[2] = server.arg("SB").toInt();
whiteS = server.arg("CW").toInt(); colS[3] = server.arg("CW").toInt();
whiteSecS = server.arg("SW").toInt(); colSecS[3] = server.arg("SW").toInt();
briS = server.arg("CA").toInt(); briS = server.arg("CA").toInt();
effectDefault = server.arg("FX").toInt(); effectDefault = server.arg("FX").toInt();
effectSpeedDefault = server.arg("SX").toInt(); effectSpeedDefault = server.arg("SX").toInt();
@ -386,7 +383,7 @@ bool handleSet(String req)
//set white value //set white value
pos = req.indexOf("&W="); pos = req.indexOf("&W=");
if (pos > 0) { if (pos > 0) {
white = getNumVal(&req, pos); col[3] = getNumVal(&req, pos);
} }
//set 2nd red value //set 2nd red value
@ -407,24 +404,24 @@ bool handleSet(String req)
//set 2nd white value //set 2nd white value
pos = req.indexOf("W2="); pos = req.indexOf("W2=");
if (pos > 0) { if (pos > 0) {
whiteSec = getNumVal(&req, pos); colSec[3] = getNumVal(&req, pos);
} }
//set color from HEX or 32bit DEC //set color from HEX or 32bit DEC
pos = req.indexOf("CL="); pos = req.indexOf("CL=");
if (pos > 0) { if (pos > 0) {
colorFromDecOrHexString(col, &white, (char*)req.substring(pos + 3).c_str()); colorFromDecOrHexString(col, (char*)req.substring(pos + 3).c_str());
} }
pos = req.indexOf("C2="); pos = req.indexOf("C2=");
if (pos > 0) { if (pos > 0) {
colorFromDecOrHexString(colSec, &whiteSec, (char*)req.substring(pos + 3).c_str()); colorFromDecOrHexString(colSec, (char*)req.substring(pos + 3).c_str());
} }
//set 2nd to white //set 2nd to white
pos = req.indexOf("SW"); pos = req.indexOf("SW");
if (pos > 0) { if (pos > 0) {
if(useRGBW) { if(useRGBW) {
whiteSec = 255; colSec[3] = 255;
colSec[0] = 0; colSec[0] = 0;
colSec[1] = 0; colSec[1] = 0;
colSec[2] = 0; colSec[2] = 0;
@ -438,7 +435,7 @@ bool handleSet(String req)
//set 2nd to black //set 2nd to black
pos = req.indexOf("SB"); pos = req.indexOf("SB");
if (pos > 0) { if (pos > 0) {
whiteSec = 0; colSec[3] = 0;
colSec[0] = 0; colSec[0] = 0;
colSec[1] = 0; colSec[1] = 0;
colSec[2] = 0; colSec[2] = 0;
@ -455,21 +452,18 @@ bool handleSet(String req)
colSec[0] = col[0]; colSec[0] = col[0];
colSec[1] = col[1]; colSec[1] = col[1];
colSec[2] = col[2]; colSec[2] = col[2];
whiteSec = white; colSec[3] = col[3];
} }
//swap 2nd & 1st //swap 2nd & 1st
pos = req.indexOf("SC"); pos = req.indexOf("SC");
if (pos > 0) { if (pos > 0) {
byte _temp[4]; byte temp;
for (int i = 0; i<3; i++) for (uint8_t i=0; i<4; i++)
{ {
_temp[i] = col[i]; temp = col[i];
col[i] = colSec[i]; col[i] = colSec[i];
colSec[i] = _temp[i]; colSec[i] = temp;
} }
_temp[3] = white;
white = whiteSec;
whiteSec = _temp[3];
} }
//set current effect index //set current effect index

View File

@ -33,12 +33,12 @@ void notify(byte callMode, bool followUp=false)
udpOut[7] = nightlightDelayMins; udpOut[7] = nightlightDelayMins;
udpOut[8] = effectCurrent; udpOut[8] = effectCurrent;
udpOut[9] = effectSpeed; udpOut[9] = effectSpeed;
udpOut[10] = white; udpOut[10] = col[3];
udpOut[11] = 5; //compatibilityVersionByte: 0: old 1: supports white 2: supports secondary color 3: supports FX intensity, 24 byte packet 4: supports transitionDelay 5: sup palette udpOut[11] = 5; //compatibilityVersionByte: 0: old 1: supports white 2: supports secondary color 3: supports FX intensity, 24 byte packet 4: supports transitionDelay 5: sup palette
udpOut[12] = colSec[0]; udpOut[12] = colSec[0];
udpOut[13] = colSec[1]; udpOut[13] = colSec[1];
udpOut[14] = colSec[2]; udpOut[14] = colSec[2];
udpOut[15] = whiteSec; udpOut[15] = colSec[3];
udpOut[16] = effectIntensity; udpOut[16] = effectIntensity;
udpOut[17] = (transitionDelay >> 0) & 0xFF; udpOut[17] = (transitionDelay >> 0) & 0xFF;
udpOut[18] = (transitionDelay >> 8) & 0xFF; udpOut[18] = (transitionDelay >> 8) & 0xFF;
@ -168,13 +168,13 @@ void handleNotifications()
col[2] = udpIn[5]; col[2] = udpIn[5];
if (udpIn[11] > 0) //check if sending modules white val is inteded if (udpIn[11] > 0) //check if sending modules white val is inteded
{ {
white = udpIn[10]; col[3] = udpIn[10];
if (udpIn[11] > 1) if (udpIn[11] > 1)
{ {
colSec[0] = udpIn[12]; colSec[0] = udpIn[12];
colSec[1] = udpIn[13]; colSec[1] = udpIn[13];
colSec[2] = udpIn[14]; colSec[2] = udpIn[14];
whiteSec = udpIn[15]; colSec[3] = udpIn[15];
} }
} }
} }

View File

@ -34,51 +34,46 @@ void setAllLeds() {
{ {
colSecT[i] = colSec[i]; colSecT[i] = colSec[i];
} }
whiteSecT = whiteSec; colSecT[3] = colSec[3];
} }
if (useRGBW && autoRGBtoRGBW) if (useRGBW && autoRGBtoRGBW)
{ {
colorRGBtoRGBW(colT,&whiteT); colorRGBtoRGBW(colT);
colorRGBtoRGBW(colSecT,&whiteSecT); colorRGBtoRGBW(colSecT);
} }
if (useGammaCorrectionRGB) if (useGammaCorrectionRGB)
{ {
strip.setColor(gamma8[colT[0]], gamma8[colT[1]], gamma8[colT[2]], gamma8[whiteT]); strip.setColor(gamma8[colT[0]], gamma8[colT[1]], gamma8[colT[2]], gamma8[colT[3]]);
strip.setSecondaryColor(gamma8[colSecT[0]], gamma8[colSecT[1]], gamma8[colSecT[2]], gamma8[whiteSecT]); strip.setSecondaryColor(gamma8[colSecT[0]], gamma8[colSecT[1]], gamma8[colSecT[2]], gamma8[colSecT[3]]);
} else { } else {
strip.setColor(colT[0], colT[1], colT[2], whiteT); strip.setColor(colT[0], colT[1], colT[2], colT[3]);
strip.setSecondaryColor(colSecT[0], colSecT[1], colSecT[2], whiteSecT); strip.setSecondaryColor(colSecT[0], colSecT[1], colSecT[2], colSecT[3]);
} }
} }
void setLedsStandard() void setLedsStandard()
{ {
for (byte i = 0; i<3; i++) for (byte i=0; i<4; i++)
{ {
colOld[i] = col[i]; colOld[i] = col[i];
colT[i] = col[i]; colT[i] = col[i];
colSecOld[i] = colSec[i]; colSecOld[i] = colSec[i];
colSecT[i] = colSec[i]; colSecT[i] = colSec[i];
} }
whiteOld = white;
briOld = bri; briOld = bri;
whiteSecOld = whiteSec;
whiteT = white;
briT = bri; briT = bri;
whiteSecT = whiteSec;
setAllLeds(); setAllLeds();
} }
bool colorChanged() bool colorChanged()
{ {
for (int i = 0; i < 3; i++) for (byte i=0; i<4; i++)
{ {
if (col[i] != colIT[i]) return true; if (col[i] != colIT[i]) return true;
if (colSec[i] != colSecIT[i]) return true; if (colSec[i] != colSecIT[i]) return true;
} }
if (white != whiteIT || whiteSec != whiteSecIT) return true;
if (bri != briIT) return true; if (bri != briIT) return true;
return false; return false;
} }
@ -104,14 +99,11 @@ void colorUpdated(int callMode)
nightlightDelayMs -= (millis() - nightlightStartTime); nightlightDelayMs -= (millis() - nightlightStartTime);
nightlightStartTime = millis(); nightlightStartTime = millis();
} }
colIT[0] = col[0]; for (byte i=0; i<4; i++)
colIT[1] = col[1]; {
colIT[2] = col[2]; colIT[i] = col[i];
colSecIT[0] = colSec[0]; colSecIT[i] = colSec[i];
colSecIT[1] = colSec[1]; }
colSecIT[2] = colSec[2];
whiteIT = white;
whiteSecIT = whiteSec;
briIT = bri; briIT = bri;
if (bri > 0) briLast = bri; if (bri > 0) briLast = bri;
@ -125,14 +117,11 @@ void colorUpdated(int callMode)
if (transitionActive) if (transitionActive)
{ {
colOld[0] = colT[0]; for (byte i=0; i<4; i++)
colOld[1] = colT[1]; {
colOld[2] = colT[2]; colOld[i] = colT[i];
whiteOld = whiteT; colSecOld[i] = colSecT[i];
colSecOld[0] = colSecT[0]; }
colSecOld[1] = colSecT[1];
colSecOld[2] = colSecT[2];
whiteSecOld = whiteSecT;
briOld = briT; briOld = briT;
tperLast = 0; tperLast = 0;
} }
@ -189,13 +178,11 @@ void handleTransitions()
} }
if (tper - tperLast < 0.004) return; if (tper - tperLast < 0.004) return;
tperLast = tper; tperLast = tper;
for (byte i = 0; i<3; i++) for (byte i=0; i<4; i++)
{ {
colT[i] = colOld[i]+((col[i] - colOld[i])*tper); colT[i] = colOld[i]+((col[i] - colOld[i])*tper);
colSecT[i] = colSecOld[i]+((colSec[i] - colSecOld[i])*tper); colSecT[i] = colSecOld[i]+((colSec[i] - colSecOld[i])*tper);
} }
whiteT = whiteOld +((white - whiteOld )*tper);
whiteSecT = whiteSecOld +((whiteSec - whiteSecOld )*tper);
briT = briOld +((bri - briOld )*tper); briT = briOld +((bri - briOld )*tper);
setAllLeds(); setAllLeds();

View File

@ -22,7 +22,7 @@ void _nixieDisplay(int num[], uint16_t dur[], uint16_t pausedur[], byte cnt)
strip.setRange(overlayMin, overlayMax, 0); strip.setRange(overlayMin, overlayMax, 0);
if (num[nixieClockI] >= 0 && !nixiePause) if (num[nixieClockI] >= 0 && !nixiePause)
{ {
strip.setIndividual(num[nixieClockI],((uint32_t)white << 24)| ((uint32_t)colT[0] << 16) | ((uint32_t)colT[1] << 8) | colT[2]); strip.setIndividual(num[nixieClockI],((uint32_t)colT[3] << 24)| ((uint32_t)colT[0] << 16) | ((uint32_t)colT[1] << 8) | colT[2]);
strip.unlock(num[nixieClockI]); strip.unlock(num[nixieClockI]);
} }
if (!nixiePause) if (!nixiePause)
@ -310,11 +310,11 @@ void _overlayAnalogCountdown()
byte pixelCnt = perc*overlaySize; byte pixelCnt = perc*overlaySize;
if (analogClock12pixel + pixelCnt > overlayMax) if (analogClock12pixel + pixelCnt > overlayMax)
{ {
strip.setRange(analogClock12pixel, overlayMax, ((uint32_t)whiteSec << 24)| ((uint32_t)colSec[0] << 16) | ((uint32_t)colSec[1] << 8) | colSec[2]); strip.setRange(analogClock12pixel, overlayMax, ((uint32_t)colSec[3] << 24)| ((uint32_t)colSec[0] << 16) | ((uint32_t)colSec[1] << 8) | colSec[2]);
strip.setRange(overlayMin, overlayMin +pixelCnt -(1+ overlayMax -analogClock12pixel), ((uint32_t)whiteSec << 24)| ((uint32_t)colSec[0] << 16) | ((uint32_t)colSec[1] << 8) | colSec[2]); strip.setRange(overlayMin, overlayMin +pixelCnt -(1+ overlayMax -analogClock12pixel), ((uint32_t)colSec[3] << 24)| ((uint32_t)colSec[0] << 16) | ((uint32_t)colSec[1] << 8) | colSec[2]);
} else } else
{ {
strip.setRange(analogClock12pixel, analogClock12pixel + pixelCnt, ((uint32_t)whiteSec << 24)| ((uint32_t)colSec[0] << 16) | ((uint32_t)colSec[1] << 8) | colSec[2]); strip.setRange(analogClock12pixel, analogClock12pixel + pixelCnt, ((uint32_t)colSec[3] << 24)| ((uint32_t)colSec[0] << 16) | ((uint32_t)colSec[1] << 8) | colSec[2]);
} }
} }
overlayRefreshMs = 998; overlayRefreshMs = 998;

View File

@ -68,7 +68,7 @@ void onAlexaChange(byte b, uint32_t color)
col[0] = ((color >> 16) & 0xFF); col[0] = ((color >> 16) & 0xFF);
col[1] = ((color >> 8) & 0xFF); col[1] = ((color >> 8) & 0xFF);
col[2] = (color & 0xFF); col[2] = (color & 0xFF);
if (useRGBW) colorRGBtoRGBW(col,&white); if (useRGBW) colorRGBtoRGBW(col);
colorUpdated(10); colorUpdated(10);
} }
} }

View File

@ -4,7 +4,7 @@
void colorFromUint32(uint32_t in) void colorFromUint32(uint32_t in)
{ {
white = in >> 24 & 0xFF; col[3] = in >> 24 & 0xFF;
col[0] = in >> 16 & 0xFF; col[0] = in >> 16 & 0xFF;
col[1] = in >> 8 & 0xFF; col[1] = in >> 8 & 0xFF;
col[2] = in & 0xFF; col[2] = in & 0xFF;
@ -118,7 +118,7 @@ void colorRGBtoXY(byte* rgb, float* xy) //rgb to coordinates (https://www.develo
} }
#endif #endif
void colorFromDecOrHexString(byte* rgb, byte* wht, char* in) void colorFromDecOrHexString(byte* rgb, char* in)
{ {
if (in[0] == 0) return; if (in[0] == 0) return;
char first = in[0]; char first = in[0];
@ -132,7 +132,7 @@ void colorFromDecOrHexString(byte* rgb, byte* wht, char* in)
c = strtoul(in, NULL, 10); c = strtoul(in, NULL, 10);
} }
*wht = (c >> 24) & 0xFF; rgb[3] = (c >> 24) & 0xFF;
rgb[0] = (c >> 16) & 0xFF; rgb[0] = (c >> 16) & 0xFF;
rgb[1] = (c >> 8) & 0xFF; rgb[1] = (c >> 8) & 0xFF;
rgb[2] = c & 0xFF; rgb[2] = c & 0xFF;
@ -150,11 +150,11 @@ float maxf (float v, float w)
return v; return v;
} }
void colorRGBtoRGBW(byte* rgb, byte* wht) //rgb to rgbw (http://codewelt.com/rgbw) void colorRGBtoRGBW(byte* rgb) //rgb to rgbw (http://codewelt.com/rgbw)
{ {
float low = minf(rgb[0],minf(rgb[1],rgb[2])); float low = minf(rgb[0],minf(rgb[1],rgb[2]));
float high = maxf(rgb[0],maxf(rgb[1],rgb[2])); float high = maxf(rgb[0],maxf(rgb[1],rgb[2]));
if (high < 0.1f) return; if (high < 0.1f) return;
float sat = 255.0f * ((high - low) / high); float sat = 255.0f * ((high - low) / high);
*wht = (byte)((255.0f - sat) / 255.0f * (rgb[0] + rgb[1] + rgb[2]) / 3); rgb[3] = (byte)((255.0f - sat) / 255.0f * (rgb[0] + rgb[1] + rgb[2]) / 3);
} }

View File

@ -25,7 +25,7 @@ void callbackMQTT(char* topic, byte* payload, unsigned int length) {
if (strstr(topic, "/col")) if (strstr(topic, "/col"))
{ {
colorFromDecOrHexString(col, &white, (char*)payload); colorFromDecOrHexString(col, (char*)payload);
colorUpdated(1); colorUpdated(1);
} else if (strstr(topic, "/api")) } else if (strstr(topic, "/api"))
{ {
@ -53,7 +53,7 @@ void publishMQTT()
strcat(subuf, "/g"); strcat(subuf, "/g");
mqtt->publish(subuf, s); mqtt->publish(subuf, s);
sprintf(s, "#%X", white*16777216 + col[0]*65536 + col[1]*256 + col[2]); sprintf(s, "#%X", col[3]*16777216 + col[0]*65536 + col[1]*256 + col[2]);
strcpy(subuf, mqttDeviceTopic); strcpy(subuf, mqttDeviceTopic);
strcat(subuf, "/c"); strcat(subuf, "/c");
mqtt->publish(subuf, s); mqtt->publish(subuf, s);