Major parts of rework complete
This commit is contained in:
parent
30ee42732e
commit
76dd7b63fb
@ -246,7 +246,7 @@ void WS2812FX::mode_static(void) {
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Normal blinking. 50% on/off time.
|
* Normal blinking. on/off duty time set by FX intensity.
|
||||||
*/
|
*/
|
||||||
void WS2812FX::mode_blink(void) {
|
void WS2812FX::mode_blink(void) {
|
||||||
if(_counter_mode_call % 2 == 1) {
|
if(_counter_mode_call % 2 == 1) {
|
||||||
@ -254,16 +254,15 @@ void WS2812FX::mode_blink(void) {
|
|||||||
if (!_locked[i])
|
if (!_locked[i])
|
||||||
setPixelColor(i, _color);
|
setPixelColor(i, _color);
|
||||||
}
|
}
|
||||||
show();
|
_mode_delay = (100 + ((1986 * (uint32_t)(SPEED_MAX - _speed)) / SPEED_MAX))*(float)(_intensity/128.0);
|
||||||
} else {
|
} else {
|
||||||
for(uint16_t i=0; i < _led_count; i++) {
|
for(uint16_t i=0; i < _led_count; i++) {
|
||||||
if (!_locked[i])
|
if (!_locked[i])
|
||||||
setPixelColor(i, _color_sec);
|
setPixelColor(i, _color_sec);
|
||||||
}
|
}
|
||||||
show();
|
_mode_delay = (100 + ((1986 * (uint32_t)(SPEED_MAX - _speed)) / SPEED_MAX))*(float)(2.0-(_intensity/128.0));
|
||||||
}
|
}
|
||||||
|
show();
|
||||||
_mode_delay = 100 + ((1986 * (uint32_t)(SPEED_MAX - _speed)) / SPEED_MAX);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -342,12 +341,11 @@ void WS2812FX::mode_single_dynamic(void) {
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Lights every LED in a random color. Changes all LED at the same time
|
* Lights multiple random leds in a random color (higher intensity, more updates)
|
||||||
* to new random colors.
|
|
||||||
*/
|
*/
|
||||||
void WS2812FX::mode_multi_dynamic(void) {
|
void WS2812FX::mode_multi_dynamic(void) {
|
||||||
for(uint16_t i=0; i < _led_count; i++) {
|
for(uint16_t i=0; i < _led_count; i++) {
|
||||||
if (!_locked[i])
|
if (!_locked[i] && random(256)<=_intensity)
|
||||||
setPixelColor(i, color_wheel(random(256)));
|
setPixelColor(i, color_wheel(random(256)));
|
||||||
}
|
}
|
||||||
show();
|
show();
|
||||||
@ -493,7 +491,7 @@ void WS2812FX::mode_rainbow(void) {
|
|||||||
void WS2812FX::mode_rainbow_cycle(void) {
|
void WS2812FX::mode_rainbow_cycle(void) {
|
||||||
for(uint16_t i=0; i < _led_count; i++) {
|
for(uint16_t i=0; i < _led_count; i++) {
|
||||||
if (!_locked[i])
|
if (!_locked[i])
|
||||||
setPixelColor(i, color_wheel(((i * 256 / _led_count) + _counter_mode_step) % 256));
|
setPixelColor(i, color_wheel(((i * 256 / ((uint16_t)(_led_count*(float)(_intensity/128.0))+1)) + _counter_mode_step) % 256));
|
||||||
}
|
}
|
||||||
show();
|
show();
|
||||||
|
|
||||||
|
@ -56,10 +56,12 @@
|
|||||||
} else {
|
} else {
|
||||||
uwv = false;
|
uwv = false;
|
||||||
}
|
}
|
||||||
if (d.activeElement != Cf.TX) Cf.TX.selectedIndex = this.responseXML.getElementsByTagName('fx')[0].childNodes[0].nodeValue;
|
Cf.TX.selectedIndex = this.responseXML.getElementsByTagName('fx')[0].childNodes[0].nodeValue;
|
||||||
d.Cf.SX.value = this.responseXML.getElementsByTagName('sx')[0].childNodes[0].nodeValue;
|
d.Cf.SX.value = this.responseXML.getElementsByTagName('sx')[0].childNodes[0].nodeValue;
|
||||||
d.Cf.IX.value = this.responseXML.getElementsByTagName('ix')[0].childNodes[0].nodeValue;
|
d.Cf.IX.value = this.responseXML.getElementsByTagName('ix')[0].childNodes[0].nodeValue;
|
||||||
nla = (this.responseXML.getElementsByTagName('nl')[0].innerHTML)!=0?true:false;
|
nla = (this.responseXML.getElementsByTagName('nl')[0].innerHTML)!=0?true:false;
|
||||||
|
d.Cf.SN.value = this.responseXML.getElementsByTagName('nd')[0].childNodes[0].nodeValue;
|
||||||
|
d.Cf.ST.value = this.responseXML.getElementsByTagName('nt')[0].childNodes[0].nodeValue;
|
||||||
nState = 0;
|
nState = 0;
|
||||||
nState = (this.responseXML.getElementsByTagName('nr')[0].innerHTML)!=0?1:0;
|
nState = (this.responseXML.getElementsByTagName('nr')[0].innerHTML)!=0?1:0;
|
||||||
nState += (this.responseXML.getElementsByTagName('ns')[0].innerHTML)!=0?2:0;
|
nState += (this.responseXML.getElementsByTagName('ns')[0].innerHTML)!=0?2:0;
|
||||||
@ -332,11 +334,11 @@
|
|||||||
</script>
|
</script>
|
||||||
<style>
|
<style>
|
||||||
:root {
|
:root {
|
||||||
--aCol: #D9B310;
|
--aCol: #0ac;
|
||||||
--bCol: #0B3C5D;
|
--bCol: #124;
|
||||||
--cCol: #1D2731;
|
--cCol: #334;
|
||||||
--dCol: #328CC1;
|
--dCol: #288;
|
||||||
--sCol: #000;
|
--sCol: #003eff;
|
||||||
}
|
}
|
||||||
.ctrl_box {
|
.ctrl_box {
|
||||||
margin: auto;
|
margin: auto;
|
||||||
|
@ -15,15 +15,6 @@
|
|||||||
--dCol: #328CC1;
|
--dCol: #328CC1;
|
||||||
--sCol: #000;
|
--sCol: #000;
|
||||||
}
|
}
|
||||||
body {
|
|
||||||
font-family: Verdana, Helvetica, sans-serif;
|
|
||||||
text-align: center;
|
|
||||||
background: var(--cCol);
|
|
||||||
color: var(--dCol);
|
|
||||||
line-height: 200%;
|
|
||||||
margin: 0;
|
|
||||||
background-attachment: fixed;
|
|
||||||
}
|
|
||||||
button {
|
button {
|
||||||
background: var(--bCol);
|
background: var(--bCol);
|
||||||
color: var(--dCol);
|
color: var(--dCol);
|
||||||
@ -34,6 +25,15 @@
|
|||||||
margin: 8px;
|
margin: 8px;
|
||||||
margin-top: 12px;
|
margin-top: 12px;
|
||||||
}
|
}
|
||||||
|
body {
|
||||||
|
font-family: Verdana, Helvetica, sans-serif;
|
||||||
|
text-align: center;
|
||||||
|
background: var(--cCol);
|
||||||
|
color: var(--dCol);
|
||||||
|
line-height: 200%;
|
||||||
|
margin: 0;
|
||||||
|
background-attachment: fixed;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
@ -31,11 +31,11 @@
|
|||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<form action="/settings/wifi" method="post"><button type="submit">WiFi Setup</button></form>
|
<form action="/settings/wifi"><button type="submit">WiFi Setup</button></form>
|
||||||
<form action="/settings/leds" method="post"><button type="submit">LED Preferences</button></form>
|
<form action="/settings/leds"><button type="submit">LED Preferences</button></form>
|
||||||
<form action="/settings/ui" method="post"><button type="submit">User Interface</button></form>
|
<form action="/settings/ui"><button type="submit">User Interface</button></form>
|
||||||
<form action="/settings/sync" method="post"><button type="submit">Sync Interfaces</button></form>
|
<form action="/settings/sync"><button type="submit">Sync Interfaces</button></form>
|
||||||
<form action="/settings/time" method="post"><button type="submit">Time & Macros</button></form>
|
<form action="/settings/time"><button type="submit">Time & Macros</button></form>
|
||||||
<form action="/settings/sec" method="post"><button type="submit">Security & Updates</button></form>
|
<form action="/settings/sec"><button type="submit">Security & Updates</button></form>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
20
wled00/data/themes.txt
Normal file
20
wled00/data/themes.txt
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
6. Amber:
|
||||||
|
--aCol: #f7c331;
|
||||||
|
--bCol: #dcc7aa;
|
||||||
|
--cCol: #6b7a8f;
|
||||||
|
--dCol: #f7882f;
|
||||||
|
--sCol: #0007;
|
||||||
|
|
||||||
|
7. Club
|
||||||
|
--aCol: #fc3;
|
||||||
|
--bCol: #124;
|
||||||
|
--cCol: #334;
|
||||||
|
--dCol: #f1d;
|
||||||
|
--sCol: #f00;
|
||||||
|
|
||||||
|
8: Air:
|
||||||
|
--aCol: #0ac;
|
||||||
|
--bCol: #124;
|
||||||
|
--cCol: #334;
|
||||||
|
--dCol: #00ced1;
|
||||||
|
--sCol: #003eff;
|
170
wled00/htmls00.h
170
wled00/htmls00.h
File diff suppressed because one or more lines are too long
341
wled00/htmls01.h
341
wled00/htmls01.h
@ -1,17 +1,346 @@
|
|||||||
/*
|
/*
|
||||||
* Settings html
|
* Settings html
|
||||||
*/
|
*/
|
||||||
const char PAGE_settings0[] PROGMEM = R"=====(
|
const char PAGE_settingsCss[] PROGMEM = R"=====(
|
||||||
|
body{font-family:Verdana,Helvetica,sans-serif;text-align:center;background:var(--cCol);color:var(--dCol);line-height:200%;margin:0;background-attachment:fixed}hr{border-color:var(--dCol);filter:drop-shadow(-5px -5px 5px var(--sCol))}button{background:var(--bCol);color:var(--dCol);border:.3ch solid var(--bCol);display:inline-block;filter:drop-shadow(-5px -5px 5px var(--sCol));font-size:20px;margin:8px;margin-top:12px}.helpB{text-align:left;position:absolute;width:60px}input{background:var(--bCol);color:var(--dCol);border:.5ch solid var(--bCol);filter:drop-shadow(-5px -5px 5px var(--sCol))}input[type=number]{width:3em}select{background:var(--bCol);color:var(--dCol);border:0.5ch solid var(--bCol);filter:drop-shadow( -5px -5px 5px var(--sCol) );}</style>
|
||||||
|
)=====";
|
||||||
|
|
||||||
|
const char PAGE_settings0[] PROGMEM = R"=====(
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>WLED Settings</title>
|
||||||
)=====";
|
)=====";
|
||||||
|
|
||||||
const char PAGE_settings1[] PROGMEM = R"=====(
|
const char PAGE_settings1[] PROGMEM = R"=====(
|
||||||
|
body{font-family:Verdana,Helvetica,sans-serif;text-align:center;background:var(--cCol);height:100%;margin:0;background-attachment:fixed}button{background:var(--bCol);color:var(--dCol);border:.3ch solid var(--bCol);display:inline-block;filter:drop-shadow(-5px -5px 5px var(--sCol));font-size:9vmin;width:95%;margin-top:2.4vh}</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<form action=/settings/wifi><button type=submit>WiFi Setup</button></form>
|
||||||
|
<form action=/settings/leds><button type=submit>LED Preferences</button></form>
|
||||||
|
<form action=/settings/ui><button type=submit>User Interface</button></form>
|
||||||
|
<form action=/settings/sync><button type=submit>Sync Interfaces</button></form>
|
||||||
|
<form action=/settings/time><button type=submit>Time & Macros</button></form>
|
||||||
|
<form action=/settings/sec><button type=submit>Security & Updates</button></form>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
)=====";
|
||||||
|
|
||||||
|
const char PAGE_settings_wifi0[] PROGMEM = R"=====(
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>WiFi Settings</title><script>function H(){window.open("https://github.com/Aircoookie/WLED/wiki/Settings#wifi-settings");}function B(){window.history.back();}function GetV(){var d = document;
|
||||||
|
)=====";
|
||||||
|
const char PAGE_settings_wifi1[] PROGMEM = R"=====(
|
||||||
|
</head>
|
||||||
|
<body onload="GetV()">
|
||||||
|
<form id="form_s" name="Sf" method="post">
|
||||||
|
<div class="helpB"><button type="button" onclick="H()">?</button></div>
|
||||||
|
<button type="button" onclick="B()">Back</button><button type="submit" name="SUBM">Save</button><hr>
|
||||||
|
<h2>WiFi setup</h2>
|
||||||
|
<h3>Connect to existing network</h3>
|
||||||
|
Network name (SSID, empty to not connect): <br><input name="CSSID" maxlength="32"> <br>
|
||||||
|
Network password: <br> <input type="password" name="CPASS" maxlength="63"> <br>
|
||||||
|
Static IP (leave at 0.0.0.0 for DHCP): <br>
|
||||||
|
<input name="CSIP0" type="number" min="0" max="255" required> .
|
||||||
|
<input name="CSIP1" type="number" min="0" max="255" required> .
|
||||||
|
<input name="CSIP2" type="number" min="0" max="255" required> .
|
||||||
|
<input name="CSIP3" type="number" min="0" max="255" required> <br>
|
||||||
|
Static gateway: <br>
|
||||||
|
<input name="CSGW0" type="number" min="0" max="255" required> .
|
||||||
|
<input name="CSGW1" type="number" min="0" max="255" required> .
|
||||||
|
<input name="CSGW2" type="number" min="0" max="255" required> .
|
||||||
|
<input name="CSGW3" type="number" min="0" max="255" required> <br>
|
||||||
|
Static subnet mask: <br>
|
||||||
|
<input name="CSSN0" type="number" min="0" max="255" required> .
|
||||||
|
<input name="CSSN1" type="number" min="0" max="255" required> .
|
||||||
|
<input name="CSSN2" type="number" min="0" max="255" required> .
|
||||||
|
<input name="CSSN3" type="number" min="0" max="255" required> <br>
|
||||||
|
mDNS address (leave empty for no mDNS): <br/>
|
||||||
|
http:// <input name="CMDNS" maxlength="32"> .local <br>
|
||||||
|
Try connecting before opening AP for: <input name="APWTM" type="number" min="0" max="255" required> s <br>
|
||||||
|
Client IP: <span class="sip"> Not connected </span> <br>
|
||||||
|
<h3>Configure Access Point</h3>
|
||||||
|
AP SSID (leave empty for no AP): <br> <input name="APSSID" maxlength="32"> <br>
|
||||||
|
Hide AP name: <input type="checkbox" name="APHSSID"> <br>
|
||||||
|
AP password (leave empty for open): <br> <input type="password" name="APPASS" maxlength="63"> <br>
|
||||||
|
Access Point WiFi channel: <input name="APCHAN" type="number" min="1" max="13" required> <br>
|
||||||
|
AP IP: <span class="sip"> Not active </span> <hr>
|
||||||
|
<button type="button" onclick="B()">Back</button><button type="submit" name="SUBM">Save</button>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
)=====";
|
||||||
|
|
||||||
|
const char PAGE_settings_leds0[] PROGMEM = R"=====(
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html><head>
|
||||||
|
<title>LED Settings</title><script>function H(){window.open("https://github.com/Aircoookie/WLED/wiki/Settings#led-settings");}function B(){window.history.back();}function GetV(){var d = document;
|
||||||
|
)=====";
|
||||||
|
const char PAGE_settings_leds1[] PROGMEM = R"=====(
|
||||||
|
</head>
|
||||||
|
<body onload="GetV()">
|
||||||
|
<form id="form_s" name="Sf" method="post">
|
||||||
|
<div class="helpB"><button type="button" onclick="H()">?</button></div>
|
||||||
|
<button type="button" onclick="B()">Back</button><button type="submit" name="SUBM">Save</button><hr>
|
||||||
|
<h2>LED setup</h2>
|
||||||
|
LED count (max. 255): <input name="LEDCN" type="number" min="1" max="255" required> <br>
|
||||||
|
<i>The default boot color is always saved in preset slot 0.</i><br>
|
||||||
|
Alternatively, apply preset <input name="BOOTP" type="number" min="0" max="25" required> at boot<br>
|
||||||
|
Default RGB color:
|
||||||
|
<input name="CLDFR" type="number" min="0" max="255" required>
|
||||||
|
<input name="CLDFG" type="number" min="0" max="255" required>
|
||||||
|
<input name="CLDFB" type="number" min="0" max="255" required> <br>
|
||||||
|
Default brightness: <input name="CLDFA" type="number" min="0" max="255" required> (0-255) <br>
|
||||||
|
Default white value (only RGBW, -1 to disable): <input name="CLDFW" type="number" min="-1" max="255" required> <br>
|
||||||
|
Default effect ID: <input name="FXDEF" type="number" min="0" max="57" required> <br>
|
||||||
|
Default effect speed: <input name="SXDEF" type="number" min="0" max="255" required> <br>
|
||||||
|
Default effect intensity: <input name="IXDEF" type="number" min="0" max="255" required> <br>
|
||||||
|
Default secondary RGB(W):<br>
|
||||||
|
<input name="CSECR" type="number" min="0" max="255" required>
|
||||||
|
<input name="CSECG" type="number" min="0" max="255" required>
|
||||||
|
<input name="CSECB" type="number" min="0" max="255" required>
|
||||||
|
<input name="CSECW" type="number" min="0" max="255" required><br>
|
||||||
|
Ignore and use current color, brightness and effects: <input type="checkbox" name="CBEOR"> <br>
|
||||||
|
Turn on after power up/reset: <input type="checkbox" name="BOOTN"> <br>
|
||||||
|
Use Gamma correction for brightness: <input type="checkbox" name="GCBRI"> <br>
|
||||||
|
Use Gamma correction for color: <input type="checkbox" name="GCRGB"> <br>
|
||||||
|
Brightness factor: <input name="NRBRI" type="number" min="0" max="255" required> %
|
||||||
|
<h3>Transitions</h3>
|
||||||
|
Fade: <input type="checkbox" name="TFADE"><br>
|
||||||
|
Sweep: <input type="checkbox" name="TSWEE"> Invert direction: <input type="checkbox" name="TSDIR"><br>
|
||||||
|
Transition Delay: <input name="TDLAY" maxlength="5" size="2"> ms
|
||||||
|
<h3>Timed light</h3>
|
||||||
|
Default Duration: <input name="TLDUR" type="number" min="1" max="255" required> min<br>
|
||||||
|
Default Target brightness: <input name="TLBRI" type="number" min="0" max="255" required><br>
|
||||||
|
Fade down: <input type="checkbox" name="TLFDE"><br>
|
||||||
|
<h3>Advanced</h3>
|
||||||
|
Default overlay ID: <input name="OLDEF" type="number" min="0" max="255" required> <br>
|
||||||
|
WARLS offset: <input name="WOFFS" type="number" min="-255" max="255" required><hr>
|
||||||
|
<button type="button" onclick="B()">Back</button><button type="submit" name="SUBM">Save</button>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
||||||
)=====";
|
)=====";
|
||||||
|
|
||||||
/*
|
const char PAGE_settings_ui0[] PROGMEM = R"=====(
|
||||||
* Settings set html
|
<!DOCTYPE html>
|
||||||
*/
|
<html>
|
||||||
const char PAGE_msg[] PROGMEM = R"=====(
|
<head>
|
||||||
|
<title>UI Settings</title><script>
|
||||||
|
function gId(s){return document.getElementById(s);}function S(){GetV();Ct();}function H(){window.open("https://github.com/Aircoookie/WLED/wiki/Settings#user-interface-settings");}function B(){window.history.back();}function Ct(){if (gId("co").selected){gId("cth").style.display="block";}else{gId("cth").style.display="none";}}function GetV(){var d = document;
|
||||||
|
)=====";
|
||||||
|
const char PAGE_settings_ui1[] PROGMEM = R"=====(
|
||||||
|
</head>
|
||||||
|
<body onload="S()">
|
||||||
|
<form id="form_s" name="Sf" method="post">
|
||||||
|
<div class="helpB"><button type="button" onclick="H()">?</button></div>
|
||||||
|
<button type="button" onclick="B()">Back</button><button type="submit" name="SUBM">Save</button><hr>
|
||||||
|
<h2>Web Setup</h2>
|
||||||
|
Server description: <input name="DESC" maxlength="32"><br>
|
||||||
|
Use HSB sliders instead of RGB by default: <input type="checkbox" name="COLMD"><br>
|
||||||
|
Color Theme:
|
||||||
|
<select name="THEME" onchange="Ct()">
|
||||||
|
<option value="0" selected>Night</option>
|
||||||
|
<option value="1">Modern</option>
|
||||||
|
<option value="2">Bright</option>
|
||||||
|
<option value="3">Wine</option>
|
||||||
|
<option value="4">Electric</option>
|
||||||
|
<option value="5">Mint</option>
|
||||||
|
<option value="6">Amber</option>
|
||||||
|
<option value="7">Club</option>
|
||||||
|
<option value="8">Air</option>
|
||||||
|
<option value="9">Coookie</option>
|
||||||
|
<option value="10">Unused</option>
|
||||||
|
<option value="11">Unused</option>
|
||||||
|
<option value="12">Unused</option>
|
||||||
|
<option value="13">Unused</option>
|
||||||
|
<option value="14">The End</option>
|
||||||
|
<option value="15" id="co">Custom</option>
|
||||||
|
</select><br>
|
||||||
|
<div id="cth">
|
||||||
|
Please specify your custom hex colors (e.g. #FF0000 for red)<br>
|
||||||
|
Custom accent color: <input maxlength=9 name="CCOL0"><br>
|
||||||
|
Custom background: <input maxlength=9 name="CCOL1"><br>
|
||||||
|
Custom panel color: <input maxlength=9 name="CCOL2"><br>
|
||||||
|
Custom text color: <input maxlength=9 name="CCOL3"><br>
|
||||||
|
Custom shadow: <input maxlength=9 name="CCOL4"><br></div>
|
||||||
|
<hr><button type="button" onclick="B()">Back</button><button type="submit" name="SUBM">Save</button>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
)=====";
|
||||||
|
|
||||||
|
const char PAGE_settings_sync0[] PROGMEM = R"=====(
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html><head><title>Sync Settings</title>
|
||||||
|
<script>function H(){window.open("https://github.com/Aircoookie/WLED/wiki/Settings#sync-settings");}function B(){window.open("/settings","_self");}function GetV(){var d = document;
|
||||||
|
)=====";
|
||||||
|
const char PAGE_settings_sync1[] PROGMEM = R"=====(
|
||||||
|
</head>
|
||||||
|
<body onload="GetV()">
|
||||||
|
<form id="form_s" name="Sf" method="post">
|
||||||
|
<div class="helpB"><button type="button" onclick="H()">?</button></div>
|
||||||
|
<button type="button" onclick="B()">Back</button><button type="submit" name="SUBM">Save</button><hr>
|
||||||
|
<h2>Sync setup</h2>
|
||||||
|
<h3>Button setup</h3>
|
||||||
|
On/Off button enabled: <input type="checkbox" name="BTNON">
|
||||||
|
<h3>WLED Broadcast</h3>
|
||||||
|
UDP Port: <input name="NUDPP" maxlength="5" size="2"><br>
|
||||||
|
Receive <input type="checkbox" name="NRCBR">Brightness, <input type="checkbox" name="NRCCL">Color, and <input type="checkbox" name="NRCFX">Effects<br>
|
||||||
|
Send notifications on direct change: <input type="checkbox" name="NSDIR"> <br>
|
||||||
|
Send notifications on button press: <input type="checkbox" name="NSBTN"> <br>
|
||||||
|
Send Alexa notifications: <input type="checkbox" name="NSALX"> <br>
|
||||||
|
<!--Send Philips Hue change notifications: <input type="checkbox" name="NSHUE">-->
|
||||||
|
<h3>Alexa Voice Assistant</h3>
|
||||||
|
Emulate Alexa device: <input type="checkbox" name="ALEXA"> <br>
|
||||||
|
Alexa invocation name: <input name="AINVN" maxlength="32"><br>
|
||||||
|
<h3>Philips Hue</h3>
|
||||||
|
Coming soon! Not yet implemented!
|
||||||
|
<!--<i>You can find the bridge IP and the light number in the 'About' section of the hue app.</i><br>
|
||||||
|
Hue Bridge IP:<br>
|
||||||
|
<input name="HUIP0" type="number" min="0" max="255" required> .
|
||||||
|
<input name="HUIP1" type="number" min="0" max="255" required> .
|
||||||
|
<input name="HUIP2" type="number" min="0" max="255" required> .
|
||||||
|
<input name="HUIP3" type="number" min="0" max="255" required> <br>
|
||||||
|
<b>For successful pairing, press the pushlink button on the bridge, then save this page!</b><br>
|
||||||
|
(when first connecting)<br>
|
||||||
|
<i> Use 0 for group and light to turn off sending/receiving </i><br>
|
||||||
|
Update Hue group <input name="HUEGR" type="number" min="0" max="99" required> <br>
|
||||||
|
Send <input type="checkbox" name="HUEIO"> On/Off, <input type="checkbox" name="HUEBR"> Brightness, and <input type="checkbox" name="HUECL"> Color<br>
|
||||||
|
Poll Hue light <input name="HUELI" type="number" min="0" max="99" required> every <input name="HUEPL" type="number" min="100" max="62000" required> ms<br>
|
||||||
|
Then, receive <input type="checkbox" name="HURIO"> On/Off, <input type="checkbox" name="HURBR"> Brightness, and <input type="checkbox" name="HURCL"> Color<br>
|
||||||
|
After device color update, ignore Hue updates for <input name="HUELI" type="number" min="0" max="255" required> minutes<br>
|
||||||
|
Hue status: <span class="hms"> Internal ESP error! </span>-->
|
||||||
|
<hr>
|
||||||
|
<button type="button" onclick="B()">Back</button><button type="submit" name="SUBM">Save</button>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
)=====";
|
||||||
|
|
||||||
|
const char PAGE_settings_time0[] PROGMEM = R"=====(
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html><head><title>Time Settings</title>
|
||||||
|
<script>function H(){window.open("https://github.com/Aircoookie/WLED/wiki/Settings#time-settings");}function B(){window.open("/settings","_self");}function GetV(){var d = document;
|
||||||
|
)=====";
|
||||||
|
const char PAGE_settings_time1[] PROGMEM = R"=====(
|
||||||
|
</head>
|
||||||
|
<body onload="GetV()">
|
||||||
|
<form id="form_s" name="Sf" method="post">
|
||||||
|
<div class="helpB"><button type="button" onclick="H()">?</button></div>
|
||||||
|
<button type="button" onclick="B()">Back</button><button type="submit" name="SUBM">Save</button><hr>
|
||||||
|
<h2>Time setup</h2>
|
||||||
|
Requires reboot. <br>
|
||||||
|
Get time from NTP server: <input type="checkbox" name="NTPON"><br>
|
||||||
|
NTP server: <input name="NTPSR" maxlength="32"><br>
|
||||||
|
Time zone:
|
||||||
|
<select name="TZONE">
|
||||||
|
<option value="1" selected>GMT(UTC)</option>
|
||||||
|
<option value="2">GMT/BST</option>
|
||||||
|
<option value="3">CET/CEST</option>
|
||||||
|
<option value="4">EET/EEST</option>
|
||||||
|
<option value="5">US-EST/EDT</option>
|
||||||
|
<option value="6">US-CST/CDT</option>
|
||||||
|
<option value="7">US-MST/MDT</option>
|
||||||
|
<option value="8">US-AZ</option>
|
||||||
|
<option value="9">US-PST/PDT</option>
|
||||||
|
<option value="10">CST(AWST)</option>
|
||||||
|
<option value="11">JST(KST)</option>
|
||||||
|
<option value="12">AEST/AEDT</option>
|
||||||
|
<option value="13">NZST/NZDT</option>
|
||||||
|
</select><br>
|
||||||
|
Hour/Min offset: <input name="TOFSH" type="number" min="-255" max="255" required> <input name="TOFSM" type="number" min="-255" max="255" required><br>
|
||||||
|
Current local time is <span class="times">unknown</span>.
|
||||||
|
<h3>Weather</h3>
|
||||||
|
Coming soon! Not yet implemented!
|
||||||
|
<!--Get yours on open weather API.<br>
|
||||||
|
City code: <input name="WCITY" maxlength="32"><br>
|
||||||
|
Change color depending on weather: <input type="checkbox" name="WCCOL"><br>
|
||||||
|
Daylight Emulation: <input type="checkbox" name="WDAYL"><br>
|
||||||
|
Reverse (turns on at sunset): <input type="checkbox" name="WREVL"><br>
|
||||||
|
Fade duration: <input name="WSDUR" type="number" min="0" max="255" required><br>
|
||||||
|
Sunrise/Sunset Offset: <input name="WSOFS" type="number" min="-255" max="255" required>-->
|
||||||
|
<h3>Advanced Macros</h3>
|
||||||
|
Define API macros here:<br>
|
||||||
|
0: <input name="MCR00" maxlength="64"><br>
|
||||||
|
1: <input name="MCR01" maxlength="64"><br>
|
||||||
|
2: <input name="MCR02" maxlength="64"><br>
|
||||||
|
3: <input name="MCR03" maxlength="64"><br>
|
||||||
|
4: <input name="MCR04" maxlength="64"><br>
|
||||||
|
5: <input name="MCR05" maxlength="64"><br>
|
||||||
|
6: <input name="MCR06" maxlength="64"><br>
|
||||||
|
7: <input name="MCR07" maxlength="64"><br>
|
||||||
|
8: <input name="MCR08" maxlength="64"><br>
|
||||||
|
9: <input name="MCR09" maxlength="64"><br>
|
||||||
|
10: <input name="MCR10" maxlength="64"><br>
|
||||||
|
11: <input name="MCR11" maxlength="64"><br>
|
||||||
|
12: <input name="MCR12" maxlength="64"><br>
|
||||||
|
13: <input name="MCR13" maxlength="64"><br>
|
||||||
|
14: <input name="MCR14" maxlength="64"><br>
|
||||||
|
15: <input name="MCR15" maxlength="64"><br>
|
||||||
|
<br>
|
||||||
|
<i>Use -1 to use the default action instead of a macro</i><br>
|
||||||
|
<!--1st Time-Controlled Macro:-->
|
||||||
|
Alexa On/Off Macros: <input name="MCA0I" type="number" min="-1" max="15" required> <input name="MCA0O" type="number" min="-1" max="15" required><br>
|
||||||
|
<!--Emulate 2nd Alexa device:
|
||||||
|
Emulate 3rd Alexa device:-->
|
||||||
|
Button Macro: <input name="MCBT0" type="number" min="-1" max="15" required><br>
|
||||||
|
Button Long Press Macro: <input name="MCBT1" type="number" min="-1" max="15" required><br>
|
||||||
|
<!--Sunrise Macro
|
||||||
|
Sunset Macro-->
|
||||||
|
Countdown-Over Macro: <input name="MCNTD" type="number" min="-1" max="15" required><br>
|
||||||
|
<hr>
|
||||||
|
<button type="button" onclick="B()">Back</button><button type="submit" name="SUBM">Save</button>
|
||||||
|
</form>
|
||||||
|
</body></html>
|
||||||
|
)=====";
|
||||||
|
|
||||||
|
const char PAGE_settings_sec0[] PROGMEM = R"=====(
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html><head>
|
||||||
|
<title>Misc Settings</title>
|
||||||
|
<script>function H(){window.open("https://github.com/Aircoookie/WLED/wiki/Settings#security-settings");}function B(){window.open("/settings","_self");}function U(){window.open("/update","_self");}function GetV(){var d = document;
|
||||||
|
)=====";
|
||||||
|
const char PAGE_settings_sec1[] PROGMEM = R"=====(
|
||||||
|
</head>
|
||||||
|
<body onload="GetV()">
|
||||||
|
<form id="form_s" name="Sf" method="post">
|
||||||
|
<div class="helpB"><button type="button" onclick="H()">?</button></div>
|
||||||
|
<button type="button" onclick="B()">Back</button><button type="submit" name="SUBM">Save</button><hr>
|
||||||
|
<h2>Security & Update setup</h2>
|
||||||
|
Enable OTA lock: <input type="checkbox" name="NOOTA"><br>
|
||||||
|
Passphrase: <input type="password" name="OPASS" maxlength="32"><br>
|
||||||
|
To enable OTA, for security reasons you need to also enter the correct password!<br>
|
||||||
|
The password may/should be changed when OTA is enabled.<br>
|
||||||
|
<b>Disable OTA when not in use, otherwise an attacker could reflash device software!</b><br>
|
||||||
|
<i>Settings on this page are only changable if OTA lock is disabled!</i><br>
|
||||||
|
Deny access to WiFi settings if locked: <input type="checkbox" name="OWIFI"><br><br>
|
||||||
|
Disable recovery AP: <input type="checkbox" name="NORAP"><br>
|
||||||
|
In case of a connection error there will be no wireless recovery possible!<br>
|
||||||
|
Completely disables all Access Point functions.<br><br>
|
||||||
|
Factory reset: <input type="checkbox" name="RESET"><br>
|
||||||
|
All EEPROM content (settings) will be erased.<br><br>
|
||||||
|
HTTP traffic is not encrypted. An attacker in the same network could intercept form data!
|
||||||
|
<h3>Software Update</h3>
|
||||||
|
<button type="button" onclick="U()">Manual OTA Update</button><br>
|
||||||
|
Enable ArduinoOTA: <input type="checkbox" name="AROTA"><br>
|
||||||
|
<h3>About</h3>
|
||||||
|
<a href="https://github.com/Aircoookie/WLED">WLED</a> version 0.5dev<br>
|
||||||
|
(c) 2016-2018 Christian Schwinne <br>
|
||||||
|
<i>Licensed under the MIT license</i><br><br>
|
||||||
|
<i>Uses libraries:</i><br>
|
||||||
|
<i>ESP8266/ESP32 Arduino Core</i><br>
|
||||||
|
<i>(ESP32) <a href="https://github.com/bbx10/WebServer_tng">WebServer_tng</a> by bbx10</i><br>
|
||||||
|
<i><a href="https://github.com/kitesurfer1404/WS2812FX">WS2812FX</a> by kitesurfer1404 (modified)</i><br>
|
||||||
|
<i><a href="https://github.com/JChristensen/Timezone">Timezone</a> library by JChristensen</i><br>
|
||||||
|
<i><a href="https://github.com/Aircoookie/Espalexa">Espalexa</a> by Aircoookie (modified)</i><br><br>
|
||||||
|
<i>UI icons by <a href="https://linearicons.com">Linearicons</a> created by <a href="https://perxis.com">Perxis</a>! (CC-BY-SA 4.0)</i> <br><br>
|
||||||
|
Server message: <span class="msg"> Response error! </span><hr>
|
||||||
|
<button type="button" onclick="B()">Back</button><button type="submit" name="SUBM">Save</button>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
)=====";
|
)=====";
|
||||||
|
@ -1,6 +1,44 @@
|
|||||||
/*
|
/*
|
||||||
* Various
|
* Various
|
||||||
*/
|
*/
|
||||||
|
const char PAGE_msg0[] PROGMEM = R"=====(
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html><head>
|
||||||
|
<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
|
||||||
|
<title>WLED Message</title>
|
||||||
|
<script>function B(){window.history.back()};</script>
|
||||||
|
)=====";
|
||||||
|
const char PAGE_msg1[] PROGMEM = R"=====(
|
||||||
|
button{background:var(--bCol);color:var(--dCol);border:.3ch solid var(--bCol);display:inline-block;filter:drop-shadow(-5px -5px 5px var(--sCol));font-size:20px;margin:8px;margin-top:12px}body{font-family:Verdana,Helvetica,sans-serif;text-align:center;background:var(--cCol);color:var(--dCol);line-height:200%;margin:0;background-attachment:fixed}</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
)=====";
|
||||||
|
|
||||||
|
const char PAGE_welcome0[] PROGMEM = R"=====(
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html><head>
|
||||||
|
<title>WLED Welcome!</title>
|
||||||
|
)=====";
|
||||||
|
const char PAGE_welcome1[] PROGMEM = R"=====(
|
||||||
|
body{font-family:Verdana, Helvetica, sans-serif;text-align:center;background:linear-gradient(var(--bCol),black);height:100%;margin:0;background-repeat:no-repeat;background-attachment: fixed;color: var(--dCol);}svg {fill: var(--dCol);}
|
||||||
|
</style></head>
|
||||||
|
<body>
|
||||||
|
<svg style="position: absolute; width: 0; height: 0; overflow: hidden;" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<symbol id="lnr-smile" viewBox="0 0 1024 1024"><path d="M486.4 1024c-129.922 0-252.067-50.594-343.936-142.464s-142.464-214.014-142.464-343.936c0-129.923 50.595-252.067 142.464-343.936s214.013-142.464 343.936-142.464c129.922 0 252.067 50.595 343.936 142.464s142.464 214.014 142.464 343.936-50.594 252.067-142.464 343.936c-91.869 91.87-214.014 142.464-343.936 142.464zM486.4 102.4c-239.97 0-435.2 195.23-435.2 435.2s195.23 435.2 435.2 435.2 435.2-195.23 435.2-435.2-195.23-435.2-435.2-435.2z"></path><path d="M332.8 409.6c-42.347 0-76.8-34.453-76.8-76.8s34.453-76.8 76.8-76.8 76.8 34.453 76.8 76.8-34.453 76.8-76.8 76.8zM332.8 307.2c-14.115 0-25.6 11.485-25.6 25.6s11.485 25.6 25.6 25.6 25.6-11.485 25.6-25.6-11.485-25.6-25.6-25.6z"></path><path d="M640 409.6c-42.349 0-76.8-34.453-76.8-76.8s34.451-76.8 76.8-76.8 76.8 34.453 76.8 76.8-34.451 76.8-76.8 76.8zM640 307.2c-14.115 0-25.6 11.485-25.6 25.6s11.485 25.6 25.6 25.6 25.6-11.485 25.6-25.6-11.485-25.6-25.6-25.6z"></path><path d="M486.4 870.4c-183.506 0-332.8-149.294-332.8-332.8 0-14.139 11.462-25.6 25.6-25.6s25.6 11.461 25.6 25.6c0 155.275 126.325 281.6 281.6 281.6s281.6-126.325 281.6-281.6c0-14.139 11.461-25.6 25.6-25.6s25.6 11.461 25.6 25.6c0 183.506-149.294 332.8-332.8 332.8z"></path></symbol>
|
||||||
|
</defs></svg>
|
||||||
|
<br><br>
|
||||||
|
<svg><use xlink:href="#lnr-smile"></use></svg>
|
||||||
|
<h1>Welcome to WLED!</h1>
|
||||||
|
<h3>Thank you for installing my application!</h3>
|
||||||
|
Take a quick look at the <a href="https://github.com/Aircoookie/WLED/wiki" target="_blank">wiki</a>!<br>
|
||||||
|
If you encounter a bug or have a question/feature suggestion, feel free to open a GitHub issue!<br><br>
|
||||||
|
<b>Next steps:</b><br><br>
|
||||||
|
Connect the module to your local WiFi <a href="/settings/wifi">here</a>!<br><br>
|
||||||
|
<i>Just trying this out in AP mode?</i> <a href="/sliders">Here are the controls.</a><br>
|
||||||
|
</body></html>
|
||||||
|
)=====";
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SPIFFS editor html
|
* SPIFFS editor html
|
||||||
*/
|
*/
|
||||||
@ -11,7 +49,7 @@ eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a
|
|||||||
</script><script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.1.9/ace.js" type="text/javascript" charset="utf-8"></script></head><body onload="onBodyLoad();"><div id="uploader"></div><div id="tree"></div><div id="editor"></div><div id="preview" style="display:none;"></div><iframe id=download-frame style='display:none;'></iframe></body></html>
|
</script><script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.1.9/ace.js" type="text/javascript" charset="utf-8"></script></head><body onload="onBodyLoad();"><div id="uploader"></div><div id="tree"></div><div id="editor"></div><div id="preview" style="display:none;"></div><iframe id=download-frame style='display:none;'></iframe></body></html>
|
||||||
)=====";
|
)=====";
|
||||||
#else
|
#else
|
||||||
const char PAGE_edit[] PROGMEM = R"=====(SPIFFS disabled by firmware)=====";
|
const char PAGE_edit[] PROGMEM = R"=====(SPIFFS disabled)=====";
|
||||||
#endif
|
#endif
|
||||||
/*
|
/*
|
||||||
* favicon
|
* favicon
|
||||||
|
@ -26,10 +26,11 @@
|
|||||||
#include "src/dependencies/timezone/Timezone.h"
|
#include "src/dependencies/timezone/Timezone.h"
|
||||||
#include "htmls00.h"
|
#include "htmls00.h"
|
||||||
#include "htmls01.h"
|
#include "htmls01.h"
|
||||||
|
#include "htmls02.h"
|
||||||
#include "WS2812FX.h"
|
#include "WS2812FX.h"
|
||||||
|
|
||||||
//version in format yymmddb (b = daily build)
|
//version in format yymmddb (b = daily build)
|
||||||
#define VERSION 1801180
|
#define VERSION 1802193
|
||||||
const String versionName = "WLED 0.5dev";
|
const String versionName = "WLED 0.5dev";
|
||||||
|
|
||||||
//AP and OTA default passwords (change them!)
|
//AP and OTA default passwords (change them!)
|
||||||
@ -37,7 +38,7 @@ String appass = "wled1234";
|
|||||||
String otapass = "wledota";
|
String otapass = "wledota";
|
||||||
|
|
||||||
//If you have an RGBW strip, also uncomment first line in WS2812FX.h!
|
//If you have an RGBW strip, also uncomment first line in WS2812FX.h!
|
||||||
boolean useRGBW = false;
|
bool useRGBW = false;
|
||||||
|
|
||||||
//overlays, needed for clocks etc.
|
//overlays, needed for clocks etc.
|
||||||
#define USEOVERLAYS
|
#define USEOVERLAYS
|
||||||
@ -82,7 +83,8 @@ bool ntpEnabled = true;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
//Default CONFIG
|
//Default CONFIG
|
||||||
String serverDescription = "WLED 0.5dev";
|
String serverDescription = versionName;
|
||||||
|
uint8_t currentTheme = 0;
|
||||||
String clientssid = "Your_Network_Here";
|
String clientssid = "Your_Network_Here";
|
||||||
String clientpass = "Dummy_Pass";
|
String clientpass = "Dummy_Pass";
|
||||||
String cmdns = "led";
|
String cmdns = "led";
|
||||||
@ -98,26 +100,27 @@ IPAddress staticip(0, 0, 0, 0);
|
|||||||
IPAddress staticgateway(0, 0, 0, 0);
|
IPAddress staticgateway(0, 0, 0, 0);
|
||||||
IPAddress staticsubnet(255, 255, 255, 0);
|
IPAddress staticsubnet(255, 255, 255, 0);
|
||||||
IPAddress staticdns(8, 8, 8, 8); //only for NTP
|
IPAddress staticdns(8, 8, 8, 8); //only for NTP
|
||||||
boolean useHSB = false, useHSBDefault = false;
|
bool useHSB = false, useHSBDefault = false;
|
||||||
boolean turnOnAtBoot = true;
|
bool turnOnAtBoot = true;
|
||||||
uint8_t bootPreset = 0;
|
uint8_t bootPreset = 0;
|
||||||
byte col_s[]{255, 159, 0};
|
byte col_s[]{255, 159, 0};
|
||||||
byte col_sec_s[]{0, 0, 0};
|
byte col_sec_s[]{0, 0, 0};
|
||||||
byte white_s = 0;
|
byte white_s = 0;
|
||||||
byte white_sec_s = 0;
|
byte white_sec_s = 0;
|
||||||
byte bri_s = 127;
|
byte bri_s = 127;
|
||||||
uint8_t bri_nl = 0, bri_nls;
|
uint8_t nightlightTargetBri = 0, bri_nl_t;
|
||||||
boolean fadeTransition = true;
|
bool fadeTransition = true;
|
||||||
boolean sweepTransition = false; boolean sweepDirection = true;
|
bool sweepTransition = false, sweepDirection = true;
|
||||||
uint16_t transitionDelay = 1200;
|
uint16_t transitionDelay = 1200;
|
||||||
boolean otaLock = true;
|
bool otaLock = true;
|
||||||
boolean onlyAP = false;
|
bool aOtaEnabled = true;
|
||||||
boolean buttonEnabled = true;
|
bool onlyAP = false;
|
||||||
boolean notifyDirect = true, notifyButton = true, notifyDirectDefault = true, alexaNotify = false, macroNotify = false;
|
bool buttonEnabled = true;
|
||||||
boolean receiveNotifications = true, receiveNotificationsDefault = true;
|
bool notifyDirect = true, notifyButton = true, notifyDirectDefault = true, alexaNotify = false, macroNotify = false;
|
||||||
uint8_t bri_n = 100;
|
bool receiveNotifications = true, receiveNotificationBrightness = true, receiveNotificlationColor = true, receiveNotificationEffects = true;
|
||||||
|
uint8_t briMultiplier = 100;
|
||||||
uint8_t nightlightDelayMins = 60;
|
uint8_t nightlightDelayMins = 60;
|
||||||
boolean nightlightFade = true;
|
bool nightlightFade = true;
|
||||||
uint16_t udpPort = 21324;
|
uint16_t udpPort = 21324;
|
||||||
uint8_t effectDefault = 0;
|
uint8_t effectDefault = 0;
|
||||||
uint8_t effectSpeedDefault = 75;
|
uint8_t effectSpeedDefault = 75;
|
||||||
@ -178,6 +181,8 @@ uint8_t effectSpeed = 75;
|
|||||||
uint8_t effectIntensity = 128;
|
uint8_t effectIntensity = 128;
|
||||||
boolean udpConnected = false;
|
boolean udpConnected = false;
|
||||||
byte udpIn[1026];
|
byte udpIn[1026];
|
||||||
|
String cssCol[]={"","","","","",""};
|
||||||
|
String cssColorString="";
|
||||||
//NTP stuff
|
//NTP stuff
|
||||||
boolean ntpConnected = false;
|
boolean ntpConnected = false;
|
||||||
unsigned int ntpLocalPort = 2390;
|
unsigned int ntpLocalPort = 2390;
|
||||||
@ -217,17 +222,16 @@ boolean arlsSign = true;
|
|||||||
uint8_t auxTime = 0;
|
uint8_t auxTime = 0;
|
||||||
unsigned long auxStartTime;
|
unsigned long auxStartTime;
|
||||||
boolean auxActive, auxActiveBefore;
|
boolean auxActive, auxActiveBefore;
|
||||||
boolean initialBoot = false;
|
boolean showWelcomePage = false;
|
||||||
|
|
||||||
boolean useGammaCorrectionBri = false;
|
boolean useGammaCorrectionBri = false;
|
||||||
boolean useGammaCorrectionRGB = true;
|
boolean useGammaCorrectionRGB = true;
|
||||||
int arlsOffset = -22; //10: -22 assuming arls52
|
int arlsOffset = -22; //10: -22 assuming arls52
|
||||||
|
|
||||||
//alexa
|
//alexa udp
|
||||||
WiFiUDP UDP;
|
WiFiUDP UDP;
|
||||||
IPAddress ipMulti(239, 255, 255, 250);
|
IPAddress ipMulti(239, 255, 255, 250);
|
||||||
unsigned int portMulti = 1900;
|
unsigned int portMulti = 1900;
|
||||||
unsigned int localPort = 1900;
|
|
||||||
char packetBuffer[255];
|
char packetBuffer[255];
|
||||||
String escapedMac;
|
String escapedMac;
|
||||||
|
|
||||||
@ -289,6 +293,10 @@ const uint8_t gamma8[] = {
|
|||||||
177,180,182,184,186,189,191,193,196,198,200,203,205,208,210,213,
|
177,180,182,184,186,189,191,193,196,198,200,203,205,208,210,213,
|
||||||
215,218,220,223,225,228,231,233,236,239,241,244,247,249,252,255 };
|
215,218,220,223,225,228,231,233,236,239,241,244,247,249,252,255 };
|
||||||
|
|
||||||
|
String txd = "Please disable OTA Lock in security settings!";
|
||||||
|
|
||||||
|
void serveMessage(int,String,String,bool=false);
|
||||||
|
|
||||||
void down()
|
void down()
|
||||||
{
|
{
|
||||||
bri_t = 0;
|
bri_t = 0;
|
||||||
@ -316,7 +324,7 @@ void loop() {
|
|||||||
yield();
|
yield();
|
||||||
handleButton();
|
handleButton();
|
||||||
handleNetworkTime();
|
handleNetworkTime();
|
||||||
if (!otaLock) ArduinoOTA.handle();
|
if (!otaLock && aOtaEnabled) ArduinoOTA.handle();
|
||||||
#ifdef CRONIXIE
|
#ifdef CRONIXIE
|
||||||
handleCronixie();
|
handleCronixie();
|
||||||
#endif
|
#endif
|
||||||
|
@ -19,6 +19,10 @@ void saveSettingsToEEPROM()
|
|||||||
{
|
{
|
||||||
clearEEPROM();
|
clearEEPROM();
|
||||||
EEPROM.write(233, 233);
|
EEPROM.write(233, 233);
|
||||||
|
showWelcomePage = true;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
showWelcomePage = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < 32; ++i)
|
for (int i = 0; i < 32; ++i)
|
||||||
@ -67,17 +71,17 @@ void saveSettingsToEEPROM()
|
|||||||
EEPROM.write(247, col_s[1]);
|
EEPROM.write(247, col_s[1]);
|
||||||
EEPROM.write(248, col_s[2]);
|
EEPROM.write(248, col_s[2]);
|
||||||
EEPROM.write(249, bri_s);
|
EEPROM.write(249, bri_s);
|
||||||
EEPROM.write(250, receiveNotificationsDefault);
|
EEPROM.write(250, receiveNotificationBrightness);
|
||||||
EEPROM.write(251, fadeTransition);
|
EEPROM.write(251, fadeTransition);
|
||||||
EEPROM.write(253, (transitionDelay >> 0) & 0xFF);
|
EEPROM.write(253, (transitionDelay >> 0) & 0xFF);
|
||||||
EEPROM.write(254, (transitionDelay >> 8) & 0xFF);
|
EEPROM.write(254, (transitionDelay >> 8) & 0xFF);
|
||||||
EEPROM.write(255, bri_n);
|
EEPROM.write(255, briMultiplier);
|
||||||
//255,250,231,230,226 notifier bytes
|
//255,250,231,230,226 notifier bytes
|
||||||
for (int i = 256; i < 288; ++i)
|
for (int i = 256; i < 288; ++i)
|
||||||
{
|
{
|
||||||
EEPROM.write(i, otapass.charAt(i-256));
|
EEPROM.write(i, otapass.charAt(i-256));
|
||||||
}
|
}
|
||||||
EEPROM.write(288, bri_nl);
|
EEPROM.write(288, nightlightTargetBri);
|
||||||
EEPROM.write(289, otaLock);
|
EEPROM.write(289, otaLock);
|
||||||
EEPROM.write(290, (udpPort >> 0) & 0xFF);
|
EEPROM.write(290, (udpPort >> 0) & 0xFF);
|
||||||
EEPROM.write(291, (udpPort >> 8) & 0xFF);
|
EEPROM.write(291, (udpPort >> 8) & 0xFF);
|
||||||
@ -123,6 +127,19 @@ void saveSettingsToEEPROM()
|
|||||||
EEPROM.write(387, cc_fromEnd);
|
EEPROM.write(387, cc_fromEnd);
|
||||||
EEPROM.write(388, cc_step);
|
EEPROM.write(388, cc_step);
|
||||||
EEPROM.write(389, bootPreset);
|
EEPROM.write(389, bootPreset);
|
||||||
|
EEPROM.write(390, aOtaEnabled);
|
||||||
|
EEPROM.write(391, receiveNotificationColor);
|
||||||
|
EEPROM.write(392, receiveNotificationEffects);
|
||||||
|
if (currentTheme == 15)
|
||||||
|
{
|
||||||
|
for (int k=0;k<6;k++){
|
||||||
|
for (int i = 900+k*8; i < (908+k*8); ++i)
|
||||||
|
{
|
||||||
|
EEPROM.write(i, cssCol[k].charAt(i-900));
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
EEPROM.write(948,currentTheme);
|
||||||
|
|
||||||
EEPROM.commit();
|
EEPROM.commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -197,18 +214,17 @@ void loadSettingsFromEEPROM(bool first)
|
|||||||
{
|
{
|
||||||
bri = 0; bri_last = bri_s;
|
bri = 0; bri_last = bri_s;
|
||||||
}
|
}
|
||||||
receiveNotifications = EEPROM.read(250);
|
receiveNotificationBrightness = EEPROM.read(250);
|
||||||
receiveNotificationsDefault = receiveNotifications;
|
|
||||||
fadeTransition = EEPROM.read(251);
|
fadeTransition = EEPROM.read(251);
|
||||||
transitionDelay = ((EEPROM.read(253) << 0) & 0xFF) + ((EEPROM.read(254) << 8) & 0xFF00);
|
transitionDelay = ((EEPROM.read(253) << 0) & 0xFF) + ((EEPROM.read(254) << 8) & 0xFF00);
|
||||||
bri_n = EEPROM.read(255);
|
briMultiplier = EEPROM.read(255);
|
||||||
otapass = "";
|
otapass = "";
|
||||||
for (int i = 256; i < 288; ++i)
|
for (int i = 256; i < 288; ++i)
|
||||||
{
|
{
|
||||||
if (EEPROM.read(i) == 0) break;
|
if (EEPROM.read(i) == 0) break;
|
||||||
otapass += char(EEPROM.read(i));
|
otapass += char(EEPROM.read(i));
|
||||||
}
|
}
|
||||||
bri_nl = EEPROM.read(288);
|
nightlightTargetBri = EEPROM.read(288);
|
||||||
otaLock = EEPROM.read(289);
|
otaLock = EEPROM.read(289);
|
||||||
udpPort = ((EEPROM.read(290) << 0) & 0xFF) + ((EEPROM.read(291) << 8) & 0xFF00);
|
udpPort = ((EEPROM.read(290) << 0) & 0xFF) + ((EEPROM.read(291) << 8) & 0xFF00);
|
||||||
serverDescription = "";
|
serverDescription = "";
|
||||||
@ -261,12 +277,28 @@ void loadSettingsFromEEPROM(bool first)
|
|||||||
}
|
}
|
||||||
if (lastEEPROMversion > 3) {
|
if (lastEEPROMversion > 3) {
|
||||||
effectIntensityDefault = EEPROM.read(326); effectIntensity = effectIntensityDefault;
|
effectIntensityDefault = EEPROM.read(326); effectIntensity = effectIntensityDefault;
|
||||||
|
aOtaEnabled = EEPROM.read(390);
|
||||||
|
receiveNotificationColor = EEPROM.read(391);
|
||||||
|
receiveNotificationEffects = EEPROM.read(392);
|
||||||
}
|
}
|
||||||
|
receiveNotifications = (receiveNotificationBrightness || receiveNotificationColor || receiveNotificationEffects);
|
||||||
|
|
||||||
bootPreset = EEPROM.read(389);
|
bootPreset = EEPROM.read(389);
|
||||||
|
|
||||||
//favorite setting memory (25 slots/ each 20byte)
|
//favorite setting memory (25 slots/ each 20byte)
|
||||||
//400 - 899 reserved
|
//400 - 899 reserved
|
||||||
|
|
||||||
|
currentTheme = EEPROM.read(948);
|
||||||
|
if (currentTheme == 15)
|
||||||
|
{
|
||||||
|
for (int k=0;k<6;k++){
|
||||||
|
for (int i = 900+k*8; i < (908+k*8); ++i)
|
||||||
|
{
|
||||||
|
if (EEPROM.read(i) == 0) break;
|
||||||
|
cssCol[k] += char(EEPROM.read(i));
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
|
||||||
//custom macro memory (16 slots/ each 64byte)
|
//custom macro memory (16 slots/ each 64byte)
|
||||||
//1024-2047 reserved
|
//1024-2047 reserved
|
||||||
|
|
||||||
|
@ -29,7 +29,13 @@ void XML_response()
|
|||||||
resp = resp + receiveNotifications;
|
resp = resp + receiveNotifications;
|
||||||
resp = resp + "</nr><nl>";
|
resp = resp + "</nr><nl>";
|
||||||
resp = resp + nightlightActive;
|
resp = resp + nightlightActive;
|
||||||
resp = resp + "</nl><fx>";
|
resp = resp + "</nl><nf>";
|
||||||
|
resp = resp + nightlightFade;
|
||||||
|
resp = resp + "</nf><nd>";
|
||||||
|
resp = resp + nightlightDelayMins;
|
||||||
|
resp = resp + "</nd><nt>";
|
||||||
|
resp = resp + nightlightTargetBri;
|
||||||
|
resp = resp + "</nt><fx>";
|
||||||
resp = resp + effectCurrent;
|
resp = resp + effectCurrent;
|
||||||
resp = resp + "</fx><sx>";
|
resp = resp + "</fx><sx>";
|
||||||
resp = resp + effectSpeed;
|
resp = resp + effectSpeed;
|
||||||
@ -46,7 +52,6 @@ void XML_response()
|
|||||||
resp = resp + "</md><desc>";
|
resp = resp + "</md><desc>";
|
||||||
resp = resp + serverDescription;
|
resp = resp + serverDescription;
|
||||||
resp = resp + "</desc>";
|
resp = resp + "</desc>";
|
||||||
//enable toolbar here
|
|
||||||
resp = resp + "</vs>";
|
resp = resp + "</vs>";
|
||||||
server.send(200, "text/xml", resp);
|
server.send(200, "text/xml", resp);
|
||||||
}
|
}
|
||||||
@ -58,12 +63,15 @@ String getSettings(uint8_t subPage)
|
|||||||
DEBUG_PRINTLN(subPage);
|
DEBUG_PRINTLN(subPage);
|
||||||
|
|
||||||
String resp = "";
|
String resp = "";
|
||||||
|
if (subPage <1 || subPage >6) return resp;
|
||||||
|
|
||||||
String ds = "d.Sf.";
|
String ds = "d.Sf.";
|
||||||
String dg = "d.getElementsByClassName";
|
String dg = "d.getElementsByClassName";
|
||||||
String v = ".value=";
|
String v = ".value=";
|
||||||
String c = ".checked=";
|
String c = ".checked=";
|
||||||
String ih = ".innerHTML=";
|
String ih = ".innerHTML=";
|
||||||
|
|
||||||
|
if (subPage == 1) {
|
||||||
resp += ds + "CSSID" + v + "\"" + clientssid + "\";";
|
resp += ds + "CSSID" + v + "\"" + clientssid + "\";";
|
||||||
resp += ds + "CPASS" + v + "\"";
|
resp += ds + "CPASS" + v + "\"";
|
||||||
for (int i = 0; i < clientpass.length(); i++)
|
for (int i = 0; i < clientpass.length(); i++)
|
||||||
@ -94,51 +102,6 @@ String getSettings(uint8_t subPage)
|
|||||||
}
|
}
|
||||||
resp += "\";";
|
resp += "\";";
|
||||||
resp += ds + "APCHAN" + v + apchannel +";";
|
resp += ds + "APCHAN" + v + apchannel +";";
|
||||||
|
|
||||||
resp += ds + "DESC" + v + "\"" + serverDescription + "\";";
|
|
||||||
resp += ds + "COLMD" + c + useHSBDefault + ";";
|
|
||||||
resp += ds + "LEDCN" + v + ledcount +";";
|
|
||||||
resp += ds + "CLDFR" + v + col_s[0] +";";
|
|
||||||
resp += ds + "CLDFG" + v + col_s[1] +";";
|
|
||||||
resp += ds + "CLDFB" + v + col_s[2] +";";
|
|
||||||
resp += ds + "CLDFA" + v + bri_s +";";
|
|
||||||
if (useRGBW) {
|
|
||||||
resp += ds + "CLDFW" + v + white_s +";";
|
|
||||||
} else {
|
|
||||||
resp += ds + "CLDFW" + v + "-1;";
|
|
||||||
}
|
|
||||||
resp += ds + "CSECR" + v + col_sec_s[0] +";";
|
|
||||||
resp += ds + "CSECG" + v + col_sec_s[1] +";";
|
|
||||||
resp += ds + "CSECB" + v + col_sec_s[2] +";";
|
|
||||||
resp += ds + "CSECW" + v + white_s +";";
|
|
||||||
resp += ds + "BOOTN" + c + turnOnAtBoot +";";
|
|
||||||
resp += ds + "BOOTP" + v + bootPreset +";";
|
|
||||||
resp += ds + "FXDEF" + v + effectDefault +";";
|
|
||||||
resp += ds + "SXDEF" + v + effectSpeedDefault +";";
|
|
||||||
resp += ds + "GCBRI" + c + useGammaCorrectionBri +";";
|
|
||||||
resp += ds + "GCRGB" + c + useGammaCorrectionRGB +";";
|
|
||||||
resp += ds + "BTNON" + c + buttonEnabled +";";
|
|
||||||
resp += ds + "TFADE" + c + fadeTransition +";";
|
|
||||||
resp += ds + "TSWEE" + c + sweepTransition +";";
|
|
||||||
resp += ds + "TSDIR" + c + !sweepDirection +";";
|
|
||||||
resp += ds + "TDLAY" + v + transitionDelay +";";
|
|
||||||
resp += ds + "TLBRI" + v + bri_nl +";";
|
|
||||||
resp += ds + "TLDUR" + v + nightlightDelayMins +";";
|
|
||||||
resp += ds + "TLFDE" + c + nightlightFade +";";
|
|
||||||
resp += ds + "NUDPP" + v + udpPort +";";
|
|
||||||
resp += ds + "NRBRI" + v + bri_n +";";
|
|
||||||
resp += ds + "NRCVE" + c + receiveNotificationsDefault +";";
|
|
||||||
resp += ds + "NSDIR" + c + notifyDirectDefault +";";
|
|
||||||
resp += ds + "NSBTN" + c + notifyButton +";";
|
|
||||||
resp += ds + "NTPON" + c + ntpEnabled +";";
|
|
||||||
resp += ds + "ALEXA" + c + alexaEnabled +";";
|
|
||||||
resp += ds + "AINVN" + v + "\"" + alexaInvocationName + "\";";
|
|
||||||
resp += ds + "NSALX" + c + alexaNotify +";";
|
|
||||||
resp += dg + "(\"times\")[0]" + ih + "\"" + getTimeString() + "\";";
|
|
||||||
resp += ds + "OLDEF" + v + overlayDefault +";";
|
|
||||||
resp += ds + "WOFFS" + v + arlsOffset +";";
|
|
||||||
resp += ds + "NOOTA" + c + otaLock +";";
|
|
||||||
resp += ds + "NORAP" + c + recoveryAPDisabled +";";
|
|
||||||
resp += dg + "(\"sip\")[0]" + ih + "\"";
|
resp += dg + "(\"sip\")[0]" + ih + "\"";
|
||||||
if (!WiFi.localIP()[0] == 0)
|
if (!WiFi.localIP()[0] == 0)
|
||||||
{
|
{
|
||||||
@ -169,7 +132,78 @@ String getSettings(uint8_t subPage)
|
|||||||
resp += "Not active";
|
resp += "Not active";
|
||||||
}
|
}
|
||||||
resp += "\";";
|
resp += "\";";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (subPage == 2) {
|
||||||
|
resp += ds + "LEDCN" + v + ledcount +";";
|
||||||
|
resp += ds + "CLDFR" + v + col_s[0] +";";
|
||||||
|
resp += ds + "CLDFG" + v + col_s[1] +";";
|
||||||
|
resp += ds + "CLDFB" + v + col_s[2] +";";
|
||||||
|
resp += ds + "CLDFA" + v + bri_s +";";
|
||||||
|
if (useRGBW) {
|
||||||
|
resp += ds + "CLDFW" + v + white_s +";";
|
||||||
|
} else {
|
||||||
|
resp += ds + "CLDFW" + v + "-1;";
|
||||||
|
}
|
||||||
|
resp += ds + "CSECR" + v + col_sec_s[0] +";";
|
||||||
|
resp += ds + "CSECG" + v + col_sec_s[1] +";";
|
||||||
|
resp += ds + "CSECB" + v + col_sec_s[2] +";";
|
||||||
|
resp += ds + "CSECW" + v + white_s +";";
|
||||||
|
resp += ds + "BOOTN" + c + turnOnAtBoot +";";
|
||||||
|
resp += ds + "BOOTP" + v + bootPreset +";";
|
||||||
|
resp += ds + "FXDEF" + v + effectDefault +";";
|
||||||
|
resp += ds + "SXDEF" + v + effectSpeedDefault +";";
|
||||||
|
resp += ds + "GCBRI" + c + useGammaCorrectionBri +";";
|
||||||
|
resp += ds + "GCRGB" + c + useGammaCorrectionRGB +";";
|
||||||
|
resp += ds + "TFADE" + c + fadeTransition +";";
|
||||||
|
resp += ds + "TSWEE" + c + sweepTransition +";";
|
||||||
|
resp += ds + "TSDIR" + c + !sweepDirection +";";
|
||||||
|
resp += ds + "TDLAY" + v + transitionDelay +";";
|
||||||
|
resp += ds + "NRBRI" + v + briMultiplier +";";
|
||||||
|
resp += ds + "TLBRI" + v + nightlightTargetBri +";";
|
||||||
|
resp += ds + "TLDUR" + v + nightlightDelayMins +";";
|
||||||
|
resp += ds + "TLFDE" + c + nightlightFade +";";
|
||||||
|
resp += ds + "OLDEF" + v + overlayDefault +";";
|
||||||
|
resp += ds + "WOFFS" + v + arlsOffset +";";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (subPage == 3)
|
||||||
|
{
|
||||||
|
resp += ds + "DESC" + v + "\"" + serverDescription + "\";";
|
||||||
|
resp += ds + "COLMD" + c + useHSBDefault + ";";
|
||||||
|
resp += ds + "THEME.selectedIndex=" + String(currentTheme) + ";";
|
||||||
|
for(int i=0;i<5;i++)
|
||||||
|
resp += ds + "CCOL" + i + v + "\"" + cssCol[i] + "\";";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (subPage == 4)
|
||||||
|
{
|
||||||
|
resp += ds + "BTNON" + c + buttonEnabled +";";
|
||||||
|
resp += ds + "NUDPP" + v + udpPort +";";
|
||||||
|
resp += ds + "NRCBR" + c + receiveNotificationBrightness +";";
|
||||||
|
resp += ds + "NRCCL" + c + receiveNotificationColor +";";
|
||||||
|
resp += ds + "NRCFX" + c + receiveNotificationEffects +";";
|
||||||
|
resp += ds + "NSDIR" + c + notifyDirectDefault +";";
|
||||||
|
resp += ds + "NSBTN" + c + notifyButton +";";
|
||||||
|
resp += ds + "ALEXA" + c + alexaEnabled +";";
|
||||||
|
resp += ds + "AINVN" + v + "\"" + alexaInvocationName + "\";";
|
||||||
|
resp += ds + "NSALX" + c + alexaNotify +";";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (subPage == 5)
|
||||||
|
{
|
||||||
|
resp += ds + "NTPON" + c + ntpEnabled +";";
|
||||||
|
resp += dg + "(\"times\")[0]" + ih + "\"" + getTimeString() + "\";";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (subPage == 6)
|
||||||
|
{
|
||||||
|
resp += ds + "NOOTA" + c + otaLock +";";
|
||||||
|
resp += ds + "AROTA" + c + aOtaEnabled +";";
|
||||||
|
resp += ds + "NORAP" + c + recoveryAPDisabled +";";
|
||||||
resp += dg + "(\"msg\")[0]" + ih + "\""+ versionName +" (build " + VERSION + ") OK\";";
|
resp += dg + "(\"msg\")[0]" + ih + "\""+ versionName +" (build " + VERSION + ") OK\";";
|
||||||
|
}
|
||||||
|
resp += "}</script>";
|
||||||
|
|
||||||
return resp;
|
return resp;
|
||||||
}
|
}
|
||||||
|
@ -19,8 +19,14 @@ void _setRandomColor(bool _sec)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleSettingsSet()
|
void handleSettingsSet(uint8_t subPage)
|
||||||
{
|
{
|
||||||
|
//0: menu 1: wifi 2: leds 3: ui 4: sync 5: time 6: sec
|
||||||
|
if (subPage <1 || subPage >6) return;
|
||||||
|
|
||||||
|
//WIFI SETTINGS
|
||||||
|
if (subPage == 1)
|
||||||
|
{
|
||||||
if (server.hasArg("CSSID")) clientssid = server.arg("CSSID");
|
if (server.hasArg("CSSID")) clientssid = server.arg("CSSID");
|
||||||
if (server.hasArg("CPASS"))
|
if (server.hasArg("CPASS"))
|
||||||
{
|
{
|
||||||
@ -47,12 +53,6 @@ void handleSettingsSet()
|
|||||||
int chan = server.arg("APCHAN").toInt();
|
int chan = server.arg("APCHAN").toInt();
|
||||||
if (chan > 0 && chan < 14) apchannel = chan;
|
if (chan > 0 && chan < 14) apchannel = chan;
|
||||||
}
|
}
|
||||||
if (server.hasArg("RESET")) //might be dangerous in case arg is always sent
|
|
||||||
{
|
|
||||||
clearEEPROM();
|
|
||||||
server.send(200, "text/plain", "Settings erased. Rebooting...");
|
|
||||||
reset();
|
|
||||||
}
|
|
||||||
if (server.hasArg("CSIP0"))
|
if (server.hasArg("CSIP0"))
|
||||||
{
|
{
|
||||||
int i = server.arg("CSIP0").toInt();
|
int i = server.arg("CSIP0").toInt();
|
||||||
@ -113,9 +113,11 @@ void handleSettingsSet()
|
|||||||
int i = server.arg("CSSN3").toInt();
|
int i = server.arg("CSSN3").toInt();
|
||||||
if (i >= 0 && i <= 255) staticsubnet[3] = i;
|
if (i >= 0 && i <= 255) staticsubnet[3] = i;
|
||||||
}
|
}
|
||||||
if (server.hasArg("DESC")) serverDescription = server.arg("DESC");
|
}
|
||||||
useHSBDefault = server.hasArg("COLMD");
|
|
||||||
useHSB = useHSBDefault;
|
//LED SETTINGS
|
||||||
|
if (subPage == 2)
|
||||||
|
{
|
||||||
if (server.hasArg("LEDCN"))
|
if (server.hasArg("LEDCN"))
|
||||||
{
|
{
|
||||||
int i = server.arg("LEDCN").toInt();
|
int i = server.arg("LEDCN").toInt();
|
||||||
@ -216,7 +218,7 @@ void handleSettingsSet()
|
|||||||
}
|
}
|
||||||
if (server.hasArg("TLBRI"))
|
if (server.hasArg("TLBRI"))
|
||||||
{
|
{
|
||||||
bri_nl = server.arg("TLBRI").toInt();
|
nightlightTargetBri = server.arg("TLBRI").toInt();
|
||||||
}
|
}
|
||||||
if (server.hasArg("TLDUR"))
|
if (server.hasArg("TLDUR"))
|
||||||
{
|
{
|
||||||
@ -224,24 +226,6 @@ void handleSettingsSet()
|
|||||||
if (i > 0) nightlightDelayMins = i;
|
if (i > 0) nightlightDelayMins = i;
|
||||||
}
|
}
|
||||||
nightlightFade = server.hasArg("TLFDE");
|
nightlightFade = server.hasArg("TLFDE");
|
||||||
if (server.hasArg("NUDPP"))
|
|
||||||
{
|
|
||||||
udpPort = server.arg("NUDPP").toInt();
|
|
||||||
}
|
|
||||||
receiveNotifications = server.hasArg("NRCVE");
|
|
||||||
receiveNotificationsDefault = receiveNotifications;
|
|
||||||
if (server.hasArg("NRBRI"))
|
|
||||||
{
|
|
||||||
int i = server.arg("NRBRI").toInt();
|
|
||||||
if (i > 0) bri_n = i;
|
|
||||||
}
|
|
||||||
notifyDirectDefault = server.hasArg("NSDIR");
|
|
||||||
notifyDirect = notifyDirectDefault;
|
|
||||||
notifyButton = server.hasArg("NSBTN");
|
|
||||||
alexaEnabled = server.hasArg("ALEXA");
|
|
||||||
if (server.hasArg("AINVN")) alexaInvocationName = server.arg("AINVN");
|
|
||||||
alexaNotify = server.hasArg("NSALX");
|
|
||||||
ntpEnabled = server.hasArg("NTPON");
|
|
||||||
if (server.hasArg("OLDEF"))
|
if (server.hasArg("OLDEF"))
|
||||||
{
|
{
|
||||||
int i = server.arg("OLDEF").toInt();
|
int i = server.arg("OLDEF").toInt();
|
||||||
@ -253,6 +237,62 @@ void handleSettingsSet()
|
|||||||
if (i >= -255 && i <= 255) arlsOffset = i;
|
if (i >= -255 && i <= 255) arlsOffset = i;
|
||||||
arlsSign = (i>=0)?true:false;
|
arlsSign = (i>=0)?true:false;
|
||||||
}
|
}
|
||||||
|
if (server.hasArg("NRBRI"))
|
||||||
|
{
|
||||||
|
int i = server.arg("NRBRI").toInt();
|
||||||
|
if (i > 0) briMultiplier = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//UI
|
||||||
|
if (subPage == 3)
|
||||||
|
{
|
||||||
|
if (server.hasArg("DESC")) serverDescription = server.arg("DESC");
|
||||||
|
useHSBDefault = server.hasArg("COLMD");
|
||||||
|
useHSB = useHSBDefault;
|
||||||
|
if (server.hasArg("THEME")) currentTheme = server.arg("THEME").toInt();
|
||||||
|
for(int i=0;i<5;i++)
|
||||||
|
{
|
||||||
|
if (server.hasArg(("CCOL"+i))) cssCol[i] = server.arg(("CCOL"+i));
|
||||||
|
}
|
||||||
|
buildCssColorString();
|
||||||
|
}
|
||||||
|
|
||||||
|
//SYNC
|
||||||
|
if (subPage == 4)
|
||||||
|
{
|
||||||
|
if (server.hasArg("NUDPP"))
|
||||||
|
{
|
||||||
|
udpPort = server.arg("NUDPP").toInt();
|
||||||
|
}
|
||||||
|
receiveNotificationBrightness = server.hasArg("NRCBR");
|
||||||
|
receiveNotificationColor = server.hasArg("NRCCL");
|
||||||
|
receiveNotificationEffects = server.hasArg("NRCFX");
|
||||||
|
receiveNotifications = (receiveNotificationBrightness || receiveNotificationColor || receiveNotificationEffects);
|
||||||
|
notifyDirectDefault = server.hasArg("NSDIR");
|
||||||
|
notifyDirect = notifyDirectDefault;
|
||||||
|
notifyButton = server.hasArg("NSBTN");
|
||||||
|
alexaEnabled = server.hasArg("ALEXA");
|
||||||
|
if (server.hasArg("AINVN")) alexaInvocationName = server.arg("AINVN");
|
||||||
|
alexaNotify = server.hasArg("NSALX");
|
||||||
|
}
|
||||||
|
|
||||||
|
//TIME
|
||||||
|
if (subPage == 5)
|
||||||
|
{
|
||||||
|
ntpEnabled = server.hasArg("NTPON");
|
||||||
|
}
|
||||||
|
|
||||||
|
//SECURITY
|
||||||
|
if (subPage == 6)
|
||||||
|
{
|
||||||
|
if (server.hasArg("RESET"))
|
||||||
|
{
|
||||||
|
clearEEPROM();
|
||||||
|
serveMessage(200, "All Settings erased.", "Rebooting...");
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
|
||||||
if (server.hasArg("OPASS"))
|
if (server.hasArg("OPASS"))
|
||||||
{
|
{
|
||||||
if (!otaLock)
|
if (!otaLock)
|
||||||
@ -268,11 +308,13 @@ void handleSettingsSet()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (server.hasArg("NOOTA")) otaLock = true;
|
if (server.hasArg("NOOTA")) otaLock = true;
|
||||||
if (server.hasArg("NORAP")) {
|
if (!otaLock)
|
||||||
if (!otaLock) recoveryAPDisabled = true;
|
{
|
||||||
} else {
|
recoveryAPDisabled = server.hasArg("NORAP");
|
||||||
recoveryAPDisabled = false;
|
aOtaEnabled = server.hasArg("AROTA");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
saveSettingsToEEPROM();
|
saveSettingsToEEPROM();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -329,6 +371,7 @@ boolean handleSet(String req)
|
|||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
white = req.substring(pos + 3).toInt();
|
white = req.substring(pos + 3).toInt();
|
||||||
}
|
}
|
||||||
|
|
||||||
//set 2nd red value
|
//set 2nd red value
|
||||||
pos = req.indexOf("R2=");
|
pos = req.indexOf("R2=");
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
@ -349,6 +392,7 @@ boolean handleSet(String req)
|
|||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
white_sec = req.substring(pos + 3).toInt();
|
white_sec = req.substring(pos + 3).toInt();
|
||||||
}
|
}
|
||||||
|
|
||||||
//set 2nd to white
|
//set 2nd to white
|
||||||
pos = req.indexOf("SW");
|
pos = req.indexOf("SW");
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
@ -398,6 +442,7 @@ boolean handleSet(String req)
|
|||||||
white = white_sec;
|
white = white_sec;
|
||||||
white_sec = _temp[3];
|
white_sec = _temp[3];
|
||||||
}
|
}
|
||||||
|
|
||||||
//set current effect index
|
//set current effect index
|
||||||
pos = req.indexOf("FX=");
|
pos = req.indexOf("FX=");
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
@ -418,6 +463,17 @@ boolean handleSet(String req)
|
|||||||
effectUpdated = true;
|
effectUpdated = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//set effect intensity
|
||||||
|
pos = req.indexOf("IX=");
|
||||||
|
if (pos > 0) {
|
||||||
|
if (effectIntensity != req.substring(pos + 3).toInt())
|
||||||
|
{
|
||||||
|
effectIntensity = req.substring(pos + 3).toInt();
|
||||||
|
strip.setIntensity(effectIntensity);
|
||||||
|
effectUpdated = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//set default control mode (0 - RGB, 1 - HSB)
|
//set default control mode (0 - RGB, 1 - HSB)
|
||||||
pos = req.indexOf("MD=");
|
pos = req.indexOf("MD=");
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
@ -511,7 +567,7 @@ boolean handleSet(String req)
|
|||||||
//set nightlight target brightness
|
//set nightlight target brightness
|
||||||
pos = req.indexOf("NT=");
|
pos = req.indexOf("NT=");
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
bri_nl = req.substring(pos + 3).toInt();
|
nightlightTargetBri = req.substring(pos + 3).toInt();
|
||||||
nightlightActive_old = false; //re-init
|
nightlightActive_old = false; //re-init
|
||||||
}
|
}
|
||||||
//toggle nightlight fade
|
//toggle nightlight fade
|
||||||
@ -560,6 +616,7 @@ boolean handleSet(String req)
|
|||||||
countdownTime = req.substring(pos+3).toInt();
|
countdownTime = req.substring(pos+3).toInt();
|
||||||
if (countdownTime - now() > 0) countdownOverTriggered = false;
|
if (countdownTime - now() > 0) countdownOverTriggered = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//set custom chase data
|
//set custom chase data
|
||||||
bool _cc_updated = false;
|
bool _cc_updated = false;
|
||||||
pos = req.indexOf("C0="); if (pos > 0) {cc_start = (req.substring(pos + 3).toInt()); _cc_updated = true;}
|
pos = req.indexOf("C0="); if (pos > 0) {cc_start = (req.substring(pos + 3).toInt()); _cc_updated = true;}
|
||||||
|
@ -26,6 +26,7 @@ void wledInit()
|
|||||||
loadSettingsFromEEPROM(true);
|
loadSettingsFromEEPROM(true);
|
||||||
DEBUG_PRINT("CC: SSID: ");
|
DEBUG_PRINT("CC: SSID: ");
|
||||||
DEBUG_PRINT(clientssid);
|
DEBUG_PRINT(clientssid);
|
||||||
|
buildCssColorString();
|
||||||
|
|
||||||
WiFi.disconnect(); //close old connections
|
WiFi.disconnect(); //close old connections
|
||||||
|
|
||||||
@ -71,59 +72,108 @@ void wledInit()
|
|||||||
//SERVER INIT
|
//SERVER INIT
|
||||||
//settings page
|
//settings page
|
||||||
server.on("/settings", HTTP_GET, [](){
|
server.on("/settings", HTTP_GET, [](){
|
||||||
if (!arlsTimeout) //do not serve while receiving realtime
|
serveSettings(0);
|
||||||
{
|
|
||||||
String settingsBuffer = getSettings();
|
|
||||||
server.setContentLength(strlen_P(PAGE_settings0) + strlen_P(PAGE_settings1) + settingsBuffer.length());
|
|
||||||
server.send(200, "text/html", "");
|
|
||||||
server.sendContent_P(PAGE_settings0);
|
|
||||||
server.sendContent(settingsBuffer);
|
|
||||||
server.sendContent_P(PAGE_settings1);
|
|
||||||
} else {
|
|
||||||
server.send(200, "text/plain", "The settings are not available while receiving real-time data.");
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
server.on("/settings/wifi", HTTP_GET, [](){
|
||||||
|
serveSettings(1);
|
||||||
|
});
|
||||||
|
server.on("/settings/leds", HTTP_GET, [](){
|
||||||
|
serveSettings(2);
|
||||||
|
});
|
||||||
|
server.on("/settings/ui", HTTP_GET, [](){
|
||||||
|
serveSettings(3);
|
||||||
|
});
|
||||||
|
server.on("/settings/sync", HTTP_GET, [](){
|
||||||
|
serveSettings(4);
|
||||||
|
});
|
||||||
|
server.on("/settings/time", HTTP_GET, [](){
|
||||||
|
serveSettings(5);
|
||||||
|
});
|
||||||
|
server.on("/settings/sec", HTTP_GET, [](){
|
||||||
|
serveSettings(6);
|
||||||
|
});
|
||||||
|
|
||||||
server.on("/favicon.ico", HTTP_GET, [](){
|
server.on("/favicon.ico", HTTP_GET, [](){
|
||||||
if(!handleFileRead("/favicon.ico")) server.send(200, "image/x-icon", favicon);
|
if(!handleFileRead("/favicon.ico")) server.send(200, "image/x-icon", favicon);
|
||||||
});
|
});
|
||||||
|
|
||||||
server.on("/", HTTP_GET, [](){
|
server.on("/", HTTP_GET, [](){
|
||||||
if (!initialBoot){
|
if (!showWelcomePage){
|
||||||
if(!handleFileRead("/index.htm")) {
|
if(!handleFileRead("/index.htm")) {
|
||||||
serveIndex();
|
serveIndex();
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
if(!handleFileRead("/welcome.htm")) {
|
if(!handleFileRead("/welcome.htm")) {
|
||||||
serveWelcomePage();
|
serveSettings(255);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
server.on("/sliders", HTTP_GET, serveIndex)
|
|
||||||
server.on("/welcome", HTTP_GET, serveWelcomePage)
|
server.on("/sliders", HTTP_GET, serveIndex);
|
||||||
|
|
||||||
|
server.on("/welcome", HTTP_GET, [](){
|
||||||
|
serveSettings(255);
|
||||||
|
});
|
||||||
|
|
||||||
server.on("/reset", HTTP_GET, [](){
|
server.on("/reset", HTTP_GET, [](){
|
||||||
server.send(200, "text/plain", "Rebooting...");
|
serveMessage(200,"Rebooting now...","(takes ~15 seconds)");
|
||||||
reset();
|
reset();
|
||||||
});
|
});
|
||||||
server.on("/set-settings", HTTP_POST, [](){
|
|
||||||
handleSettingsSet();
|
server.on("/settings/wifi", HTTP_POST, [](){
|
||||||
if(!handleFileRead("/settingssaved.htm")) server.send(200, "text/html", PAGE_settingssaved);
|
handleSettingsSet(1);
|
||||||
|
serveMessage(200,"WiFi settings saved.","Rebooting now...");
|
||||||
|
reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
server.on("/settings/leds", HTTP_POST, [](){
|
||||||
|
handleSettingsSet(2);
|
||||||
|
serveMessage(200,"LED settings saved.","",true);
|
||||||
|
});
|
||||||
|
|
||||||
|
server.on("/settings/ui", HTTP_POST, [](){
|
||||||
|
handleSettingsSet(3);
|
||||||
|
serveMessage(200,"UI settings saved.","",true);
|
||||||
|
});
|
||||||
|
|
||||||
|
server.on("/settings/sync", HTTP_POST, [](){
|
||||||
|
handleSettingsSet(4);
|
||||||
|
serveMessage(200,"Sync settings saved.","",true);
|
||||||
|
});
|
||||||
|
|
||||||
|
server.on("/settings/time", HTTP_POST, [](){
|
||||||
|
handleSettingsSet(5);
|
||||||
|
serveMessage(200,"Time settings saved.","If you made changes to NTP, please reboot.",true);
|
||||||
|
});
|
||||||
|
|
||||||
|
server.on("/settings/sec", HTTP_POST, [](){
|
||||||
|
handleSettingsSet(6);
|
||||||
|
serveMessage(200,"Security settings saved.","Rebooting now...");
|
||||||
|
reset();
|
||||||
|
});
|
||||||
|
|
||||||
server.on("/version", HTTP_GET, [](){
|
server.on("/version", HTTP_GET, [](){
|
||||||
server.send(200, "text/plain", (String)VERSION);
|
server.send(200, "text/plain", (String)VERSION);
|
||||||
});
|
});
|
||||||
|
|
||||||
server.on("/uptime", HTTP_GET, [](){
|
server.on("/uptime", HTTP_GET, [](){
|
||||||
server.send(200, "text/plain", (String)millis());
|
server.send(200, "text/plain", (String)millis());
|
||||||
});
|
});
|
||||||
|
|
||||||
server.on("/freeheap", HTTP_GET, [](){
|
server.on("/freeheap", HTTP_GET, [](){
|
||||||
server.send(200, "text/plain", (String)ESP.getFreeHeap());
|
server.send(200, "text/plain", (String)ESP.getFreeHeap());
|
||||||
});
|
});
|
||||||
|
|
||||||
server.on("/power", HTTP_GET, [](){
|
server.on("/power", HTTP_GET, [](){
|
||||||
String val = (String)(int)strip.getPowerEstimate(ledcount,strip.getColor(),strip.getBrightness());
|
String val = (String)(int)strip.getPowerEstimate(ledcount,strip.getColor(),strip.getBrightness());
|
||||||
val += "mA currently\nNotice: This is just an estimate which does not take into account several factors (like effects and wire resistance). It is NOT an accurate measurement!";
|
val += "mA currently\nNotice: This is just an estimate which does not take into account several factors (like effects and wire resistance). It is NOT an accurate measurement!";
|
||||||
server.send(200, "text/plain", val);
|
server.send(200, "text/plain", val);
|
||||||
});
|
});
|
||||||
|
|
||||||
server.on("/teapot", HTTP_GET, [](){
|
server.on("/teapot", HTTP_GET, [](){
|
||||||
server.send(418, "text/plain", "418. I'm a teapot. (Tangible Embedded Advanced Project Of Twinkling)");
|
serveMessage(418, "418. I'm a teapot.","(Tangible Embedded Advanced Project Of Twinkling)");
|
||||||
});
|
});
|
||||||
|
|
||||||
server.on("/build", HTTP_GET, [](){
|
server.on("/build", HTTP_GET, [](){
|
||||||
String info = "hard-coded build info:\r\n\n";
|
String info = "hard-coded build info:\r\n\n";
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
@ -183,30 +233,22 @@ void wledInit()
|
|||||||
server.on("/cleareeprom", HTTP_GET, clearEEPROM);
|
server.on("/cleareeprom", HTTP_GET, clearEEPROM);
|
||||||
//init ota page
|
//init ota page
|
||||||
httpUpdater.setup(&server);
|
httpUpdater.setup(&server);
|
||||||
//init ArduinoOTA
|
|
||||||
ArduinoOTA.onStart([]() {
|
|
||||||
#ifndef ARDUINO_ARCH_ESP32
|
|
||||||
wifi_set_sleep_type(NONE_SLEEP_T);
|
|
||||||
#endif
|
|
||||||
DEBUG_PRINTLN("Start ArduinoOTA");
|
|
||||||
});
|
|
||||||
ArduinoOTA.begin();
|
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
server.on("/edit", HTTP_GET, [](){
|
server.on("/edit", HTTP_GET, [](){
|
||||||
server.send(500, "text/plain", "OTA lock active");
|
serveMessage(500, "Access Denied", txd);
|
||||||
});
|
});
|
||||||
server.on("/down", HTTP_GET, [](){
|
server.on("/down", HTTP_GET, [](){
|
||||||
server.send(500, "text/plain", "OTA lock active");
|
serveMessage(500, "Access Denied", txd);
|
||||||
});
|
});
|
||||||
server.on("/cleareeprom", HTTP_GET, [](){
|
server.on("/cleareeprom", HTTP_GET, [](){
|
||||||
server.send(500, "text/plain", "OTA lock active");
|
serveMessage(500, "Access Denied", txd);
|
||||||
});
|
});
|
||||||
server.on("/update", HTTP_GET, [](){
|
server.on("/update", HTTP_GET, [](){
|
||||||
server.send(500, "text/plain", "OTA lock active");
|
serveMessage(500, "Access Denied", txd);
|
||||||
});
|
});
|
||||||
server.on("/list", HTTP_GET, [](){
|
server.on("/list", HTTP_GET, [](){
|
||||||
server.send(500, "text/plain", "OTA lock active");
|
serveMessage(500, "Access Denied", txd);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
//called when the url is not defined here, ajax-in; get-settings
|
//called when the url is not defined here, ajax-in; get-settings
|
||||||
@ -216,7 +258,7 @@ void wledInit()
|
|||||||
DEBUG_PRINTLN("Body: " + server.arg(0));
|
DEBUG_PRINTLN("Body: " + server.arg(0));
|
||||||
if(!handleSet(server.uri())){
|
if(!handleSet(server.uri())){
|
||||||
if(!handleAlexaApiCall(server.uri(),server.arg(0)))
|
if(!handleAlexaApiCall(server.uri(),server.arg(0)))
|
||||||
server.send(404, "text/plain", "FileNotFound");
|
server.send(404, "text/plain", "Not Found");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
//init Alexa hue emulation
|
//init Alexa hue emulation
|
||||||
@ -227,6 +269,18 @@ void wledInit()
|
|||||||
// Add service to MDNS
|
// Add service to MDNS
|
||||||
MDNS.addService("http", "tcp", 80);
|
MDNS.addService("http", "tcp", 80);
|
||||||
|
|
||||||
|
//init ArduinoOTA
|
||||||
|
if (aOtaEnabled)
|
||||||
|
{
|
||||||
|
ArduinoOTA.onStart([]() {
|
||||||
|
#ifndef ARDUINO_ARCH_ESP32
|
||||||
|
wifi_set_sleep_type(NONE_SLEEP_T);
|
||||||
|
#endif
|
||||||
|
DEBUG_PRINTLN("Start ArduinoOTA");
|
||||||
|
});
|
||||||
|
ArduinoOTA.begin();
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize NeoPixel Strip
|
// Initialize NeoPixel Strip
|
||||||
strip.init();
|
strip.init();
|
||||||
strip.setLedCount(ledcount);
|
strip.setLedCount(ledcount);
|
||||||
@ -278,16 +332,31 @@ void initCon()
|
|||||||
|
|
||||||
void buildCssColorString()
|
void buildCssColorString()
|
||||||
{
|
{
|
||||||
cssColorString=":root{--aCol:";
|
switch (currentTheme)
|
||||||
|
{
|
||||||
|
default: cssCol[0]="D9B310"; cssCol[1]="0B3C5D"; cssCol[2]="1D2731"; cssCol[3]="328CC1"; cssCol[4]="000"; break; //night
|
||||||
|
case 1: cssCol[0]="eee"; cssCol[1]="ddd"; cssCol[2]="b9b9b9"; cssCol[3]="049"; cssCol[4]="777"; break; //modern
|
||||||
|
case 2: cssCol[0]="abc"; cssCol[1]="fff"; cssCol[2]="ddd"; cssCol[3]="000"; cssCol[4]="0004"; break; //bright
|
||||||
|
case 3: cssCol[0]="c09f80"; cssCol[1]="d7cec7"; cssCol[2]="76323f"; cssCol[3]="888"; cssCol[4]="3334"; break; //wine
|
||||||
|
case 4: cssCol[0]="3cc47c"; cssCol[1]="828081"; cssCol[2]="d9a803"; cssCol[3]="1e392a"; cssCol[4]="000a"; break; //electric
|
||||||
|
case 5: cssCol[0]="57bc90"; cssCol[1]="a5a5af"; cssCol[2]="015249"; cssCol[3]="88c9d4"; cssCol[4]="0004"; break; //mint
|
||||||
|
case 6: cssCol[0]="f7c331"; cssCol[1]="dcc7aa"; cssCol[2]="6b7a8f"; cssCol[3]="f7882f"; cssCol[4]="0007"; break; //amber
|
||||||
|
case 7: cssCol[0]="fc3"; cssCol[1]="124"; cssCol[2]="334"; cssCol[3]="f1d"; cssCol[4]="f00"; break; //club
|
||||||
|
case 14: cssCol[0]="fc7"; cssCol[1]="49274a"; cssCol[2]="94618e"; cssCol[3]="f4decb"; cssCol[4]="0008"; break; //end
|
||||||
|
//case 15 do nothing since custom vals are already loaded
|
||||||
|
}
|
||||||
|
cssColorString="<style>:root{--aCol:#";
|
||||||
cssColorString+=cssCol[0];
|
cssColorString+=cssCol[0];
|
||||||
cssColorString+=";--bCol:";
|
cssColorString+=";--bCol:#";
|
||||||
cssColorString+=cssCol[1];
|
cssColorString+=cssCol[1];
|
||||||
cssColorString+=";--cCol:";
|
cssColorString+=";--cCol:#";
|
||||||
cssColorString+=cssCol[2];
|
cssColorString+=cssCol[2];
|
||||||
cssColorString+=";--dCol:";
|
cssColorString+=";--dCol:#";
|
||||||
cssColorString+=cssCol[3];
|
cssColorString+=cssCol[3];
|
||||||
cssColorString+=";--sCol:";
|
cssColorString+=";--sCol:#";
|
||||||
cssColorString+=cssCol[4];
|
cssColorString+=cssCol[4];
|
||||||
|
cssColorString+=";--tCol:#";
|
||||||
|
cssColorString+=cssCol[5];
|
||||||
cssColorString+=";}";
|
cssColorString+=";}";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -307,13 +376,80 @@ void serveIndex()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void serveWelcomePage()
|
void serveMessage(int code, String headl, String subl="", bool backToSettings)
|
||||||
{
|
{
|
||||||
String resp = "";
|
String messageBody = "<h2>";
|
||||||
resp += PAGE_welcome0;
|
messageBody += headl;
|
||||||
resp += cssColorString;
|
messageBody += "</h2>";
|
||||||
resp += PAGE_welcome1;
|
messageBody += subl;
|
||||||
server.send(200, "text/html", resp);
|
if (backToSettings)
|
||||||
|
{
|
||||||
|
messageBody += "<form action=/settings><button type=submit>Back</button></form>";
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
messageBody += "<br><br><button type=\"button\" onclick=\"B()\">Back</button>";
|
||||||
|
}
|
||||||
|
messageBody += "</body></html>";
|
||||||
|
server.setContentLength(strlen_P(PAGE_msg0) + cssColorString.length() + strlen_P(PAGE_msg1) + messageBody.length());
|
||||||
|
server.send(code, "text/html", "");
|
||||||
|
server.sendContent_P(PAGE_msg0);
|
||||||
|
server.sendContent(cssColorString);
|
||||||
|
server.sendContent_P(PAGE_msg1);
|
||||||
|
server.sendContent(messageBody);
|
||||||
|
}
|
||||||
|
|
||||||
|
void serveSettings(uint8_t subPage)
|
||||||
|
{
|
||||||
|
//0: menu 1: wifi 2: leds 3: ui 4: sync 5: time 6: sec 255: welcomepage
|
||||||
|
if (!arlsTimeout) //do not serve while receiving realtime
|
||||||
|
{
|
||||||
|
int pl0, pl1;
|
||||||
|
switch (subPage)
|
||||||
|
{
|
||||||
|
case 1: pl0 = strlen_P(PAGE_settings_wifi0); pl1 = strlen_P(PAGE_settings_wifi1); break;
|
||||||
|
case 2: pl0 = strlen_P(PAGE_settings_leds0); pl1 = strlen_P(PAGE_settings_leds1); break;
|
||||||
|
case 3: pl0 = strlen_P(PAGE_settings_ui0); pl1 = strlen_P(PAGE_settings_ui1); break;
|
||||||
|
case 4: pl0 = strlen_P(PAGE_settings_sync0); pl1 = strlen_P(PAGE_settings_sync1); break;
|
||||||
|
case 5: pl0 = strlen_P(PAGE_settings_time0); pl1 = strlen_P(PAGE_settings_time1); break;
|
||||||
|
case 6: pl0 = strlen_P(PAGE_settings_sec0); pl1 = strlen_P(PAGE_settings_sec1); break;
|
||||||
|
case 255: pl0 = strlen_P(PAGE_welcome0); pl1 = strlen_P(PAGE_welcome1); break;
|
||||||
|
default: pl0 = strlen_P(PAGE_settings0); pl1 = strlen_P(PAGE_settings1);
|
||||||
|
}
|
||||||
|
|
||||||
|
String settingsBuffer = getSettings(subPage);
|
||||||
|
int sCssLength = (subPage >0 && subPage <7)?strlen_P(PAGE_settingsCss):0;
|
||||||
|
|
||||||
|
server.setContentLength(pl0 + cssColorString.length() + settingsBuffer.length() + sCssLength + pl1);
|
||||||
|
server.send(200, "text/html", "");
|
||||||
|
|
||||||
|
switch (subPage)
|
||||||
|
{
|
||||||
|
case 1: server.sendContent_P(PAGE_settings_wifi0); break;
|
||||||
|
case 2: server.sendContent_P(PAGE_settings_leds0); break;
|
||||||
|
case 3: server.sendContent_P(PAGE_settings_ui0); break;
|
||||||
|
case 4: server.sendContent_P(PAGE_settings_sync0); break;
|
||||||
|
case 5: server.sendContent_P(PAGE_settings_time0); break;
|
||||||
|
case 6: server.sendContent_P(PAGE_settings_sec0); break;
|
||||||
|
case 255: server.sendContent_P(PAGE_welcome0); break;
|
||||||
|
default: server.sendContent_P(PAGE_settings0);
|
||||||
|
}
|
||||||
|
server.sendContent(settingsBuffer);
|
||||||
|
server.sendContent(cssColorString);
|
||||||
|
if (subPage >0 && subPage <7) server.sendContent_P(PAGE_settingsCss);
|
||||||
|
switch (subPage)
|
||||||
|
{
|
||||||
|
case 1: server.sendContent_P(PAGE_settings_wifi1); break;
|
||||||
|
case 2: server.sendContent_P(PAGE_settings_leds1); break;
|
||||||
|
case 3: server.sendContent_P(PAGE_settings_ui1); break;
|
||||||
|
case 4: server.sendContent_P(PAGE_settings_sync1); break;
|
||||||
|
case 5: server.sendContent_P(PAGE_settings_time1); break;
|
||||||
|
case 6: server.sendContent_P(PAGE_settings_sec1); break;
|
||||||
|
case 255: server.sendContent_P(PAGE_welcome1); break;
|
||||||
|
default: server.sendContent_P(PAGE_settings1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
server.send(200, "text/plain", "The settings are not available while receiving real-time data.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
void setAllLeds() {
|
void setAllLeds() {
|
||||||
double d = bri_t*bri_n;
|
double d = bri_t*briMultiplier;
|
||||||
int val = d/100;
|
int val = d/100;
|
||||||
if (val > 255) val = 255;
|
if (val > 255) val = 255;
|
||||||
if (useGammaCorrectionBri)
|
if (useGammaCorrectionBri)
|
||||||
@ -59,7 +59,7 @@ void colorUpdated(int callMode)
|
|||||||
}
|
}
|
||||||
if (callMode != 5 && nightlightActive && nightlightFade)
|
if (callMode != 5 && nightlightActive && nightlightFade)
|
||||||
{
|
{
|
||||||
bri_nls = bri;
|
bri_nl_t = bri;
|
||||||
nightlightDelayMs -= (millis() - nightlightStartTime);
|
nightlightDelayMs -= (millis() - nightlightStartTime);
|
||||||
nightlightStartTime = millis();
|
nightlightStartTime = millis();
|
||||||
}
|
}
|
||||||
@ -151,12 +151,12 @@ void handleNightlight()
|
|||||||
notify(4);
|
notify(4);
|
||||||
nightlightDelayMs = (int)(nightlightDelayMins*60000);
|
nightlightDelayMs = (int)(nightlightDelayMins*60000);
|
||||||
nightlightActive_old = true;
|
nightlightActive_old = true;
|
||||||
bri_nls = bri;
|
bri_nl_t = bri;
|
||||||
}
|
}
|
||||||
float nper = (millis() - nightlightStartTime)/((float)nightlightDelayMs);
|
float nper = (millis() - nightlightStartTime)/((float)nightlightDelayMs);
|
||||||
if (nightlightFade)
|
if (nightlightFade)
|
||||||
{
|
{
|
||||||
bri = bri_nls+((bri_nl - bri_nls)*nper);
|
bri = bri_nl_t+((nightlightTargetBri - bri_nl_t)*nper);
|
||||||
colorUpdated(5);
|
colorUpdated(5);
|
||||||
}
|
}
|
||||||
if (nper >= 1)
|
if (nper >= 1)
|
||||||
@ -164,10 +164,10 @@ void handleNightlight()
|
|||||||
nightlightActive = false;
|
nightlightActive = false;
|
||||||
if (!nightlightFade)
|
if (!nightlightFade)
|
||||||
{
|
{
|
||||||
bri = bri_nl;
|
bri = nightlightTargetBri;
|
||||||
colorUpdated(5);
|
colorUpdated(5);
|
||||||
}
|
}
|
||||||
if (bri == 0) bri_last = bri_nls;
|
if (bri == 0) bri_last = bri_nl_t;
|
||||||
}
|
}
|
||||||
} else if (nightlightActive_old) //early de-init
|
} else if (nightlightActive_old) //early de-init
|
||||||
{
|
{
|
||||||
|
@ -84,3 +84,17 @@ String getTimeString()
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//returns true if countdown just over
|
||||||
|
bool checkCountdown()
|
||||||
|
{
|
||||||
|
long diff = countdownTime - local;
|
||||||
|
local = abs(diff);
|
||||||
|
if (diff <0 && !countdownOverTriggered)
|
||||||
|
{
|
||||||
|
applyMacro(countdownMacro);
|
||||||
|
countdownOverTriggered = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -265,7 +265,7 @@ void _overlayAnalogCountdown()
|
|||||||
strip.unlockAll();
|
strip.unlockAll();
|
||||||
if (now() >= countdownTime)
|
if (now() >= countdownTime)
|
||||||
{
|
{
|
||||||
//what to do if countdown finished
|
checkCountdown();
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
long diff = countdownTime - now();
|
long diff = countdownTime - now();
|
||||||
@ -309,13 +309,10 @@ void _overlayNixieCountdown()
|
|||||||
{
|
{
|
||||||
if (now() >= countdownTime)
|
if (now() >= countdownTime)
|
||||||
{
|
{
|
||||||
if (effectCurrent != 8){
|
if (checkCountdown())
|
||||||
effectCurrent = 8;
|
{
|
||||||
strip.setMode(8);
|
_nixieNumber(2019, 2019);
|
||||||
strip.setSpeed(255);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_nixieNumber(2018, 2018);
|
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
long diff = countdownTime - now();
|
long diff = countdownTime - now();
|
||||||
|
@ -34,7 +34,7 @@ void handleAlexa()
|
|||||||
String request = packetBuffer;
|
String request = packetBuffer;
|
||||||
|
|
||||||
if(request.indexOf("M-SEARCH") >= 0) {
|
if(request.indexOf("M-SEARCH") >= 0) {
|
||||||
if(request.indexOf("upnp:rootdevice") > 0) {
|
if(request.indexOf("upnp:rootdevice") > 0 || request.indexOf("device:basic:1") > 0) {
|
||||||
DEBUG_PRINTLN("Responding search req...");
|
DEBUG_PRINTLN("Responding search req...");
|
||||||
respondToSearch();
|
respondToSearch();
|
||||||
}
|
}
|
||||||
@ -87,7 +87,13 @@ void alexaDim(uint8_t briL)
|
|||||||
server.send(200, "application/json", body.c_str());
|
server.send(200, "application/json", body.c_str());
|
||||||
|
|
||||||
String ct = (alexaNotify)?"win&IN&A=":"win&NN&IN&A=";
|
String ct = (alexaNotify)?"win&IN&A=":"win&NN&IN&A=";
|
||||||
|
if (briL < 255)
|
||||||
|
{
|
||||||
ct = ct + (briL+1);
|
ct = ct + (briL+1);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
ct = ct + (255);
|
||||||
|
}
|
||||||
handleSet(ct);
|
handleSet(ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,16 +148,7 @@ void handleCronixie()
|
|||||||
{
|
{
|
||||||
cronixieRefreshedTime = millis();
|
cronixieRefreshedTime = millis();
|
||||||
local = TZ.toLocal(now(), &tcr);
|
local = TZ.toLocal(now(), &tcr);
|
||||||
if (cronixieCountdown)
|
if (cronixieCountdown) checkCountdown();
|
||||||
{
|
|
||||||
long diff = countdownTime - local;
|
|
||||||
local = abs(diff);
|
|
||||||
if (diff <0 && !countdownOverTriggered)
|
|
||||||
{
|
|
||||||
applyMacro(countdownMacro);
|
|
||||||
countdownOverTriggered = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
uint8_t h = hour(local);
|
uint8_t h = hour(local);
|
||||||
uint8_t h0 = h;
|
uint8_t h0 = h;
|
||||||
uint8_t m = minute(local);
|
uint8_t m = minute(local);
|
||||||
|
Loading…
Reference in New Issue
Block a user