commit
65a0f60257
11
readme.md
11
readme.md
@ -2,29 +2,28 @@
|
|||||||
|
|
||||||
WLED is a fast and (relatively) secure implementation of an ESP8266/ESP32 webserver to control NeoPixel (WS2812B) LEDs!
|
WLED is a fast and (relatively) secure implementation of an ESP8266/ESP32 webserver to control NeoPixel (WS2812B) LEDs!
|
||||||
|
|
||||||
### Features: (V0.6.4)
|
### Features: (V0.7.0)
|
||||||
- RGB, HSB, and brightness sliders
|
- RGB, HSB, and brightness sliders
|
||||||
|
- All new, mobile-friendly web UI!
|
||||||
- Settings page - configuration over network
|
- Settings page - configuration over network
|
||||||
- Access Point and station mode - automatic failsafe AP
|
- Access Point and station mode - automatic failsafe AP
|
||||||
- WS2812FX library integrated for over 50 special effects!
|
- WS2812FX library integrated for over 50 special effects (+Custom Theater Chase)!
|
||||||
- Secondary color support lets you use even more effect combinations
|
- Secondary color support lets you use even more effect combinations
|
||||||
- Alexa smart home device server (including dimming)
|
- Alexa smart home device server (including dimming)
|
||||||
- Beta syncronization to Philips hue lights
|
- Beta syncronization to Philips hue lights
|
||||||
- Support for RGBW strips
|
- Support for RGBW strips
|
||||||
- 25 user presets! Save your favorite colors and effects and apply them easily! Now supports cycling through them.
|
- 25 user presets! Save colors and effects and apply them easily! Supports cycling through them.
|
||||||
- HTTP request API for simple integration
|
- HTTP request API for simple integration
|
||||||
- Macro functions to automatically execute API calls
|
- Macro functions to automatically execute API calls
|
||||||
- Nightlight function (gradually dims down)
|
- Nightlight function (gradually dims down)
|
||||||
- Notifier function (multiple ESPs sync color via UDP broadcast)
|
- Notifier function (multiple ESPs sync color via UDP broadcast)
|
||||||
- Support for power pushbutton
|
- Support for power pushbutton
|
||||||
- Custom Theater Chase
|
|
||||||
- Support for the Adalight serial ambilight protocol!
|
- Support for the Adalight serial ambilight protocol!
|
||||||
- Full OTA software update capability (HTTP and ArduinoOTA)
|
- Full OTA software update capability (HTTP and ArduinoOTA)
|
||||||
- Password protected OTA page for added security (OTA lock)
|
- Password protected OTA page for added security (OTA lock)
|
||||||
- NTP and configurable analog clock function
|
- NTP and configurable analog clock function
|
||||||
- Support for the Cronixie Clock kit by Diamex
|
- Support for the Cronixie Clock kit by Diamex
|
||||||
- Realtime UDP Packet Control (WARLS, DRGB, DRGBW) possible
|
- Realtime UDP Packet Control (Hyperion, WARLS, DRGB, DRGBW)
|
||||||
- Client HTML UI controlled, customizable themes
|
|
||||||
|
|
||||||
### Quick start guide and documentation:
|
### Quick start guide and documentation:
|
||||||
|
|
||||||
|
@ -37,8 +37,8 @@
|
|||||||
|
|
||||||
#define CALL_MODE(n) (this->*_mode[n])();
|
#define CALL_MODE(n) (this->*_mode[n])();
|
||||||
|
|
||||||
void WS2812FX::init(bool supportWhite, uint16_t countPixels, uint8_t pin) {
|
void WS2812FX::init(bool supportWhite, uint16_t countPixels, uint8_t pin,bool skipFirst) {
|
||||||
begin(supportWhite,countPixels,pin);
|
begin(supportWhite,countPixels,pin,skipFirst);
|
||||||
for (int i=0; i < _led_count; i++) _locked[i] = false;
|
for (int i=0; i < _led_count; i++) _locked[i] = false;
|
||||||
WS2812FX::setBrightness(_brightness);
|
WS2812FX::setBrightness(_brightness);
|
||||||
show();
|
show();
|
||||||
@ -2032,6 +2032,7 @@ void WS2812FX::setPixelColor(uint16_t i, byte r, byte g, byte b, byte w)
|
|||||||
if (_reverseMode) i = _led_count - 1 -i;
|
if (_reverseMode) i = _led_count - 1 -i;
|
||||||
if (!_cronixieMode)
|
if (!_cronixieMode)
|
||||||
{
|
{
|
||||||
|
if (_skipFirstMode) {i++;if(i==1)setPixelColorRaw(0,0,0,0,0);}
|
||||||
if (_rgbwMode)
|
if (_rgbwMode)
|
||||||
{
|
{
|
||||||
bus->SetPixelColor(i, RgbwColor(r,g,b,w));
|
bus->SetPixelColor(i, RgbwColor(r,g,b,w));
|
||||||
@ -2050,27 +2051,27 @@ void WS2812FX::setPixelColor(uint16_t i, byte r, byte g, byte b, byte w)
|
|||||||
byte wCorr = (int)(((double)((_color_sec>>24) & 0xFF))*_cronixieSecMultiplier);
|
byte wCorr = (int)(((double)((_color_sec>>24) & 0xFF))*_cronixieSecMultiplier);
|
||||||
for (int j=o; j< o+19; j++)
|
for (int j=o; j< o+19; j++)
|
||||||
{
|
{
|
||||||
setPixelColorRaw(j,rCorr,gCorr,bCorr,wCorr);
|
setPixelColorRaw((_skipFirstMode)?j+1:j,rCorr,gCorr,bCorr,wCorr);
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
for (int j=o; j< o+19; j++)
|
for (int j=o; j< o+19; j++)
|
||||||
{
|
{
|
||||||
setPixelColorRaw(j,0,0,0,0);
|
setPixelColorRaw((_skipFirstMode)?j+1:j,0,0,0,0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch(_cronixieDigits[i])
|
switch(_cronixieDigits[i])
|
||||||
{
|
{
|
||||||
case 0: setPixelColorRaw(o+5,r,g,b,w); break;
|
case 0: setPixelColorRaw((_skipFirstMode)?o+6:o+5,r,g,b,w); break;
|
||||||
case 1: setPixelColorRaw(o+0,r,g,b,w); break;
|
case 1: setPixelColorRaw((_skipFirstMode)?o+1:o+0,r,g,b,w); break;
|
||||||
case 2: setPixelColorRaw(o+6,r,g,b,w); break;
|
case 2: setPixelColorRaw((_skipFirstMode)?o+7:o+6,r,g,b,w); break;
|
||||||
case 3: setPixelColorRaw(o+1,r,g,b,w); break;
|
case 3: setPixelColorRaw((_skipFirstMode)?o+2:o+1,r,g,b,w); break;
|
||||||
case 4: setPixelColorRaw(o+7,r,g,b,w); break;
|
case 4: setPixelColorRaw((_skipFirstMode)?o+8:o+7,r,g,b,w); break;
|
||||||
case 5: setPixelColorRaw(o+2,r,g,b,w); break;
|
case 5: setPixelColorRaw((_skipFirstMode)?o+3:o+2,r,g,b,w); break;
|
||||||
case 6: setPixelColorRaw(o+8,r,g,b,w); break;
|
case 6: setPixelColorRaw((_skipFirstMode)?o+9:o+8,r,g,b,w); break;
|
||||||
case 7: setPixelColorRaw(o+3,r,g,b,w); break;
|
case 7: setPixelColorRaw((_skipFirstMode)?o+4:o+3,r,g,b,w); break;
|
||||||
case 8: setPixelColorRaw(o+9,r,g,b,w); break;
|
case 8: setPixelColorRaw((_skipFirstMode)?o+10:o+9,r,g,b,w); break;
|
||||||
case 9: setPixelColorRaw(o+4,r,g,b,w); break;
|
case 9: setPixelColorRaw((_skipFirstMode)?o+5:o+4,r,g,b,w); break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2134,17 +2135,19 @@ void WS2812FX::clear()
|
|||||||
bus->ClearTo(RgbColor(0));
|
bus->ClearTo(RgbColor(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
void WS2812FX::begin(bool supportWhite, uint16_t countPixels, uint8_t pin)
|
void WS2812FX::begin(bool supportWhite, uint16_t countPixels, uint8_t pin, bool skipFirst)
|
||||||
{
|
{
|
||||||
if (supportWhite == _rgbwMode && countPixels == _led_count && _locked != NULL) return;
|
if (supportWhite == _rgbwMode && countPixels == _led_count && _locked != NULL) return;
|
||||||
_rgbwMode = supportWhite;
|
_rgbwMode = supportWhite;
|
||||||
|
_skipFirstMode = skipFirst;
|
||||||
_led_count = countPixels;
|
_led_count = countPixels;
|
||||||
_cc_i2 = _led_count -1;
|
_cc_i2 = _led_count -1;
|
||||||
|
if (_skipFirstMode) _led_count++;
|
||||||
uint8_t ty = 1;
|
uint8_t ty = 1;
|
||||||
if (supportWhite) ty =2;
|
if (supportWhite) ty =2;
|
||||||
bus->Begin((NeoPixelType)ty, countPixels, pin);
|
bus->Begin((NeoPixelType)ty, _led_count, pin);
|
||||||
if (_locked != NULL) delete _locked;
|
if (_locked != NULL) delete _locked;
|
||||||
_locked = new bool[countPixels];
|
_locked = new bool[_led_count];
|
||||||
}
|
}
|
||||||
|
|
||||||
//For some reason min and max are not declared here
|
//For some reason min and max are not declared here
|
||||||
|
@ -199,6 +199,7 @@ class WS2812FX {
|
|||||||
_counter_ccStep = 0;
|
_counter_ccStep = 0;
|
||||||
_fastStandard = false;
|
_fastStandard = false;
|
||||||
_reverseMode = false;
|
_reverseMode = false;
|
||||||
|
_skipFirstMode = false;
|
||||||
_locked = NULL;
|
_locked = NULL;
|
||||||
_cronixieDigits = new byte[6];
|
_cronixieDigits = new byte[6];
|
||||||
bus = new NeoPixelWrapper();
|
bus = new NeoPixelWrapper();
|
||||||
@ -208,7 +209,7 @@ class WS2812FX {
|
|||||||
show(void),
|
show(void),
|
||||||
setPixelColor(uint16_t i, byte r, byte g, byte b),
|
setPixelColor(uint16_t i, byte r, byte g, byte b),
|
||||||
setPixelColor(uint16_t i, byte r, byte g, byte b, byte w),
|
setPixelColor(uint16_t i, byte r, byte g, byte b, byte w),
|
||||||
init(bool supportWhite, uint16_t countPixels, uint8_t pin),
|
init(bool supportWhite, uint16_t countPixels, uint8_t pin, bool skipFirst),
|
||||||
service(void),
|
service(void),
|
||||||
start(void),
|
start(void),
|
||||||
stop(void),
|
stop(void),
|
||||||
@ -277,7 +278,7 @@ class WS2812FX {
|
|||||||
NeoPixelWrapper *bus;
|
NeoPixelWrapper *bus;
|
||||||
|
|
||||||
void
|
void
|
||||||
begin(bool supportWhite, uint16_t countPixels, uint8_t pin),
|
begin(bool supportWhite, uint16_t countPixels, uint8_t pin, bool skipFirst),
|
||||||
clear(void),
|
clear(void),
|
||||||
setPixelColor(uint16_t i, uint32_t c),
|
setPixelColor(uint16_t i, uint32_t c),
|
||||||
setPixelColorRaw(uint16_t i, byte r, byte g, byte b, byte w),
|
setPixelColorRaw(uint16_t i, byte r, byte g, byte b, byte w),
|
||||||
@ -348,6 +349,7 @@ class WS2812FX {
|
|||||||
bool
|
bool
|
||||||
_triggered,
|
_triggered,
|
||||||
_rgbwMode,
|
_rgbwMode,
|
||||||
|
_skipFirstMode,
|
||||||
_fastStandard,
|
_fastStandard,
|
||||||
_reverseMode,
|
_reverseMode,
|
||||||
_cronixieMode,
|
_cronixieMode,
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head><meta charset="utf-8">
|
<head><meta charset="utf-8"><meta name="theme-color" content="#fff">
|
||||||
<link rel='shortcut icon' type='image/x-icon' href='/favicon.ico'/>
|
<link rel='shortcut icon' type='image/x-icon' href='/favicon.ico'/>
|
||||||
<title>WLED 0.6.4</title>
|
<title>WLED 0.7.0</title>
|
||||||
<script>
|
<script>
|
||||||
var d=document;
|
var d=document;
|
||||||
var w=window.getComputedStyle(d.querySelector("html"));
|
var w=window.getComputedStyle(d.querySelector("html"));
|
||||||
@ -33,6 +33,7 @@
|
|||||||
aC = w.getPropertyValue("--aCol");
|
aC = w.getPropertyValue("--aCol");
|
||||||
bC = w.getPropertyValue("--bCol");
|
bC = w.getPropertyValue("--bCol");
|
||||||
dC = w.getPropertyValue("--dCol");
|
dC = w.getPropertyValue("--dCol");
|
||||||
|
d.querySelector("meta[name=theme-color]").setAttribute("content",bC);
|
||||||
CV(0);
|
CV(0);
|
||||||
setInterval('GIO()', 5000);
|
setInterval('GIO()', 5000);
|
||||||
GIO();
|
GIO();
|
||||||
@ -197,6 +198,7 @@
|
|||||||
function SwFX(s)
|
function SwFX(s)
|
||||||
{
|
{
|
||||||
var n=Cf.TX.selectedIndex+s;
|
var n=Cf.TX.selectedIndex+s;
|
||||||
|
if (n==-1||n==58) return;
|
||||||
Cf.TX.selectedIndex =n;
|
Cf.TX.selectedIndex =n;
|
||||||
if (n < 0) Cf.TX.selectedIndex = 0;
|
if (n < 0) Cf.TX.selectedIndex = 0;
|
||||||
if (n > 57) Cf.TX.selectedIndex = 53;
|
if (n > 57) Cf.TX.selectedIndex = 53;
|
||||||
@ -217,21 +219,22 @@
|
|||||||
if (d.Cf.FF.value < 1) d.Cf.FF.value = 1;
|
if (d.Cf.FF.value < 1) d.Cf.FF.value = 1;
|
||||||
if (d.Cf.FF.value > 25) d.Cf.FF.value = 25;
|
if (d.Cf.FF.value > 25) d.Cf.FF.value = 25;
|
||||||
}
|
}
|
||||||
|
function PAt()
|
||||||
|
{
|
||||||
|
resp+=(d.Cf.BC.checked)?"&PA=1":"&PA=0";
|
||||||
|
resp+=(d.Cf.CC.checked)?"&PC=1":"&PC=0";
|
||||||
|
resp+=(d.Cf.FC.checked)?"&PX=1":"&PX=0";
|
||||||
|
}
|
||||||
function PSIO(sv)
|
function PSIO(sv)
|
||||||
{
|
{
|
||||||
|
PAt();
|
||||||
if(sv)
|
if(sv)
|
||||||
{
|
{
|
||||||
resp+="&PS=";
|
resp+="&PS=";
|
||||||
resp+=d.Cf.FF.value;
|
resp+=d.Cf.FF.value;
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
if (d.Cf.BC.checked&&d.Cf.CC.checked&&d.Cf.FC.checked)
|
resp+="&PL=";resp+=d.Cf.FF.value;
|
||||||
{resp+="&PL=";resp+=d.Cf.FF.value;}
|
|
||||||
else {
|
|
||||||
if(d.Cf.BC.checked){resp+="&PA=";resp+=d.Cf.FF.value;}
|
|
||||||
if(d.Cf.CC.checked){resp+="&PC=";resp+=d.Cf.FF.value;}
|
|
||||||
if(d.Cf.FC.checked){resp+="&PX=";resp+=d.Cf.FF.value;}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
GIO();
|
GIO();
|
||||||
}
|
}
|
||||||
@ -337,13 +340,11 @@
|
|||||||
}
|
}
|
||||||
function uCY()
|
function uCY()
|
||||||
{
|
{
|
||||||
|
PAt();
|
||||||
resp+=(d.Cf.CY.checked)?"&CY=1":"&CY=0";
|
resp+=(d.Cf.CY.checked)?"&CY=1":"&CY=0";
|
||||||
resp+="&P1=" + Cf.P1.value;
|
resp+="&P1=" + Cf.P1.value;
|
||||||
resp+="&P2=" + Cf.P2.value;
|
resp+="&P2=" + Cf.P2.value;
|
||||||
resp+="&PT=" + Cf.PT.value;
|
resp+="&PT=" + Cf.PT.value;
|
||||||
if(d.Cf.BC.checked){resp+="&PA";}
|
|
||||||
if(d.Cf.CC.checked){resp+="&PC";}
|
|
||||||
if(d.Cf.FC.checked){resp+="&PX";}
|
|
||||||
GIO();
|
GIO();
|
||||||
}
|
}
|
||||||
function R()
|
function R()
|
||||||
@ -353,11 +354,12 @@
|
|||||||
</script>
|
</script>
|
||||||
<style>
|
<style>
|
||||||
:root {
|
:root {
|
||||||
--aCol: #0ac;
|
--aCol: #D9B310;
|
||||||
--bCol: #124;
|
--bCol: #0B3C5D;
|
||||||
--cCol: #334;
|
--cCol: #1D2731;
|
||||||
--dCol: #288;
|
--dCol: #328CC1;
|
||||||
--sCol: #FF00FF;
|
--sCol: #000;
|
||||||
|
--tCol: #328CC1;
|
||||||
--cFn: Verdana;
|
--cFn: Verdana;
|
||||||
}
|
}
|
||||||
.ctrl_box {
|
.ctrl_box {
|
||||||
|
599
wled00/data/index_mobile.htm
Normal file
599
wled00/data/index_mobile.htm
Normal file
File diff suppressed because one or more lines are too long
@ -9,7 +9,7 @@
|
|||||||
window.location = "/settings";
|
window.location = "/settings";
|
||||||
}
|
}
|
||||||
function RP() {
|
function RP() {
|
||||||
top.location.href=top.location.href;
|
top.location.href="/";
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style>
|
<style>
|
||||||
|
@ -19,6 +19,9 @@
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
background-attachment: fixed;
|
background-attachment: fixed;
|
||||||
}
|
}
|
||||||
|
html {
|
||||||
|
--h:11.55vh;
|
||||||
|
}
|
||||||
button {
|
button {
|
||||||
background: var(--bCol);
|
background: var(--bCol);
|
||||||
color: var(--tCol);
|
color: var(--tCol);
|
||||||
@ -27,13 +30,23 @@
|
|||||||
display: inline-block;
|
display: inline-block;
|
||||||
filter: drop-shadow( -5px -5px 5px var(--sCol) );
|
filter: drop-shadow( -5px -5px 5px var(--sCol) );
|
||||||
font-size: 8vmin;
|
font-size: 8vmin;
|
||||||
height:13.86vh;
|
height:var(--h);
|
||||||
width: 95%;
|
width: 95%;
|
||||||
margin-top: 2.4vh;
|
margin-top: 2.4vh;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
<script>
|
||||||
|
function BB()
|
||||||
|
{
|
||||||
|
if (window.frameElement) {
|
||||||
|
document.getElementById("b").style.display = "none";
|
||||||
|
document.documentElement.style.setProperty('--h',"13.86vh");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body onload="BB()">
|
||||||
|
<form action="/"><button type=submit id="b">Back</button></form>
|
||||||
<form action="/settings/wifi"><button type="submit">WiFi Setup</button></form>
|
<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/leds"><button type="submit">LED Preferences</button></form>
|
||||||
<form action="/settings/ui"><button type="submit">User Interface</button></form>
|
<form action="/settings/ui"><button type="submit">User Interface</button></form>
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
@ -7,15 +7,15 @@ body{font-family:var(--cFn),sans-serif;text-align:center;background:var(--cCol);
|
|||||||
|
|
||||||
const char PAGE_settings0[] PROGMEM = R"=====(
|
const char PAGE_settings0[] PROGMEM = R"=====(
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html><head><title>WLED Settings</title>
|
||||||
<head>
|
|
||||||
<title>WLED Settings</title>
|
|
||||||
)=====";
|
)=====";
|
||||||
|
|
||||||
const char PAGE_settings1[] PROGMEM = R"=====(
|
const char PAGE_settings1[] PROGMEM = R"=====(
|
||||||
body{text-align:center;background:var(--cCol);height:100%;margin:0;background-attachment:fixed}button{background:var(--bCol);color:var(--tCol);font-family:var(--cFn),sans-serif;border:.3ch solid var(--bCol);display:inline-block;filter:drop-shadow(-5px -5px 5px var(--sCol));font-size:8vmin;height:13.86vh;width:95%;margin-top:2.4vh}</style>
|
body{text-align:center;background:var(--cCol);height:100%;margin:0;background-attachment:fixed}html{--h:11.55vh}button{background:var(--bCol);color:var(--tCol);font-family:var(--cFn),Helvetica,sans-serif;border:.3ch solid var(--bCol);display:inline-block;filter:drop-shadow(-5px -5px 5px var(--sCol));font-size:8vmin;height:var(--h);width:95%;margin-top:2.4vh}</style>
|
||||||
|
<script>function BB(){if(window.frameElement){document.getElementById("b").style.display="none";document.documentElement.style.setProperty("--h","13.86vh")}};</script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body onload=BB()>
|
||||||
|
<form action=/><button type=submit id=b>Back</button></form>
|
||||||
<form action=/settings/wifi><button type=submit>WiFi Setup</button></form>
|
<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/leds><button type=submit>LED Preferences</button></form>
|
||||||
<form action=/settings/ui><button type=submit>User Interface</button></form>
|
<form action=/settings/ui><button type=submit>User Interface</button></form>
|
||||||
@ -28,8 +28,7 @@ body{text-align:center;background:var(--cCol);height:100%;margin:0;background-at
|
|||||||
|
|
||||||
const char PAGE_settings_wifi0[] PROGMEM = R"=====(
|
const char PAGE_settings_wifi0[] PROGMEM = R"=====(
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html><head>
|
||||||
<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;
|
<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"=====(
|
const char PAGE_settings_wifi1[] PROGMEM = R"=====(
|
||||||
@ -93,15 +92,18 @@ Default RGB color:
|
|||||||
<input name="CG" type="number" min="0" max="255" required>
|
<input name="CG" type="number" min="0" max="255" required>
|
||||||
<input name="CB" type="number" min="0" max="255" required><br>
|
<input name="CB" type="number" min="0" max="255" required><br>
|
||||||
Default white value (only RGBW): <input name="CW" type="number" min="0" max="255" required><br>
|
Default white value (only RGBW): <input name="CW" type="number" min="0" max="255" required><br>
|
||||||
|
Auto-calculate white from RGB instead: <input type="checkbox" name="AW"><br>
|
||||||
Default brightness: <input name="CA" type="number" min="0" max="255" required> (0-255)<br>
|
Default brightness: <input name="CA" type="number" min="0" max="255" required> (0-255)<br>
|
||||||
Default effect ID: <input name="FX" type="number" min="0" max="57" required><br>
|
Default effect ID: <input name="FX" type="number" min="0" max="57" required><br>
|
||||||
Default effect speed: <input name="SX" type="number" min="0" max="255" required><br>
|
Default effect speed: <input name="SX" type="number" min="0" max="255" required><br>
|
||||||
Default effect intensity: <input name="IX" type="number" min="0" max="255" required><br>
|
Default effect intensity: <input name="IX" type="number" min="0" max="255" required><br>
|
||||||
|
Default secondary RGB(W):<br>
|
||||||
<input name="SR" type="number" min="0" max="255" required>
|
<input name="SR" type="number" min="0" max="255" required>
|
||||||
<input name="SG" type="number" min="0" max="255" required>
|
<input name="SG" type="number" min="0" max="255" required>
|
||||||
<input name="SB" type="number" min="0" max="255" required>
|
<input name="SB" type="number" min="0" max="255" required>
|
||||||
<input name="SW" type="number" min="0" max="255" required><br>
|
<input name="SW" type="number" min="0" max="255" required><br>
|
||||||
Ignore and use current color, brightness and effects: <input type="checkbox" name="IS"><br>
|
Ignore and use current color, brightness and effects: <input type="checkbox" name="IS"><br>
|
||||||
|
Save current preset cycle configuration as boot default: <input type="checkbox" name="PC"><br>
|
||||||
Turn on after power up/reset: <input type="checkbox" name="BO"><br>
|
Turn on after power up/reset: <input type="checkbox" name="BO"><br>
|
||||||
Use Gamma correction for brightness: <input type="checkbox" name="GB"><br>
|
Use Gamma correction for brightness: <input type="checkbox" name="GB"><br>
|
||||||
Use Gamma correction for color: <input type="checkbox" name="GC"><br>
|
Use Gamma correction for color: <input type="checkbox" name="GC"><br>
|
||||||
@ -109,7 +111,8 @@ Brightness factor: <input name="BF" type="number" min="0" max="255" required> %
|
|||||||
<h3>Transitions</h3>
|
<h3>Transitions</h3>
|
||||||
Fade: <input type="checkbox" name="TF"><br>
|
Fade: <input type="checkbox" name="TF"><br>
|
||||||
Sweep: <input type="checkbox" name="TS"> Invert direction: <input type="checkbox" name="TI"><br>
|
Sweep: <input type="checkbox" name="TS"> Invert direction: <input type="checkbox" name="TI"><br>
|
||||||
Transition Time: <input name="TD" maxlength="5" size="2"> ms
|
Transition Time: <input name="TD" maxlength="5" size="2"> ms<br>
|
||||||
|
Enable transition for secondary color: <input type="checkbox" name="T2"><br>
|
||||||
<h3>Timed light</h3>
|
<h3>Timed light</h3>
|
||||||
Default Duration: <input name="TL" type="number" min="1" max="255" required> min<br>
|
Default Duration: <input name="TL" type="number" min="1" max="255" required> min<br>
|
||||||
Default Target brightness: <input name="TB" type="number" min="0" max="255" required><br>
|
Default Target brightness: <input name="TB" type="number" min="0" max="255" required><br>
|
||||||
@ -117,7 +120,8 @@ Fade down: <input type="checkbox" name="TW"><br>
|
|||||||
<h3>Advanced</h3>
|
<h3>Advanced</h3>
|
||||||
Reverse LED order (rotate 180): <input type="checkbox" name="RV"><br>
|
Reverse LED order (rotate 180): <input type="checkbox" name="RV"><br>
|
||||||
Init LEDs after WiFi: <input type="checkbox" name="EI"><br>
|
Init LEDs after WiFi: <input type="checkbox" name="EI"><br>
|
||||||
WARLS offset: <input name="WO" type="number" min="-255" max="255" required><hr>
|
WARLS offset: <input name="WO" type="number" min="-255" max="255" required><br>
|
||||||
|
Skip first LED: <input type="checkbox" name="SL"><hr>
|
||||||
<button type="button" onclick="B()">Back</button><button type="submit">Save</button>
|
<button type="button" onclick="B()">Back</button><button type="submit">Save</button>
|
||||||
</form>
|
</form>
|
||||||
</body>
|
</body>
|
||||||
@ -126,8 +130,7 @@ WARLS offset: <input name="WO" type="number" min="-255" max="255" required><hr>
|
|||||||
|
|
||||||
const char PAGE_settings_ui0[] PROGMEM = R"=====(
|
const char PAGE_settings_ui0[] PROGMEM = R"=====(
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html><head>
|
||||||
<head>
|
|
||||||
<title>UI Settings</title><script>
|
<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;
|
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;
|
||||||
)=====";
|
)=====";
|
||||||
@ -138,7 +141,14 @@ const char PAGE_settings_ui1[] PROGMEM = R"=====(
|
|||||||
<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>
|
User Interface Mode:
|
||||||
|
<select name="UI">
|
||||||
|
<option value="0" selected>Auto</option>
|
||||||
|
<option value="1">Classic</option>
|
||||||
|
<option value="2">Mobile</option>
|
||||||
|
</select><br>
|
||||||
|
Server description: <input name="DS" maxlength="32"><br><br>
|
||||||
|
<i>The following options are for the classic UI!</i><br>
|
||||||
Use HSB sliders instead of RGB by default: <input type="checkbox" name="MD"><br>
|
Use HSB sliders instead of RGB by default: <input type="checkbox" name="MD"><br>
|
||||||
Color Theme:
|
Color Theme:
|
||||||
<select name="TH" onchange="Ct()">
|
<select name="TH" onchange="Ct()">
|
||||||
@ -196,12 +206,16 @@ Send notifications on direct change: <input type="checkbox" name="SD"><br>
|
|||||||
Send notifications on button press: <input type="checkbox" name="SB"><br>
|
Send notifications on button press: <input type="checkbox" name="SB"><br>
|
||||||
Send Alexa notifications: <input type="checkbox" name="SA"><br>
|
Send Alexa notifications: <input type="checkbox" name="SA"><br>
|
||||||
Send Philips Hue change notifications: <input type="checkbox" name="SH"><br>
|
Send Philips Hue change notifications: <input type="checkbox" name="SH"><br>
|
||||||
Send notifications twice: <input type="checkbox" name="S2">
|
Send notifications twice: <input type="checkbox" name="S2"><br>
|
||||||
|
Receive UDP realtime: <input type="checkbox" name="RD"><br>
|
||||||
|
Enable UI access during realtime: <input type="checkbox" name="RU"> (can cause issues)
|
||||||
<h3>Alexa Voice Assistant</h3>
|
<h3>Alexa Voice Assistant</h3>
|
||||||
Emulate Alexa device: <input type="checkbox" name="AL"><br>
|
Emulate Alexa device: <input type="checkbox" name="AL"><br>
|
||||||
Alexa invocation name: <input name="AI" maxlength="32"><br>
|
Alexa invocation name: <input name="AI" maxlength="32"><br>
|
||||||
<h3>Philips Hue</h3>
|
<h3>Philips Hue</h3>
|
||||||
<i>You can find the bridge IP and the light number in the 'About' section of the hue app.</i><br>
|
<i>You can find the bridge IP and the light number in the 'About' section of the hue app.</i><br>
|
||||||
|
Poll Hue light <input name="HL" type="number" min="1" max="99" required> every <input name="HI" type="number" min="100" max="65000" required> ms: <input type="checkbox" name="HP"><br>
|
||||||
|
Then, receive <input type="checkbox" name="HO"> On/Off, <input type="checkbox" name="HB"> Brightness, and <input type="checkbox" name="HC"> Color<br>
|
||||||
Hue Bridge IP:<br>
|
Hue Bridge IP:<br>
|
||||||
<input name="H0" type="number" min="0" max="255" required> .
|
<input name="H0" type="number" min="0" max="255" required> .
|
||||||
<input name="H1" type="number" min="0" max="255" required> .
|
<input name="H1" type="number" min="0" max="255" required> .
|
||||||
@ -209,8 +223,6 @@ Hue Bridge IP:<br>
|
|||||||
<input name="H3" type="number" min="0" max="255" required><br>
|
<input name="H3" type="number" min="0" max="255" required><br>
|
||||||
<b>Press the pushlink button on the bridge, after that save this page!</b><br>
|
<b>Press the pushlink button on the bridge, after that save this page!</b><br>
|
||||||
(when first connecting)<br>
|
(when first connecting)<br>
|
||||||
Poll Hue light <input name="HL" type="number" min="1" max="99" required> every <input name="HI" type="number" min="100" max="65000" required> ms: <input type="checkbox" name="HP"><br>
|
|
||||||
Then, receive <input type="checkbox" name="HO"> On/Off, <input type="checkbox" name="HB"> Brightness, and <input type="checkbox" name="HC"> Color<br>
|
|
||||||
Hue status: <span class="hms"> Internal ESP Error! </span><hr>
|
Hue status: <span class="hms"> Internal ESP Error! </span><hr>
|
||||||
<button type="button" onclick="B()">Back</button><button type="submit">Save</button>
|
<button type="button" onclick="B()">Back</button><button type="submit">Save</button>
|
||||||
</form>
|
</form>
|
||||||
@ -318,7 +330,7 @@ const char PAGE_settings_sec1[] PROGMEM = R"=====(
|
|||||||
<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 & Reboot</button><hr>
|
<button type="button" onclick="B()">Back</button><button type="submit">Save & Reboot</button><hr>
|
||||||
<h2>Security & Update setup</h2>
|
<h2>Security & Update setup</h2>
|
||||||
Enable OTA lock: <input type="checkbox" name="NO"><br>
|
Lock wireless (OTA) software update: <input type="checkbox" name="NO"><br>
|
||||||
Passphrase: <input type="password" name="OP" maxlength="32"><br>
|
Passphrase: <input type="password" name="OP" maxlength="32"><br>
|
||||||
To enable OTA, for security reasons you need to also enter the correct password!<br>
|
To enable OTA, for security reasons you need to also enter the correct password!<br>
|
||||||
The password should be changed when OTA is enabled.<br>
|
The password should be changed when OTA is enabled.<br>
|
||||||
@ -335,10 +347,12 @@ HTTP traffic is unencrypted. An attacker in the same network can intercept form
|
|||||||
<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">WLED</a> version 0.6.4<br>
|
<a href="https://github.com/Aircoookie/WLED">WLED</a> version 0.7.0<br><br>
|
||||||
|
<b>Contributors:</b><br>
|
||||||
|
StormPie <i>(Mobile HTML UI)</i><br><br>
|
||||||
(c) 2016-2018 Christian Schwinne <br>
|
(c) 2016-2018 Christian Schwinne <br>
|
||||||
<i>Licensed under the MIT license</i><br><br>
|
<i>Licensed under the MIT license</i><br><br>
|
||||||
<i>Uses libraries:</i><br>
|
<b>Uses libraries:</b><br>
|
||||||
<i>ESP8266/ESP32 Arduino Core</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>(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/kitesurfer1404/WS2812FX">WS2812FX</a> by kitesurfer1404 (modified)</i><br>
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
//USER HTML
|
||||||
|
const char PAGE_usermod[] PROGMEM = R"=====(
|
||||||
|
<html><body>There is no usermod installed or it doesn't specify a custom web page.</body></html>
|
||||||
|
)=====";
|
||||||
/*
|
/*
|
||||||
* Various
|
* Various
|
||||||
*/
|
*/
|
||||||
@ -5,7 +9,7 @@ const char PAGE_msg0[] PROGMEM = R"=====(
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html><head>
|
<html><head>
|
||||||
<title>WLED Message</title>
|
<title>WLED Message</title>
|
||||||
<script>function B(){window.history.back()};function RS(){window.location = "/settings";}function RP(){top.location.href=top.location.href;}</script>
|
<script>function B(){window.history.back()};function RS(){window.location = "/settings";}function RP(){top.location.href="/";}</script>
|
||||||
)=====";
|
)=====";
|
||||||
const char PAGE_msg1[] PROGMEM = R"=====(
|
const char PAGE_msg1[] PROGMEM = R"=====(
|
||||||
button{background:var(--bCol);color:var(--tCol);font-family:var(--cFn),sans-serif;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:var(--cFn),sans-serif;text-align:center;background:var(--cCol);color:var(--tCol);line-height:200%;margin:0;background-attachment:fixed}</style>
|
button{background:var(--bCol);color:var(--tCol);font-family:var(--cFn),sans-serif;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:var(--cFn),sans-serif;text-align:center;background:var(--cCol);color:var(--tCol);line-height:200%;margin:0;background-attachment:fixed}</style>
|
||||||
|
@ -90,8 +90,8 @@ WebServer::~WebServer() {
|
|||||||
void WebServer::begin() {
|
void WebServer::begin() {
|
||||||
_currentStatus = HC_NONE;
|
_currentStatus = HC_NONE;
|
||||||
_server.begin();
|
_server.begin();
|
||||||
if(!_headerKeysCount)
|
//if(!_headerKeysCount)
|
||||||
collectHeaders(0, 0);
|
//collectHeaders(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WebServer::authenticate(const char * username, const char * password){
|
bool WebServer::authenticate(const char * username, const char * password){
|
||||||
@ -408,15 +408,13 @@ String WebServer::header(String name) {
|
|||||||
return String();
|
return String();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebServer::collectHeaders(const char* headerKeys[], const size_t headerKeysCount) {
|
//Modified by Aircoookie to work for WLED
|
||||||
_headerKeysCount = headerKeysCount + 1;
|
void WebServer::collectHeaders(String headerKey) {
|
||||||
if (_currentHeaders)
|
_headerKeysCount = 2;
|
||||||
delete[]_currentHeaders;
|
if (_currentHeaders) delete[]_currentHeaders;
|
||||||
_currentHeaders = new RequestArgument[_headerKeysCount];
|
_currentHeaders = new RequestArgument[2];
|
||||||
_currentHeaders[0].key = AUTHORIZATION_HEADER;
|
_currentHeaders[0].key = AUTHORIZATION_HEADER;
|
||||||
for (int i = 1; i < _headerKeysCount; i++){
|
_currentHeaders[1].key = headerKey;
|
||||||
_currentHeaders[i].key = headerKeys[i-1];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String WebServer::header(int i) {
|
String WebServer::header(int i) {
|
||||||
|
@ -105,7 +105,7 @@ public:
|
|||||||
String argName(int i); // get request argument name by number
|
String argName(int i); // get request argument name by number
|
||||||
int args(); // get arguments count
|
int args(); // get arguments count
|
||||||
bool hasArg(String name); // check if argument exists
|
bool hasArg(String name); // check if argument exists
|
||||||
void collectHeaders(const char* headerKeys[], const size_t headerKeysCount); // set the request headers to collect
|
void collectHeaders(String headerKey); // set the request headers to collect
|
||||||
String header(String name); // get request header value by name
|
String header(String name); // get request header value by name
|
||||||
String header(int i); // get request header value by number
|
String header(int i); // get request header value by number
|
||||||
String headerName(int i); // get request header name by number
|
String headerName(int i); // get request header name by number
|
||||||
|
@ -3,10 +3,14 @@
|
|||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* @title WLED project sketch
|
* @title WLED project sketch
|
||||||
* @version 0.6.4
|
* @version 0.7.0
|
||||||
* @author Christian Schwinne
|
* @author Christian Schwinne
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
//ESP8266-01 got too little storage space to work with all features of WLED. To use it, you must use ESP8266 Arduino Core v2.3.0 and the setting 512K(64K SPIFFS).
|
||||||
|
//Uncomment the following line to disable some features (currently Mobile UI) to compile for ESP8266-01
|
||||||
|
//#define WLED_FLASH_512K_MODE
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
#include <WiFi.h>
|
#include <WiFi.h>
|
||||||
@ -33,8 +37,8 @@
|
|||||||
#include "WS2812FX.h"
|
#include "WS2812FX.h"
|
||||||
|
|
||||||
//version in format yymmddb (b = daily build)
|
//version in format yymmddb (b = daily build)
|
||||||
#define VERSION 1804151
|
#define VERSION 1806240
|
||||||
const String versionString = "0.6.4";
|
const String versionString = "0.7.0";
|
||||||
|
|
||||||
//AP and OTA default passwords (change them!)
|
//AP and OTA default passwords (change them!)
|
||||||
String apPass = "wled1234";
|
String apPass = "wled1234";
|
||||||
@ -54,8 +58,9 @@ byte auxDefaultState = 0; //0: input 1: high 2: low
|
|||||||
byte auxTriggeredState = 0; //0: input 1: high 2: low
|
byte auxTriggeredState = 0; //0: input 1: high 2: low
|
||||||
|
|
||||||
//Default CONFIG
|
//Default CONFIG
|
||||||
String serverDescription = versionString;
|
String serverDescription = "WLED Light";
|
||||||
byte currentTheme = 0;
|
byte currentTheme = 0;
|
||||||
|
byte uiConfiguration = 0; //0: auto 1: classic 2: mobile
|
||||||
String clientSSID = "Your_Network";
|
String clientSSID = "Your_Network";
|
||||||
String clientPass = "";
|
String clientPass = "";
|
||||||
String cmDNS = "led";
|
String cmDNS = "led";
|
||||||
@ -69,9 +74,9 @@ 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
|
||||||
bool useHSB = true, useHSBDefault = true, useRGBW = false;
|
bool useHSB = true, useHSBDefault = true, useRGBW = false, autoRGBtoRGBW = false;
|
||||||
bool turnOnAtBoot = true;
|
bool turnOnAtBoot = true;
|
||||||
bool initLedsLast = false;
|
bool initLedsLast = false, skipFirstLed = false;
|
||||||
byte bootPreset = 0;
|
byte bootPreset = 0;
|
||||||
byte colS[]{255, 159, 0};
|
byte colS[]{255, 159, 0};
|
||||||
byte colSecS[]{0, 0, 0};
|
byte colSecS[]{0, 0, 0};
|
||||||
@ -81,6 +86,7 @@ byte briS = 127;
|
|||||||
byte nightlightTargetBri = 0;
|
byte nightlightTargetBri = 0;
|
||||||
bool fadeTransition = true;
|
bool fadeTransition = true;
|
||||||
bool sweepTransition = false, sweepDirection = true;
|
bool sweepTransition = false, sweepDirection = true;
|
||||||
|
bool disableSecTransition = true;
|
||||||
uint16_t transitionDelay = 1200, transitionDelayDefault = transitionDelay;
|
uint16_t transitionDelay = 1200, transitionDelayDefault = transitionDelay;
|
||||||
bool reverseMode = false;
|
bool reverseMode = false;
|
||||||
bool otaLock = false, wifiLock = false;
|
bool otaLock = false, wifiLock = false;
|
||||||
@ -91,7 +97,7 @@ bool receiveNotifications = true, receiveNotificationBrightness = true, receiveN
|
|||||||
byte briMultiplier = 100;
|
byte briMultiplier = 100;
|
||||||
byte nightlightDelayMins = 60;
|
byte nightlightDelayMins = 60;
|
||||||
bool nightlightFade = true;
|
bool nightlightFade = true;
|
||||||
uint16_t udpPort = 21324;
|
uint16_t udpPort = 21324, udpRgbPort = 19446;
|
||||||
byte effectDefault = 0;
|
byte effectDefault = 0;
|
||||||
byte effectSpeedDefault = 75;
|
byte effectSpeedDefault = 75;
|
||||||
byte effectIntensityDefault = 128;
|
byte effectIntensityDefault = 128;
|
||||||
@ -126,15 +132,19 @@ IPAddress hueIP = (0,0,0,0);
|
|||||||
bool notifyHue = true;
|
bool notifyHue = true;
|
||||||
bool hueApplyOnOff = true, hueApplyBri = true, hueApplyColor = true;
|
bool hueApplyOnOff = true, hueApplyBri = true, hueApplyColor = true;
|
||||||
|
|
||||||
|
uint16_t userVar0 = 0, userVar1 = 0;
|
||||||
|
|
||||||
//Internal vars
|
//Internal vars
|
||||||
byte col[]{0, 0, 0};
|
byte col[]{0, 0, 0};
|
||||||
byte colOld[]{0, 0, 0};
|
byte colOld[]{0, 0, 0};
|
||||||
byte colT[]{0, 0, 0};
|
byte colT[]{0, 0, 0};
|
||||||
byte colIT[]{0, 0, 0};
|
byte colIT[]{0, 0, 0};
|
||||||
byte colSec[]{0, 0, 0};
|
byte colSec[]{0, 0, 0};
|
||||||
|
byte colSecT[]{0, 0, 0};
|
||||||
|
byte colSecOld[]{0, 0, 0};
|
||||||
byte colSecIT[]{0, 0, 0};
|
byte colSecIT[]{0, 0, 0};
|
||||||
byte white, whiteOld, whiteT, whiteIT;
|
byte white, whiteOld, whiteT, whiteIT;
|
||||||
byte whiteSec, whiteSecIT;
|
byte whiteSec, whiteSecOld, whiteSecT, whiteSecIT;
|
||||||
byte lastRandomIndex = 0;
|
byte lastRandomIndex = 0;
|
||||||
uint16_t transitionDelayTemp = transitionDelay;
|
uint16_t transitionDelayTemp = transitionDelay;
|
||||||
unsigned long transitionStartTime;
|
unsigned long transitionStartTime;
|
||||||
@ -153,20 +163,20 @@ byte notificationSentCallMode = 0;
|
|||||||
bool notificationTwoRequired = false;
|
bool notificationTwoRequired = false;
|
||||||
bool nightlightActive = false;
|
bool nightlightActive = false;
|
||||||
bool nightlightActiveOld = false;
|
bool nightlightActiveOld = false;
|
||||||
uint32_t nightlightDelayMs;
|
uint32_t nightlightDelayMs = 10;
|
||||||
byte briNlT;
|
byte briNlT = 0;
|
||||||
byte effectCurrent = 0;
|
byte effectCurrent = 0;
|
||||||
byte effectSpeed = 75;
|
byte effectSpeed = 75;
|
||||||
byte effectIntensity = 128;
|
byte effectIntensity = 128;
|
||||||
bool onlyAP = false;
|
bool onlyAP = false;
|
||||||
bool udpConnected = false;
|
bool udpConnected = false, udpRgbConnected = false;
|
||||||
String cssCol[]={"","","","","",""};
|
String cssCol[]={"","","","","",""};
|
||||||
String cssFont="Verdana";
|
String cssFont="Verdana";
|
||||||
String cssColorString="";
|
String cssColorString="";
|
||||||
//NTP stuff
|
//NTP stuff
|
||||||
bool ntpConnected = false;
|
bool ntpConnected = false;
|
||||||
byte currentTimezone = 0;
|
byte currentTimezone = 0;
|
||||||
time_t local;
|
time_t local = 0;
|
||||||
int utcOffsetSecs = 0;
|
int utcOffsetSecs = 0;
|
||||||
|
|
||||||
//hue
|
//hue
|
||||||
@ -207,15 +217,17 @@ bool presetCyclingEnabled = false;
|
|||||||
byte presetCycleMin = 1, presetCycleMax = 5;
|
byte presetCycleMin = 1, presetCycleMax = 5;
|
||||||
uint16_t presetCycleTime = 1250;
|
uint16_t presetCycleTime = 1250;
|
||||||
unsigned long presetCycledTime = 0; byte presetCycCurr = presetCycleMin;
|
unsigned long presetCycledTime = 0; byte presetCycCurr = presetCycleMin;
|
||||||
bool presetCycleBri, presetCycleCol, presetCycleFx;
|
bool presetApplyBri = true, presetApplyCol = true, presetApplyFx = true;
|
||||||
|
bool saveCurrPresetCycConf = false;
|
||||||
|
|
||||||
uint32_t arlsTimeoutMillis = 2500;
|
uint32_t arlsTimeoutMillis = 2500;
|
||||||
bool arlsTimeout = false;
|
bool arlsTimeout = false;
|
||||||
bool receiveDirect = true;
|
bool receiveDirect = true, enableRealtimeUI = false;
|
||||||
unsigned long arlsTimeoutTime;
|
IPAddress realtimeIP = (0,0,0,0);
|
||||||
|
unsigned long arlsTimeoutTime = 0;
|
||||||
byte auxTime = 0;
|
byte auxTime = 0;
|
||||||
unsigned long auxStartTime;
|
unsigned long auxStartTime = 0;
|
||||||
bool auxActive, auxActiveBefore;
|
bool auxActive = false, auxActiveBefore = false;
|
||||||
bool showWelcomePage = false;
|
bool showWelcomePage = false;
|
||||||
|
|
||||||
bool useGammaCorrectionBri = false;
|
bool useGammaCorrectionBri = false;
|
||||||
@ -240,7 +252,7 @@ ESP8266WebServer server(80);
|
|||||||
#endif
|
#endif
|
||||||
HTTPClient hueClient;
|
HTTPClient hueClient;
|
||||||
ESP8266HTTPUpdateServer httpUpdater;
|
ESP8266HTTPUpdateServer httpUpdater;
|
||||||
WiFiUDP notifierUdp;
|
WiFiUDP notifierUdp, rgbUdp;
|
||||||
WiFiUDP ntpUdp;
|
WiFiUDP ntpUdp;
|
||||||
IPAddress ntpServerIP;
|
IPAddress ntpServerIP;
|
||||||
unsigned int ntpLocalPort = 2390;
|
unsigned int ntpLocalPort = 2390;
|
||||||
@ -294,14 +306,6 @@ String txd = "Please disable OTA Lock in security settings!";
|
|||||||
|
|
||||||
void serveMessage(int,String,String,int=255);
|
void serveMessage(int,String,String,int=255);
|
||||||
|
|
||||||
void down()
|
|
||||||
{
|
|
||||||
briT = 0;
|
|
||||||
setAllLeds();
|
|
||||||
DEBUG_PRINTLN("MODULE TERMINATED");
|
|
||||||
while (1) {delay(1000);}
|
|
||||||
}
|
|
||||||
|
|
||||||
void reset()
|
void reset()
|
||||||
{
|
{
|
||||||
briT = 0;
|
briT = 0;
|
||||||
@ -323,7 +327,7 @@ void loop() {
|
|||||||
yield();
|
yield();
|
||||||
handleButton();
|
handleButton();
|
||||||
handleNetworkTime();
|
handleNetworkTime();
|
||||||
if (!otaLock && aOtaEnabled) ArduinoOTA.handle();
|
if (aOtaEnabled) ArduinoOTA.handle();
|
||||||
handleAlexa();
|
handleAlexa();
|
||||||
handleOverlays();
|
handleOverlays();
|
||||||
if (!arlsTimeout) //block stuff if WARLS/Adalight is enabled
|
if (!arlsTimeout) //block stuff if WARLS/Adalight is enabled
|
||||||
|
@ -148,6 +148,7 @@ void saveSettingsToEEPROM()
|
|||||||
EEPROM.write(396, (utcOffsetSecs<0)); //is negative
|
EEPROM.write(396, (utcOffsetSecs<0)); //is negative
|
||||||
EEPROM.write(397, initLedsLast);
|
EEPROM.write(397, initLedsLast);
|
||||||
EEPROM.write(398, (ledCount >> 8) & 0xFF);
|
EEPROM.write(398, (ledCount >> 8) & 0xFF);
|
||||||
|
EEPROM.write(399, disableSecTransition);
|
||||||
|
|
||||||
for (int k=0;k<6;k++){
|
for (int k=0;k<6;k++){
|
||||||
int in = 900+k*8;
|
int in = 900+k*8;
|
||||||
@ -209,6 +210,25 @@ void saveSettingsToEEPROM()
|
|||||||
EEPROM.write(2180, macroCountdown);
|
EEPROM.write(2180, macroCountdown);
|
||||||
EEPROM.write(2181, macroNl);
|
EEPROM.write(2181, macroNl);
|
||||||
|
|
||||||
|
EEPROM.write(2200,!receiveDirect);
|
||||||
|
EEPROM.write(2201,enableRealtimeUI);
|
||||||
|
EEPROM.write(2202,uiConfiguration);
|
||||||
|
EEPROM.write(2203,autoRGBtoRGBW);
|
||||||
|
EEPROM.write(2204,skipFirstLed);
|
||||||
|
|
||||||
|
if (saveCurrPresetCycConf)
|
||||||
|
{
|
||||||
|
EEPROM.write(2205,presetCyclingEnabled);
|
||||||
|
EEPROM.write(2206,(presetCycleTime >> 0) & 0xFF);
|
||||||
|
EEPROM.write(2207,(presetCycleTime >> 8) & 0xFF);
|
||||||
|
EEPROM.write(2208,presetCycleMin);
|
||||||
|
EEPROM.write(2209,presetCycleMax);
|
||||||
|
EEPROM.write(2210,presetApplyBri);
|
||||||
|
EEPROM.write(2211,presetApplyCol);
|
||||||
|
EEPROM.write(2212,presetApplyFx);
|
||||||
|
saveCurrPresetCycConf = false;
|
||||||
|
}
|
||||||
|
|
||||||
EEPROM.commit();
|
EEPROM.commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -260,7 +280,7 @@ void loadSettingsFromEEPROM(bool first)
|
|||||||
if (apChannel > 13 || apChannel < 1) apChannel = 1;
|
if (apChannel > 13 || apChannel < 1) apChannel = 1;
|
||||||
apHide = EEPROM.read(228);
|
apHide = EEPROM.read(228);
|
||||||
if (apHide > 1) apHide = 1;
|
if (apHide > 1) apHide = 1;
|
||||||
ledCount = ((EEPROM.read(229) << 0) & 0xFF) + ((EEPROM.read(398) << 8) & 0xFF00); if (ledCount > 1200) ledCount = 10;
|
ledCount = ((EEPROM.read(229) << 0) & 0xFF) + ((EEPROM.read(398) << 8) & 0xFF00); if (ledCount > 1200 || ledCount == 0) ledCount = 10;
|
||||||
notifyButton = EEPROM.read(230);
|
notifyButton = EEPROM.read(230);
|
||||||
notifyTwice = EEPROM.read(231);
|
notifyTwice = EEPROM.read(231);
|
||||||
buttonEnabled = EEPROM.read(232);
|
buttonEnabled = EEPROM.read(232);
|
||||||
@ -416,14 +436,37 @@ void loadSettingsFromEEPROM(bool first)
|
|||||||
macroCountdown = EEPROM.read(2180);
|
macroCountdown = EEPROM.read(2180);
|
||||||
macroNl = EEPROM.read(2181);
|
macroNl = EEPROM.read(2181);
|
||||||
}
|
}
|
||||||
|
receiveDirect = !EEPROM.read(2200);
|
||||||
|
enableRealtimeUI = EEPROM.read(2201);
|
||||||
|
uiConfiguration = EEPROM.read(2202);
|
||||||
|
|
||||||
|
#ifdef WLED_FLASH_512K_MODE
|
||||||
|
uiConfiguration = 1;
|
||||||
|
//force default UI since mobile is unavailable
|
||||||
|
#endif
|
||||||
|
|
||||||
|
autoRGBtoRGBW = EEPROM.read(2203);
|
||||||
|
skipFirstLed = EEPROM.read(2204);
|
||||||
|
|
||||||
|
if (EEPROM.read(2210) || EEPROM.read(2211) || EEPROM.read(2212))
|
||||||
|
{
|
||||||
|
presetCyclingEnabled = EEPROM.read(2205);
|
||||||
|
presetCycleTime = ((EEPROM.read(2206) << 0) & 0xFF) + ((EEPROM.read(2207) << 8) & 0xFF00);
|
||||||
|
presetCycleMin = EEPROM.read(2208);
|
||||||
|
presetCycleMax = EEPROM.read(2209);
|
||||||
|
presetApplyBri = EEPROM.read(2210);
|
||||||
|
presetApplyCol = EEPROM.read(2211);
|
||||||
|
presetApplyFx = EEPROM.read(2212);
|
||||||
|
}
|
||||||
|
|
||||||
bootPreset = EEPROM.read(389);
|
bootPreset = EEPROM.read(389);
|
||||||
wifiLock = EEPROM.read(393);
|
wifiLock = EEPROM.read(393);
|
||||||
utcOffsetSecs = ((EEPROM.read(394) << 0) & 0xFF) + ((EEPROM.read(395) << 8) & 0xFF00);
|
utcOffsetSecs = ((EEPROM.read(394) << 0) & 0xFF) + ((EEPROM.read(395) << 8) & 0xFF00);
|
||||||
if (EEPROM.read(396)) utcOffsetSecs = -utcOffsetSecs; //negative
|
if (EEPROM.read(396)) utcOffsetSecs = -utcOffsetSecs; //negative
|
||||||
initLedsLast = EEPROM.read(397);
|
initLedsLast = EEPROM.read(397);
|
||||||
|
disableSecTransition = EEPROM.read(399);
|
||||||
|
|
||||||
//favorite setting memory (25 slots/ each 20byte)
|
//favorite setting (preset) memory (25 slots/ each 20byte)
|
||||||
//400 - 899 reserved
|
//400 - 899 reserved
|
||||||
|
|
||||||
currentTheme = EEPROM.read(948);
|
currentTheme = EEPROM.read(948);
|
||||||
|
@ -142,6 +142,7 @@ String getSettings(byte subPage)
|
|||||||
resp += ds + "CB" + v + colS[2] +";";
|
resp += ds + "CB" + v + colS[2] +";";
|
||||||
resp += ds + "CA" + v + briS +";";
|
resp += ds + "CA" + v + briS +";";
|
||||||
resp += ds + "EW" + c + useRGBW +";";
|
resp += ds + "EW" + c + useRGBW +";";
|
||||||
|
resp += ds + "AW" + c + autoRGBtoRGBW +";";
|
||||||
resp += ds + "CW" + v + whiteS +";";
|
resp += ds + "CW" + v + whiteS +";";
|
||||||
resp += ds + "SR" + v + colSecS[0] +";";
|
resp += ds + "SR" + v + colSecS[0] +";";
|
||||||
resp += ds + "SG" + v + colSecS[1] +";";
|
resp += ds + "SG" + v + colSecS[1] +";";
|
||||||
@ -158,6 +159,7 @@ String getSettings(byte subPage)
|
|||||||
resp += ds + "TS" + c + sweepTransition +";";
|
resp += ds + "TS" + c + sweepTransition +";";
|
||||||
resp += ds + "TI" + c + !sweepDirection +";";
|
resp += ds + "TI" + c + !sweepDirection +";";
|
||||||
resp += ds + "TD" + v + transitionDelay +";";
|
resp += ds + "TD" + v + transitionDelay +";";
|
||||||
|
resp += ds + "T2" + c + !disableSecTransition +";";
|
||||||
resp += ds + "BF" + v + briMultiplier +";";
|
resp += ds + "BF" + v + briMultiplier +";";
|
||||||
resp += ds + "TB" + v + nightlightTargetBri +";";
|
resp += ds + "TB" + v + nightlightTargetBri +";";
|
||||||
resp += ds + "TL" + v + nightlightDelayMins +";";
|
resp += ds + "TL" + v + nightlightDelayMins +";";
|
||||||
@ -165,10 +167,12 @@ String getSettings(byte subPage)
|
|||||||
resp += ds + "RV" + c + reverseMode +";";
|
resp += ds + "RV" + c + reverseMode +";";
|
||||||
resp += ds + "EI" + c + initLedsLast +";";
|
resp += ds + "EI" + c + initLedsLast +";";
|
||||||
resp += ds + "WO" + v + arlsOffset +";";
|
resp += ds + "WO" + v + arlsOffset +";";
|
||||||
|
resp += ds + "SL" + c + skipFirstLed +";";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (subPage == 3)
|
if (subPage == 3)
|
||||||
{
|
{
|
||||||
|
resp += ds + "UI" + si + String(uiConfiguration) + ";";
|
||||||
resp += ds + "DS" + v + "\"" + serverDescription + "\";";
|
resp += ds + "DS" + v + "\"" + serverDescription + "\";";
|
||||||
resp += ds + "MD" + c + useHSBDefault + ";";
|
resp += ds + "MD" + c + useHSBDefault + ";";
|
||||||
resp += ds + "TH" + si + String(currentTheme) + ";";
|
resp += ds + "TH" + si + String(currentTheme) + ";";
|
||||||
@ -188,6 +192,8 @@ String getSettings(byte subPage)
|
|||||||
resp += ds + "SB" + c + notifyButton +";";
|
resp += ds + "SB" + c + notifyButton +";";
|
||||||
resp += ds + "SH" + c + notifyHue +";";
|
resp += ds + "SH" + c + notifyHue +";";
|
||||||
resp += ds + "S2" + c + notifyTwice +";";
|
resp += ds + "S2" + c + notifyTwice +";";
|
||||||
|
resp += ds + "RD" + c + receiveDirect +";";
|
||||||
|
resp += ds + "RU" + c + enableRealtimeUI +";";
|
||||||
resp += ds + "AL" + c + alexaEnabled +";";
|
resp += ds + "AL" + c + alexaEnabled +";";
|
||||||
resp += ds + "AI" + v + "\"" + alexaInvocationName + "\";";
|
resp += ds + "AI" + v + "\"" + alexaInvocationName + "\";";
|
||||||
resp += ds + "SA" + c + alexaNotify +";";
|
resp += ds + "SA" + c + alexaNotify +";";
|
||||||
|
@ -121,7 +121,9 @@ void handleSettingsSet(byte subPage)
|
|||||||
if (ledCount > 600) ledCount = 600;
|
if (ledCount > 600) ledCount = 600;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
ccIndex2 = ledCount -1;
|
||||||
useRGBW = server.hasArg("EW");
|
useRGBW = server.hasArg("EW");
|
||||||
|
autoRGBtoRGBW = server.hasArg("AW");
|
||||||
if (server.hasArg("IS")) //ignore settings and save current brightness, colors and fx as default
|
if (server.hasArg("IS")) //ignore settings and save current brightness, colors and fx as default
|
||||||
{
|
{
|
||||||
colS[0] = col[0];
|
colS[0] = col[0];
|
||||||
@ -193,6 +195,7 @@ void handleSettingsSet(byte subPage)
|
|||||||
if (i >= 0 && i <= 255) effectIntensityDefault = i;
|
if (i >= 0 && i <= 255) effectIntensityDefault = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
saveCurrPresetCycConf = server.hasArg("PC");
|
||||||
turnOnAtBoot = server.hasArg("BO");
|
turnOnAtBoot = server.hasArg("BO");
|
||||||
if (server.hasArg("BP"))
|
if (server.hasArg("BP"))
|
||||||
{
|
{
|
||||||
@ -211,6 +214,7 @@ void handleSettingsSet(byte subPage)
|
|||||||
transitionDelay = i;
|
transitionDelay = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
disableSecTransition = !server.hasArg("T2");
|
||||||
if (server.hasArg("TB"))
|
if (server.hasArg("TB"))
|
||||||
{
|
{
|
||||||
nightlightTargetBri = server.arg("TB").toInt();
|
nightlightTargetBri = server.arg("TB").toInt();
|
||||||
@ -229,6 +233,7 @@ void handleSettingsSet(byte subPage)
|
|||||||
int i = server.arg("WO").toInt();
|
int i = server.arg("WO").toInt();
|
||||||
if (i >= -255 && i <= 255) arlsOffset = i;
|
if (i >= -255 && i <= 255) arlsOffset = i;
|
||||||
}
|
}
|
||||||
|
skipFirstLed = server.hasArg("SL");
|
||||||
if (server.hasArg("BF"))
|
if (server.hasArg("BF"))
|
||||||
{
|
{
|
||||||
int i = server.arg("BF").toInt();
|
int i = server.arg("BF").toInt();
|
||||||
@ -239,6 +244,7 @@ void handleSettingsSet(byte subPage)
|
|||||||
//UI
|
//UI
|
||||||
if (subPage == 3)
|
if (subPage == 3)
|
||||||
{
|
{
|
||||||
|
if (server.hasArg("UI")) uiConfiguration = server.arg("UI").toInt();
|
||||||
if (server.hasArg("DS")) serverDescription = server.arg("DS");
|
if (server.hasArg("DS")) serverDescription = server.arg("DS");
|
||||||
useHSBDefault = server.hasArg("MD");
|
useHSBDefault = server.hasArg("MD");
|
||||||
useHSB = useHSBDefault;
|
useHSB = useHSBDefault;
|
||||||
@ -267,6 +273,8 @@ void handleSettingsSet(byte subPage)
|
|||||||
notifyDirect = notifyDirectDefault;
|
notifyDirect = notifyDirectDefault;
|
||||||
notifyButton = server.hasArg("SB");
|
notifyButton = server.hasArg("SB");
|
||||||
notifyTwice = server.hasArg("S2");
|
notifyTwice = server.hasArg("S2");
|
||||||
|
receiveDirect = server.hasArg("RD");
|
||||||
|
enableRealtimeUI = server.hasArg("RU");
|
||||||
alexaEnabled = server.hasArg("AL");
|
alexaEnabled = server.hasArg("AL");
|
||||||
if (server.hasArg("AI")) alexaInvocationName = server.arg("AI");
|
if (server.hasArg("AI")) alexaInvocationName = server.arg("AI");
|
||||||
alexaNotify = server.hasArg("SA");
|
alexaNotify = server.hasArg("SA");
|
||||||
@ -381,7 +389,7 @@ void handleSettingsSet(byte subPage)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
saveSettingsToEEPROM();
|
saveSettingsToEEPROM();
|
||||||
if (subPage == 2) strip.init(useRGBW,ledCount,PIN);
|
if (subPage == 2) strip.init(useRGBW,ledCount,PIN,skipFirstLed);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool handleSet(String req)
|
bool handleSet(String req)
|
||||||
@ -703,6 +711,8 @@ bool handleSet(String req)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//deactivate nightlight if target brightness is reached
|
||||||
|
if (bri == nightlightTargetBri) nightlightActive = false;
|
||||||
//set time (unix timestamp)
|
//set time (unix timestamp)
|
||||||
pos = req.indexOf("ST=");
|
pos = req.indexOf("ST=");
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
@ -729,6 +739,12 @@ bool handleSet(String req)
|
|||||||
if (_cc_updated) strip.setCustomChase(ccIndex1, ccIndex2, ccStart, ccNumPrimary, ccNumSecondary, ccStep, ccFromStart, ccFromEnd);
|
if (_cc_updated) strip.setCustomChase(ccIndex1, ccIndex2, ccStart, ccNumPrimary, ccNumSecondary, ccStep, ccFromStart, ccFromEnd);
|
||||||
|
|
||||||
//set presets
|
//set presets
|
||||||
|
pos = req.indexOf("P1="); //sets first preset for cycle
|
||||||
|
if (pos > 0) presetCycleMin = req.substring(pos + 3).toInt();
|
||||||
|
|
||||||
|
pos = req.indexOf("P2="); //sets last preset for cycle
|
||||||
|
if (pos > 0) presetCycleMax = req.substring(pos + 3).toInt();
|
||||||
|
|
||||||
if (req.indexOf("CY=") > 0) //preset cycle
|
if (req.indexOf("CY=") > 0) //preset cycle
|
||||||
{
|
{
|
||||||
presetCyclingEnabled = true;
|
presetCyclingEnabled = true;
|
||||||
@ -736,61 +752,36 @@ bool handleSet(String req)
|
|||||||
{
|
{
|
||||||
presetCyclingEnabled = false;
|
presetCyclingEnabled = false;
|
||||||
}
|
}
|
||||||
bool all = true;
|
presetCycCurr = presetCycleMin;
|
||||||
if (req.indexOf("&PA") > 0)
|
|
||||||
{
|
|
||||||
presetCycleBri = true;
|
|
||||||
all = false;
|
|
||||||
}
|
|
||||||
if (req.indexOf("&PC") > 0)
|
|
||||||
{
|
|
||||||
presetCycleCol = true;
|
|
||||||
all = false;
|
|
||||||
}
|
|
||||||
if (req.indexOf("&PX") > 0)
|
|
||||||
{
|
|
||||||
presetCycleFx = true;
|
|
||||||
all = false;
|
|
||||||
}
|
|
||||||
if (all)
|
|
||||||
{
|
|
||||||
presetCycleBri = true;
|
|
||||||
presetCycleCol = true;
|
|
||||||
presetCycleFx = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
pos = req.indexOf("PT="); //sets cycle time in ms
|
pos = req.indexOf("PT="); //sets cycle time in ms
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
int v = req.substring(pos + 3).toInt();
|
int v = req.substring(pos + 3).toInt();
|
||||||
if (v > 49) presetCycleTime = v;
|
if (v > 49) presetCycleTime = v;
|
||||||
}
|
}
|
||||||
pos = req.indexOf("P1="); //sets first preset for cycle
|
if (req.indexOf("PA=") > 0) //apply brightness from preset
|
||||||
if (pos > 0) presetCycleMin = req.substring(pos + 3).toInt();
|
{
|
||||||
|
presetApplyBri = true;
|
||||||
pos = req.indexOf("P2="); //sets last preset for cycle
|
if (req.indexOf("PA=0") > 0) presetApplyBri = false;
|
||||||
if (pos > 0) presetCycleMax = req.substring(pos + 3).toInt();
|
}
|
||||||
|
if (req.indexOf("PC=") > 0) //apply color from preset
|
||||||
|
{
|
||||||
|
presetApplyCol = true;
|
||||||
|
if (req.indexOf("PC=0") > 0) presetApplyCol = false;
|
||||||
|
}
|
||||||
|
if (req.indexOf("PX=") > 0) //apply effects from preset
|
||||||
|
{
|
||||||
|
presetApplyFx = true;
|
||||||
|
if (req.indexOf("PX=0") > 0) presetApplyFx = false;
|
||||||
|
}
|
||||||
pos = req.indexOf("PS="); //saves current in preset
|
pos = req.indexOf("PS="); //saves current in preset
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
savePreset(req.substring(pos + 3).toInt());
|
savePreset(req.substring(pos + 3).toInt());
|
||||||
}
|
}
|
||||||
pos = req.indexOf("PL="); //applies entire preset
|
pos = req.indexOf("PL="); //applies entire preset
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
applyPreset(req.substring(pos + 3).toInt(), true, true, true);
|
applyPreset(req.substring(pos + 3).toInt(), presetApplyBri, presetApplyCol, presetApplyFx);
|
||||||
effectUpdated = true;
|
if (presetApplyFx) effectUpdated = true;
|
||||||
}
|
|
||||||
pos = req.indexOf("PA="); //applies brightness from preset
|
|
||||||
if (pos > 0) {
|
|
||||||
applyPreset(req.substring(pos + 3).toInt(), true, false, false);
|
|
||||||
}
|
|
||||||
pos = req.indexOf("PC="); //applies color from preset
|
|
||||||
if (pos > 0) {
|
|
||||||
applyPreset(req.substring(pos + 3).toInt(), false, true, false);
|
|
||||||
}
|
|
||||||
pos = req.indexOf("PX="); //applies effects from preset
|
|
||||||
if (pos > 0) {
|
|
||||||
applyPreset(req.substring(pos + 3).toInt(), false, false, true);
|
|
||||||
effectUpdated = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//cronixie
|
//cronixie
|
||||||
@ -817,6 +808,15 @@ bool handleSet(String req)
|
|||||||
if (overlayCurrent == 4) strip.setCronixieBacklight(cronixieBacklight);
|
if (overlayCurrent == 4) strip.setCronixieBacklight(cronixieBacklight);
|
||||||
overlayRefreshedTime = 0;
|
overlayRefreshedTime = 0;
|
||||||
}
|
}
|
||||||
|
pos = req.indexOf("U0="); //user var 0
|
||||||
|
if (pos > 0) {
|
||||||
|
userVar0 = req.substring(pos + 3).toInt();
|
||||||
|
}
|
||||||
|
pos = req.indexOf("U1="); //user var 1
|
||||||
|
if (pos > 0) {
|
||||||
|
userVar1 = req.substring(pos + 3).toInt();
|
||||||
|
}
|
||||||
|
//you can add more if you need
|
||||||
|
|
||||||
//internal call, does not send XML response
|
//internal call, does not send XML response
|
||||||
pos = req.indexOf("IN");
|
pos = req.indexOf("IN");
|
||||||
|
@ -13,7 +13,7 @@ void handleSerial()
|
|||||||
strip.setMode(0);
|
strip.setMode(0);
|
||||||
}
|
}
|
||||||
arlsTimeout = true;
|
arlsTimeout = true;
|
||||||
arlsTimeoutTime = millis() + 4900;
|
arlsTimeoutTime = millis() + 5200;
|
||||||
delay(1);
|
delay(1);
|
||||||
byte hi = Serial.read();
|
byte hi = Serial.read();
|
||||||
byte ledc = Serial.read();
|
byte ledc = Serial.read();
|
||||||
|
@ -5,12 +5,12 @@
|
|||||||
void wledInit()
|
void wledInit()
|
||||||
{
|
{
|
||||||
EEPROM.begin(EEPSIZE);
|
EEPROM.begin(EEPSIZE);
|
||||||
ledCount = ((EEPROM.read(229) << 0) & 0xFF) + ((EEPROM.read(398) << 8) & 0xFF00); if (ledCount > 1200) ledCount = 10;
|
ledCount = ((EEPROM.read(229) << 0) & 0xFF) + ((EEPROM.read(398) << 8) & 0xFF00); if (ledCount > 1200 || ledCount == 0) ledCount = 10;
|
||||||
//RMT eats up too much RAM
|
//RMT eats up too much RAM
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
if (ledCount > 600) ledCount = 600;
|
if (ledCount > 600) ledCount = 600;
|
||||||
#endif
|
#endif
|
||||||
if (!EEPROM.read(397)) strip.init(EEPROM.read(372),ledCount,PIN); //quick init
|
if (!EEPROM.read(397)) strip.init(EEPROM.read(372),ledCount,PIN,EEPROM.read(2204)); //quick init
|
||||||
|
|
||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
Serial.setTimeout(50);
|
Serial.setTimeout(50);
|
||||||
@ -40,16 +40,10 @@ void wledInit()
|
|||||||
hueIP[2] = WiFi.localIP()[2];
|
hueIP[2] = WiFi.localIP()[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set up mDNS responder:
|
|
||||||
if (cmDNS != NULL && !onlyAP && !MDNS.begin(cmDNS.c_str())) {
|
|
||||||
DEBUG_PRINTLN("Error setting up MDNS responder!");
|
|
||||||
down();
|
|
||||||
}
|
|
||||||
DEBUG_PRINTLN("mDNS responder started");
|
|
||||||
|
|
||||||
if (udpPort > 0 && udpPort != ntpLocalPort && WiFi.status() == WL_CONNECTED)
|
if (udpPort > 0 && udpPort != ntpLocalPort && WiFi.status() == WL_CONNECTED)
|
||||||
{
|
{
|
||||||
udpConnected = notifierUdp.begin(udpPort);
|
udpConnected = notifierUdp.begin(udpPort);
|
||||||
|
if (udpConnected && udpRgbPort != udpPort) udpRgbConnected = rgbUdp.begin(udpRgbPort);
|
||||||
}
|
}
|
||||||
if (ntpEnabled && WiFi.status() == WL_CONNECTED)
|
if (ntpEnabled && WiFi.status() == WL_CONNECTED)
|
||||||
ntpConnected = ntpUdp.begin(ntpLocalPort);
|
ntpConnected = ntpUdp.begin(ntpLocalPort);
|
||||||
@ -171,16 +165,18 @@ void wledInit()
|
|||||||
server.send(200, "text/plain", (String)ESP.getFreeHeap());
|
server.send(200, "text/plain", (String)ESP.getFreeHeap());
|
||||||
});
|
});
|
||||||
|
|
||||||
server.on("/pdebug", HTTP_GET, [](){
|
|
||||||
server.send(200, "text/plain", (String)presetCycleTime);
|
|
||||||
});
|
|
||||||
|
|
||||||
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";
|
val += "mA currently";
|
||||||
serveMessage(200,val,"This is just an estimate (does not take into account several factors like effects and wire resistance). It is NOT an accurate measurement!",254);
|
serveMessage(200,val,"This is just an estimate (does not take into account several factors like effects and wire resistance). It is NOT an accurate measurement!",254);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
server.on("/u", HTTP_GET, [](){
|
||||||
|
server.setContentLength(strlen_P(PAGE_usermod));
|
||||||
|
server.send(200, "text/html", "");
|
||||||
|
server.sendContent_P(PAGE_usermod);
|
||||||
|
});
|
||||||
|
|
||||||
server.on("/teapot", HTTP_GET, [](){
|
server.on("/teapot", HTTP_GET, [](){
|
||||||
serveMessage(418, "418. I'm a teapot.","(Tangible Embedded Advanced Project Of Twinkling)",254);
|
serveMessage(418, "418. I'm a teapot.","(Tangible Embedded Advanced Project Of Twinkling)",254);
|
||||||
});
|
});
|
||||||
@ -199,8 +195,6 @@ void wledInit()
|
|||||||
server.on("/edit", HTTP_POST, [](){ server.send(200, "text/plain", ""); }, handleFileUpload);
|
server.on("/edit", HTTP_POST, [](){ server.send(200, "text/plain", ""); }, handleFileUpload);
|
||||||
server.on("/list", HTTP_GET, handleFileList);
|
server.on("/list", HTTP_GET, handleFileList);
|
||||||
#endif
|
#endif
|
||||||
server.on("/down", HTTP_GET, down);
|
|
||||||
server.on("/cleareeprom", HTTP_GET, clearEEPROM);
|
|
||||||
//init ota page
|
//init ota page
|
||||||
httpUpdater.setup(&server);
|
httpUpdater.setup(&server);
|
||||||
} else
|
} else
|
||||||
@ -208,12 +202,6 @@ void wledInit()
|
|||||||
server.on("/edit", HTTP_GET, [](){
|
server.on("/edit", HTTP_GET, [](){
|
||||||
serveMessage(500, "Access Denied", txd, 254);
|
serveMessage(500, "Access Denied", txd, 254);
|
||||||
});
|
});
|
||||||
server.on("/down", HTTP_GET, [](){
|
|
||||||
serveMessage(500, "Access Denied", txd, 254);
|
|
||||||
});
|
|
||||||
server.on("/cleareeprom", HTTP_GET, [](){
|
|
||||||
serveMessage(500, "Access Denied", txd, 254);
|
|
||||||
});
|
|
||||||
server.on("/update", HTTP_GET, [](){
|
server.on("/update", HTTP_GET, [](){
|
||||||
serveMessage(500, "Access Denied", txd, 254);
|
serveMessage(500, "Access Denied", txd, 254);
|
||||||
});
|
});
|
||||||
@ -231,14 +219,21 @@ void wledInit()
|
|||||||
server.send(404, "text/plain", "Not Found");
|
server.send(404, "text/plain", "Not Found");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
#ifndef ARDUINO_ARCH_ESP32
|
||||||
|
const char * headerkeys[] = {"User-Agent"};
|
||||||
|
server.collectHeaders(headerkeys,sizeof(char*));
|
||||||
|
#else
|
||||||
|
String ua = "User-Agent";
|
||||||
|
server.collectHeaders(ua);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!initLedsLast) strip.service();
|
if (!initLedsLast) strip.service();
|
||||||
//init Alexa hue emulation
|
//init Alexa hue emulation
|
||||||
if (alexaEnabled) alexaInit();
|
if (alexaEnabled) alexaInit();
|
||||||
|
|
||||||
server.begin();
|
server.begin();
|
||||||
DEBUG_PRINTLN("HTTP server started");
|
DEBUG_PRINTLN("HTTP server started");
|
||||||
// Add service to MDNS
|
|
||||||
MDNS.addService("http", "tcp", 80);
|
|
||||||
|
|
||||||
//init ArduinoOTA
|
//init ArduinoOTA
|
||||||
if (aOtaEnabled)
|
if (aOtaEnabled)
|
||||||
@ -249,9 +244,20 @@ void wledInit()
|
|||||||
#endif
|
#endif
|
||||||
DEBUG_PRINTLN("Start ArduinoOTA");
|
DEBUG_PRINTLN("Start ArduinoOTA");
|
||||||
});
|
});
|
||||||
|
if (cmDNS.length() > 0) ArduinoOTA.setHostname(cmDNS.c_str());
|
||||||
ArduinoOTA.begin();
|
ArduinoOTA.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!initLedsLast) strip.service();
|
||||||
|
// Set up mDNS responder:
|
||||||
|
if (cmDNS.length() > 0 && !onlyAP)
|
||||||
|
{
|
||||||
|
MDNS.begin(cmDNS.c_str());
|
||||||
|
DEBUG_PRINTLN("mDNS responder started");
|
||||||
|
// Add service to MDNS
|
||||||
|
MDNS.addService("http", "tcp", 80);
|
||||||
|
}
|
||||||
|
|
||||||
if (initLedsLast) initStrip();
|
if (initLedsLast) initStrip();
|
||||||
userBegin();
|
userBegin();
|
||||||
if (macroBoot>0) applyMacro(macroBoot);
|
if (macroBoot>0) applyMacro(macroBoot);
|
||||||
@ -261,13 +267,15 @@ void wledInit()
|
|||||||
void initStrip()
|
void initStrip()
|
||||||
{
|
{
|
||||||
// Initialize NeoPixel Strip and button
|
// Initialize NeoPixel Strip and button
|
||||||
if (initLedsLast) strip.init(useRGBW,ledCount,PIN);
|
if (initLedsLast) strip.init(useRGBW,ledCount,PIN,skipFirstLed);
|
||||||
strip.setReverseMode(reverseMode);
|
strip.setReverseMode(reverseMode);
|
||||||
strip.setColor(0);
|
strip.setColor(0);
|
||||||
strip.setBrightness(255);
|
strip.setBrightness(255);
|
||||||
strip.start();
|
strip.start();
|
||||||
|
|
||||||
pinMode(buttonPin, INPUT_PULLUP);
|
pinMode(buttonPin, INPUT_PULLUP);
|
||||||
|
pinMode(4,OUTPUT); //this is only needed in special cases
|
||||||
|
digitalWrite(4,LOW);
|
||||||
|
|
||||||
if (bootPreset>0) applyPreset(bootPreset, turnOnAtBoot, true, true);
|
if (bootPreset>0) applyPreset(bootPreset, turnOnAtBoot, true, true);
|
||||||
colorUpdated(0);
|
colorUpdated(0);
|
||||||
@ -305,7 +313,13 @@ void initCon()
|
|||||||
}
|
}
|
||||||
int fail_count = 0;
|
int fail_count = 0;
|
||||||
if (clientSSID.length() <1 || clientSSID.equals("Your_Network")) fail_count = apWaitTimeSecs*2;
|
if (clientSSID.length() <1 || clientSSID.equals("Your_Network")) fail_count = apWaitTimeSecs*2;
|
||||||
|
#ifndef ARDUINO_ARCH_ESP32
|
||||||
|
WiFi.hostname(serverDescription);
|
||||||
|
#endif
|
||||||
WiFi.begin(clientSSID.c_str(), clientPass.c_str());
|
WiFi.begin(clientSSID.c_str(), clientPass.c_str());
|
||||||
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
|
WiFi.setHostname(serverDescription.c_str());
|
||||||
|
#endif
|
||||||
unsigned long lastTry = 0;
|
unsigned long lastTry = 0;
|
||||||
bool con = false;
|
bool con = false;
|
||||||
while(!con)
|
while(!con)
|
||||||
@ -386,19 +400,46 @@ void serveIndexOrWelcome()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void serveRealtimeError(bool settings)
|
||||||
|
{
|
||||||
|
String mesg = "The ";
|
||||||
|
mesg += (settings)?"settings":"WLED";
|
||||||
|
mesg += " UI is not available while receiving real-time data (UDP from ";
|
||||||
|
mesg += realtimeIP[0];
|
||||||
|
for (int i = 1; i < 4; i++)
|
||||||
|
{
|
||||||
|
mesg += ".";
|
||||||
|
mesg += realtimeIP[i];
|
||||||
|
}
|
||||||
|
mesg += ").";
|
||||||
|
server.send(200, "text/plain", mesg);
|
||||||
|
}
|
||||||
|
|
||||||
void serveIndex()
|
void serveIndex()
|
||||||
{
|
{
|
||||||
if (!arlsTimeout) //do not serve while receiving realtime
|
bool serveMobile = false;
|
||||||
|
if (uiConfiguration == 0) serveMobile = checkClientIsMobile(server.header("User-Agent"));
|
||||||
|
else if (uiConfiguration == 2) serveMobile = true;
|
||||||
|
|
||||||
|
if (!arlsTimeout || enableRealtimeUI) //do not serve while receiving realtime
|
||||||
{
|
{
|
||||||
server.setContentLength(strlen_P(PAGE_index0) + cssColorString.length() + strlen_P(PAGE_index1) + strlen_P(PAGE_index2) + strlen_P(PAGE_index3));
|
if (serveMobile)
|
||||||
server.send(200, "text/html", "");
|
{
|
||||||
server.sendContent_P(PAGE_index0);
|
server.setContentLength(strlen_P(PAGE_indexM));
|
||||||
server.sendContent(cssColorString);
|
server.send(200, "text/html", "");
|
||||||
server.sendContent_P(PAGE_index1);
|
server.sendContent_P(PAGE_indexM);
|
||||||
server.sendContent_P(PAGE_index2);
|
} else
|
||||||
server.sendContent_P(PAGE_index3);
|
{
|
||||||
|
server.setContentLength(strlen_P(PAGE_index0) + cssColorString.length() + strlen_P(PAGE_index1) + strlen_P(PAGE_index2) + strlen_P(PAGE_index3));
|
||||||
|
server.send(200, "text/html", "");
|
||||||
|
server.sendContent_P(PAGE_index0);
|
||||||
|
server.sendContent(cssColorString);
|
||||||
|
server.sendContent_P(PAGE_index1);
|
||||||
|
server.sendContent_P(PAGE_index2);
|
||||||
|
server.sendContent_P(PAGE_index3);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
server.send(200, "text/plain", "The WLED UI is not available while receiving real-time data.");
|
serveRealtimeError(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -436,7 +477,7 @@ void serveMessage(int code, String headl, String subl="", int optionType)
|
|||||||
void serveSettings(byte subPage)
|
void serveSettings(byte subPage)
|
||||||
{
|
{
|
||||||
//0: menu 1: wifi 2: leds 3: ui 4: sync 5: time 6: sec 255: welcomepage
|
//0: menu 1: wifi 2: leds 3: ui 4: sync 5: time 6: sec 255: welcomepage
|
||||||
if (!arlsTimeout) //do not serve while receiving realtime
|
if (!arlsTimeout || enableRealtimeUI) //do not serve while receiving realtime
|
||||||
{
|
{
|
||||||
int pl0, pl1;
|
int pl0, pl1;
|
||||||
switch (subPage)
|
switch (subPage)
|
||||||
@ -483,7 +524,7 @@ void serveSettings(byte subPage)
|
|||||||
default: server.sendContent_P(PAGE_settings1);
|
default: server.sendContent_P(PAGE_settings1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
server.send(200, "text/plain", "The settings are not available while receiving real-time data.");
|
serveRealtimeError(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -518,5 +559,14 @@ String getBuildInfo()
|
|||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool checkClientIsMobile(String useragent)
|
||||||
|
{
|
||||||
|
//to save complexity this function is not comprehensive
|
||||||
|
if (useragent.indexOf("Android") >= 0) return true;
|
||||||
|
if (useragent.indexOf("iPhone") >= 0) return true;
|
||||||
|
if (useragent.indexOf("iPod") >= 0) return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
* EEPROM bytes 2944 to 3071 are reserved for your custom use case.
|
* EEPROM bytes 2944 to 3071 are reserved for your custom use case.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
//Use userVar0 and userVar1 (API calls &U0=,&U1=, uint16_t)
|
||||||
|
|
||||||
void userBeginPreConnection()
|
void userBeginPreConnection()
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -18,4 +20,3 @@ void userLoop()
|
|||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,14 +50,60 @@ void notify(byte callMode, bool followUp=false)
|
|||||||
notificationTwoRequired = (followUp)? false:notifyTwice;
|
notificationTwoRequired = (followUp)? false:notifyTwice;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void arlsLock(uint32_t timeoutMs)
|
||||||
|
{
|
||||||
|
if (!arlsTimeout){
|
||||||
|
strip.setRange(0, ledCount-1, 0);
|
||||||
|
strip.setMode(0);
|
||||||
|
}
|
||||||
|
arlsTimeout = true;
|
||||||
|
arlsTimeoutTime = millis() + timeoutMs;
|
||||||
|
}
|
||||||
|
|
||||||
void handleNotifications()
|
void handleNotifications()
|
||||||
{
|
{
|
||||||
|
//send second notification if enabled
|
||||||
if(udpConnected && notificationTwoRequired && millis()-notificationSentTime > 250){
|
if(udpConnected && notificationTwoRequired && millis()-notificationSentTime > 250){
|
||||||
notify(notificationSentCallMode,true);
|
notify(notificationSentCallMode,true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//unlock strip when realtime UDP times out
|
||||||
|
if (arlsTimeout && millis() > arlsTimeoutTime)
|
||||||
|
{
|
||||||
|
strip.unlockAll();
|
||||||
|
if (bri == 0) strip.setBrightness(0);
|
||||||
|
arlsTimeout = false;
|
||||||
|
strip.setMode(effectCurrent);
|
||||||
|
}
|
||||||
|
|
||||||
|
//receive UDP notifications
|
||||||
if(udpConnected && (receiveNotifications || receiveDirect)){
|
if(udpConnected && (receiveNotifications || receiveDirect)){
|
||||||
uint16_t packetSize = notifierUdp.parsePacket();
|
uint16_t packetSize = notifierUdp.parsePacket();
|
||||||
|
|
||||||
|
//hyperion / raw RGB
|
||||||
|
if (!packetSize && udpRgbConnected) {
|
||||||
|
packetSize = rgbUdp.parsePacket();
|
||||||
|
if (!receiveDirect) return;
|
||||||
|
realtimeIP = rgbUdp.remoteIP();
|
||||||
|
if (packetSize > 1026 || packetSize < 3) return;
|
||||||
|
byte udpIn[packetSize];
|
||||||
|
rgbUdp.read(udpIn, packetSize);
|
||||||
|
arlsLock(5200);
|
||||||
|
uint16_t id = 0;
|
||||||
|
for (uint16_t i = 0; i < packetSize -2; i += 3)
|
||||||
|
{
|
||||||
|
if (useGammaCorrectionRGB)
|
||||||
|
{
|
||||||
|
strip.setPixelColor(id, gamma8[udpIn[i]], gamma8[udpIn[i+1]], gamma8[udpIn[i+2]]);
|
||||||
|
} else {
|
||||||
|
strip.setPixelColor(id, udpIn[i], udpIn[i+1], udpIn[i+2]);
|
||||||
|
}
|
||||||
|
id++; if (id >= ledCount) break;
|
||||||
|
}
|
||||||
|
strip.show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (packetSize > 1026) return;
|
if (packetSize > 1026) return;
|
||||||
if(packetSize && notifierUdp.remoteIP() != WiFi.localIP()) //don't process broadcasts we send ourselves
|
if(packetSize && notifierUdp.remoteIP() != WiFi.localIP()) //don't process broadcasts we send ourselves
|
||||||
{
|
{
|
||||||
@ -107,23 +153,19 @@ void handleNotifications()
|
|||||||
if (receiveNotificationBrightness) bri = udpIn[2];
|
if (receiveNotificationBrightness) bri = udpIn[2];
|
||||||
colorUpdated(3);
|
colorUpdated(3);
|
||||||
}
|
}
|
||||||
} else if (udpIn[0] > 0 && udpIn[0] < 4) //1 warls //2 drgb //3 drgbw
|
} else if (udpIn[0] > 0 && udpIn[0] < 4 && receiveDirect) //1 warls //2 drgb //3 drgbw
|
||||||
{
|
{
|
||||||
|
realtimeIP = notifierUdp.remoteIP();
|
||||||
if (packetSize > 1) {
|
if (packetSize > 1) {
|
||||||
if (udpIn[1] == 0)
|
if (udpIn[1] == 0)
|
||||||
{
|
{
|
||||||
arlsTimeout = false;
|
arlsTimeout = false;
|
||||||
} else {
|
} else {
|
||||||
if (!arlsTimeout){
|
arlsLock(udpIn[1]*1000);
|
||||||
strip.setRange(0, ledCount-1, 0);
|
|
||||||
strip.setMode(0);
|
|
||||||
}
|
|
||||||
arlsTimeout = true;
|
|
||||||
arlsTimeoutTime = millis() + 1000*udpIn[1];
|
|
||||||
}
|
}
|
||||||
if (udpIn[0] == 1) //warls
|
if (udpIn[0] == 1) //warls
|
||||||
{
|
{
|
||||||
for (int i = 2; i < packetSize -3; i += 4)
|
for (uint16_t i = 2; i < packetSize -3; i += 4)
|
||||||
{
|
{
|
||||||
if (udpIn[i] + arlsOffset < ledCount && udpIn[i] + arlsOffset >= 0)
|
if (udpIn[i] + arlsOffset < ledCount && udpIn[i] + arlsOffset >= 0)
|
||||||
if (useGammaCorrectionRGB)
|
if (useGammaCorrectionRGB)
|
||||||
@ -133,10 +175,10 @@ void handleNotifications()
|
|||||||
strip.setPixelColor(udpIn[i] + arlsOffset, udpIn[i+1], udpIn[i+2], udpIn[i+3]);
|
strip.setPixelColor(udpIn[i] + arlsOffset, udpIn[i+1], udpIn[i+2], udpIn[i+3]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (udpIn[0] == 2 && receiveDirect) //drgb
|
} else if (udpIn[0] == 2) //drgb
|
||||||
{
|
{
|
||||||
int id = 0;
|
uint16_t id = 0;
|
||||||
for (int i = 2; i < packetSize -2; i += 3)
|
for (uint16_t i = 2; i < packetSize -2; i += 3)
|
||||||
{
|
{
|
||||||
if (useGammaCorrectionRGB)
|
if (useGammaCorrectionRGB)
|
||||||
{
|
{
|
||||||
@ -146,10 +188,10 @@ void handleNotifications()
|
|||||||
}
|
}
|
||||||
id++; if (id >= ledCount) break;
|
id++; if (id >= ledCount) break;
|
||||||
}
|
}
|
||||||
} else if (udpIn[0] == 3 && receiveDirect) //drgbw
|
} else if (udpIn[0] == 3) //drgbw
|
||||||
{
|
{
|
||||||
int id = 0;
|
uint16_t id = 0;
|
||||||
for (int i = 2; i < packetSize -3; i += 4)
|
for (uint16_t i = 2; i < packetSize -3; i += 4)
|
||||||
{
|
{
|
||||||
if (useGammaCorrectionRGB)
|
if (useGammaCorrectionRGB)
|
||||||
{
|
{
|
||||||
@ -165,13 +207,6 @@ void handleNotifications()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (arlsTimeout && millis() > arlsTimeoutTime)
|
|
||||||
{
|
|
||||||
strip.unlockAll();
|
|
||||||
if (bri == 0) strip.setBrightness(0);
|
|
||||||
arlsTimeout = false;
|
|
||||||
strip.setMode(effectCurrent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -12,28 +12,44 @@ void setAllLeds() {
|
|||||||
} else {
|
} else {
|
||||||
strip.setBrightness(val);
|
strip.setBrightness(val);
|
||||||
}
|
}
|
||||||
|
if (disableSecTransition)
|
||||||
|
{
|
||||||
|
for (byte i = 0; i<3; i++)
|
||||||
|
{
|
||||||
|
colSecT[i] = colSec[i];
|
||||||
|
}
|
||||||
|
whiteSecT = whiteSec;
|
||||||
|
}
|
||||||
|
if (autoRGBtoRGBW)
|
||||||
|
{
|
||||||
|
colorRGBtoRGBW(colT,&whiteT);
|
||||||
|
colorRGBtoRGBW(colSecT,&whiteSecT);
|
||||||
|
}
|
||||||
if (useGammaCorrectionRGB)
|
if (useGammaCorrectionRGB)
|
||||||
{
|
{
|
||||||
strip.setColor(gamma8[colT[0]], gamma8[colT[1]], gamma8[colT[2]], gamma8[whiteT]);
|
strip.setColor(gamma8[colT[0]], gamma8[colT[1]], gamma8[colT[2]], gamma8[whiteT]);
|
||||||
strip.setSecondaryColor(gamma8[colSec[0]], gamma8[colSec[1]], gamma8[colSec[2]], gamma8[whiteSec]);
|
strip.setSecondaryColor(gamma8[colSecT[0]], gamma8[colSecT[1]], gamma8[colSecT[2]], gamma8[whiteSecT]);
|
||||||
} else {
|
} else {
|
||||||
strip.setColor(colT[0], colT[1], colT[2], whiteT);
|
strip.setColor(colT[0], colT[1], colT[2], whiteT);
|
||||||
strip.setSecondaryColor(colSec[0], colSec[1], colSec[2], whiteSec);
|
strip.setSecondaryColor(colSecT[0], colSecT[1], colSecT[2], whiteSecT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setLedsStandard()
|
void setLedsStandard()
|
||||||
{
|
{
|
||||||
colOld[0] = col[0];
|
for (byte i = 0; i<3; i++)
|
||||||
colOld[1] = col[1];
|
{
|
||||||
colOld[2] = col[2];
|
colOld[i] = col[i];
|
||||||
|
colT[i] = col[i];
|
||||||
|
colSecOld[i] = colSec[i];
|
||||||
|
colSecT[i] = colSec[i];
|
||||||
|
}
|
||||||
whiteOld = white;
|
whiteOld = white;
|
||||||
briOld = bri;
|
briOld = bri;
|
||||||
colT[0] = col[0];
|
whiteSecOld = whiteSec;
|
||||||
colT[1] = col[1];
|
|
||||||
colT[2] = col[2];
|
|
||||||
whiteT = white;
|
whiteT = white;
|
||||||
briT = bri;
|
briT = bri;
|
||||||
|
whiteSecT = whiteSec;
|
||||||
setAllLeds();
|
setAllLeds();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,6 +102,10 @@ void colorUpdated(int callMode)
|
|||||||
colOld[1] = colT[1];
|
colOld[1] = colT[1];
|
||||||
colOld[2] = colT[2];
|
colOld[2] = colT[2];
|
||||||
whiteOld = whiteT;
|
whiteOld = whiteT;
|
||||||
|
colSecOld[0] = colSecT[0];
|
||||||
|
colSecOld[1] = colSecT[1];
|
||||||
|
colSecOld[2] = colSecT[2];
|
||||||
|
whiteSecOld = whiteSecT;
|
||||||
briOld = briT;
|
briOld = briT;
|
||||||
tperLast = 0;
|
tperLast = 0;
|
||||||
}
|
}
|
||||||
@ -120,10 +140,13 @@ void handleTransitions()
|
|||||||
tperLast = tper;
|
tperLast = tper;
|
||||||
if (fadeTransition)
|
if (fadeTransition)
|
||||||
{
|
{
|
||||||
colT[0] = colOld[0]+((col[0] - colOld[0])*tper);
|
for (byte i = 0; i<3; i++)
|
||||||
colT[1] = colOld[1]+((col[1] - colOld[1])*tper);
|
{
|
||||||
colT[2] = colOld[2]+((col[2] - colOld[2])*tper);
|
colT[i] = colOld[i]+((col[i] - colOld[i])*tper);
|
||||||
|
colSecT[i] = colSecOld[i]+((colSec[i] - colSecOld[i])*tper);
|
||||||
|
}
|
||||||
whiteT = whiteOld +((white - whiteOld )*tper);
|
whiteT = whiteOld +((white - whiteOld )*tper);
|
||||||
|
whiteSecT = whiteSecOld +((whiteSec - whiteSecOld )*tper);
|
||||||
briT = briOld +((bri - briOld )*tper);
|
briT = briOld +((bri - briOld )*tper);
|
||||||
}
|
}
|
||||||
if (sweepTransition)
|
if (sweepTransition)
|
||||||
@ -181,7 +204,7 @@ void handleNightlight()
|
|||||||
//also handle preset cycle here
|
//also handle preset cycle here
|
||||||
if (presetCyclingEnabled && (millis() - presetCycledTime > presetCycleTime))
|
if (presetCyclingEnabled && (millis() - presetCycledTime > presetCycleTime))
|
||||||
{
|
{
|
||||||
applyPreset(presetCycCurr,presetCycleBri,presetCycleCol,presetCycleFx);
|
applyPreset(presetCycCurr,presetApplyBri,presetApplyCol,presetApplyFx);
|
||||||
presetCycCurr++; if (presetCycCurr > presetCycleMax) presetCycCurr = presetCycleMin;
|
presetCycCurr++; if (presetCycCurr > presetCycleMax) presetCycCurr = presetCycleMin;
|
||||||
if (presetCycCurr > 25) presetCycCurr = 1;
|
if (presetCycCurr > 25) presetCycCurr = 1;
|
||||||
colorUpdated(8);
|
colorUpdated(8);
|
||||||
|
@ -115,8 +115,6 @@ void colorRGBtoXY(byte* rgb, float* xy) //rgb to coordinates (https://www.develo
|
|||||||
xy[1] = Y / (X + Y + Z);
|
xy[1] = Y / (X + Y + Z);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*//For some reason min and max are not declared here
|
|
||||||
|
|
||||||
float minf (float v, float w)
|
float minf (float v, float w)
|
||||||
{
|
{
|
||||||
if (w > v) return v;
|
if (w > v) return v;
|
||||||
@ -129,11 +127,12 @@ float maxf (float v, float w)
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
void colorRGBtoRGBW(byte* rgb, byte* wht) //rgb to rgbw, untested and currently unused
|
void colorRGBtoRGBW(byte* rgb, byte* wht) //rgb to rgbw (http://codewelt.com/rgbw)
|
||||||
{
|
{
|
||||||
*wht = (float)minf(rgb[0],minf(rgb[1],rgb[2]))*0.95;
|
float low = minf(rgb[0],minf(rgb[1],rgb[2]));
|
||||||
rgb[0]-=wht;
|
float high = maxf(rgb[0],maxf(rgb[1],rgb[2]));
|
||||||
rgb[1]-=wht;
|
if (high < 0.1f) return;
|
||||||
rgb[2]-=wht;
|
float sat = 255.0f * ((high - low) / high);
|
||||||
}*/
|
*wht = (byte)((255.0f - sat) / 255.0f * (rgb[0] + rgb[1] + rgb[2]) / 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user