From 094bdf02c4b9a3d463a10c2721107def128d8643 Mon Sep 17 00:00:00 2001 From: cschwinne Date: Sun, 24 Jun 2018 01:20:15 +0200 Subject: [PATCH] Release of v0.7.0 Substantial optimizations of mobile UI Added option to save current preset cycle as boot default Added option not to use first LED in strip Realtime UI error now includes source IP address Removed /down and /cleareeprom pages Fixed bug (turning receiveDirect off would crash on UDP packet) --- readme.md | 11 +- wled00/WS2812FX.cpp | 37 +- wled00/WS2812FX.h | 6 +- wled00/data/index.htm | 15 +- wled00/data/index_mobile.htm | 830 +++++-------- wled00/data/msg.htm | 2 +- wled00/data/settings.htm | 17 +- wled00/data/settings_leds.htm | Bin 8394 -> 8704 bytes wled00/data/settings_sync.htm | Bin 7952 -> 7952 bytes wled00/data/settings_ui.htm | Bin 7836 -> 7836 bytes wled00/htmls00.h | 1096 +---------------- wled00/htmls01.h | 28 +- wled00/htmls02.h | 2 +- .../src/dependencies/webserver/WebServer.cpp | 18 +- wled00/src/dependencies/webserver/WebServer.h | 2 +- wled00/wled00.ino | 18 +- wled00/wled01_eeprom.ino | 32 + wled00/wled02_xml.ino | 1 + wled00/wled03_set.ino | 5 +- wled00/wled05_init.ino | 49 +- wled00/wled07_notify.ino | 5 +- 21 files changed, 503 insertions(+), 1671 deletions(-) diff --git a/readme.md b/readme.md index ea7a0266..51a14402 100644 --- a/readme.md +++ b/readme.md @@ -2,29 +2,28 @@ 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 +- All new, mobile-friendly web UI! - Settings page - configuration over network - 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 - Alexa smart home device server (including dimming) - Beta syncronization to Philips hue lights - 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 - Macro functions to automatically execute API calls - Nightlight function (gradually dims down) - Notifier function (multiple ESPs sync color via UDP broadcast) - Support for power pushbutton -- Custom Theater Chase - Support for the Adalight serial ambilight protocol! - Full OTA software update capability (HTTP and ArduinoOTA) - Password protected OTA page for added security (OTA lock) - NTP and configurable analog clock function - Support for the Cronixie Clock kit by Diamex -- Realtime UDP Packet Control (WARLS, DRGB, DRGBW) possible -- Client HTML UI controlled, customizable themes +- Realtime UDP Packet Control (Hyperion, WARLS, DRGB, DRGBW) ### Quick start guide and documentation: diff --git a/wled00/WS2812FX.cpp b/wled00/WS2812FX.cpp index 60e1d548..9b2e0e74 100644 --- a/wled00/WS2812FX.cpp +++ b/wled00/WS2812FX.cpp @@ -37,8 +37,8 @@ #define CALL_MODE(n) (this->*_mode[n])(); -void WS2812FX::init(bool supportWhite, uint16_t countPixels, uint8_t pin) { - begin(supportWhite,countPixels,pin); +void WS2812FX::init(bool supportWhite, uint16_t countPixels, uint8_t pin,bool skipFirst) { + begin(supportWhite,countPixels,pin,skipFirst); for (int i=0; i < _led_count; i++) _locked[i] = false; WS2812FX::setBrightness(_brightness); 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 (!_cronixieMode) { + if (_skipFirstMode) {i++;if(i==1)setPixelColorRaw(0,0,0,0,0);} if (_rgbwMode) { 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); for (int j=o; j< o+19; j++) { - setPixelColorRaw(j,rCorr,gCorr,bCorr,wCorr); + setPixelColorRaw((_skipFirstMode)?j+1:j,rCorr,gCorr,bCorr,wCorr); } } else { 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]) { - case 0: setPixelColorRaw(o+5,r,g,b,w); break; - case 1: setPixelColorRaw(o+0,r,g,b,w); break; - case 2: setPixelColorRaw(o+6,r,g,b,w); break; - case 3: setPixelColorRaw(o+1,r,g,b,w); break; - case 4: setPixelColorRaw(o+7,r,g,b,w); break; - case 5: setPixelColorRaw(o+2,r,g,b,w); break; - case 6: setPixelColorRaw(o+8,r,g,b,w); break; - case 7: setPixelColorRaw(o+3,r,g,b,w); break; - case 8: setPixelColorRaw(o+9,r,g,b,w); break; - case 9: setPixelColorRaw(o+4,r,g,b,w); break; + case 0: setPixelColorRaw((_skipFirstMode)?o+6:o+5,r,g,b,w); break; + case 1: setPixelColorRaw((_skipFirstMode)?o+1:o+0,r,g,b,w); break; + case 2: setPixelColorRaw((_skipFirstMode)?o+7:o+6,r,g,b,w); break; + case 3: setPixelColorRaw((_skipFirstMode)?o+2:o+1,r,g,b,w); break; + case 4: setPixelColorRaw((_skipFirstMode)?o+8:o+7,r,g,b,w); break; + case 5: setPixelColorRaw((_skipFirstMode)?o+3:o+2,r,g,b,w); break; + case 6: setPixelColorRaw((_skipFirstMode)?o+9:o+8,r,g,b,w); break; + case 7: setPixelColorRaw((_skipFirstMode)?o+4:o+3,r,g,b,w); break; + case 8: setPixelColorRaw((_skipFirstMode)?o+10:o+9,r,g,b,w); break; + case 9: setPixelColorRaw((_skipFirstMode)?o+5:o+4,r,g,b,w); break; default: break; } } @@ -2134,17 +2135,19 @@ void WS2812FX::clear() 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; _rgbwMode = supportWhite; + _skipFirstMode = skipFirst; _led_count = countPixels; _cc_i2 = _led_count -1; + if (_skipFirstMode) _led_count++; uint8_t ty = 1; if (supportWhite) ty =2; - bus->Begin((NeoPixelType)ty, countPixels, pin); + bus->Begin((NeoPixelType)ty, _led_count, pin); if (_locked != NULL) delete _locked; - _locked = new bool[countPixels]; + _locked = new bool[_led_count]; } //For some reason min and max are not declared here diff --git a/wled00/WS2812FX.h b/wled00/WS2812FX.h index 7a9ae891..2ea09e4f 100644 --- a/wled00/WS2812FX.h +++ b/wled00/WS2812FX.h @@ -199,6 +199,7 @@ class WS2812FX { _counter_ccStep = 0; _fastStandard = false; _reverseMode = false; + _skipFirstMode = false; _locked = NULL; _cronixieDigits = new byte[6]; bus = new NeoPixelWrapper(); @@ -208,7 +209,7 @@ class WS2812FX { show(void), setPixelColor(uint16_t i, byte r, byte g, byte b), 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), start(void), stop(void), @@ -277,7 +278,7 @@ class WS2812FX { NeoPixelWrapper *bus; void - begin(bool supportWhite, uint16_t countPixels, uint8_t pin), + begin(bool supportWhite, uint16_t countPixels, uint8_t pin, bool skipFirst), clear(void), setPixelColor(uint16_t i, uint32_t c), setPixelColorRaw(uint16_t i, byte r, byte g, byte b, byte w), @@ -348,6 +349,7 @@ class WS2812FX { bool _triggered, _rgbwMode, + _skipFirstMode, _fastStandard, _reverseMode, _cronixieMode, diff --git a/wled00/data/index.htm b/wled00/data/index.htm index f7579be1..e395b3ad 100644 --- a/wled00/data/index.htm +++ b/wled00/data/index.htm @@ -1,6 +1,6 @@ - + WLED 0.7.0 - -
-
-
-

