Merge branch 'master' into CCT-support
This commit is contained in:
commit
16d97d3c63
14
CHANGELOG.md
14
CHANGELOG.md
@ -2,7 +2,18 @@
|
|||||||
|
|
||||||
### Builds after release 0.12.0
|
### Builds after release 0.12.0
|
||||||
|
|
||||||
#### Build 2111160
|
#### Build 2111220
|
||||||
|
|
||||||
|
- Fixed preset cycle not working from preset called by UI
|
||||||
|
- Reintroduced permanent min. and max. cycle bounds
|
||||||
|
|
||||||
|
#### Build 2111190
|
||||||
|
|
||||||
|
- Changed default ESP32 LED pin from 16 to 2
|
||||||
|
- Renamed "Running 2" to "Chase 2"
|
||||||
|
- Renamed "Tri Chase" to "Chase 3"
|
||||||
|
|
||||||
|
#### Build 2111170
|
||||||
|
|
||||||
- Version bump to 0.13.0-b5 "Toki"
|
- Version bump to 0.13.0-b5 "Toki"
|
||||||
- Improv Serial support (PR #2334)
|
- Improv Serial support (PR #2334)
|
||||||
@ -388,6 +399,7 @@
|
|||||||
- Added support for WESP32 ethernet board (PR #1764)
|
- Added support for WESP32 ethernet board (PR #1764)
|
||||||
- Added Caching for main UI (PR #1704)
|
- Added Caching for main UI (PR #1704)
|
||||||
- Added Tetrix mode (PR #1729)
|
- Added Tetrix mode (PR #1729)
|
||||||
|
- Removed Merry Christmas mode (use "Chase 2" - called Running 2 before 0.13.0)
|
||||||
- Added memory check on Bus creation
|
- Added memory check on Bus creation
|
||||||
|
|
||||||
#### Build 2102050
|
#### Build 2102050
|
||||||
|
@ -51,7 +51,7 @@ A fast and feature-rich implementation of an ESP8266/ESP32 webserver to control
|
|||||||
|
|
||||||
See the [documentation on our official site](https://kno.wled.ge)!
|
See the [documentation on our official site](https://kno.wled.ge)!
|
||||||
|
|
||||||
[On this page](https://github.com/Aircoookie/WLED/wiki/Learning-the-ropes) you can find excellent tutorials made by the community and helpful tools to help you get your new lamp up and running!
|
[On this page](https://kno.wled.ge/basics/tutorials/) you can find excellent tutorials made by the community and helpful tools to help you get your new lamp up and running!
|
||||||
|
|
||||||
## 🖼️ Images
|
## 🖼️ Images
|
||||||
<img src="/images/macbook-pro-space-gray-on-the-wooden-table.jpg" width="50%"><img src="/images/walking-with-iphone-x.jpg" width="50%">
|
<img src="/images/macbook-pro-space-gray-on-the-wooden-table.jpg" width="50%"><img src="/images/walking-with-iphone-x.jpg" width="50%">
|
||||||
@ -82,7 +82,7 @@ Any | 5v 3-pin ARGB for PC | Any PC RGB device that supports the 5v 3-pin ARGB m
|
|||||||
## ✌️ Other
|
## ✌️ Other
|
||||||
|
|
||||||
Licensed under the MIT license
|
Licensed under the MIT license
|
||||||
Credits [here](https://github.com/Aircoookie/WLED/wiki/Contributors-&-About)!
|
Credits [here](https://kno.wled.ge/about/contributors/)!
|
||||||
|
|
||||||
Uses Linearicons by Perxis!
|
Uses Linearicons by Perxis!
|
||||||
|
|
||||||
|
@ -925,9 +925,9 @@ const char JSON_mode_names[] PROGMEM = R"=====([
|
|||||||
"Solid","Blink","Breathe","Wipe","Wipe Random","Random Colors","Sweep","Dynamic","Colorloop","Rainbow",
|
"Solid","Blink","Breathe","Wipe","Wipe Random","Random Colors","Sweep","Dynamic","Colorloop","Rainbow",
|
||||||
"Scan","Scan Dual","Fade","Theater","Theater Rainbow","Running","Saw","Twinkle","Dissolve","Dissolve Rnd",
|
"Scan","Scan Dual","Fade","Theater","Theater Rainbow","Running","Saw","Twinkle","Dissolve","Dissolve Rnd",
|
||||||
"Sparkle","Sparkle Dark","Sparkle+","Strobe","Strobe Rainbow","Strobe Mega","Blink Rainbow","Android","Chase","Chase Random",
|
"Sparkle","Sparkle Dark","Sparkle+","Strobe","Strobe Rainbow","Strobe Mega","Blink Rainbow","Android","Chase","Chase Random",
|
||||||
"Chase Rainbow","Chase Flash","Chase Flash Rnd","Rainbow Runner","Colorful","Traffic Light","Sweep Random","Running 2","Aurora","Stream",
|
"Chase Rainbow","Chase Flash","Chase Flash Rnd","Rainbow Runner","Colorful","Traffic Light","Sweep Random","Chase 2","Aurora","Stream",
|
||||||
"Scanner","Lighthouse","Fireworks","Rain","Tetrix","Fire Flicker","Gradient","Loading","Police","Police All",
|
"Scanner","Lighthouse","Fireworks","Rain","Tetrix","Fire Flicker","Gradient","Loading","Police","Police All",
|
||||||
"Two Dots","Two Areas","Running Dual","Halloween","Tri Chase","Tri Wipe","Tri Fade","Lightning","ICU","Multi Comet",
|
"Two Dots","Two Areas","Running Dual","Halloween","Chase 3","Tri Wipe","Tri Fade","Lightning","ICU","Multi Comet",
|
||||||
"Scanner Dual","Stream 2","Oscillate","Pride 2015","Juggle","Palette","Fire 2012","Colorwaves","Bpm","Fill Noise",
|
"Scanner Dual","Stream 2","Oscillate","Pride 2015","Juggle","Palette","Fire 2012","Colorwaves","Bpm","Fill Noise",
|
||||||
"Noise 1","Noise 2","Noise 3","Noise 4","Colortwinkles","Lake","Meteor","Meteor Smooth","Railway","Ripple",
|
"Noise 1","Noise 2","Noise 3","Noise 4","Colortwinkles","Lake","Meteor","Meteor Smooth","Railway","Ripple",
|
||||||
"Twinklefox","Twinklecat","Halloween Eyes","Solid Pattern","Solid Pattern Tri","Spots","Spots Fade","Glitter","Candle","Fireworks Starburst",
|
"Twinklefox","Twinklecat","Halloween Eyes","Solid Pattern","Solid Pattern Tri","Spots","Spots Fade","Glitter","Candle","Fireworks Starburst",
|
||||||
|
@ -223,7 +223,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
|
|||||||
CJSON(macroNl, light_nl["macro"]);
|
CJSON(macroNl, light_nl["macro"]);
|
||||||
|
|
||||||
JsonObject def = doc[F("def")];
|
JsonObject def = doc[F("def")];
|
||||||
CJSON(bootPreset, def[F("ps")]);
|
CJSON(bootPreset, def["ps"]);
|
||||||
CJSON(turnOnAtBoot, def["on"]); // true
|
CJSON(turnOnAtBoot, def["on"]); // true
|
||||||
CJSON(briS, def["bri"]); // 128
|
CJSON(briS, def["bri"]); // 128
|
||||||
|
|
||||||
@ -599,7 +599,7 @@ void serializeConfig() {
|
|||||||
light_nl["macro"] = macroNl;
|
light_nl["macro"] = macroNl;
|
||||||
|
|
||||||
JsonObject def = doc.createNestedObject("def");
|
JsonObject def = doc.createNestedObject("def");
|
||||||
def[F("ps")] = bootPreset;
|
def["ps"] = bootPreset;
|
||||||
def["on"] = turnOnAtBoot;
|
def["on"] = turnOnAtBoot;
|
||||||
def["bri"] = briS;
|
def["bri"] = briS;
|
||||||
|
|
||||||
|
@ -313,15 +313,15 @@
|
|||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
#define LEDPIN 2 // GPIO2 (D4) on Wemod D1 mini compatible boards
|
#define LEDPIN 2 // GPIO2 (D4) on Wemod D1 mini compatible boards
|
||||||
#else
|
#else
|
||||||
#define LEDPIN 16 // aligns with GPIO2 (D4) on Wemos D1 mini32 compatible boards
|
#define LEDPIN 2 // Changed from 16 to restore compatibility with ESP32-pico
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef WLED_ENABLE_DMX
|
#ifdef WLED_ENABLE_DMX
|
||||||
#if (LEDPIN == 2)
|
#if (LEDPIN == 2)
|
||||||
#undef LEDPIN
|
#undef LEDPIN
|
||||||
#define LEDPIN 3
|
#define LEDPIN 1
|
||||||
#warning "Pin conflict compiling with DMX and LEDs on pin 2. The default LED pin has been changed to pin 3."
|
#warning "Pin conflict compiling with DMX and LEDs on pin 2. The default LED pin has been changed to pin 1."
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -9,6 +9,10 @@ body {
|
|||||||
hr {
|
hr {
|
||||||
border-color: #666;
|
border-color: #666;
|
||||||
}
|
}
|
||||||
|
a {
|
||||||
|
color: #28f;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
button, .btn {
|
button, .btn {
|
||||||
background: #333;
|
background: #333;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// Autogenerated from wled00/data/style.css, do not edit!!
|
// Autogenerated from wled00/data/style.css, do not edit!!
|
||||||
const char PAGE_settingsCss[] PROGMEM = R"=====(<style>body{font-family:Verdana,sans-serif;text-align:center;background:#222;color:#fff;line-height:200%%;margin:0}hr{border-color:#666}.btn,button{background:#333;color:#fff;font-family:Verdana,sans-serif;border:.3ch solid #333;display:inline-block;font-size:20px;margin:12px 8px 8px;padding:1px 6px;cursor:pointer;text-decoration:none}.lnk{border:0}.helpB{text-align:left;position:absolute;width:60px}input{background:#333;color:#fff;font-family:Verdana,sans-serif;border:.5ch solid #333}input:disabled{color:#888}input[type=number]{width:4em;margin:2px}input[type=number].xxl{width:100px}input[type=number].xl{width:85px}input[type=number].l{width:63px}input[type=number].m{width:56px}input[type=number].s{width:49px}input[type=number].xs{width:42px}input[type=checkbox]{transform:scale(1.5);margin-right:10px}select{background:#333;color:#fff;font-family:Verdana,sans-serif;border:.5ch solid #333}td{padding:2px}.d5{width:4.5em!important}#toast{opacity:0;background-color:#444;border-radius:5px;bottom:64px;color:#fff;font-size:17px;padding:16px;pointer-events:none;position:fixed;text-align:center;z-index:5;transform:translateX(-50%%);max-width:90%%;left:50%%}#toast.show{opacity:1;background-color:#264;animation:fadein .5s,fadein .5s 2.5s reverse}#toast.error{opacity:1;background-color:#b21;animation:fadein .5s}</style>)=====";
|
const char PAGE_settingsCss[] PROGMEM = R"=====(<style>body{font-family:Verdana,sans-serif;text-align:center;background:#222;color:#fff;line-height:200%%;margin:0}hr{border-color:#666}a{color:#28f;text-decoration:none}.btn,button{background:#333;color:#fff;font-family:Verdana,sans-serif;border:.3ch solid #333;display:inline-block;font-size:20px;margin:12px 8px 8px;padding:1px 6px;cursor:pointer;text-decoration:none}.lnk{border:0}.helpB{text-align:left;position:absolute;width:60px}input{background:#333;color:#fff;font-family:Verdana,sans-serif;border:.5ch solid #333}input:disabled{color:#888}input[type=number]{width:4em;margin:2px}input[type=number].xxl{width:100px}input[type=number].xl{width:85px}input[type=number].l{width:63px}input[type=number].m{width:56px}input[type=number].s{width:49px}input[type=number].xs{width:42px}input[type=checkbox]{transform:scale(1.5);margin-right:10px}select{background:#333;color:#fff;font-family:Verdana,sans-serif;border:.5ch solid #333}td{padding:2px}.d5{width:4.5em!important}#toast{opacity:0;background-color:#444;border-radius:5px;bottom:64px;color:#fff;font-size:17px;padding:16px;pointer-events:none;position:fixed;text-align:center;z-index:5;transform:translateX(-50%%);max-width:90%%;left:50%%}#toast.show{opacity:1;background-color:#264;animation:fadein .5s,fadein .5s 2.5s reverse}#toast.error{opacity:1;background-color:#b21;animation:fadein .5s}</style>)=====";
|
||||||
|
|
||||||
|
|
||||||
// Autogenerated from wled00/data/settings.htm, do not edit!!
|
// Autogenerated from wled00/data/settings.htm, do not edit!!
|
||||||
|
@ -150,21 +150,21 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
|
|||||||
|
|
||||||
//temporary, strip object gets updated via colorUpdated()
|
//temporary, strip object gets updated via colorUpdated()
|
||||||
if (id == strip.getMainSegmentId()) {
|
if (id == strip.getMainSegmentId()) {
|
||||||
byte effectPrev = effectCurrent;
|
if (getVal(elem["fx"], &effectCurrent, 1, strip.getModeCount())) { //load effect ('r' random, '~' inc/dec, 1-255 exact value)
|
||||||
effectCurrent = elem["fx"] | effectCurrent;
|
if (!presetId) unloadPlaylist(); //stop playlist if active and FX changed manually
|
||||||
if (!presetId && effectCurrent != effectPrev) unloadPlaylist(); //stop playlist if active and FX changed manually
|
}
|
||||||
effectSpeed = elem[F("sx")] | effectSpeed;
|
effectSpeed = elem[F("sx")] | effectSpeed;
|
||||||
effectIntensity = elem[F("ix")] | effectIntensity;
|
effectIntensity = elem[F("ix")] | effectIntensity;
|
||||||
effectPalette = elem["pal"] | effectPalette;
|
getVal(elem["pal"], &effectPalette, 1, strip.getPaletteCount());
|
||||||
} else { //permanent
|
} else { //permanent
|
||||||
byte fx = elem["fx"] | seg.mode;
|
byte fx = seg.mode;
|
||||||
if (fx != seg.mode && fx < strip.getModeCount()) {
|
if (getVal(elem["fx"], &fx, 1, strip.getModeCount())) { //load effect ('r' random, '~' inc/dec, 1-255 exact value)
|
||||||
strip.setMode(id, fx);
|
strip.setMode(id, fx);
|
||||||
if (!presetId) unloadPlaylist(); //stop playlist if active and FX changed manually
|
if (!presetId) unloadPlaylist(); //stop playlist if active and FX changed manually
|
||||||
}
|
}
|
||||||
seg.speed = elem[F("sx")] | seg.speed;
|
seg.speed = elem[F("sx")] | seg.speed;
|
||||||
seg.intensity = elem[F("ix")] | seg.intensity;
|
seg.intensity = elem[F("ix")] | seg.intensity;
|
||||||
seg.palette = elem["pal"] | seg.palette;
|
getVal(elem["pal"], &seg.palette, 1, strip.getPaletteCount());
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonArray iarr = elem[F("i")]; //set individual LEDs
|
JsonArray iarr = elem[F("i")]; //set individual LEDs
|
||||||
@ -346,9 +346,11 @@ bool deserializeState(JsonObject root, byte callMode, byte presetId)
|
|||||||
deletePreset(ps);
|
deletePreset(ps);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (getVal(root["ps"], &presetCycCurr, 1, 5)) { //load preset (clears state request!)
|
ps = presetCycCurr;
|
||||||
|
if (getVal(root["ps"], &ps, presetCycMin, presetCycMax)) { //load preset (clears state request!)
|
||||||
if (!presetId) unloadPlaylist(); //stop playlist if preset changed manually
|
if (!presetId) unloadPlaylist(); //stop playlist if preset changed manually
|
||||||
applyPreset(presetCycCurr, callMode);
|
if (ps >= presetCycMin && ps <= presetCycMax) presetCycCurr = ps;
|
||||||
|
applyPreset(ps, callMode);
|
||||||
return stateResponse;
|
return stateResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -438,7 +440,7 @@ void serializeState(JsonObject root, bool forPreset, bool includeBri, bool segme
|
|||||||
if (!forPreset) {
|
if (!forPreset) {
|
||||||
if (errorFlag) root[F("error")] = errorFlag;
|
if (errorFlag) root[F("error")] = errorFlag;
|
||||||
|
|
||||||
root[F("ps")] = (currentPreset > 0) ? currentPreset : -1;
|
root["ps"] = (currentPreset > 0) ? currentPreset : -1;
|
||||||
root[F("pl")] = currentPlaylist;
|
root[F("pl")] = currentPlaylist;
|
||||||
|
|
||||||
usermods.addToJsonState(root);
|
usermods.addToJsonState(root);
|
||||||
|
@ -549,6 +549,7 @@ void parseNumber(const char* str, byte* val, byte minv, byte maxv)
|
|||||||
const char* str2 = strchr(str,'~'); //min/max range (for preset cycle, e.g. "1~5~")
|
const char* str2 = strchr(str,'~'); //min/max range (for preset cycle, e.g. "1~5~")
|
||||||
if (str2) {
|
if (str2) {
|
||||||
byte p2 = atoi(str2+1);
|
byte p2 = atoi(str2+1);
|
||||||
|
presetCycMin = p1; presetCycMax = p2;
|
||||||
while (isdigit((str2+1)[0])) str2++;
|
while (isdigit((str2+1)[0])) str2++;
|
||||||
parseNumber(str2+1, val, p1, p2);
|
parseNumber(str2+1, val, p1, p2);
|
||||||
} else {
|
} else {
|
||||||
@ -657,17 +658,14 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply)
|
|||||||
pos = req.indexOf(F("PS=")); //saves current in preset
|
pos = req.indexOf(F("PS=")); //saves current in preset
|
||||||
if (pos > 0) savePreset(getNumVal(&req, pos));
|
if (pos > 0) savePreset(getNumVal(&req, pos));
|
||||||
|
|
||||||
byte presetCycleMin = 1;
|
|
||||||
byte presetCycleMax = 5;
|
|
||||||
|
|
||||||
pos = req.indexOf(F("P1=")); //sets first preset for cycle
|
pos = req.indexOf(F("P1=")); //sets first preset for cycle
|
||||||
if (pos > 0) presetCycleMin = getNumVal(&req, pos);
|
if (pos > 0) presetCycMin = getNumVal(&req, pos);
|
||||||
|
|
||||||
pos = req.indexOf(F("P2=")); //sets last preset for cycle
|
pos = req.indexOf(F("P2=")); //sets last preset for cycle
|
||||||
if (pos > 0) presetCycleMax = getNumVal(&req, pos);
|
if (pos > 0) presetCycMax = getNumVal(&req, pos);
|
||||||
|
|
||||||
//apply preset
|
//apply preset
|
||||||
if (updateVal(&req, "PL=", &presetCycCurr, presetCycleMin, presetCycleMax)) {
|
if (updateVal(&req, "PL=", &presetCycCurr, presetCycMin, presetCycMax)) {
|
||||||
applyPreset(presetCycCurr);
|
applyPreset(presetCycCurr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -516,6 +516,8 @@ WLED_GLOBAL byte improvError _INIT(0);
|
|||||||
WLED_GLOBAL int16_t currentPlaylist _INIT(-1);
|
WLED_GLOBAL int16_t currentPlaylist _INIT(-1);
|
||||||
//still used for "PL=~" HTTP API command
|
//still used for "PL=~" HTTP API command
|
||||||
WLED_GLOBAL byte presetCycCurr _INIT(0);
|
WLED_GLOBAL byte presetCycCurr _INIT(0);
|
||||||
|
WLED_GLOBAL byte presetCycMin _INIT(1);
|
||||||
|
WLED_GLOBAL byte presetCycMax _INIT(5);
|
||||||
|
|
||||||
// realtime
|
// realtime
|
||||||
WLED_GLOBAL byte realtimeMode _INIT(REALTIME_MODE_INACTIVE);
|
WLED_GLOBAL byte realtimeMode _INIT(REALTIME_MODE_INACTIVE);
|
||||||
|
Loading…
Reference in New Issue
Block a user