Release of WLED v0.9.0-b1
Timebase reset when turned off Added Aurora paletta
This commit is contained in:
parent
f1810a9784
commit
c98c54bd6b
@ -586,7 +586,8 @@ const char JSON_palette_names[] PROGMEM = R"=====([
|
|||||||
"Forest","Rainbow","Rainbow Bands","Sunset","Rivendell","Breeze","Red & Blue","Yellowout","Analogous","Splash",
|
"Forest","Rainbow","Rainbow Bands","Sunset","Rivendell","Breeze","Red & Blue","Yellowout","Analogous","Splash",
|
||||||
"Pastel","Sunset 2","Beech","Vintage","Departure","Landscape","Beach","Sherbet","Hult","Hult 64",
|
"Pastel","Sunset 2","Beech","Vintage","Departure","Landscape","Beach","Sherbet","Hult","Hult 64",
|
||||||
"Drywet","Jul","Grintage","Rewhi","Tertiary","Fire","Icefire","Cyane","Light Pink","Autumn",
|
"Drywet","Jul","Grintage","Rewhi","Tertiary","Fire","Icefire","Cyane","Light Pink","Autumn",
|
||||||
"Magenta","Magred","Yelmag","Yelblu","Orange & Teal","Tiamat","April Night","Orangery","C9","Sakura"
|
"Magenta","Magred","Yelmag","Yelblu","Orange & Teal","Tiamat","April Night","Orangery","C9","Sakura",
|
||||||
|
"Aurora"
|
||||||
])=====";
|
])=====";
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -481,6 +481,10 @@ void WS2812FX::resetSegments() {
|
|||||||
_segments[0].speed = DEFAULT_SPEED;
|
_segments[0].speed = DEFAULT_SPEED;
|
||||||
_segments[0].stop = _length;
|
_segments[0].stop = _length;
|
||||||
_segments[0].setOption(0, 1); //select
|
_segments[0].setOption(0, 1); //select
|
||||||
|
for (uint16_t i = 1; i < MAX_NUM_SEGMENTS; i++)
|
||||||
|
{
|
||||||
|
_segments[i].colors[0] = color_wheel(i*51);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void WS2812FX::setIndividual(uint16_t i, uint32_t col)
|
void WS2812FX::setIndividual(uint16_t i, uint32_t col)
|
||||||
|
@ -38,6 +38,7 @@ body {
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
position: fixed;
|
position: fixed;
|
||||||
|
overscroll-behavior: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
p {
|
p {
|
||||||
@ -173,9 +174,9 @@ button {
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
width: calc(var(--n)*100%);
|
width: calc(var(--n)*100%);
|
||||||
height: calc(100% - var(--tp, 60px) - var(--bt, 60px));
|
height: calc(100% - var(--tp, 60px) - var(--bt, 60px));
|
||||||
margin-bottom: 62px;
|
|
||||||
margin-top: var(--tp, 60px);
|
margin-top: var(--tp, 60px);
|
||||||
transform: translate(calc(var(--tx, 0px) + var(--i, 0)/var(--n)*-100%));
|
transform: translate(calc(var(--tx, 0px) + var(--i, 0)/var(--n)*-100%));
|
||||||
|
overscroll-behavior: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tabcontent {
|
.tabcontent {
|
||||||
@ -245,11 +246,8 @@ button {
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
padding: 16px;
|
padding: 16px;
|
||||||
padding: 16px;
|
|
||||||
padding: 16px;
|
|
||||||
padding: 16px;
|
|
||||||
position: fixed;
|
position: fixed;
|
||||||
z-index: 1;
|
z-index: 2;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
transform: translateX(-50%);
|
transform: translateX(-50%);
|
||||||
bottom: 100px;
|
bottom: 100px;
|
||||||
@ -766,7 +764,7 @@ input[type=number]::-webkit-outer-spin-button {
|
|||||||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define("RangeTouch",t):e.RangeTouch=t()}(this,function(){"use strict";function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}var t={addCSS:!0,thumbWidth:15,watch:!0};var n=function(e){return null!=e?e.constructor:null},r=function(e,t){return!!(e&&t&&e instanceof t)},u=function(e){return null==e},i=function(e){return n(e)===Object},o=function(e){return n(e)===String},a=function(e){return Array.isArray(e)},c=function(e){return r(e,NodeList)},l={nullOrUndefined:u,object:i,number:function(e){return n(e)===Number&&!Number.isNaN(e)},string:o,boolean:function(e){return n(e)===Boolean},function:function(e){return n(e)===Function},array:a,nodeList:c,element:function(e){return r(e,Element)},event:function(e){return r(e,Event)},empty:function(e){return u(e)||(o(e)||a(e)||c(e))&&!e.length||i(e)&&!Object.keys(e).length}};function s(e,t){if(1>t){var n=function(e){var t="".concat(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}(t);return parseFloat(e.toFixed(n))}return Math.round(e/t)*t}return function(){function n(e,r){(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")})(this,n),l.element(e)?this.element=e:l.string(e)&&(this.element=document.querySelector(e)),l.element(this.element)&&l.empty(this.element.rangeTouch)&&(this.config=Object.assign({},t,r),this.init())}return r=n,i=[{key:"setup",value:function(e){var r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},u=null;if(l.empty(e)||l.string(e)?u=Array.from(document.querySelectorAll(l.string(e)?e:'input[type="range"]')):l.element(e)?u=[e]:l.nodeList(e)?u=Array.from(e):l.array(e)&&(u=e.filter(l.element)),l.empty(u))return null;var i=Object.assign({},t,r);l.string(e)&&i.watch&&new MutationObserver(function(t){Array.from(t).forEach(function(t){Array.from(t.addedNodes).forEach(function(t){l.element(t)&&function(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}(t,e)&&new n(t,i)})})}).observe(document.body,{childList:!0,subtree:!0});return u.map(function(e){return new n(e,r)})}},{key:"enabled",get:function(){return"ontouchstart"in document.documentElement}}],(u=[{key:"init",value:function(){n.enabled&&(this.config.addCSS&&(this.element.style.userSelect="none",this.element.style.webKitUserSelect="none",this.element.style.touchAction="manipulation"),this.listeners(!0),this.element.rangeTouch=this)}},{key:"destroy",value:function(){n.enabled&&(this.listeners(!1),this.element.rangeTouch=null)}},{key:"listeners",value:function(e){var t=this,n=e?"addEventListener":"removeEventListener";["touchstart","touchmove","touchend"].forEach(function(e){t.element[n](e,function(e){return t.set(e)},!1)})}},{key:"get",value:function(e){if(!n.enabled||!l.event(e))return null;var t,r=e.target,u=e.changedTouches[0],i=parseFloat(r.getAttribute("min"))||0,o=parseFloat(r.getAttribute("max"))||100,a=parseFloat(r.getAttribute("step"))||1,c=r.getBoundingClientRect(),f=100/c.width*(this.config.thumbWidth/2)/100;return 0>(t=100/c.width*(u.clientX-c.left))?t=0:100<t&&(t=100),50>t?t-=(100-2*t)*f:50<t&&(t+=2*(t-50)*f),i+s(t/100*(o-i),a)}},{key:"set",value:function(e){n.enabled&&l.event(e)&&!e.target.disabled&&(e.preventDefault(),e.target.value=this.get(e),function(e,t){if(e&&t){var n=new Event(t);e.dispatchEvent(n)}}(e.target,"touchend"===e.type?"change":"input"))}}])&&e(r.prototype,u),i&&e(r,i),n;var r,u,i}()});
|
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define("RangeTouch",t):e.RangeTouch=t()}(this,function(){"use strict";function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}var t={addCSS:!0,thumbWidth:15,watch:!0};var n=function(e){return null!=e?e.constructor:null},r=function(e,t){return!!(e&&t&&e instanceof t)},u=function(e){return null==e},i=function(e){return n(e)===Object},o=function(e){return n(e)===String},a=function(e){return Array.isArray(e)},c=function(e){return r(e,NodeList)},l={nullOrUndefined:u,object:i,number:function(e){return n(e)===Number&&!Number.isNaN(e)},string:o,boolean:function(e){return n(e)===Boolean},function:function(e){return n(e)===Function},array:a,nodeList:c,element:function(e){return r(e,Element)},event:function(e){return r(e,Event)},empty:function(e){return u(e)||(o(e)||a(e)||c(e))&&!e.length||i(e)&&!Object.keys(e).length}};function s(e,t){if(1>t){var n=function(e){var t="".concat(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}(t);return parseFloat(e.toFixed(n))}return Math.round(e/t)*t}return function(){function n(e,r){(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")})(this,n),l.element(e)?this.element=e:l.string(e)&&(this.element=document.querySelector(e)),l.element(this.element)&&l.empty(this.element.rangeTouch)&&(this.config=Object.assign({},t,r),this.init())}return r=n,i=[{key:"setup",value:function(e){var r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},u=null;if(l.empty(e)||l.string(e)?u=Array.from(document.querySelectorAll(l.string(e)?e:'input[type="range"]')):l.element(e)?u=[e]:l.nodeList(e)?u=Array.from(e):l.array(e)&&(u=e.filter(l.element)),l.empty(u))return null;var i=Object.assign({},t,r);l.string(e)&&i.watch&&new MutationObserver(function(t){Array.from(t).forEach(function(t){Array.from(t.addedNodes).forEach(function(t){l.element(t)&&function(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}(t,e)&&new n(t,i)})})}).observe(document.body,{childList:!0,subtree:!0});return u.map(function(e){return new n(e,r)})}},{key:"enabled",get:function(){return"ontouchstart"in document.documentElement}}],(u=[{key:"init",value:function(){n.enabled&&(this.config.addCSS&&(this.element.style.userSelect="none",this.element.style.webKitUserSelect="none",this.element.style.touchAction="manipulation"),this.listeners(!0),this.element.rangeTouch=this)}},{key:"destroy",value:function(){n.enabled&&(this.listeners(!1),this.element.rangeTouch=null)}},{key:"listeners",value:function(e){var t=this,n=e?"addEventListener":"removeEventListener";["touchstart","touchmove","touchend"].forEach(function(e){t.element[n](e,function(e){return t.set(e)},!1)})}},{key:"get",value:function(e){if(!n.enabled||!l.event(e))return null;var t,r=e.target,u=e.changedTouches[0],i=parseFloat(r.getAttribute("min"))||0,o=parseFloat(r.getAttribute("max"))||100,a=parseFloat(r.getAttribute("step"))||1,c=r.getBoundingClientRect(),f=100/c.width*(this.config.thumbWidth/2)/100;return 0>(t=100/c.width*(u.clientX-c.left))?t=0:100<t&&(t=100),50>t?t-=(100-2*t)*f:50<t&&(t+=2*(t-50)*f),i+s(t/100*(o-i),a)}},{key:"set",value:function(e){n.enabled&&l.event(e)&&!e.target.disabled&&(e.preventDefault(),e.target.value=this.get(e),function(e,t){if(e&&t){var n=new Event(t);e.dispatchEvent(n)}}(e.target,"touchend"===e.type?"change":"input"))}}])&&e(r.prototype,u),i&&e(r,i),n;var r,u,i}()});
|
||||||
//page js
|
//page js
|
||||||
var ps = false, noNewSegs = false;
|
var ps = false, noNewSegs = false;
|
||||||
var isOn = false, nlA = false, isLv = false, syncSend = false, isRgbw = false;
|
var isOn = false, nlA = false, isLv = false, syncSend = false, syncTglRecv = true, isRgbw = false;
|
||||||
var whites = [0,0,0];
|
var whites = [0,0,0];
|
||||||
var expanded = [false];
|
var expanded = [false];
|
||||||
var nlDur = 60;
|
var nlDur = 60;
|
||||||
@ -835,14 +833,14 @@ function showToast(text, error = false) {
|
|||||||
x.style.animation = 'none';
|
x.style.animation = 'none';
|
||||||
x.offsetHeight;
|
x.offsetHeight;
|
||||||
x.style.animation = null;
|
x.style.animation = null;
|
||||||
timeout = setTimeout(function(){ x.className = x.className.replace("show", ""); }, 3000);
|
timeout = setTimeout(function(){ x.className = x.className.replace("show", ""); }, 2900);
|
||||||
}
|
}
|
||||||
|
|
||||||
function showErrorToast() {
|
function showErrorToast() {
|
||||||
showToast('Connection to light failed. Please refresh the page. If the issue persists, reboot your ESP.', true);
|
showToast('Connection to light failed. Please refresh the page. If the issue persists, reboot your ESP.', true);
|
||||||
}
|
}
|
||||||
function clearErrorToast() {
|
function clearErrorToast() {
|
||||||
d.getElementById("toast").className.replace("error", "");
|
d.getElementById("toast").className = d.getElementById("toast").className.replace("error", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
function populateSegments(s)
|
function populateSegments(s)
|
||||||
@ -866,8 +864,8 @@ function populateSegments(s)
|
|||||||
</label>
|
</label>
|
||||||
<i class="icons slider-icon flr ${expanded[i] ? "exp":""}" id="sege${i}" onclick="expand(${i})"></i>
|
<i class="icons slider-icon flr ${expanded[i] ? "exp":""}" id="sege${i}" onclick="expand(${i})"></i>
|
||||||
<div class="segin ${expanded[i] ? "expanded":""}" id="seg${i}">
|
<div class="segin ${expanded[i] ? "expanded":""}" id="seg${i}">
|
||||||
Start LED: <input class="starts" id="seg${i}s" class="noslide" type="number" min="0" max="${ledCount-1}" value="${inst.start}" oninput="updateLen(this)"><br>
|
Start LED: <input class="starts noslide" id="seg${i}s" type="number" min="0" max="${ledCount-1}" value="${inst.start}" oninput="updateLen(this)"><br>
|
||||||
Stop LED: <input class="stops botpad" id="seg${i}e" class="noslide" type="number" min="0" max="${ledCount}" value="${inst.stop}" oninput="updateLen(this)">
|
Stop LED: <input class="stops noslide botpad" id="seg${i}e" type="number" min="0" max="${ledCount}" value="${inst.stop}" oninput="updateLen(this)">
|
||||||
<span class="h">(${inst.stop - inst.start} LED${inst.stop - inst.start > 1 ? "s":""})</span><br>
|
<span class="h">(${inst.stop - inst.start} LED${inst.stop - inst.start > 1 ? "s":""})</span><br>
|
||||||
<i class="icons slider-icon cnf" id="segc${i}" onclick="setSeg(${i})"></i>
|
<i class="icons slider-icon cnf" id="segc${i}" onclick="setSeg(${i})"></i>
|
||||||
<i class="icons slider-icon del" id="segd${i}" onclick="delSeg(${i})"></i>
|
<i class="icons slider-icon del" id="segd${i}" onclick="delSeg(${i})"></i>
|
||||||
@ -951,13 +949,12 @@ function requestJson(command, verbose = true) {
|
|||||||
e2 = d.getElementById('selectPalette');
|
e2 = d.getElementById('selectPalette');
|
||||||
|
|
||||||
url = command ? '/json/state':'/json';
|
url = command ? '/json/state':'/json';
|
||||||
//url = command ? 'http://10.10.1.26/json/state':'http://10.10.1.26/json';
|
|
||||||
type = command ? 'post':'get';
|
type = command ? 'post':'get';
|
||||||
if (command)
|
if (command)
|
||||||
{
|
{
|
||||||
command.v = verbose;
|
command.v = verbose;
|
||||||
req = JSON.stringify(command);
|
req = JSON.stringify(command);
|
||||||
console.log(req);
|
|
||||||
}
|
}
|
||||||
fetch
|
fetch
|
||||||
(url, {
|
(url, {
|
||||||
@ -977,7 +974,8 @@ function requestJson(command, verbose = true) {
|
|||||||
clearTimeout(jsonTimeout);
|
clearTimeout(jsonTimeout);
|
||||||
jsonTimeout = null;
|
jsonTimeout = null;
|
||||||
clearErrorToast();
|
clearErrorToast();
|
||||||
if (json.success) return; //non-verbose response
|
if (!json) showToast('Empty response', true);
|
||||||
|
if (json.success) return;
|
||||||
var s = json;
|
var s = json;
|
||||||
if (!command) {
|
if (!command) {
|
||||||
var x='',y='<option value="0">Default</option>';
|
var x='',y='<option value="0">Default</option>';
|
||||||
@ -999,10 +997,11 @@ function requestJson(command, verbose = true) {
|
|||||||
var name = info.name;
|
var name = info.name;
|
||||||
d.getElementById('namelabel').innerHTML = name;
|
d.getElementById('namelabel').innerHTML = name;
|
||||||
if (name === "Dinnerbone") d.documentElement.style.transform = "rotate(180deg)";
|
if (name === "Dinnerbone") d.documentElement.style.transform = "rotate(180deg)";
|
||||||
if (json.info.live) name = "(Live) " + name;
|
if (info.live) name = "(Live) " + name;
|
||||||
d.title = name;
|
d.title = name;
|
||||||
isRgbw = info.leds.wv;
|
isRgbw = info.leds.wv;
|
||||||
ledCount = info.leds.count;
|
ledCount = info.leds.count;
|
||||||
|
syncTglRecv = info.str;
|
||||||
maxSeg = info.leds.maxseg;
|
maxSeg = info.leds.maxseg;
|
||||||
s = json.state;
|
s = json.state;
|
||||||
}
|
}
|
||||||
@ -1026,6 +1025,11 @@ function requestJson(command, verbose = true) {
|
|||||||
if(s.seg[i].sel) {selc = ind; break;} ind++;
|
if(s.seg[i].sel) {selc = ind; break;} ind++;
|
||||||
}
|
}
|
||||||
var i=s.seg[selc];
|
var i=s.seg[selc];
|
||||||
|
if (!i) {
|
||||||
|
showToast('No Segments!', true);
|
||||||
|
updateUI();
|
||||||
|
return;
|
||||||
|
}
|
||||||
var cd = d.getElementById('csl').children;
|
var cd = d.getElementById('csl').children;
|
||||||
for (e = 2; e >= 0; e--)
|
for (e = 2; e >= 0; e--)
|
||||||
{
|
{
|
||||||
@ -1039,17 +1043,14 @@ function requestJson(command, verbose = true) {
|
|||||||
d.getElementById('sliderIntensity').value = i.ix;
|
d.getElementById('sliderIntensity').value = i.ix;
|
||||||
|
|
||||||
d.getElementById('fxb' + selectedFx).style.backgroundColor = "#333";
|
d.getElementById('fxb' + selectedFx).style.backgroundColor = "#333";
|
||||||
var f = i.fx;
|
|
||||||
selectedFx = i.fx;
|
selectedFx = i.fx;
|
||||||
e2.value = i.pal;
|
e2.value = i.pal;
|
||||||
isPaused = i.psd;
|
|
||||||
if (!command) d.getElementById('Effects').scrollTop = d.getElementById('fxb' + selectedFx).offsetTop - d.getElementById('Effects').clientHeight/1.8;
|
if (!command) d.getElementById('Effects').scrollTop = d.getElementById('fxb' + selectedFx).offsetTop - d.getElementById('Effects').clientHeight/1.8;
|
||||||
|
|
||||||
if (s.error) showToast('WLED error ' + s.error, true);
|
if (s.error) showToast('WLED error ' + s.error, true);
|
||||||
updateUI();
|
updateUI();
|
||||||
})
|
})
|
||||||
.catch(function (error) {
|
.catch(function (error) {
|
||||||
console.log('Request failed', error);
|
|
||||||
showToast(error, true);
|
showToast(error, true);
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -1081,7 +1082,8 @@ function toggleSync() {
|
|||||||
} else {
|
} else {
|
||||||
showToast('This light and other lights in the network will no longer sync.');
|
showToast('This light and other lights in the network will no longer sync.');
|
||||||
}
|
}
|
||||||
var obj = {"udpn": {"send": syncSend, "recv": syncSend}};
|
var obj = {"udpn": {"send": syncSend}};
|
||||||
|
if (syncTglRecv) obj.udpn.recv = syncSend;
|
||||||
requestJson(obj);
|
requestJson(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1103,8 +1105,8 @@ function makeSeg() {
|
|||||||
Segment ${lowestUnused} (new)
|
Segment ${lowestUnused} (new)
|
||||||
</label>
|
</label>
|
||||||
<div class="segin expanded">
|
<div class="segin expanded">
|
||||||
Start LED: <input class="starts" id="seg${lowestUnused}s" class="noslide" type="number" min="0" max="${ledCount-1}" value="${ns}" oninput="updateLen(this)"><br>
|
Start LED: <input class="starts noslide" id="seg${lowestUnused}s" type="number" min="0" max="${ledCount-1}" value="${ns}" oninput="updateLen(this)"><br>
|
||||||
Stop LED: <input class="stops" id="seg${lowestUnused}e" class="noslide" type="number" min="0" max="${ledCount}" value="${ledCount}" oninput="updateLen(this)">
|
Stop LED: <input class="stops noslide" id="seg${lowestUnused}e" type="number" min="0" max="${ledCount}" value="${ledCount}" oninput="updateLen(this)">
|
||||||
<span class="h">(${ledCount - ns} LEDs)</span><br>
|
<span class="h">(${ledCount - ns} LEDs)</span><br>
|
||||||
<i class="icons slider-icon cnf" id="segc${lowestUnused}" onclick="setSeg(${lowestUnused}); resetUtil();"></i>
|
<i class="icons slider-icon cnf" id="segc${lowestUnused}" onclick="setSeg(${lowestUnused}); resetUtil();"></i>
|
||||||
</div>
|
</div>
|
||||||
@ -1113,7 +1115,8 @@ function makeSeg() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function resetUtil() {
|
function resetUtil() {
|
||||||
d.getElementById('segutil').innerHTML = '<button class="btn btn-i" onclick="makeSeg()"><i class="icons btn-icon"></i>Add segment</button><br>';
|
var cn = `<button class="btn btn-i" onclick="makeSeg()"><i class="icons btn-icon"></i>Add segment</button><br>`;
|
||||||
|
d.getElementById('segutil').innerHTML = cn;
|
||||||
}
|
}
|
||||||
|
|
||||||
function selSeg(s){
|
function selSeg(s){
|
||||||
@ -1123,15 +1126,18 @@ function selSeg(s){
|
|||||||
}
|
}
|
||||||
|
|
||||||
function setSeg(s){
|
function setSeg(s){
|
||||||
var start = d.getElementById(`seg${s}s`).value;
|
var start = parseInt(d.getElementById(`seg${s}s`).value);
|
||||||
var stop = d.getElementById(`seg${s}e`).value;
|
var stop = parseInt(d.getElementById(`seg${s}e`).value);
|
||||||
var obj = {"seg": {"id": s, "start": parseInt(start), "stop": parseInt(stop)}};
|
if (stop <= start) {delSeg(s); return;};
|
||||||
console.log(obj);
|
var obj = {"seg": {"id": s, "start": start, "stop": stop}};
|
||||||
requestJson(obj);
|
requestJson(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
function delSeg(s){
|
function delSeg(s){
|
||||||
if (segCount < 2) return;
|
if (segCount < 2) {
|
||||||
|
showToast("You need to have multiple segments in order to delete one.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
expanded[s] = false;
|
expanded[s] = false;
|
||||||
segCount--;
|
segCount--;
|
||||||
var obj = {"seg": {"id": s, "stop": 0}};
|
var obj = {"seg": {"id": s, "stop": 0}};
|
||||||
@ -1140,7 +1146,6 @@ function delSeg(s){
|
|||||||
|
|
||||||
function setRev(s){
|
function setRev(s){
|
||||||
var rev = d.getElementById(`seg${s}rev`).checked;
|
var rev = d.getElementById(`seg${s}rev`).checked;
|
||||||
console.log(rev);
|
|
||||||
var obj = {"seg": {"id": s, "rev": rev}};
|
var obj = {"seg": {"id": s, "rev": rev}};
|
||||||
requestJson(obj);
|
requestJson(obj);
|
||||||
}
|
}
|
||||||
|
@ -88,7 +88,7 @@
|
|||||||
<button type="button" onclick="U()">Manual OTA Update</button><br>
|
<button type="button" onclick="U()">Manual OTA Update</button><br>
|
||||||
Enable ArduinoOTA: <input type="checkbox" name="AO"><br>
|
Enable ArduinoOTA: <input type="checkbox" name="AO"><br>
|
||||||
<h3>About</h3>
|
<h3>About</h3>
|
||||||
<a href="https://github.com/Aircoookie/WLED" target="_blank">WLED</a> version 0.8.4<br><br>
|
<a href="https://github.com/Aircoookie/WLED" target="_blank">WLED</a> version 0.9.0<br><br>
|
||||||
<a href="https://github.com/Aircoookie/WLED/wiki/Contributors-&-About" target="_blank">Contributors, dependencies and special thanks</a><br>
|
<a href="https://github.com/Aircoookie/WLED/wiki/Contributors-&-About" target="_blank">Contributors, dependencies and special thanks</a><br>
|
||||||
A huge thank you to everyone who helped me create WLED!<br><br>
|
A huge thank you to everyone who helped me create WLED!<br><br>
|
||||||
(c) 2016-2019 Christian Schwinne <br>
|
(c) 2016-2019 Christian Schwinne <br>
|
||||||
|
@ -103,6 +103,7 @@
|
|||||||
Device Auth token: <input name="BK" maxlength="33"><br>
|
Device Auth token: <input name="BK" maxlength="33"><br>
|
||||||
<i>Clear the token field to disable. </i><a href="https://github.com/Aircoookie/WLED/wiki/Blynk" target="_blank">Setup info</a>
|
<i>Clear the token field to disable. </i><a href="https://github.com/Aircoookie/WLED/wiki/Blynk" target="_blank">Setup info</a>
|
||||||
<h3>MQTT</h3>
|
<h3>MQTT</h3>
|
||||||
|
Enable MQTT: <input type="checkbox" name="MQ"><br>
|
||||||
Broker: <input name="MS" maxlength="32"><br>
|
Broker: <input name="MS" maxlength="32"><br>
|
||||||
Username: <input name="MQTTUSER" maxlength="32"><br>
|
Username: <input name="MQTTUSER" maxlength="32"><br>
|
||||||
Password: <input type="password" input name="MQTTPASS" maxlength="32"><br>
|
Password: <input type="password" input name="MQTTPASS" maxlength="32"><br>
|
||||||
|
@ -98,7 +98,8 @@
|
|||||||
<div class="helpB"><button type="button" onclick="H()">?</button></div>
|
<div class="helpB"><button type="button" onclick="H()">?</button></div>
|
||||||
<button type="button" onclick="B()">Back</button><button type="submit">Save</button><hr>
|
<button type="button" onclick="B()">Back</button><button type="submit">Save</button><hr>
|
||||||
<h2>Web Setup</h2>
|
<h2>Web Setup</h2>
|
||||||
Server description: <input name="DS" maxlength="32"><br><br>
|
Server description: <input name="DS" maxlength="32"><br>
|
||||||
|
Sync button toggles both send and receive: <input type="checkbox" name="ST"><br><br>
|
||||||
<hr><button type="button" onclick="B()">Back</button><button type="submit">Save</button>
|
<hr><button type="button" onclick="B()">Back</button><button type="submit">Save</button>
|
||||||
</form>
|
</form>
|
||||||
</body>
|
</body>
|
||||||
|
@ -167,7 +167,8 @@ function gId(s){return document.getElementById(s);}function S(){GetV();Ct();}fun
|
|||||||
<div class="helpB"><button type="button" onclick="H()">?</button></div>
|
<div class="helpB"><button type="button" onclick="H()">?</button></div>
|
||||||
<button type="button" onclick="B()">Back</button><button type="submit">Save</button><hr>
|
<button type="button" onclick="B()">Back</button><button type="submit">Save</button><hr>
|
||||||
<h2>Web Setup</h2>
|
<h2>Web Setup</h2>
|
||||||
Server description: <input name="DS" maxlength="32"><br><br>
|
Server description: <input name="DS" maxlength="32"><br>
|
||||||
|
Sync button toggles both send and receive: <input type="checkbox" name="ST"><br><br>
|
||||||
<hr><button type="button" onclick="B()">Back</button><button type="submit">Save</button>
|
<hr><button type="button" onclick="B()">Back</button><button type="submit">Save</button>
|
||||||
</form>
|
</form>
|
||||||
</body>
|
</body>
|
||||||
@ -218,6 +219,7 @@ For best results, only use one of these services at a time.<br>
|
|||||||
Device Auth token: <input name="BK" maxlength="33"><br>
|
Device Auth token: <input name="BK" maxlength="33"><br>
|
||||||
<i>Clear the token field to disable. </i><a href="https://github.com/Aircoookie/WLED/wiki/Blynk" target="_blank">Setup info</a>
|
<i>Clear the token field to disable. </i><a href="https://github.com/Aircoookie/WLED/wiki/Blynk" target="_blank">Setup info</a>
|
||||||
<h3>MQTT</h3>
|
<h3>MQTT</h3>
|
||||||
|
Enable MQTT: <input type="checkbox" name="MQ"><br>
|
||||||
Broker: <input name="MS" maxlength="32">
|
Broker: <input name="MS" maxlength="32">
|
||||||
Port: <input name="MQPORT" type="number" min="1" max="65535" required><br>
|
Port: <input name="MQPORT" type="number" min="1" max="65535" required><br>
|
||||||
<b>The MQTT credentials are sent over an unsecured connection.<br>
|
<b>The MQTT credentials are sent over an unsecured connection.<br>
|
||||||
|
2886
wled00/html_ui.h
2886
wled00/html_ui.h
File diff suppressed because it is too large
Load Diff
@ -565,6 +565,14 @@ DEFINE_GRADIENT_PALETTE( Sakura_gp ) {
|
|||||||
195, 255, 82,103,
|
195, 255, 82,103,
|
||||||
255, 223, 13, 17};
|
255, 223, 13, 17};
|
||||||
|
|
||||||
|
DEFINE_GRADIENT_PALETTE( Aurora_gp ) {
|
||||||
|
0, 1, 5, 45, //deep blue
|
||||||
|
64, 0,200, 23,
|
||||||
|
128, 0,255, 0, //green
|
||||||
|
170, 0,243, 45,
|
||||||
|
200, 0,135, 7,
|
||||||
|
255, 1, 5, 45};//deep blue
|
||||||
|
|
||||||
|
|
||||||
// Single array of defined cpt-city color palettes.
|
// Single array of defined cpt-city color palettes.
|
||||||
// This will let us programmatically choose one based on
|
// This will let us programmatically choose one based on
|
||||||
@ -614,6 +622,7 @@ const TProgmemRGBGradientPalettePtr gGradientPalettes[] = {
|
|||||||
Orangery_gp, //47-34 Orangery
|
Orangery_gp, //47-34 Orangery
|
||||||
C9_gp, //48-35 C9
|
C9_gp, //48-35 C9
|
||||||
Sakura_gp, //49-36 Sakura
|
Sakura_gp, //49-36 Sakura
|
||||||
|
Aurora_gp, //50-37 Aurora
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@
|
|||||||
|
|
||||||
|
|
||||||
//version code in format yymmddb (b = daily build)
|
//version code in format yymmddb (b = daily build)
|
||||||
#define VERSION 1912111
|
#define VERSION 1912121
|
||||||
char versionString[] = "0.9.0-b1";
|
char versionString[] = "0.9.0-b1";
|
||||||
|
|
||||||
|
|
||||||
@ -148,7 +148,6 @@ bool fadeTransition = true; //enable crossfading color transit
|
|||||||
bool enableSecTransition = true; //also enable transition for secondary color
|
bool enableSecTransition = true; //also enable transition for secondary color
|
||||||
uint16_t transitionDelay = 750; //default crossfade duration in ms
|
uint16_t transitionDelay = 750; //default crossfade duration in ms
|
||||||
|
|
||||||
//bool strip.reverseMode = false; //flip entire LED strip (reverses all effect directions) --> edit in WS2812FX.h
|
|
||||||
bool skipFirstLed = false; //ignore first LED in strip (useful if you need the LED as signal repeater)
|
bool skipFirstLed = false; //ignore first LED in strip (useful if you need the LED as signal repeater)
|
||||||
uint8_t disableNLeds = 0; //disables N LEDs between active nodes. (Useful for spacing out lights for more traditional christmas light look)
|
uint8_t disableNLeds = 0; //disables N LEDs between active nodes. (Useful for spacing out lights for more traditional christmas light look)
|
||||||
byte briMultiplier = 100; //% of brightness to set (to limit power, if you set it to 50 and set bri to 255, actual brightness will be 127)
|
byte briMultiplier = 100; //% of brightness to set (to limit power, if you set it to 50 and set bri to 255, actual brightness will be 127)
|
||||||
@ -156,6 +155,7 @@ byte briMultiplier = 100; //% of brightness to set (to limit
|
|||||||
|
|
||||||
//User Interface CONFIG
|
//User Interface CONFIG
|
||||||
char serverDescription[33] = "WLED"; //Name of module
|
char serverDescription[33] = "WLED"; //Name of module
|
||||||
|
bool syncToggleReceive = false; //UIs which only have a single button for sync should toggle send+receive if this is true, only send otherwise
|
||||||
|
|
||||||
|
|
||||||
//Sync CONFIG
|
//Sync CONFIG
|
||||||
@ -189,6 +189,7 @@ bool arlsForceMaxBri = false; //enable to force max brightness i
|
|||||||
uint16_t e131Universe = 1; //settings for E1.31 (sACN) protocol
|
uint16_t e131Universe = 1; //settings for E1.31 (sACN) protocol
|
||||||
bool e131Multicast = false;
|
bool e131Multicast = false;
|
||||||
|
|
||||||
|
bool mqttEnabled = false;
|
||||||
char mqttDeviceTopic[33] = ""; //main MQTT topic (individual per device, default is wled/mac)
|
char mqttDeviceTopic[33] = ""; //main MQTT topic (individual per device, default is wled/mac)
|
||||||
char mqttGroupTopic[33] = "wled/all"; //second MQTT topic (for example to group devices)
|
char mqttGroupTopic[33] = "wled/all"; //second MQTT topic (for example to group devices)
|
||||||
char mqttServer[33] = ""; //both domains and IPs should work (no SSL)
|
char mqttServer[33] = ""; //both domains and IPs should work (no SSL)
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
#define EEPSIZE 2560
|
#define EEPSIZE 2560
|
||||||
|
|
||||||
//eeprom Version code, enables default settings instead of 0 init on update
|
//eeprom Version code, enables default settings instead of 0 init on update
|
||||||
#define EEPVER 13
|
#define EEPVER 14
|
||||||
//0 -> old version, default
|
//0 -> old version, default
|
||||||
//1 -> 0.4p 1711272 and up
|
//1 -> 0.4p 1711272 and up
|
||||||
//2 -> 0.4p 1711302 and up
|
//2 -> 0.4p 1711302 and up
|
||||||
@ -20,7 +20,8 @@
|
|||||||
//10-> 0.8.2
|
//10-> 0.8.2
|
||||||
//11-> 0.8.5-dev #mqttauth @TimothyBrown
|
//11-> 0.8.5-dev #mqttauth @TimothyBrown
|
||||||
//12-> 0.8.7-dev
|
//12-> 0.8.7-dev
|
||||||
//13-> 0.9.0
|
//13-> 0.9.0-dev
|
||||||
|
//14-> 0.9.0-b1
|
||||||
|
|
||||||
void commit()
|
void commit()
|
||||||
{
|
{
|
||||||
@ -152,7 +153,7 @@ void saveSettingsToEEPROM()
|
|||||||
EEPROM.write(394, abs(utcOffsetSecs) & 0xFF);
|
EEPROM.write(394, abs(utcOffsetSecs) & 0xFF);
|
||||||
EEPROM.write(395, (abs(utcOffsetSecs) >> 8) & 0xFF);
|
EEPROM.write(395, (abs(utcOffsetSecs) >> 8) & 0xFF);
|
||||||
EEPROM.write(396, (utcOffsetSecs<0)); //is negative
|
EEPROM.write(396, (utcOffsetSecs<0)); //is negative
|
||||||
//397 was initLedsLast
|
EEPROM.write(397, syncToggleReceive);
|
||||||
EEPROM.write(398, (ledCount >> 8) & 0xFF);
|
EEPROM.write(398, (ledCount >> 8) & 0xFF);
|
||||||
EEPROM.write(399, !enableSecTransition);
|
EEPROM.write(399, !enableSecTransition);
|
||||||
|
|
||||||
@ -241,6 +242,7 @@ void saveSettingsToEEPROM()
|
|||||||
EEPROM.write(2290 + i, timerMacro[i] );
|
EEPROM.write(2290 + i, timerMacro[i] );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EEPROM.write(2299, mqttEnabled);
|
||||||
writeStringToEEPROM(2300, mqttServer, 32);
|
writeStringToEEPROM(2300, mqttServer, 32);
|
||||||
writeStringToEEPROM(2333, mqttDeviceTopic, 32);
|
writeStringToEEPROM(2333, mqttDeviceTopic, 32);
|
||||||
writeStringToEEPROM(2366, mqttGroupTopic, 32);
|
writeStringToEEPROM(2366, mqttGroupTopic, 32);
|
||||||
@ -462,6 +464,14 @@ void loadSettingsFromEEPROM(bool first)
|
|||||||
{
|
{
|
||||||
readStringFromEEPROM(990, ntpServerName, 32);
|
readStringFromEEPROM(990, ntpServerName, 32);
|
||||||
}
|
}
|
||||||
|
if (lastEEPROMversion > 13)
|
||||||
|
{
|
||||||
|
mqttEnabled = EEPROM.read(2299);
|
||||||
|
syncToggleReceive = EEPROM.read(397);
|
||||||
|
} else {
|
||||||
|
mqttEnabled = true;
|
||||||
|
syncToggleReceive = false;
|
||||||
|
}
|
||||||
|
|
||||||
receiveDirect = !EEPROM.read(2200);
|
receiveDirect = !EEPROM.read(2200);
|
||||||
notifyMacro = EEPROM.read(2201);
|
notifyMacro = EEPROM.read(2201);
|
||||||
|
@ -243,6 +243,7 @@ void getSettingsJS(byte subPage, char* dest)
|
|||||||
if (subPage == 3)
|
if (subPage == 3)
|
||||||
{
|
{
|
||||||
sappends('s',"DS",serverDescription);
|
sappends('s',"DS",serverDescription);
|
||||||
|
sappend('c',"ST",syncToggleReceive);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (subPage == 4)
|
if (subPage == 4)
|
||||||
@ -271,6 +272,7 @@ void getSettingsJS(byte subPage, char* dest)
|
|||||||
sappends('s',"BK",(char*)((blynkEnabled)?"Hidden":""));
|
sappends('s',"BK",(char*)((blynkEnabled)?"Hidden":""));
|
||||||
|
|
||||||
#ifdef WLED_ENABLE_MQTT
|
#ifdef WLED_ENABLE_MQTT
|
||||||
|
sappend('c',"MQ",mqttEnabled);
|
||||||
sappends('s',"MS",mqttServer);
|
sappends('s',"MS",mqttServer);
|
||||||
sappend('v',"MQPORT",mqttPort);
|
sappend('v',"MQPORT",mqttPort);
|
||||||
sappends('s',"MQUSER",mqttUser);
|
sappends('s',"MQUSER",mqttUser);
|
||||||
|
@ -113,6 +113,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
|||||||
if (subPage == 3)
|
if (subPage == 3)
|
||||||
{
|
{
|
||||||
strlcpy(serverDescription, request->arg("DS").c_str(), 33);
|
strlcpy(serverDescription, request->arg("DS").c_str(), 33);
|
||||||
|
syncToggleReceive = request->hasArg("ST");
|
||||||
}
|
}
|
||||||
|
|
||||||
//SYNC
|
//SYNC
|
||||||
@ -153,6 +154,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WLED_ENABLE_MQTT
|
#ifdef WLED_ENABLE_MQTT
|
||||||
|
mqttEnabled = request->hasArg("MQ");
|
||||||
strlcpy(mqttServer, request->arg("MS").c_str(), 33);
|
strlcpy(mqttServer, request->arg("MS").c_str(), 33);
|
||||||
t = request->arg("MQPORT").toInt();
|
t = request->arg("MQPORT").toInt();
|
||||||
if (t > 0) mqttPort = t;
|
if (t > 0) mqttPort = t;
|
||||||
|
@ -179,7 +179,7 @@ void handleNotifications()
|
|||||||
col[0] = udpIn[3];
|
col[0] = udpIn[3];
|
||||||
col[1] = udpIn[4];
|
col[1] = udpIn[4];
|
||||||
col[2] = udpIn[5];
|
col[2] = udpIn[5];
|
||||||
if (udpIn[11] > 0) //check if sending modules white val is inteded
|
if (udpIn[11] > 0) //sending module's white val is intended
|
||||||
{
|
{
|
||||||
col[3] = udpIn[10];
|
col[3] = udpIn[10];
|
||||||
if (udpIn[11] > 1)
|
if (udpIn[11] > 1)
|
||||||
@ -192,7 +192,7 @@ void handleNotifications()
|
|||||||
if (udpIn[11] > 5)
|
if (udpIn[11] > 5)
|
||||||
{
|
{
|
||||||
uint32_t t = (udpIn[25] << 24) | (udpIn[26] << 16) | (udpIn[27] << 8) | (udpIn[28]);
|
uint32_t t = (udpIn[25] << 24) | (udpIn[26] << 16) | (udpIn[27] << 8) | (udpIn[28]);
|
||||||
t -= 2;
|
t += 2;
|
||||||
t -= millis();
|
t -= millis();
|
||||||
strip.timebase = t;
|
strip.timebase = t;
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,13 @@ void setValuesFromMainSeg()
|
|||||||
effectPalette = seg.palette;
|
effectPalette = seg.palette;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void resetTimebase()
|
||||||
|
{
|
||||||
|
strip.timebase = 0 - millis();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void toggleOnOff()
|
void toggleOnOff()
|
||||||
{
|
{
|
||||||
if (bri == 0)
|
if (bri == 0)
|
||||||
@ -81,7 +88,7 @@ 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)
|
||||||
// 6: fx changed 7: hue 8: preset cycle 9: blynk 10: alexa
|
// 6: fx changed 7: hue 8: preset cycle 9: blynk 10: alexa
|
||||||
if (callMode != 1 && callMode != 5) strip.applyToAllSelected = true; //if not from JSON api, which directly sets segments
|
if (callMode != 0 && callMode != 1 && callMode != 5) strip.applyToAllSelected = true; //if not from JSON api, which directly sets segments
|
||||||
|
|
||||||
bool fxChanged = strip.setEffectConfig(effectCurrent, effectSpeed, effectIntensity, effectPalette);
|
bool fxChanged = strip.setEffectConfig(effectCurrent, effectSpeed, effectIntensity, effectPalette);
|
||||||
if (!colorChanged())
|
if (!colorChanged())
|
||||||
@ -113,6 +120,7 @@ void colorUpdated(int callMode)
|
|||||||
colIT[i] = col[i];
|
colIT[i] = col[i];
|
||||||
colSecIT[i] = colSec[i];
|
colSecIT[i] = colSec[i];
|
||||||
}
|
}
|
||||||
|
if (briT == 0 && callMode != 3) resetTimebase();
|
||||||
briIT = bri;
|
briIT = bri;
|
||||||
if (bri > 0) briLast = bri;
|
if (bri > 0) briLast = bri;
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ void publishMqtt()
|
|||||||
bool initMqtt()
|
bool initMqtt()
|
||||||
{
|
{
|
||||||
lastMqttReconnectAttempt = millis();
|
lastMqttReconnectAttempt = millis();
|
||||||
if (mqttServer[0] == 0 || !WLED_CONNECTED) return false;
|
if (!mqttEnabled || mqttServer[0] == 0 || !WLED_CONNECTED) return false;
|
||||||
|
|
||||||
if (mqtt == nullptr) {
|
if (mqtt == nullptr) {
|
||||||
mqtt = new AsyncMqttClient();
|
mqtt = new AsyncMqttClient();
|
||||||
|
@ -68,7 +68,7 @@ void initServer()
|
|||||||
|
|
||||||
server.on("/settings/wifi", HTTP_POST, [](AsyncWebServerRequest *request){
|
server.on("/settings/wifi", HTTP_POST, [](AsyncWebServerRequest *request){
|
||||||
if (!(wifiLock && otaLock)) handleSettingsSet(request, 1);
|
if (!(wifiLock && otaLock)) handleSettingsSet(request, 1);
|
||||||
serveMessage(request, 200,"WiFi settings saved.","Reconnecting now...",129);
|
serveMessage(request, 200,"WiFi settings saved.","Please connect to the new IP (if changed)",129);
|
||||||
forceReconnect = true;
|
forceReconnect = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -79,7 +79,7 @@ void initServer()
|
|||||||
|
|
||||||
server.on("/settings/ui", HTTP_POST, [](AsyncWebServerRequest *request){
|
server.on("/settings/ui", HTTP_POST, [](AsyncWebServerRequest *request){
|
||||||
handleSettingsSet(request, 3);
|
handleSettingsSet(request, 3);
|
||||||
serveMessage(request, 200,"UI settings saved.","Reloading to apply theme...",122);
|
serveMessage(request, 200,"UI settings saved.","Redirecting...",1);
|
||||||
});
|
});
|
||||||
|
|
||||||
server.on("/settings/sync", HTTP_POST, [](AsyncWebServerRequest *request){
|
server.on("/settings/sync", HTTP_POST, [](AsyncWebServerRequest *request){
|
||||||
@ -94,7 +94,7 @@ void initServer()
|
|||||||
|
|
||||||
server.on("/settings/sec", HTTP_POST, [](AsyncWebServerRequest *request){
|
server.on("/settings/sec", HTTP_POST, [](AsyncWebServerRequest *request){
|
||||||
handleSettingsSet(request, 6);
|
handleSettingsSet(request, 6);
|
||||||
if (!doReboot) serveMessage(request, 200,"Security settings saved.","Rebooting now, please wait ~10 seconds...",129);
|
if (!doReboot) serveMessage(request, 200,"Security settings saved.","Rebooting, please wait ~10 seconds...",129);
|
||||||
doReboot = true;
|
doReboot = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -123,15 +123,23 @@ bool deserializeState(JsonObject root)
|
|||||||
if (segVar.is<JsonObject>())
|
if (segVar.is<JsonObject>())
|
||||||
{
|
{
|
||||||
int id = segVar["id"] | -1;
|
int id = segVar["id"] | -1;
|
||||||
|
|
||||||
if (id < 0) { //set all selected segments
|
if (id < 0) { //set all selected segments
|
||||||
|
bool didSet = false;
|
||||||
|
byte lowestActive = 99;
|
||||||
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() && sg.isSelected())
|
if (sg.isActive())
|
||||||
{
|
{
|
||||||
deserializeSegment(segVar, s);
|
if (lowestActive == 99) lowestActive = s;
|
||||||
|
if (sg.isSelected()) {
|
||||||
|
deserializeSegment(segVar, s);
|
||||||
|
didSet = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!didSet && lowestActive < strip.getMaxSegments()) deserializeSegment(segVar, lowestActive);
|
||||||
} else { //set only the segment with the specified ID
|
} else { //set only the segment with the specified ID
|
||||||
deserializeSegment(segVar, it);
|
deserializeSegment(segVar, it);
|
||||||
}
|
}
|
||||||
@ -144,7 +152,6 @@ bool deserializeState(JsonObject root)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//fromJson = true;
|
|
||||||
colorUpdated(noNotification ? 5:1);
|
colorUpdated(noNotification ? 5:1);
|
||||||
|
|
||||||
ps = root["psave"] | -1;
|
ps = root["psave"] | -1;
|
||||||
@ -240,6 +247,8 @@ void serializeInfo(JsonObject root)
|
|||||||
leds["maxseg"] = strip.getMaxSegments();
|
leds["maxseg"] = strip.getMaxSegments();
|
||||||
leds["seglock"] = false; //will be used in the future to prevent modifications to segment config
|
leds["seglock"] = false; //will be used in the future to prevent modifications to segment config
|
||||||
|
|
||||||
|
root["str"] = syncToggleReceive;
|
||||||
|
|
||||||
root["name"] = serverDescription;
|
root["name"] = serverDescription;
|
||||||
root["udpport"] = udpPort;
|
root["udpport"] = udpPort;
|
||||||
root["live"] = realtimeActive;
|
root["live"] = realtimeActive;
|
||||||
@ -295,7 +304,7 @@ void serializeInfo(JsonObject root)
|
|||||||
|
|
||||||
root["brand"] = "WLED";
|
root["brand"] = "WLED";
|
||||||
root["product"] = "DIY light";
|
root["product"] = "DIY light";
|
||||||
root["btype"] = "dev";
|
root["btype"] = "bin";
|
||||||
root["mac"] = escapedMac;
|
root["mac"] = escapedMac;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user