WLED

- - - -
-
-

FX 2nd Color

-
- -
-
-
-
-
-

Brightness

-
-
-
 
-
 
-
 
-
 

-
 
-
 
-
 
-
 
-
-
-
-

Edit Presets

-
- -
-
-

Presets

-
1
-
2
-
3
-
4

-
5
-
6
-
7
-
8

-
9
-
10
-
11
-
12

-
13
-
14
-
15
-
16
-
-
-

Cycle Mode

-
- -
-
-

Cycle Range

-
- -
-
-
    -
  • Color
  • -
  • Effects
  • -
  • Both
  • -
-
-

Preset Duration

-
-
-

Color Transition

-
-
-
-

FX Speed

-
- -
- diff --git a/wled00/data/msg.htm b/wled00/data/msg.htm index 5475635f..2b5bf7c3 100644 --- a/wled00/data/msg.htm +++ b/wled00/data/msg.htm @@ -9,7 +9,7 @@ window.location = "/settings"; } function RP() { - top.location.href=top.location.href; + top.location.href="/"; } + - + +
diff --git a/wled00/data/settings_leds.htm b/wled00/data/settings_leds.htm index 76fb1f8efb76fc2e768b67cc4976681379a50ab8..83a84271d80847f5adc4eb8e10457012e3dbdfe8 100644 GIT binary patch delta 186 zcmX@**x<53Njy84A(5esA(cUaA(^3+p$G_58S)rPfcye5yBNp^@sb%Tfj9@MG9RcW zjUkgE9jqr2s3MaAB&Gl~tr$oq0eSggeJMa4X+Y6ZhMdWXJff2iNb4{MFgQ>CC@Z>I xNqif}BHd4;4-;UP#C0%H5kZOntWOQI{*QiD&GJA delta 16 YcmZp0Ipw%PNqqA&@ogNF`4m3^06Q}V+W-In diff --git a/wled00/data/settings_sync.htm b/wled00/data/settings_sync.htm index 0ae065c6dd5b10cf8dd3c567b34522dc603f42f7..54a1db9bf921320e58be0b2cf4d09f1a7d197071 100644 GIT binary patch delta 30 mcmbPWH^FYhFOkhZBv&v^UL(t~nMw2;%VZu2j?F7%GME6$d<&5P delta 26 icmbPWH^FYhFOkV>WH~mk692}s`IpEFrp*gv3YY++V+(lz diff --git a/wled00/data/settings_ui.htm b/wled00/data/settings_ui.htm index a8c2299e7b3162b7ade6745a98252fe11d964cc4..172b01aac7df54219ef161dd23c1050ae71eb696 100644 GIT binary patch delta 24 gcmbPZJI8iIg3#m#LKTxY$p}p@5-QuAAZ)`80Dq7PKL7v# delta 24 gcmbPZJI8iIg3#m}LLHMcgbF6>$#QH?5Vqk40DDgessI20 diff --git a/wled00/htmls00.h b/wled00/htmls00.h index 3c1b532c..b3de4829 100644 --- a/wled00/htmls00.h +++ b/wled00/htmls00.h @@ -1,1054 +1,54 @@ /* * Mobile UI by StormPie html */ +#ifndef WLED_FLASH_512K_MODE const char PAGE_indexM[] PROGMEM = R"=====( - - - - - - - - - - - WLED - - - - -
-
-
-

WLED

-
-
-

FX 2nd Color

-
- -
-
-
-
-
-

Brightness

-
-
-

Speed

-
-
-
-   -
-
-   -
-
-   -
-
-   -

-
-   -
-
-   -
-
-   -
-
-   -
-
-
-
-

Edit Presets

-
- -
-
-

Presets

-
- 1 -
-
- 2 -
-
- 3 -
-
- 4 -

-
- 5 -
-
- 6 -
-
- 7 -
-
- 8 -

-
- 9 -
-
- 10 -
-
- 11 -
-
- 12 -

-
- 13 -
-
- 14 -
-
- 15 -
-
- 16 -
-
-
-

Cycle Mode

-
- -
-
-

Cycle Range

-
- -
-
-
    -
  • Color
  • -
  • Effects
  • -
  • Both
  • -
-
-

Preset Duration

-
-
-

Color Transition

-
-
- -
- - - - +WLED 0.7.0
Loading WLED UI...

WLED

FX 2nd Color

Sync Lights

White Channel

Master Brightness



 
 
 
 

 
 
 
 

Edit Presets

Presets

1
2
3
4

5
6
7
8

9
10
11
12

13
14
15
16

Cycle Mode

Cycle Range

  • Color
  • Effects
  • Both

Preset Duration

Color Transition

FX Speed

FX Intensity

  • Solid
  • Blink
  • Breathe
  • Wipe
  • Wipe Random
  • Random Colors
  • Easter
  • Multi Colors
  • Rainbow Full
  • Rainbow Cycle
  • Scan
  • Double Scan
  • Fade
  • Chase
  • Chase Rainbow
  • Running
  • Twinkle
  • Twinkle Random
  • Twinkle Fade
  • Twinkle Random Fade
  • Sparkle
  • Dark Sparkle
  • Dark Sparkle+
  • Strobe
  • Strobe Rainbow
  • Double Strobe
  • Blink Rainbow
  • Android
  • Dark Chase
  • Dark Chase Random
  • Dark Chase Rainbow
  • Chase Flash
  • Dark Chase Random
  • Rainbow Runner
  • Colorful
  • Traffic Light
  • Sweep Random
  • Running 2
  • Red & Blue
  • Running 2 Random
  • Scanner
  • Lighthouse
  • Fireworks
  • Fireworks Random
  • Merry Christmas
  • Fire Flicker
  • Gradient
  • Gradient Loading
  • In Out
  • In In
  • Out Out
  • Out In
  • Circus
  •  
  • Go to top
)====="; +#else +const char PAGE_indexM[] PROGMEM = R"=====( +The Mobile UI is not supported due to limited flash storage. Please go to IP/settings/ui and change the UI mode to "Classic". +)====="; +#endif + /* * Classic UI Index html */ @@ -1056,10 +56,10 @@ const char PAGE_indexM[] PROGMEM = R"=====( const char PAGE_index0[] PROGMEM = R"=====( - + WLED 0.7.0 - + )====="; //head1 (css) diff --git a/wled00/htmls01.h b/wled00/htmls01.h index d87b8a79..aea78045 100644 --- a/wled00/htmls01.h +++ b/wled00/htmls01.h @@ -7,15 +7,15 @@ body{font-family:var(--cFn),sans-serif;text-align:center;background:var(--cCol); const char PAGE_settings0[] PROGMEM = R"=====( - - -WLED Settings +WLED Settings )====="; 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} +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} + - + +
@@ -28,8 +28,7 @@ body{text-align:center;background:var(--cCol);height:100%;margin:0;background-at const char PAGE_settings_wifi0[] PROGMEM = R"=====( - - + WiFi Settings + )====="; 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} diff --git a/wled00/src/dependencies/webserver/WebServer.cpp b/wled00/src/dependencies/webserver/WebServer.cpp index 8b825e67..83785bef 100644 --- a/wled00/src/dependencies/webserver/WebServer.cpp +++ b/wled00/src/dependencies/webserver/WebServer.cpp @@ -90,8 +90,8 @@ WebServer::~WebServer() { void WebServer::begin() { _currentStatus = HC_NONE; _server.begin(); - if(!_headerKeysCount) - collectHeaders(0, 0); + //if(!_headerKeysCount) + //collectHeaders(0, 0); } bool WebServer::authenticate(const char * username, const char * password){ @@ -408,15 +408,13 @@ String WebServer::header(String name) { return String(); } -void WebServer::collectHeaders(const char* headerKeys[], const size_t headerKeysCount) { - _headerKeysCount = headerKeysCount + 1; - if (_currentHeaders) - delete[]_currentHeaders; - _currentHeaders = new RequestArgument[_headerKeysCount]; +//Modified by Aircoookie to work for WLED +void WebServer::collectHeaders(String headerKey) { + _headerKeysCount = 2; + if (_currentHeaders) delete[]_currentHeaders; + _currentHeaders = new RequestArgument[2]; _currentHeaders[0].key = AUTHORIZATION_HEADER; - for (int i = 1; i < _headerKeysCount; i++){ - _currentHeaders[i].key = headerKeys[i-1]; - } + _currentHeaders[1].key = headerKey; } String WebServer::header(int i) { diff --git a/wled00/src/dependencies/webserver/WebServer.h b/wled00/src/dependencies/webserver/WebServer.h index 40807867..5a9ed0de 100644 --- a/wled00/src/dependencies/webserver/WebServer.h +++ b/wled00/src/dependencies/webserver/WebServer.h @@ -105,7 +105,7 @@ public: String argName(int i); // get request argument name by number int args(); // get arguments count 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(int i); // get request header value by number String headerName(int i); // get request header name by number diff --git a/wled00/wled00.ino b/wled00/wled00.ino index 261cbdf1..30108e70 100644 --- a/wled00/wled00.ino +++ b/wled00/wled00.ino @@ -7,6 +7,10 @@ * @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 #ifdef ARDUINO_ARCH_ESP32 #include @@ -33,7 +37,7 @@ #include "WS2812FX.h" //version in format yymmddb (b = daily build) -#define VERSION 1805311 +#define VERSION 1806240 const String versionString = "0.7.0"; //AP and OTA default passwords (change them!) @@ -72,7 +76,7 @@ IPAddress staticSubnet(255, 255, 255, 0); IPAddress staticDNS(8, 8, 8, 8); //only for NTP bool useHSB = true, useHSBDefault = true, useRGBW = false, autoRGBtoRGBW = false; bool turnOnAtBoot = true; -bool initLedsLast = false; +bool initLedsLast = false, skipFirstLed = false; byte bootPreset = 0; byte colS[]{255, 159, 0}; byte colSecS[]{0, 0, 0}; @@ -214,10 +218,12 @@ byte presetCycleMin = 1, presetCycleMax = 5; uint16_t presetCycleTime = 1250; unsigned long presetCycledTime = 0; byte presetCycCurr = presetCycleMin; bool presetApplyBri = true, presetApplyCol = true, presetApplyFx = true; +bool saveCurrPresetCycConf = false; uint32_t arlsTimeoutMillis = 2500; bool arlsTimeout = false; bool receiveDirect = true, enableRealtimeUI = false; +IPAddress realtimeIP = (0,0,0,0); unsigned long arlsTimeoutTime = 0; byte auxTime = 0; unsigned long auxStartTime = 0; @@ -300,14 +306,6 @@ String txd = "Please disable OTA Lock in security settings!"; void serveMessage(int,String,String,int=255); -void down() -{ - briT = 0; - setAllLeds(); - DEBUG_PRINTLN("MODULE TERMINATED"); - while (1) {delay(1000);} -} - void reset() { briT = 0; diff --git a/wled00/wled01_eeprom.ino b/wled00/wled01_eeprom.ino index 6755e29f..a156efa3 100644 --- a/wled00/wled01_eeprom.ino +++ b/wled00/wled01_eeprom.ino @@ -214,6 +214,20 @@ void saveSettingsToEEPROM() 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(); } @@ -425,7 +439,25 @@ void loadSettingsFromEEPROM(bool first) 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); wifiLock = EEPROM.read(393); diff --git a/wled00/wled02_xml.ino b/wled00/wled02_xml.ino index e30f4177..7cefdd11 100644 --- a/wled00/wled02_xml.ino +++ b/wled00/wled02_xml.ino @@ -167,6 +167,7 @@ String getSettings(byte subPage) resp += ds + "RV" + c + reverseMode +";"; resp += ds + "EI" + c + initLedsLast +";"; resp += ds + "WO" + v + arlsOffset +";"; + resp += ds + "SL" + c + skipFirstLed +";"; } if (subPage == 3) diff --git a/wled00/wled03_set.ino b/wled00/wled03_set.ino index 7a2ccf09..fa0c6fa2 100644 --- a/wled00/wled03_set.ino +++ b/wled00/wled03_set.ino @@ -121,6 +121,7 @@ void handleSettingsSet(byte subPage) if (ledCount > 600) ledCount = 600; #endif } + ccIndex2 = ledCount -1; useRGBW = server.hasArg("EW"); autoRGBtoRGBW = server.hasArg("AW"); if (server.hasArg("IS")) //ignore settings and save current brightness, colors and fx as default @@ -194,6 +195,7 @@ void handleSettingsSet(byte subPage) if (i >= 0 && i <= 255) effectIntensityDefault = i; } } + saveCurrPresetCycConf = server.hasArg("PC"); turnOnAtBoot = server.hasArg("BO"); if (server.hasArg("BP")) { @@ -231,6 +233,7 @@ void handleSettingsSet(byte subPage) int i = server.arg("WO").toInt(); if (i >= -255 && i <= 255) arlsOffset = i; } + skipFirstLed = server.hasArg("SL"); if (server.hasArg("BF")) { int i = server.arg("BF").toInt(); @@ -386,7 +389,7 @@ void handleSettingsSet(byte subPage) } } saveSettingsToEEPROM(); - if (subPage == 2) strip.init(useRGBW,ledCount,PIN); + if (subPage == 2) strip.init(useRGBW,ledCount,PIN,skipFirstLed); } bool handleSet(String req) diff --git a/wled00/wled05_init.ino b/wled00/wled05_init.ino index 8cc72c36..2e230e7a 100644 --- a/wled00/wled05_init.ino +++ b/wled00/wled05_init.ino @@ -10,7 +10,7 @@ void wledInit() #ifdef ARDUINO_ARCH_ESP32 if (ledCount > 600) ledCount = 600; #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.setTimeout(50); @@ -164,10 +164,6 @@ void wledInit() server.on("/freeheap", HTTP_GET, [](){ 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, [](){ String val = (String)(int)strip.getPowerEstimate(ledCount,strip.getColor(),strip.getBrightness()); @@ -199,8 +195,6 @@ void wledInit() server.on("/edit", HTTP_POST, [](){ server.send(200, "text/plain", ""); }, handleFileUpload); server.on("/list", HTTP_GET, handleFileList); #endif - server.on("/down", HTTP_GET, down); - server.on("/cleareeprom", HTTP_GET, clearEEPROM); //init ota page httpUpdater.setup(&server); } else @@ -208,12 +202,6 @@ void wledInit() server.on("/edit", HTTP_GET, [](){ 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, [](){ serveMessage(500, "Access Denied", txd, 254); }); @@ -231,8 +219,14 @@ void wledInit() 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(); //init Alexa hue emulation @@ -273,7 +267,7 @@ void wledInit() void initStrip() { // Initialize NeoPixel Strip and button - if (initLedsLast) strip.init(useRGBW,ledCount,PIN); + if (initLedsLast) strip.init(useRGBW,ledCount,PIN,skipFirstLed); strip.setReverseMode(reverseMode); strip.setColor(0); strip.setBrightness(255); @@ -319,7 +313,13 @@ void initCon() } int fail_count = 0; 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()); + #ifdef ARDUINO_ARCH_ESP32 + WiFi.setHostname(serverDescription.c_str()); + #endif unsigned long lastTry = 0; bool con = false; while(!con) @@ -400,6 +400,21 @@ 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() { bool serveMobile = false; @@ -424,7 +439,7 @@ void serveIndex() server.sendContent_P(PAGE_index3); } } else { - server.send(200, "text/plain", "The WLED UI is not available while receiving real-time data."); + serveRealtimeError(false); } } @@ -509,7 +524,7 @@ void serveSettings(byte subPage) default: server.sendContent_P(PAGE_settings1); } } else { - server.send(200, "text/plain", "The settings are not available while receiving real-time data."); + serveRealtimeError(true); } } @@ -540,7 +555,7 @@ String getBuildInfo() #else info += "strip-pin: gpio2\r\n"; #endif - info += "build-type: dev\r\n"; + info += "build-type: src\r\n"; return info; } diff --git a/wled00/wled07_notify.ino b/wled00/wled07_notify.ino index 2ef66f0f..72965575 100644 --- a/wled00/wled07_notify.ino +++ b/wled00/wled07_notify.ino @@ -81,8 +81,10 @@ void handleNotifications() uint16_t packetSize = notifierUdp.parsePacket(); //hyperion / raw RGB - if (!packetSize && receiveDirect && udpRgbConnected) { + 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); @@ -153,6 +155,7 @@ void handleNotifications() } } else if (udpIn[0] > 0 && udpIn[0] < 4 && receiveDirect) //1 warls //2 drgb //3 drgbw { + realtimeIP = notifierUdp.remoteIP(); if (packetSize > 1) { if (udpIn[1] == 0) {