2016-12-31 00:38:51 +01:00
|
|
|
/*
|
|
|
|
* LED methods
|
|
|
|
*/
|
|
|
|
|
2016-11-19 19:39:17 +01:00
|
|
|
void setAllLeds() {
|
2018-03-14 13:16:28 +01:00
|
|
|
double d = briT*briMultiplier;
|
2016-12-14 23:40:47 +01:00
|
|
|
int val = d/100;
|
2017-02-21 23:13:05 +01:00
|
|
|
if (val > 255) val = 255;
|
2017-02-01 19:25:36 +01:00
|
|
|
if (useGammaCorrectionBri)
|
|
|
|
{
|
|
|
|
strip.setBrightness(gamma8[val]);
|
|
|
|
} else {
|
|
|
|
strip.setBrightness(val);
|
|
|
|
}
|
2017-10-12 17:09:59 +02:00
|
|
|
if (useGammaCorrectionRGB)
|
|
|
|
{
|
2018-03-14 13:16:28 +01:00
|
|
|
strip.setColor(gamma8[colT[0]], gamma8[colT[1]], gamma8[colT[2]], gamma8[whiteT]);
|
|
|
|
strip.setSecondaryColor(gamma8[colSec[0]], gamma8[colSec[1]], gamma8[colSec[2]], gamma8[whiteSec]);
|
2017-10-12 17:09:59 +02:00
|
|
|
} else {
|
2018-03-14 13:16:28 +01:00
|
|
|
strip.setColor(colT[0], colT[1], colT[2], whiteT);
|
|
|
|
strip.setSecondaryColor(colSec[0], colSec[1], colSec[2], whiteSec);
|
2017-10-12 17:09:59 +02:00
|
|
|
}
|
2016-11-19 19:39:17 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void setLedsStandard()
|
|
|
|
{
|
2018-03-14 13:16:28 +01:00
|
|
|
colOld[0] = col[0];
|
|
|
|
colOld[1] = col[1];
|
|
|
|
colOld[2] = col[2];
|
|
|
|
whiteOld = white;
|
|
|
|
briOld = bri;
|
|
|
|
colT[0] = col[0];
|
|
|
|
colT[1] = col[1];
|
|
|
|
colT[2] = col[2];
|
|
|
|
whiteT = white;
|
|
|
|
briT = bri;
|
2016-11-19 19:39:17 +01:00
|
|
|
setAllLeds();
|
|
|
|
}
|
|
|
|
|
2017-11-28 16:04:11 +01:00
|
|
|
bool colorChanged()
|
|
|
|
{
|
|
|
|
for (int i = 0; i < 3; i++)
|
|
|
|
{
|
2018-03-14 13:16:28 +01:00
|
|
|
if (col[i] != colIT[i]) return true;
|
|
|
|
if (colSec[i] != colSecIT[i]) return true;
|
2017-11-28 16:04:11 +01:00
|
|
|
}
|
2018-03-14 13:16:28 +01:00
|
|
|
if (white != whiteIT || whiteSec != whiteSecIT) return true;
|
|
|
|
if (bri != briIT) return true;
|
2017-11-28 16:04:11 +01:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2016-11-19 19:39:17 +01:00
|
|
|
void colorUpdated(int callMode)
|
|
|
|
{
|
2018-02-28 00:27:10 +01:00
|
|
|
//call for notifier -> 0: init 1: direct change 2: button 3: notification 4: nightlight 5: other (NN)6: fx changed 7: hue
|
2017-11-28 16:04:11 +01:00
|
|
|
if (!colorChanged())
|
2016-11-19 19:39:17 +01:00
|
|
|
{
|
2016-12-14 23:40:47 +01:00
|
|
|
if (callMode == 6) notify(6);
|
2016-11-19 19:39:17 +01:00
|
|
|
return; //no change
|
|
|
|
}
|
2017-04-26 14:04:53 +02:00
|
|
|
if (callMode != 5 && nightlightActive && nightlightFade)
|
|
|
|
{
|
2018-03-14 13:16:28 +01:00
|
|
|
briNlT = bri;
|
2017-04-26 14:04:53 +02:00
|
|
|
nightlightDelayMs -= (millis() - nightlightStartTime);
|
|
|
|
nightlightStartTime = millis();
|
|
|
|
}
|
2018-03-14 13:16:28 +01:00
|
|
|
colIT[0] = col[0];
|
|
|
|
colIT[1] = col[1];
|
|
|
|
colIT[2] = col[2];
|
|
|
|
colSecIT[0] = colSec[0];
|
|
|
|
colSecIT[1] = colSec[1];
|
|
|
|
colSecIT[2] = colSec[2];
|
|
|
|
whiteIT = white;
|
|
|
|
whiteSecIT = whiteSec;
|
|
|
|
briIT = bri;
|
|
|
|
if (bri > 0) briLast = bri;
|
2016-11-19 19:39:17 +01:00
|
|
|
notify(callMode);
|
2017-10-28 22:22:37 +02:00
|
|
|
if (fadeTransition || sweepTransition)
|
2016-11-19 19:39:17 +01:00
|
|
|
{
|
2018-03-15 13:03:50 +01:00
|
|
|
//set correct delay if not using notification delay
|
|
|
|
if (callMode != 3) transitionDelayTemp = transitionDelay;
|
|
|
|
|
2017-10-28 23:40:06 +02:00
|
|
|
if (transitionActive)
|
2016-11-19 19:39:17 +01:00
|
|
|
{
|
2018-03-14 13:16:28 +01:00
|
|
|
colOld[0] = colT[0];
|
|
|
|
colOld[1] = colT[1];
|
|
|
|
colOld[2] = colT[2];
|
|
|
|
whiteOld = whiteT;
|
|
|
|
briOld = briT;
|
|
|
|
tperLast = 0;
|
2016-11-19 19:39:17 +01:00
|
|
|
}
|
|
|
|
transitionActive = true;
|
|
|
|
transitionStartTime = millis();
|
2017-11-19 15:31:17 +01:00
|
|
|
strip.setFastUpdateMode(true);
|
2016-11-19 19:39:17 +01:00
|
|
|
} else
|
|
|
|
{
|
|
|
|
setLedsStandard();
|
2017-11-19 15:31:17 +01:00
|
|
|
strip.trigger();
|
2016-11-19 19:39:17 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void handleTransitions()
|
|
|
|
{
|
2018-03-15 13:03:50 +01:00
|
|
|
if (transitionActive && transitionDelayTemp > 0)
|
2016-11-19 19:39:17 +01:00
|
|
|
{
|
2018-03-15 13:03:50 +01:00
|
|
|
float tper = (millis() - transitionStartTime)/(float)transitionDelayTemp;
|
2016-11-19 19:39:17 +01:00
|
|
|
if (tper >= 1.0)
|
|
|
|
{
|
|
|
|
transitionActive = false;
|
2018-03-14 13:16:28 +01:00
|
|
|
tperLast = 0;
|
2017-10-28 22:22:37 +02:00
|
|
|
if (sweepTransition) strip.unlockAll();
|
2016-11-19 19:39:17 +01:00
|
|
|
setLedsStandard();
|
2017-11-19 15:31:17 +01:00
|
|
|
strip.setFastUpdateMode(false);
|
2016-11-19 19:39:17 +01:00
|
|
|
return;
|
|
|
|
}
|
2018-03-14 13:16:28 +01:00
|
|
|
if (tper - tperLast < transitionResolution)
|
2016-11-19 19:39:17 +01:00
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
2018-03-14 13:16:28 +01:00
|
|
|
tperLast = tper;
|
2016-11-19 19:39:17 +01:00
|
|
|
if (fadeTransition)
|
|
|
|
{
|
2018-03-14 13:16:28 +01:00
|
|
|
colT[0] = colOld[0]+((col[0] - colOld[0])*tper);
|
|
|
|
colT[1] = colOld[1]+((col[1] - colOld[1])*tper);
|
|
|
|
colT[2] = colOld[2]+((col[2] - colOld[2])*tper);
|
|
|
|
whiteT = whiteOld +((white - whiteOld )*tper);
|
|
|
|
briT = briOld +((bri - briOld )*tper);
|
2016-11-19 19:39:17 +01:00
|
|
|
}
|
2017-10-28 22:22:37 +02:00
|
|
|
if (sweepTransition)
|
|
|
|
{
|
|
|
|
strip.lockAll();
|
|
|
|
if (sweepDirection)
|
|
|
|
{
|
2018-03-14 13:16:28 +01:00
|
|
|
strip.unlockRange(0, (int)(tper*(double)ledCount));
|
2017-10-28 22:22:37 +02:00
|
|
|
} else
|
|
|
|
{
|
2018-03-14 13:16:28 +01:00
|
|
|
strip.unlockRange(ledCount - (int)(tper*(double)ledCount), ledCount);
|
2017-10-28 22:22:37 +02:00
|
|
|
}
|
|
|
|
if (!fadeTransition)
|
|
|
|
{
|
|
|
|
setLedsStandard();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (fadeTransition) setAllLeds();
|
2016-11-27 16:45:54 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void handleNightlight()
|
|
|
|
{
|
|
|
|
if (nightlightActive)
|
|
|
|
{
|
2018-03-14 13:16:28 +01:00
|
|
|
if (!nightlightActiveOld) //init
|
2016-11-27 16:45:54 +01:00
|
|
|
{
|
2016-12-11 20:11:14 +01:00
|
|
|
nightlightStartTime = millis();
|
2016-11-27 22:37:51 +01:00
|
|
|
notify(4);
|
2016-11-27 16:45:54 +01:00
|
|
|
nightlightDelayMs = (int)(nightlightDelayMins*60000);
|
2018-03-14 13:16:28 +01:00
|
|
|
nightlightActiveOld = true;
|
|
|
|
briNlT = bri;
|
2016-11-27 16:45:54 +01:00
|
|
|
}
|
|
|
|
float nper = (millis() - nightlightStartTime)/((float)nightlightDelayMs);
|
2017-04-26 14:04:53 +02:00
|
|
|
if (nightlightFade)
|
|
|
|
{
|
2018-03-14 13:16:28 +01:00
|
|
|
bri = briNlT+((nightlightTargetBri - briNlT)*nper);
|
2017-04-26 14:04:53 +02:00
|
|
|
colorUpdated(5);
|
|
|
|
}
|
2016-11-27 16:45:54 +01:00
|
|
|
if (nper >= 1)
|
|
|
|
{
|
|
|
|
nightlightActive = false;
|
2016-12-11 20:11:14 +01:00
|
|
|
if (!nightlightFade)
|
|
|
|
{
|
2018-02-20 22:29:48 +01:00
|
|
|
bri = nightlightTargetBri;
|
2016-12-11 20:11:14 +01:00
|
|
|
colorUpdated(5);
|
|
|
|
}
|
2018-03-14 13:16:28 +01:00
|
|
|
if (bri == 0) briLast = briNlT;
|
2016-11-27 16:45:54 +01:00
|
|
|
}
|
2018-03-14 13:16:28 +01:00
|
|
|
} else if (nightlightActiveOld) //early de-init
|
2016-11-27 16:45:54 +01:00
|
|
|
{
|
2018-03-14 13:16:28 +01:00
|
|
|
nightlightActiveOld = false;
|
2016-11-27 16:45:54 +01:00
|
|
|
}
|
|
|
|
}
|