Separate mode blending option
This commit is contained in:
parent
cc68e6b6e6
commit
ae1d0a18f3
@ -310,17 +310,21 @@ void Segment::startTransition(uint16_t dur) {
|
|||||||
_t->_briT = on ? opacity : 0;
|
_t->_briT = on ? opacity : 0;
|
||||||
_t->_cctT = cct;
|
_t->_cctT = cct;
|
||||||
#ifndef WLED_DISABLE_MODE_BLEND
|
#ifndef WLED_DISABLE_MODE_BLEND
|
||||||
swapSegenv(_t->_segT);
|
if (modeBlending) {
|
||||||
_t->_modeT = mode;
|
swapSegenv(_t->_segT);
|
||||||
_t->_segT._dataLenT = 0;
|
_t->_modeT = mode;
|
||||||
_t->_segT._dataT = nullptr;
|
_t->_segT._dataLenT = 0;
|
||||||
if (_dataLen > 0 && data) {
|
_t->_segT._dataT = nullptr;
|
||||||
_t->_segT._dataT = (byte *)malloc(_dataLen);
|
if (_dataLen > 0 && data) {
|
||||||
if (_t->_segT._dataT) {
|
_t->_segT._dataT = (byte *)malloc(_dataLen);
|
||||||
//DEBUG_PRINTF("-- Allocated duplicate data (%d): %p\n", _dataLen, _t->_segT._dataT);
|
if (_t->_segT._dataT) {
|
||||||
memcpy(_t->_segT._dataT, data, _dataLen);
|
//DEBUG_PRINTF("-- Allocated duplicate data (%d): %p\n", _dataLen, _t->_segT._dataT);
|
||||||
_t->_segT._dataLenT = _dataLen;
|
memcpy(_t->_segT._dataT, data, _dataLen);
|
||||||
|
_t->_segT._dataLenT = _dataLen;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
for (size_t i=0; i<NUM_COLORS; i++) _t->_segT._colorT[i] = colors[i];
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
for (size_t i=0; i<NUM_COLORS; i++) _t->_colorT[i] = colors[i];
|
for (size_t i=0; i<NUM_COLORS; i++) _t->_colorT[i] = colors[i];
|
||||||
@ -407,8 +411,8 @@ void Segment::restoreSegenv(tmpsegd_t &tmpSeg) {
|
|||||||
_t->_segT._stepT = step;
|
_t->_segT._stepT = step;
|
||||||
_t->_segT._callT = call;
|
_t->_segT._callT = call;
|
||||||
//if (_t->_segT._dataT != data) DEBUG_PRINTF("--- data re-allocated: (%p) %p -> %p\n", this, _t->_segT._dataT, data);
|
//if (_t->_segT._dataT != data) DEBUG_PRINTF("--- data re-allocated: (%p) %p -> %p\n", this, _t->_segT._dataT, data);
|
||||||
_t->_segT._dataT = data; // sometimes memory gets re-allocated (!! INVESTIGATE WHY !!)
|
_t->_segT._dataT = data;
|
||||||
_t->_segT._dataLenT = _dataLen; // sometimes memory gets re-allocated (!! INVESTIGATE WHY !!)
|
_t->_segT._dataLenT = _dataLen;
|
||||||
}
|
}
|
||||||
options = tmpSeg._optionsT;
|
options = tmpSeg._optionsT;
|
||||||
for (size_t i=0; i<NUM_COLORS; i++) colors[i] = tmpSeg._colorT[i];
|
for (size_t i=0; i<NUM_COLORS; i++) colors[i] = tmpSeg._colorT[i];
|
||||||
@ -443,7 +447,7 @@ uint8_t Segment::currentBri(bool useCct) {
|
|||||||
uint8_t Segment::currentMode() {
|
uint8_t Segment::currentMode() {
|
||||||
#ifndef WLED_DISABLE_MODE_BLEND
|
#ifndef WLED_DISABLE_MODE_BLEND
|
||||||
uint16_t prog = progress();
|
uint16_t prog = progress();
|
||||||
if (prog < 0xFFFFU) return _t->_modeT;
|
if (modeBlending && prog < 0xFFFFU) return _t->_modeT;
|
||||||
#endif
|
#endif
|
||||||
return mode;
|
return mode;
|
||||||
}
|
}
|
||||||
@ -459,7 +463,7 @@ uint32_t Segment::currentColor(uint8_t slot) {
|
|||||||
CRGBPalette16 &Segment::currentPalette(CRGBPalette16 &targetPalette, uint8_t pal) {
|
CRGBPalette16 &Segment::currentPalette(CRGBPalette16 &targetPalette, uint8_t pal) {
|
||||||
loadPalette(targetPalette, pal);
|
loadPalette(targetPalette, pal);
|
||||||
uint16_t prog = progress();
|
uint16_t prog = progress();
|
||||||
if (prog < 0xFFFFU) {
|
if (strip.paletteFade && prog < 0xFFFFU) {
|
||||||
// blend palettes
|
// blend palettes
|
||||||
// there are about 255 blend passes of 48 "blends" to completely blend two palettes (in _dur time)
|
// there are about 255 blend passes of 48 "blends" to completely blend two palettes (in _dur time)
|
||||||
// minimum blend time is 100ms maximum is 65535ms
|
// minimum blend time is 100ms maximum is 65535ms
|
||||||
@ -574,7 +578,9 @@ void Segment::setMode(uint8_t fx, bool loadDefaults) {
|
|||||||
// if we have a valid mode & is not reserved
|
// if we have a valid mode & is not reserved
|
||||||
if (fx < strip.getModeCount() && strncmp_P("RSVD", strip.getModeData(fx), 4)) {
|
if (fx < strip.getModeCount() && strncmp_P("RSVD", strip.getModeData(fx), 4)) {
|
||||||
if (fx != mode) {
|
if (fx != mode) {
|
||||||
if (fadeTransition) startTransition(strip.getTransition()); // set effect transitions
|
#ifndef WLED_DISABLE_MODE_BLEND
|
||||||
|
if (modeBlending) startTransition(strip.getTransition()); // set effect transitions
|
||||||
|
#endif
|
||||||
mode = fx;
|
mode = fx;
|
||||||
// load default values from effect string
|
// load default values from effect string
|
||||||
if (loadDefaults) {
|
if (loadDefaults) {
|
||||||
@ -1207,7 +1213,7 @@ void WS2812FX::service() {
|
|||||||
[[maybe_unused]] uint8_t tmpMode = seg.currentMode(); // this will return old mode while in transition
|
[[maybe_unused]] uint8_t tmpMode = seg.currentMode(); // this will return old mode while in transition
|
||||||
delay = (*_mode[seg.mode])(); // run new/current mode
|
delay = (*_mode[seg.mode])(); // run new/current mode
|
||||||
#ifndef WLED_DISABLE_MODE_BLEND
|
#ifndef WLED_DISABLE_MODE_BLEND
|
||||||
if (seg.mode != tmpMode) {
|
if (modeBlending && seg.mode != tmpMode) {
|
||||||
Segment::tmpsegd_t _tmpSegData;
|
Segment::tmpsegd_t _tmpSegData;
|
||||||
Segment::modeBlend(true); // set semaphore
|
Segment::modeBlend(true); // set semaphore
|
||||||
seg.swapSegenv(_tmpSegData); // temporarily store new mode state (and swap it with transitional state)
|
seg.swapSegenv(_tmpSegData); // temporarily store new mode state (and swap it with transitional state)
|
||||||
|
@ -366,6 +366,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
|
|||||||
|
|
||||||
JsonObject light_tr = light["tr"];
|
JsonObject light_tr = light["tr"];
|
||||||
CJSON(fadeTransition, light_tr["mode"]);
|
CJSON(fadeTransition, light_tr["mode"]);
|
||||||
|
CJSON(modeBlending, light_tr["fx"]);
|
||||||
int tdd = light_tr["dur"] | -1;
|
int tdd = light_tr["dur"] | -1;
|
||||||
if (tdd >= 0) transitionDelay = transitionDelayDefault = tdd * 100;
|
if (tdd >= 0) transitionDelay = transitionDelayDefault = tdd * 100;
|
||||||
CJSON(strip.paletteFade, light_tr["pal"]);
|
CJSON(strip.paletteFade, light_tr["pal"]);
|
||||||
@ -835,6 +836,7 @@ void serializeConfig() {
|
|||||||
|
|
||||||
JsonObject light_tr = light.createNestedObject("tr");
|
JsonObject light_tr = light.createNestedObject("tr");
|
||||||
light_tr["mode"] = fadeTransition;
|
light_tr["mode"] = fadeTransition;
|
||||||
|
light_tr["fx"] = modeBlending;
|
||||||
light_tr["dur"] = transitionDelayDefault / 100;
|
light_tr["dur"] = transitionDelayDefault / 100;
|
||||||
light_tr["pal"] = strip.paletteFade;
|
light_tr["pal"] = strip.paletteFade;
|
||||||
light_tr[F("rpc")] = randomPaletteChangeTime;
|
light_tr[F("rpc")] = randomPaletteChangeTime;
|
||||||
|
@ -774,6 +774,7 @@ Length: <input type="number" name="XC${i}" id="xc${i}" class="l" min="1" max="65
|
|||||||
Brightness factor: <input name="BF" type="number" class="m" min="1" max="255" required> %
|
Brightness factor: <input name="BF" type="number" class="m" min="1" max="255" required> %
|
||||||
<h3>Transitions</h3>
|
<h3>Transitions</h3>
|
||||||
Crossfade: <input type="checkbox" name="TF"><br>
|
Crossfade: <input type="checkbox" name="TF"><br>
|
||||||
|
Effect blending: <input type="checkbox" name="EB"><br>
|
||||||
Transition Time: <input name="TD" type="number" class="xl" min="0" max="65500"> ms<br>
|
Transition Time: <input name="TD" type="number" class="xl" min="0" max="65500"> ms<br>
|
||||||
Enable Palette transitions: <input type="checkbox" name="PF"><br>
|
Enable Palette transitions: <input type="checkbox" name="PF"><br>
|
||||||
<i>Random Cycle</i> Palette Time: <input name="TP" type="number" class="m" min="1" max="255"> s<br>
|
<i>Random Cycle</i> Palette Time: <input name="TP" type="number" class="m" min="1" max="255"> s<br>
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -261,6 +261,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
|||||||
}
|
}
|
||||||
|
|
||||||
fadeTransition = request->hasArg(F("TF"));
|
fadeTransition = request->hasArg(F("TF"));
|
||||||
|
modeBlending = request->hasArg(F("EB"));
|
||||||
t = request->arg(F("TD")).toInt();
|
t = request->arg(F("TD")).toInt();
|
||||||
if (t >= 0) transitionDelayDefault = t;
|
if (t >= 0) transitionDelayDefault = t;
|
||||||
strip.paletteFade = request->hasArg(F("PF"));
|
strip.paletteFade = request->hasArg(F("PF"));
|
||||||
|
@ -355,6 +355,7 @@ WLED_GLOBAL byte nightlightTargetBri _INIT(0); // brightness after nightlig
|
|||||||
WLED_GLOBAL byte nightlightDelayMins _INIT(60);
|
WLED_GLOBAL byte nightlightDelayMins _INIT(60);
|
||||||
WLED_GLOBAL byte nightlightMode _INIT(NL_MODE_FADE); // See const.h for available modes. Was nightlightFade
|
WLED_GLOBAL byte nightlightMode _INIT(NL_MODE_FADE); // See const.h for available modes. Was nightlightFade
|
||||||
WLED_GLOBAL bool fadeTransition _INIT(true); // enable crossfading color transition
|
WLED_GLOBAL bool fadeTransition _INIT(true); // enable crossfading color transition
|
||||||
|
WLED_GLOBAL bool modeBlending _INIT(true); // enable effect blending
|
||||||
WLED_GLOBAL uint16_t transitionDelay _INIT(750); // default crossfade duration in ms
|
WLED_GLOBAL uint16_t transitionDelay _INIT(750); // default crossfade duration in ms
|
||||||
|
|
||||||
WLED_GLOBAL byte briMultiplier _INIT(100); // % of brightness to set (to limit power, if you set it to 50 and set bri to 255, actual brightness will be 127)
|
WLED_GLOBAL byte briMultiplier _INIT(100); // % of brightness to set (to limit power, if you set it to 50 and set bri to 255, actual brightness will be 127)
|
||||||
|
@ -438,6 +438,7 @@ void getSettingsJS(byte subPage, char* dest)
|
|||||||
sappend('c',SET_F("GC"),gammaCorrectCol);
|
sappend('c',SET_F("GC"),gammaCorrectCol);
|
||||||
dtostrf(gammaCorrectVal,3,1,nS); sappends('s',SET_F("GV"),nS);
|
dtostrf(gammaCorrectVal,3,1,nS); sappends('s',SET_F("GV"),nS);
|
||||||
sappend('c',SET_F("TF"),fadeTransition);
|
sappend('c',SET_F("TF"),fadeTransition);
|
||||||
|
sappend('c',SET_F("EB"),modeBlending);
|
||||||
sappend('v',SET_F("TD"),transitionDelayDefault);
|
sappend('v',SET_F("TD"),transitionDelayDefault);
|
||||||
sappend('c',SET_F("PF"),strip.paletteFade);
|
sappend('c',SET_F("PF"),strip.paletteFade);
|
||||||
sappend('v',SET_F("TP"),randomPaletteChangeTime);
|
sappend('v',SET_F("TP"),randomPaletteChangeTime);
|
||||||
|
Loading…
Reference in New Issue
Block a user