diff --git a/readme.md b/readme.md index ea7a02661..51a14402e 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 60e1d5489..9b2e0e746 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 7a9ae8919..2ea09e4f8 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 f7579be12..e395b3ad1 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

-
- -
-
- -
-

Preset Duration

-
-
-

Color Transition

-
-
-
-

FX Speed

-
- -
- diff --git a/wled00/data/msg.htm b/wled00/data/msg.htm index 5475635f0..2b5bf7c34 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 76fb1f8ef..83a84271d 100644 Binary files a/wled00/data/settings_leds.htm and b/wled00/data/settings_leds.htm differ diff --git a/wled00/data/settings_sync.htm b/wled00/data/settings_sync.htm index 0ae065c6d..54a1db9bf 100644 Binary files a/wled00/data/settings_sync.htm and b/wled00/data/settings_sync.htm differ diff --git a/wled00/data/settings_ui.htm b/wled00/data/settings_ui.htm index a8c2299e7..172b01aac 100644 Binary files a/wled00/data/settings_ui.htm and b/wled00/data/settings_ui.htm differ diff --git a/wled00/htmls00.h b/wled00/htmls00.h index 3c1b532cc..b3de48290 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

-
- -
-
- -
-

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

Preset Duration

Color Transition

FX Speed

FX Intensity

)====="; +#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 d87b8a79a..aea78045c 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 8b825e675..83785bef2 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 40807867c..5a9ed0de7 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 261cbdf19..30108e706 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 6755e29fb..a156efa31 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 e30f41775..7cefdd117 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 7a2ccf099..fa0c6fa2f 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 8cc72c361..2e230e7a8 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 2ef66f0f2..72965575e 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) {