Merge branch 'full-seg-sync' of github.com:blazoncek/WLED into full-seg-sync
This commit is contained in:
commit
72a6681ac1
@ -22,11 +22,6 @@ void colorFromUint24(uint32_t in, bool secondary)
|
|||||||
_col[2] = B(in);
|
_col[2] = B(in);
|
||||||
}
|
}
|
||||||
|
|
||||||
//store color components in uint32_t
|
|
||||||
uint32_t colorFromRgbw(byte* rgbw) {
|
|
||||||
return RGBW32(rgbw[0], rgbw[1], rgbw[2], rgbw[3]);
|
|
||||||
}
|
|
||||||
|
|
||||||
//relatively change white brightness, minumum A=5
|
//relatively change white brightness, minumum A=5
|
||||||
void relativeChangeWhite(int8_t amount, byte lowerBoundary)
|
void relativeChangeWhite(int8_t amount, byte lowerBoundary)
|
||||||
{
|
{
|
||||||
@ -259,7 +254,7 @@ uint32_t colorBalanceFromKelvin(uint16_t kelvin, uint32_t rgb)
|
|||||||
rgbw[1] = ((uint16_t) correctionRGB[1] * G(rgb)) /255; // correct G
|
rgbw[1] = ((uint16_t) correctionRGB[1] * G(rgb)) /255; // correct G
|
||||||
rgbw[2] = ((uint16_t) correctionRGB[2] * B(rgb)) /255; // correct B
|
rgbw[2] = ((uint16_t) correctionRGB[2] * B(rgb)) /255; // correct B
|
||||||
rgbw[3] = W(rgb);
|
rgbw[3] = W(rgb);
|
||||||
return colorFromRgbw(rgbw);
|
return RGBW32(rgbw[0],rgbw[1],rgbw[2],rgbw[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
//approximates a Kelvin color temperature from an RGB color.
|
//approximates a Kelvin color temperature from an RGB color.
|
||||||
|
@ -10,7 +10,6 @@ var nlDur = 60, nlTar = 0;
|
|||||||
var nlMode = false;
|
var nlMode = false;
|
||||||
var selectedFx = 0, prevFx = -1;
|
var selectedFx = 0, prevFx = -1;
|
||||||
var selectedPal = 0;
|
var selectedPal = 0;
|
||||||
var sliderControl = ""; //WLEDSR: used by togglePcMode
|
|
||||||
var csel = 0;
|
var csel = 0;
|
||||||
var currentPreset = -1, prevPS = -1;
|
var currentPreset = -1, prevPS = -1;
|
||||||
var lastUpdate = 0;
|
var lastUpdate = 0;
|
||||||
@ -1612,6 +1611,11 @@ ${makePlSel(true)}
|
|||||||
Save segment bounds
|
Save segment bounds
|
||||||
<input type="checkbox" id="p${i}sbtgl" checked>
|
<input type="checkbox" id="p${i}sbtgl" checked>
|
||||||
<span class="checkmark schk"></span>
|
<span class="checkmark schk"></span>
|
||||||
|
</label>
|
||||||
|
<label class="check revchkl">
|
||||||
|
Checked segments only
|
||||||
|
<input type="checkbox" id="p${i}sbchk">
|
||||||
|
<span class="checkmark schk"></span>
|
||||||
</label>`;
|
</label>`;
|
||||||
|
|
||||||
return `<input type="text" class="ptxt noslide" id="p${i}txt" autocomplete="off" maxlength=32 value="${(i>0)?pName(i):""}" placeholder="Enter name..."/>
|
return `<input type="text" class="ptxt noslide" id="p${i}txt" autocomplete="off" maxlength=32 value="${(i>0)?pName(i):""}" placeholder="Enter name..."/>
|
||||||
@ -1909,6 +1913,7 @@ function saveP(i,pl)
|
|||||||
} else {
|
} else {
|
||||||
obj.ib = gId(`p${i}ibtgl`).checked;
|
obj.ib = gId(`p${i}ibtgl`).checked;
|
||||||
obj.sb = gId(`p${i}sbtgl`).checked;
|
obj.sb = gId(`p${i}sbtgl`).checked;
|
||||||
|
obj.sc = gId(`p${i}sbchk`).checked;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ bool getJsonValue(const JsonVariant& element, DestType& destination, const Defau
|
|||||||
//colors.cpp
|
//colors.cpp
|
||||||
void colorFromUint32(uint32_t in, bool secondary = false);
|
void colorFromUint32(uint32_t in, bool secondary = false);
|
||||||
void colorFromUint24(uint32_t in, bool secondary = false);
|
void colorFromUint24(uint32_t in, bool secondary = false);
|
||||||
uint32_t colorFromRgbw(byte* rgbw);
|
inline uint32_t colorFromRgbw(byte* rgbw) { return uint32_t((byte(rgbw[3]) << 24) | (byte(rgbw[0]) << 16) | (byte(rgbw[1]) << 8) | (byte(rgbw[2]))); }
|
||||||
void relativeChangeWhite(int8_t amount, byte lowerBoundary = 0);
|
void relativeChangeWhite(int8_t amount, byte lowerBoundary = 0);
|
||||||
void colorHStoRGB(uint16_t hue, byte sat, byte* rgb); //hue, sat to rgb
|
void colorHStoRGB(uint16_t hue, byte sat, byte* rgb); //hue, sat to rgb
|
||||||
void colorKtoRGB(uint16_t kelvin, byte* rgb);
|
void colorKtoRGB(uint16_t kelvin, byte* rgb);
|
||||||
@ -146,7 +146,6 @@ void resetTimebase();
|
|||||||
void toggleOnOff();
|
void toggleOnOff();
|
||||||
void setAllLeds();
|
void setAllLeds();
|
||||||
void setLedsStandard();
|
void setLedsStandard();
|
||||||
bool colorChanged();
|
|
||||||
void colorUpdated(int callMode);
|
void colorUpdated(int callMode);
|
||||||
void updateInterfaces(uint8_t callMode);
|
void updateInterfaces(uint8_t callMode);
|
||||||
void handleTransitions();
|
void handleTransitions();
|
||||||
|
3207
wled00/html_ui.h
3207
wled00/html_ui.h
File diff suppressed because it is too large
Load Diff
@ -131,16 +131,13 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!colValid) continue;
|
if (!colValid) continue;
|
||||||
if (id == strip.getMainSegmentId() && i < 2) //temporary, to make transition work on main segment
|
|
||||||
{
|
uint32_t color = RGBW32(rgbw[0],rgbw[1],rgbw[2],rgbw[3]);
|
||||||
if (i == 0) {col[0] = rgbw[0]; col[1] = rgbw[1]; col[2] = rgbw[2]; col[3] = rgbw[3];}
|
colorChanged |= (seg.colors[i] != color);
|
||||||
if (i == 1) {colSec[0] = rgbw[0]; colSec[1] = rgbw[1]; colSec[2] = rgbw[2]; colSec[3] = rgbw[3];}
|
seg.setColor(i, color, id);
|
||||||
} else { //normal case, apply directly to segment
|
|
||||||
seg.setColor(i, ((rgbw[3] << 24) | ((rgbw[0]&0xFF) << 16) | ((rgbw[1]&0xFF) << 8) | ((rgbw[2]&0xFF))), id);
|
|
||||||
if (seg.mode == FX_MODE_STATIC) strip.trigger(); //instant refresh
|
if (seg.mode == FX_MODE_STATIC) strip.trigger(); //instant refresh
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// lx parser
|
// lx parser
|
||||||
#ifdef WLED_ENABLE_LOXONE
|
#ifdef WLED_ENABLE_LOXONE
|
||||||
@ -161,26 +158,18 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
|
|||||||
|
|
||||||
if (!(elem[F("sel")].isNull() && elem["rev"].isNull() && elem["on"].isNull() && elem[F("mi")].isNull())) effectChanged = true; //send UDP
|
if (!(elem[F("sel")].isNull() && elem["rev"].isNull() && elem["on"].isNull() && elem[F("mi")].isNull())) effectChanged = true; //send UDP
|
||||||
|
|
||||||
//temporary, strip object gets updated via colorUpdated()
|
|
||||||
if (id == strip.getMainSegmentId()) {
|
|
||||||
byte effectPrev = effectCurrent;
|
|
||||||
if (getVal(elem["fx"], &effectCurrent, 1, strip.getModeCount())) { //load effect ('r' random, '~' inc/dec, 1-255 exact value)
|
|
||||||
if (!presetId && effectCurrent != effectPrev) unloadPlaylist(); //stop playlist if active and FX changed manually
|
|
||||||
}
|
|
||||||
effectSpeed = elem[F("sx")] | effectSpeed;
|
|
||||||
effectIntensity = elem[F("ix")] | effectIntensity;
|
|
||||||
getVal(elem["pal"], &effectPalette, 1, strip.getPaletteCount());
|
|
||||||
} else { //permanent
|
|
||||||
byte fx = seg.mode;
|
byte fx = seg.mode;
|
||||||
byte fxPrev = fx;
|
byte fxPrev = fx;
|
||||||
if (getVal(elem["fx"], &fx, 1, strip.getModeCount())) { //load effect ('r' random, '~' inc/dec, 1-255 exact value)
|
if (getVal(elem["fx"], &fx, 1, strip.getModeCount())) { //load effect ('r' random, '~' inc/dec, 1-255 exact value)
|
||||||
strip.setMode(id, fx);
|
strip.setMode(id, fx);
|
||||||
if (!presetId && seg.mode != fxPrev) unloadPlaylist(); //stop playlist if active and FX changed manually
|
if (!presetId && seg.mode != fxPrev) {
|
||||||
|
effectChanged = true; //send UDP
|
||||||
|
unloadPlaylist(); //stop playlist if active and FX changed manually
|
||||||
|
}
|
||||||
}
|
}
|
||||||
seg.speed = elem[F("sx")] | seg.speed;
|
seg.speed = elem[F("sx")] | seg.speed;
|
||||||
seg.intensity = elem[F("ix")] | seg.intensity;
|
seg.intensity = elem[F("ix")] | seg.intensity;
|
||||||
getVal(elem["pal"], &seg.palette, 1, strip.getPaletteCount());
|
getVal(elem["pal"], &seg.palette, 1, strip.getPaletteCount());
|
||||||
}
|
|
||||||
|
|
||||||
JsonArray iarr = elem[F("i")]; //set individual LEDs
|
JsonArray iarr = elem[F("i")]; //set individual LEDs
|
||||||
if (!iarr.isNull()) {
|
if (!iarr.isNull()) {
|
||||||
@ -307,32 +296,32 @@ bool deserializeState(JsonObject root, byte callMode, byte presetId)
|
|||||||
|
|
||||||
byte prevMain = strip.getMainSegmentId();
|
byte prevMain = strip.getMainSegmentId();
|
||||||
strip.mainSegment = root[F("mainseg")] | prevMain;
|
strip.mainSegment = root[F("mainseg")] | prevMain;
|
||||||
if (strip.getMainSegmentId() != prevMain) setValuesFromMainSeg();
|
//if (strip.getMainSegmentId() != prevMain) setValuesFromMainSeg();
|
||||||
|
|
||||||
int it = 0;
|
int it = 0;
|
||||||
JsonVariant segVar = root["seg"];
|
JsonVariant segVar = root["seg"];
|
||||||
if (segVar.is<JsonObject>())
|
if (segVar.is<JsonObject>())
|
||||||
{
|
{
|
||||||
int id = segVar["id"] | -1;
|
int id = segVar["id"] | -1;
|
||||||
|
//if "seg" is not an array and ID not specified, apply to all selected/checked segments
|
||||||
if (id < 0) { //set all selected segments
|
if (id < 0) {
|
||||||
bool didSet = false;
|
//apply all selected segments
|
||||||
byte lowestActive = 99;
|
//bool didSet = false;
|
||||||
for (byte s = 0; s < strip.getMaxSegments(); s++)
|
//byte lowestActive = 99;
|
||||||
{
|
for (byte s = 0; s < strip.getMaxSegments(); s++) {
|
||||||
WS2812FX::Segment &sg = strip.getSegment(s);
|
WS2812FX::Segment &sg = strip.getSegment(s);
|
||||||
if (sg.isActive())
|
if (sg.isActive()) {
|
||||||
{
|
//if (lowestActive == 99) lowestActive = s;
|
||||||
if (lowestActive == 99) lowestActive = s;
|
|
||||||
if (sg.isSelected()) {
|
if (sg.isSelected()) {
|
||||||
deserializeSegment(segVar, s, presetId);
|
deserializeSegment(segVar, s, presetId);
|
||||||
didSet = true;
|
//didSet = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!didSet && lowestActive < strip.getMaxSegments()) deserializeSegment(segVar, lowestActive, presetId);
|
//TODO: not sure if it is good idea to change first active but unselected segment
|
||||||
} else { //set only the segment with the specified ID
|
//if (!didSet && lowestActive < strip.getMaxSegments()) deserializeSegment(segVar, lowestActive, presetId);
|
||||||
deserializeSegment(segVar, it, presetId);
|
} else {
|
||||||
|
deserializeSegment(segVar, id, presetId); //apply only the segment with the specified ID
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
JsonArray segs = segVar.as<JsonArray>();
|
JsonArray segs = segVar.as<JsonArray>();
|
||||||
@ -342,6 +331,7 @@ bool deserializeState(JsonObject root, byte callMode, byte presetId)
|
|||||||
it++;
|
it++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
setValuesFromMainSeg(); //to make transition work on main segment
|
||||||
|
|
||||||
#ifndef WLED_DISABLE_CRONIXIE
|
#ifndef WLED_DISABLE_CRONIXIE
|
||||||
if (root["nx"].is<const char*>()) {
|
if (root["nx"].is<const char*>()) {
|
||||||
@ -483,12 +473,12 @@ void serializeState(JsonObject root, bool forPreset, bool includeBri, bool segme
|
|||||||
|
|
||||||
root[F("mainseg")] = strip.getMainSegmentId();
|
root[F("mainseg")] = strip.getMainSegmentId();
|
||||||
|
|
||||||
|
bool selectedSegmentsOnly = root[F("sc")] | false;
|
||||||
JsonArray seg = root.createNestedArray("seg");
|
JsonArray seg = root.createNestedArray("seg");
|
||||||
for (byte s = 0; s < strip.getMaxSegments(); s++)
|
for (byte s = 0; s < strip.getMaxSegments(); s++) {
|
||||||
{
|
|
||||||
WS2812FX::Segment &sg = strip.getSegment(s);
|
WS2812FX::Segment &sg = strip.getSegment(s);
|
||||||
if (sg.isActive())
|
if (selectedSegmentsOnly && !sg.isSelected()) continue;
|
||||||
{
|
if (sg.isActive()) {
|
||||||
JsonObject seg0 = seg.createNestedObject();
|
JsonObject seg0 = seg.createNestedObject();
|
||||||
serializeSegment(seg0, sg, s, forPreset, segmentBounds);
|
serializeSegment(seg0, sg, s, forPreset, segmentBounds);
|
||||||
} else if (forPreset && segmentBounds) { //disable segments not part of preset
|
} else if (forPreset && segmentBounds) { //disable segments not part of preset
|
||||||
|
@ -31,6 +31,7 @@ void toggleOnOff()
|
|||||||
briLast = bri;
|
briLast = bri;
|
||||||
bri = 0;
|
bri = 0;
|
||||||
}
|
}
|
||||||
|
colorChanged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -61,18 +62,6 @@ void setLedsStandard()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool colorChanged()
|
|
||||||
{
|
|
||||||
for (byte i=0; i<4; i++)
|
|
||||||
{
|
|
||||||
if (col[i] != colIT[i]) return true;
|
|
||||||
if (colSec[i] != colSecIT[i]) return true;
|
|
||||||
}
|
|
||||||
if (bri != briIT) return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void colorUpdated(int callMode)
|
void colorUpdated(int callMode)
|
||||||
{
|
{
|
||||||
//call for notifier -> 0: init 1: direct change 2: button 3: notification 4: nightlight 5: other (No notification)
|
//call for notifier -> 0: init 1: direct change 2: button 3: notification 4: nightlight 5: other (No notification)
|
||||||
@ -82,23 +71,7 @@ void colorUpdated(int callMode)
|
|||||||
callMode != CALL_MODE_NO_NOTIFY &&
|
callMode != CALL_MODE_NO_NOTIFY &&
|
||||||
callMode != CALL_MODE_BUTTON_PRESET) strip.applyToAllSelected = true; //if not from JSON api, which directly sets segments
|
callMode != CALL_MODE_BUTTON_PRESET) strip.applyToAllSelected = true; //if not from JSON api, which directly sets segments
|
||||||
|
|
||||||
bool someSel = false;
|
if (effectChanged || colorChanged) {
|
||||||
|
|
||||||
if (callMode == CALL_MODE_NOTIFICATION) {
|
|
||||||
someSel = (receiveNotificationBrightness || receiveNotificationColor || receiveNotificationEffects || receiveSegmentOptions);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Notifier: apply received FX to selected segments only if actually receiving FX
|
|
||||||
if (someSel) strip.applyToAllSelected = receiveNotificationEffects;
|
|
||||||
|
|
||||||
bool fxChanged = strip.setEffectConfig(effectCurrent, effectSpeed, effectIntensity, effectPalette) || effectChanged;
|
|
||||||
bool colChanged = colorChanged();
|
|
||||||
|
|
||||||
//Notifier: apply received color to selected segments only if actually receiving color
|
|
||||||
if (someSel) strip.applyToAllSelected = receiveNotificationColor;
|
|
||||||
|
|
||||||
if (fxChanged || colChanged)
|
|
||||||
{
|
|
||||||
effectChanged = false;
|
effectChanged = false;
|
||||||
if (realtimeTimeout == UINT32_MAX) realtimeTimeout = 0;
|
if (realtimeTimeout == UINT32_MAX) realtimeTimeout = 0;
|
||||||
currentPreset = 0; //something changed, so we are no longer in the preset
|
currentPreset = 0; //something changed, so we are no longer in the preset
|
||||||
@ -108,57 +81,48 @@ void colorUpdated(int callMode)
|
|||||||
//set flag to update blynk, ws and mqtt
|
//set flag to update blynk, ws and mqtt
|
||||||
interfaceUpdateCallMode = callMode;
|
interfaceUpdateCallMode = callMode;
|
||||||
} else {
|
} else {
|
||||||
if (nightlightActive && !nightlightActiveOld &&
|
if (nightlightActive && !nightlightActiveOld && callMode != CALL_MODE_NOTIFICATION && callMode != CALL_MODE_NO_NOTIFY) {
|
||||||
callMode != CALL_MODE_NOTIFICATION &&
|
|
||||||
callMode != CALL_MODE_NO_NOTIFY)
|
|
||||||
{
|
|
||||||
notify(CALL_MODE_NIGHTLIGHT);
|
notify(CALL_MODE_NIGHTLIGHT);
|
||||||
interfaceUpdateCallMode = CALL_MODE_NIGHTLIGHT;
|
interfaceUpdateCallMode = CALL_MODE_NIGHTLIGHT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!colChanged) return; //following code is for e.g. initiating transitions
|
if (!colorChanged) return; //following code is for e.g. initiating transitions
|
||||||
|
colorChanged = false;
|
||||||
|
|
||||||
if (callMode != CALL_MODE_NO_NOTIFY && nightlightActive && (nightlightMode == NL_MODE_FADE || nightlightMode == NL_MODE_COLORFADE))
|
if (callMode != CALL_MODE_NO_NOTIFY && nightlightActive && (nightlightMode == NL_MODE_FADE || nightlightMode == NL_MODE_COLORFADE)) {
|
||||||
{
|
|
||||||
briNlT = bri;
|
briNlT = bri;
|
||||||
nightlightDelayMs -= (millis() - nightlightStartTime);
|
nightlightDelayMs -= (millis() - nightlightStartTime);
|
||||||
nightlightStartTime = millis();
|
nightlightStartTime = millis();
|
||||||
}
|
}
|
||||||
for (byte i=0; i<4; i++)
|
if (briT == 0) {
|
||||||
{
|
|
||||||
colIT[i] = col[i];
|
|
||||||
colSecIT[i] = colSec[i];
|
|
||||||
}
|
|
||||||
if (briT == 0)
|
|
||||||
{
|
|
||||||
if (callMode != CALL_MODE_NOTIFICATION) resetTimebase(); //effect start from beginning
|
if (callMode != CALL_MODE_NOTIFICATION) resetTimebase(); //effect start from beginning
|
||||||
}
|
}
|
||||||
|
|
||||||
briIT = bri;
|
|
||||||
if (bri > 0) briLast = bri;
|
if (bri > 0) briLast = bri;
|
||||||
|
|
||||||
//deactivate nightlight if target brightness is reached
|
//deactivate nightlight if target brightness is reached
|
||||||
if (bri == nightlightTargetBri && callMode != CALL_MODE_NO_NOTIFY && nightlightMode != NL_MODE_SUN) nightlightActive = false;
|
if (bri == nightlightTargetBri && callMode != CALL_MODE_NO_NOTIFY && nightlightMode != NL_MODE_SUN) nightlightActive = false;
|
||||||
|
|
||||||
if (fadeTransition)
|
if (fadeTransition) {
|
||||||
{
|
|
||||||
//set correct delay if not using notification delay
|
//set correct delay if not using notification delay
|
||||||
if (callMode != CALL_MODE_NOTIFICATION && !jsonTransitionOnce) transitionDelayTemp = transitionDelay;
|
if (callMode != CALL_MODE_NOTIFICATION && !jsonTransitionOnce) transitionDelayTemp = transitionDelay;
|
||||||
jsonTransitionOnce = false;
|
jsonTransitionOnce = false;
|
||||||
strip.setTransition(transitionDelayTemp);
|
strip.setTransition(transitionDelayTemp);
|
||||||
if (transitionDelayTemp == 0) {setLedsStandard(); strip.trigger(); return;}
|
if (transitionDelayTemp == 0) {
|
||||||
|
setLedsStandard();
|
||||||
|
strip.trigger();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (transitionActive)
|
if (transitionActive) {
|
||||||
{
|
|
||||||
briOld = briT;
|
briOld = briT;
|
||||||
tperLast = 0;
|
tperLast = 0;
|
||||||
}
|
}
|
||||||
strip.setTransitionMode(true);
|
strip.setTransitionMode(true);
|
||||||
transitionActive = true;
|
transitionActive = true;
|
||||||
transitionStartTime = millis();
|
transitionStartTime = millis();
|
||||||
} else
|
} else {
|
||||||
{
|
|
||||||
strip.setTransition(0);
|
strip.setTransition(0);
|
||||||
setLedsStandard();
|
setLedsStandard();
|
||||||
strip.trigger();
|
strip.trigger();
|
||||||
|
@ -102,6 +102,7 @@ void savePreset(byte index, bool persist, const char* pname, JsonObject saveobj)
|
|||||||
sObj.remove("o");
|
sObj.remove("o");
|
||||||
sObj.remove("ib");
|
sObj.remove("ib");
|
||||||
sObj.remove("sb");
|
sObj.remove("sb");
|
||||||
|
sObj.remove(F("sc"));
|
||||||
sObj.remove(F("error"));
|
sObj.remove(F("error"));
|
||||||
sObj.remove(F("time"));
|
sObj.remove(F("time"));
|
||||||
|
|
||||||
|
105
wled00/set.cpp
105
wled00/set.cpp
@ -518,7 +518,7 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply)
|
|||||||
DEBUG_PRINT(F("API req: "));
|
DEBUG_PRINT(F("API req: "));
|
||||||
DEBUG_PRINTLN(req);
|
DEBUG_PRINTLN(req);
|
||||||
|
|
||||||
strip.applyToAllSelected = false;
|
strip.applyToAllSelected = true;
|
||||||
|
|
||||||
//segment select (sets main segment)
|
//segment select (sets main segment)
|
||||||
byte prevMain = strip.getMainSegmentId();
|
byte prevMain = strip.getMainSegmentId();
|
||||||
@ -529,22 +529,28 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply)
|
|||||||
byte selectedSeg = strip.getMainSegmentId();
|
byte selectedSeg = strip.getMainSegmentId();
|
||||||
if (selectedSeg != prevMain) setValuesFromMainSeg();
|
if (selectedSeg != prevMain) setValuesFromMainSeg();
|
||||||
|
|
||||||
|
//snapshot to check if request changed values later, temporary.
|
||||||
|
byte prevCol[4] = {col[0], col[1], col[2], col[3]};
|
||||||
|
byte prevColSec[4] = {colSec[0], colSec[1], colSec[2], colSec[3]};
|
||||||
|
byte prevEffect = effectCurrent;
|
||||||
|
byte prevSpeed = effectSpeed;
|
||||||
|
byte prevIntensity = effectIntensity;
|
||||||
|
byte prevPalette = effectPalette;
|
||||||
|
|
||||||
pos = req.indexOf(F("SS="));
|
pos = req.indexOf(F("SS="));
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
byte t = getNumVal(&req, pos);
|
byte t = getNumVal(&req, pos);
|
||||||
if (t < strip.getMaxSegments()) selectedSeg = t;
|
if (t < strip.getMaxSegments()) {
|
||||||
|
selectedSeg = t;
|
||||||
|
strip.applyToAllSelected = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
WS2812FX::Segment& selseg = strip.getSegment(selectedSeg);
|
WS2812FX::Segment& selseg = strip.getSegment(selectedSeg);
|
||||||
pos = req.indexOf(F("SV=")); //segment selected
|
pos = req.indexOf(F("SV=")); //segment selected
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
byte t = getNumVal(&req, pos);
|
byte t = getNumVal(&req, pos);
|
||||||
if (t == 2) {
|
if (t == 2) for (uint8_t i = 0; i < strip.getMaxSegments(); i++) strip.getSegment(i).setOption(SEG_OPTION_SELECTED, 0); // unselect other segments
|
||||||
for (uint8_t i = 0; i < strip.getMaxSegments(); i++)
|
|
||||||
{
|
|
||||||
strip.getSegment(i).setOption(SEG_OPTION_SELECTED, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
selseg.setOption(SEG_OPTION_SELECTED, t);
|
selseg.setOption(SEG_OPTION_SELECTED, t);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -610,26 +616,21 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply)
|
|||||||
applyPreset(presetCycCurr);
|
applyPreset(presetCycCurr);
|
||||||
}
|
}
|
||||||
|
|
||||||
//snapshot to check if request changed values later, temporary.
|
|
||||||
byte prevCol[4] = {col[0], col[1], col[2], col[3]};
|
|
||||||
byte prevColSec[4] = {colSec[0], colSec[1], colSec[2], colSec[3]};
|
|
||||||
byte prevEffect = effectCurrent;
|
|
||||||
byte prevSpeed = effectSpeed;
|
|
||||||
byte prevIntensity = effectIntensity;
|
|
||||||
byte prevPalette = effectPalette;
|
|
||||||
|
|
||||||
//set brightness
|
//set brightness
|
||||||
updateVal(&req, "&A=", &bri);
|
updateVal(&req, "&A=", &bri);
|
||||||
|
|
||||||
|
bool col0Changed = false, col1Changed = false;
|
||||||
//set colors
|
//set colors
|
||||||
updateVal(&req, "&R=", &col[0]);
|
updateVal(&req, "&R=", &col[0]);
|
||||||
updateVal(&req, "&G=", &col[1]);
|
updateVal(&req, "&G=", &col[1]);
|
||||||
updateVal(&req, "&B=", &col[2]);
|
updateVal(&req, "&B=", &col[2]);
|
||||||
updateVal(&req, "&W=", &col[3]);
|
updateVal(&req, "&W=", &col[3]);
|
||||||
|
for (byte i=0; i<4; i++) if (prevCol[i]!=col[i]) col0Changed = colorChanged = true;
|
||||||
updateVal(&req, "R2=", &colSec[0]);
|
updateVal(&req, "R2=", &colSec[0]);
|
||||||
updateVal(&req, "G2=", &colSec[1]);
|
updateVal(&req, "G2=", &colSec[1]);
|
||||||
updateVal(&req, "B2=", &colSec[2]);
|
updateVal(&req, "B2=", &colSec[2]);
|
||||||
updateVal(&req, "W2=", &colSec[3]);
|
updateVal(&req, "W2=", &colSec[3]);
|
||||||
|
for (byte i=0; i<4; i++) if (prevColSec[i]!=colSec[i]) col1Changed = colorChanged = true;
|
||||||
|
|
||||||
#ifdef WLED_ENABLE_LOXONE
|
#ifdef WLED_ENABLE_LOXONE
|
||||||
//lox parser
|
//lox parser
|
||||||
@ -672,28 +673,31 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply)
|
|||||||
//set color from HEX or 32bit DEC
|
//set color from HEX or 32bit DEC
|
||||||
pos = req.indexOf(F("CL="));
|
pos = req.indexOf(F("CL="));
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
colorFromDecOrHexString(col, (char*)req.substring(pos + 3).c_str());
|
byte t[4];
|
||||||
|
colorFromDecOrHexString(t, (char*)req.substring(pos + 3).c_str());
|
||||||
|
selseg.setColor(0, RGBW32(t[0], t[1], t[2], t[3]), selectedSeg); // defined above (SS=)
|
||||||
|
col0Changed = colorChanged = true;
|
||||||
}
|
}
|
||||||
pos = req.indexOf(F("C2="));
|
pos = req.indexOf(F("C2="));
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
|
byte t[4];
|
||||||
colorFromDecOrHexString(colSec, (char*)req.substring(pos + 3).c_str());
|
colorFromDecOrHexString(colSec, (char*)req.substring(pos + 3).c_str());
|
||||||
|
selseg.setColor(1, RGBW32(t[0], t[1], t[2], t[3]), selectedSeg); // defined above (SS=)
|
||||||
|
col1Changed = colorChanged = true;
|
||||||
}
|
}
|
||||||
pos = req.indexOf(F("C3="));
|
pos = req.indexOf(F("C3="));
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
byte t[4];
|
byte t[4];
|
||||||
colorFromDecOrHexString(t, (char*)req.substring(pos + 3).c_str());
|
colorFromDecOrHexString(t, (char*)req.substring(pos + 3).c_str());
|
||||||
if (selectedSeg != strip.getMainSegmentId()) {
|
|
||||||
strip.applyToAllSelected = true;
|
|
||||||
strip.setColor(2, t[0], t[1], t[2], t[3]);
|
|
||||||
} else {
|
|
||||||
selseg.setColor(2, RGBW32(t[0], t[1], t[2], t[3]), selectedSeg); // defined above (SS=)
|
selseg.setColor(2, RGBW32(t[0], t[1], t[2], t[3]), selectedSeg); // defined above (SS=)
|
||||||
}
|
colorChanged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//set to random hue SR=0->1st SR=1->2nd
|
//set to random hue SR=0->1st SR=1->2nd
|
||||||
pos = req.indexOf(F("SR"));
|
pos = req.indexOf(F("SR"));
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
_setRandomColor(getNumVal(&req, pos));
|
_setRandomColor(getNumVal(&req, pos));
|
||||||
|
colorChanged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//swap 2nd & 1st
|
//swap 2nd & 1st
|
||||||
@ -706,6 +710,7 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply)
|
|||||||
col[i] = colSec[i];
|
col[i] = colSec[i];
|
||||||
colSec[i] = temp;
|
colSec[i] = temp;
|
||||||
}
|
}
|
||||||
|
colorChanged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//set effect parameters
|
//set effect parameters
|
||||||
@ -713,6 +718,11 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply)
|
|||||||
updateVal(&req, "SX=", &effectSpeed);
|
updateVal(&req, "SX=", &effectSpeed);
|
||||||
updateVal(&req, "IX=", &effectIntensity);
|
updateVal(&req, "IX=", &effectIntensity);
|
||||||
updateVal(&req, "FP=", &effectPalette, 0, strip.getPaletteCount()-1);
|
updateVal(&req, "FP=", &effectPalette, 0, strip.getPaletteCount()-1);
|
||||||
|
strip.setMode(selectedSeg, effectCurrent);
|
||||||
|
selseg.speed = effectSpeed;
|
||||||
|
selseg.intensity = effectIntensity;
|
||||||
|
selseg.palette = effectPalette;
|
||||||
|
if (effectCurrent != prevEffect || effectSpeed != prevSpeed || effectIntensity != prevIntensity || effectPalette != prevPalette) effectChanged = true;
|
||||||
|
|
||||||
//set advanced overlay
|
//set advanced overlay
|
||||||
pos = req.indexOf(F("OL="));
|
pos = req.indexOf(F("OL="));
|
||||||
@ -843,45 +853,22 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply)
|
|||||||
//you can add more if you need
|
//you can add more if you need
|
||||||
|
|
||||||
//apply to all selected manually to prevent #1618. Temporary
|
//apply to all selected manually to prevent #1618. Temporary
|
||||||
bool col0Changed = false, col1Changed = false;
|
if (strip.applyToAllSelected) {
|
||||||
for (uint8_t i = 0; i < 4; i++) {
|
for (uint8_t i = 0; i < strip.getMaxSegments(); i++) {
|
||||||
if (col[i] != prevCol[i]) col0Changed = true;
|
|
||||||
if (colSec[i] != prevColSec[i]) col1Changed = true;
|
|
||||||
}
|
|
||||||
for (uint8_t i = 0; i < strip.getMaxSegments(); i++)
|
|
||||||
{
|
|
||||||
WS2812FX::Segment& seg = strip.getSegment(i);
|
WS2812FX::Segment& seg = strip.getSegment(i);
|
||||||
if (!seg.isSelected()) continue;
|
if (!seg.isActive() || !seg.isSelected() || i == selectedSeg) continue;
|
||||||
if (effectCurrent != prevEffect) {
|
if (effectCurrent != prevEffect) strip.setMode(i, effectCurrent);
|
||||||
strip.setMode(i, effectCurrent);
|
if (effectSpeed != prevSpeed) seg.speed = effectSpeed;
|
||||||
effectChanged = true;
|
if (effectIntensity != prevIntensity) seg.intensity = effectIntensity;
|
||||||
}
|
if (effectPalette != prevPalette) seg.palette = effectPalette;
|
||||||
if (effectSpeed != prevSpeed) {
|
if (col0Changed) seg.colors[0] = RGBW32(col[0],col[1],col[2],col[3]);
|
||||||
seg.speed = effectSpeed;
|
if (col1Changed) seg.colors[1] = RGBW32(colSec[0],colSec[1],colSec[2],colSec[3]);
|
||||||
effectChanged = true;
|
|
||||||
}
|
|
||||||
if (effectIntensity != prevIntensity) {
|
|
||||||
seg.intensity = effectIntensity;
|
|
||||||
effectChanged = true;
|
|
||||||
}
|
|
||||||
if (effectPalette != prevPalette) {
|
|
||||||
seg.palette = effectPalette;
|
|
||||||
effectChanged = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (col0Changed) {
|
|
||||||
if (selectedSeg == strip.getMainSegmentId()) {
|
|
||||||
strip.applyToAllSelected = true;
|
|
||||||
strip.setColor(0, colorFromRgbw(col));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (col1Changed) {
|
|
||||||
if (selectedSeg == strip.getMainSegmentId()) {
|
|
||||||
strip.applyToAllSelected = true;
|
|
||||||
strip.setColor(1, colorFromRgbw(colSec));
|
|
||||||
}
|
}
|
||||||
|
//if (col0Changed) strip.setColor(0, RGBW32(col[0],col[1],col[2],col[3]));
|
||||||
|
//if (col1Changed) strip.setColor(1, RGBW32(colSec[0],colSec[1],colSec[2],colSec[3]));
|
||||||
}
|
}
|
||||||
|
strip.applyToAllSelected = false;
|
||||||
|
setValuesFromMainSeg();
|
||||||
//end of temporary fix code
|
//end of temporary fix code
|
||||||
|
|
||||||
if (!apply) return true; //when called by JSON API, do not call colorUpdated() here
|
if (!apply) return true; //when called by JSON API, do not call colorUpdated() here
|
||||||
@ -890,8 +877,6 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply)
|
|||||||
pos = req.indexOf(F("IN"));
|
pos = req.indexOf(F("IN"));
|
||||||
if (pos < 1) XML_response(request);
|
if (pos < 1) XML_response(request);
|
||||||
|
|
||||||
strip.applyToAllSelected = false;
|
|
||||||
|
|
||||||
pos = req.indexOf(F("&NN")); //do not send UDP notifications this time
|
pos = req.indexOf(F("&NN")); //do not send UDP notifications this time
|
||||||
colorUpdated((pos > 0) ? CALL_MODE_NO_NOTIFY : CALL_MODE_DIRECT_CHANGE);
|
colorUpdated((pos > 0) ? CALL_MODE_NO_NOTIFY : CALL_MODE_DIRECT_CHANGE);
|
||||||
|
|
||||||
|
@ -324,22 +324,20 @@ void handleNotifications()
|
|||||||
for (uint8_t i = 0; i < srcSegs; i++) {
|
for (uint8_t i = 0; i < srcSegs; i++) {
|
||||||
WS2812FX::Segment& selseg = strip.getSegment(i);
|
WS2812FX::Segment& selseg = strip.getSegment(i);
|
||||||
uint16_t ofs = 41 + i*UDP_SEG_SIZE; //start of segment offset byte
|
uint16_t ofs = 41 + i*UDP_SEG_SIZE; //start of segment offset byte
|
||||||
for (uint8_t j = 0; j<4; j++) selseg.setOption(j, (udpIn[44+i*22] >> j) & 0x01); //only take into account mirrored, selected, on, reversed
|
for (uint8_t j = 0; j<4; j++) selseg.setOption(j, (udpIn[4 +ofs] >> j) & 0x01); //only take into account mirrored, selected, on, reversed
|
||||||
uint16_t offset = udpIn[2+ofs]<<8 | udpIn[3+ofs];
|
selseg.setOpacity( udpIn[5+ofs], i);
|
||||||
selseg.setOpacity(udpIn[4+ofs], i);
|
strip.setMode(i, udpIn[6+ofs]);
|
||||||
if (i == strip.getMainSegmentId()) { //temporary, to make transition work on main segment
|
selseg.speed = udpIn[7+ofs];
|
||||||
//TODO
|
selseg.intensity = udpIn[8+ofs];
|
||||||
} else { //permanent
|
selseg.palette = udpIn[9+ofs];
|
||||||
strip.setMode(i, udpIn[5+ofs]);
|
|
||||||
selseg.speed = udpIn[6+ofs];
|
|
||||||
selseg.intensity = udpIn[7+ofs];
|
|
||||||
selseg.palette = udpIn[8+ofs];
|
|
||||||
}
|
|
||||||
selseg.setColor(0, RGBW32(udpIn[10+ofs],udpIn[11+ofs],udpIn[12+ofs],udpIn[13+ofs]), i);
|
selseg.setColor(0, RGBW32(udpIn[10+ofs],udpIn[11+ofs],udpIn[12+ofs],udpIn[13+ofs]), i);
|
||||||
selseg.setColor(1, RGBW32(udpIn[14+ofs],udpIn[15+ofs],udpIn[16+ofs],udpIn[17+ofs]), i);
|
selseg.setColor(1, RGBW32(udpIn[14+ofs],udpIn[15+ofs],udpIn[16+ofs],udpIn[17+ofs]), i);
|
||||||
selseg.setColor(2, RGBW32(udpIn[18+ofs],udpIn[19+ofs],udpIn[20+ofs],udpIn[21+ofs]), i);
|
selseg.setColor(2, RGBW32(udpIn[18+ofs],udpIn[19+ofs],udpIn[20+ofs],udpIn[21+ofs]), i);
|
||||||
strip.setSegment(i, selseg.start, selseg.stop, udpIn[0+ofs], udpIn[1+ofs], offset); //also properly resets segments
|
strip.setSegment(i, selseg.start, selseg.stop, udpIn[0+ofs], udpIn[1+ofs], (udpIn[2+ofs]<<8 | udpIn[3+ofs])); //also properly resets segments
|
||||||
}
|
}
|
||||||
|
setValuesFromMainSeg();
|
||||||
|
effectChanged = true;
|
||||||
|
colorChanged = true;
|
||||||
} else { //simple effect sync, applies to all selected
|
} else { //simple effect sync, applies to all selected
|
||||||
if (udpIn[8] < strip.getModeCount()) effectCurrent = udpIn[8];
|
if (udpIn[8] < strip.getModeCount()) effectCurrent = udpIn[8];
|
||||||
effectSpeed = udpIn[9];
|
effectSpeed = udpIn[9];
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
// ESP8266-01 (blue) got too little storage space to work with WLED. 0.10.2 is the last release supporting this unit.
|
// ESP8266-01 (blue) got too little storage space to work with WLED. 0.10.2 is the last release supporting this unit.
|
||||||
|
|
||||||
// ESP8266-01 (black) has 1MB flash and can thus fit the whole program, although OTA update is not possible. Use 1M(128K SPIFFS).
|
// ESP8266-01 (black) has 1MB flash and can thus fit the whole program, although OTA update is not possible. Use 1M(128K SPIFFS).
|
||||||
|
// 2-step OTA may still be possible: https://github.com/Aircoookie/WLED/issues/2040#issuecomment-981111096
|
||||||
// Uncomment some of the following lines to disable features:
|
// Uncomment some of the following lines to disable features:
|
||||||
// Alternatively, with platformio pass your chosen flags to your custom build target in platformio_override.ini
|
// Alternatively, with platformio pass your chosen flags to your custom build target in platformio_override.ini
|
||||||
|
|
||||||
@ -422,9 +423,6 @@ WLED_GLOBAL bool interfacesInited _INIT(false);
|
|||||||
WLED_GLOBAL bool wasConnected _INIT(false);
|
WLED_GLOBAL bool wasConnected _INIT(false);
|
||||||
|
|
||||||
// color
|
// color
|
||||||
WLED_GLOBAL byte colIT[] _INIT_N(({ 0, 0, 0, 0 })); // color that was last sent to LEDs
|
|
||||||
WLED_GLOBAL byte colSecIT[] _INIT_N(({ 0, 0, 0, 0 }));
|
|
||||||
|
|
||||||
WLED_GLOBAL byte lastRandomIndex _INIT(0); // used to save last random color so the new one is not the same
|
WLED_GLOBAL byte lastRandomIndex _INIT(0); // used to save last random color so the new one is not the same
|
||||||
|
|
||||||
// transitions
|
// transitions
|
||||||
@ -475,6 +473,7 @@ WLED_GLOBAL byte effectSpeed _INIT(128);
|
|||||||
WLED_GLOBAL byte effectIntensity _INIT(128);
|
WLED_GLOBAL byte effectIntensity _INIT(128);
|
||||||
WLED_GLOBAL byte effectPalette _INIT(0);
|
WLED_GLOBAL byte effectPalette _INIT(0);
|
||||||
WLED_GLOBAL bool effectChanged _INIT(false);
|
WLED_GLOBAL bool effectChanged _INIT(false);
|
||||||
|
WLED_GLOBAL bool colorChanged _INIT(false);
|
||||||
|
|
||||||
// network
|
// network
|
||||||
WLED_GLOBAL bool udpConnected _INIT(false), udp2Connected _INIT(false), udpRgbConnected _INIT(false);
|
WLED_GLOBAL bool udpConnected _INIT(false), udp2Connected _INIT(false), udpRgbConnected _INIT(false);
|
||||||
|
Loading…
Reference in New Issue
Block a user