diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 867d7d46..f77dc4de 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -31,14 +31,15 @@
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
- "ms-python.python"
+ "ms-python.python",
+ "platformio.platformio-ide"
],
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
// Use 'postCreateCommand' to run commands after the container is created.
- // "postCreateCommand": "pip3 install --user -r requirements.txt",
+ "postCreateCommand": "npm install",
// Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
"remoteUser": "vscode"
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 00000000..2ee772ce
--- /dev/null
+++ b/.vscode/tasks.json
@@ -0,0 +1,42 @@
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "label": "Build: HTML and binary",
+ "dependsOn": [
+ "Build: HTML only",
+ "Build: binary only"
+ ],
+ "dependsOrder": "sequence",
+ "problemMatcher": [
+ "$platformio",
+ ],
+ },
+ {
+ "type": "PlatformIO",
+ "label": "Build: binary only",
+ "task": "Build",
+ "group": {
+ "kind": "build",
+ "isDefault": true,
+ },
+ "problemMatcher": [
+ "$platformio"
+ ],
+ "presentation": {
+ "panel": "shared"
+ }
+ },
+ {
+ "type": "npm",
+ "script": "build",
+ "group": "build",
+ "problemMatcher": [],
+ "label": "Build: HTML only",
+ "detail": "npm run build",
+ "presentation": {
+ "panel": "shared"
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 24c6becc..49841070 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,11 @@
### WLED version 0.11.0
+#### Build 2012020
+
+- UDP `parsePacket()` with sync disabled (#1390)
+- Added Multi RGBW DMX mode (PR #1383)
+
#### Build 2012010
- Fixed compilation for analog (PWM) LEDs
diff --git a/platformio.ini b/platformio.ini
index c3cf2fc4..9d5ea9bc 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -37,7 +37,7 @@ default_envs = travis_esp8266, travis_esp32
src_dir = ./wled00
data_dir = ./wled00/data
build_cache_dir = ~/.buildcache
-extra_configs =
+extra_configs =
platformio_override.ini
[common]
@@ -59,6 +59,9 @@ arduino_core_git = https://github.com/platformio/platform-espressif8266#feature/
platform_wled_default = ${common.arduino_core_2_7_4}
# We use 2.7.4.7 for all, includes PWM flicker fix and Wstring optimization
platform_packages = tasmota/framework-arduinoespressif8266 @ 3.20704.7
+ platformio/toolchain-xtensa @ ~2.40802.200502
+ platformio/tool-esptool @ ~1.413.0
+ platformio/tool-esptoolpy @ ~1.30000.0
# ------------------------------------------------------------------------------
# FLAGS: DEBUG
@@ -66,7 +69,7 @@ platform_packages = tasmota/framework-arduinoespressif8266 @ 3.20704.7
# ------------------------------------------------------------------------------
debug_flags = -D DEBUG=1 -D WLED_DEBUG -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_TLS_MEM
#if needed (for memleaks etc) also add; -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-#-DDEBUG_ESP_CORE is not working right now
+#-DDEBUG_ESP_CORE is not working right now
# ------------------------------------------------------------------------------
# FLAGS: ldscript (available ldscripts at https://github.com/esp8266/Arduino/tree/master/tools/sdk/ld)
@@ -104,23 +107,23 @@ build_flags =
-Wno-return-type
-Wno-sequence-point
-Wno-narrowing
- -Wno-reorder
- -DMQTT_MAX_PACKET_SIZE=1024
- -DSECURE_CLIENT=SECURE_CLIENT_BEARSSL
+ -DMQTT_MAX_PACKET_SIZE=1024
+ -DSECURE_CLIENT=SECURE_CLIENT_BEARSSL
-DBEARSSL_SSL_BASIC
-D CORE_DEBUG_LEVEL=0
-D NDEBUG
- #build_flags for the IRremoteESP8266 library (enabled decoders have to appear here)
- -D _IR_ENABLE_DEFAULT_=false
- -D DECODE_HASH=true
+ #build_flags for the IRremoteESP8266 library (enabled decoders have to appear here)
+ -D _IR_ENABLE_DEFAULT_=false
+ -D DECODE_HASH=true
-D DECODE_NEC=true
- -D DECODE_SONY=true
+ -D DECODE_SONY=true
-D DECODE_SAMSUNG=true
-D DECODE_LG=true
-DWLED_USE_MY_CONFIG
build_unflags =
-Wall
+ -Wreorder
-Wdeprecated-declarations
# enables all features for travis CI
@@ -136,15 +139,15 @@ build_flags_all_features =
build_flags_esp8266 = ${common.build_flags} ${esp8266.build_flags}
build_flags_esp32 = ${common.build_flags} ${esp32.build_flags}
-ldscript_512k = eagle.flash.512k.ld ;for older versions change this to eagle.flash.512k0.ld
-ldscript_1m0m = eagle.flash.1m.ld ;for older versions change this to eagle.flash.1m0.ld
+ldscript_512k = eagle.flash.512k.ld ;for older versions change this to eagle.flash.512k0.ld
+ldscript_1m0m = eagle.flash.1m.ld ;for older versions change this to eagle.flash.1m0.ld
ldscript_1m128k = eagle.flash.1m128.ld
ldscript_2m512k = eagle.flash.2m512.ld
ldscript_2m1m = eagle.flash.2m1m.ld
ldscript_4m1m = eagle.flash.4m1m.ld
[esp8266]
-build_flags =
+build_flags =
-DESP8266
-DFP_IN_IROM
; NONOSDK22x_190703 = 2.2.2-dev(38a443e)
@@ -154,9 +157,9 @@ build_flags =
; lwIP 1.4 - Higher Bandwidth (Aircoookie has)
-DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH
; VTABLES in Flash
- -DVTABLES_IN_FLASH
+ -DVTABLES_IN_FLASH
; restrict to minimal mime-types
- -DMIMETYPE_MINIMAL
+ -DMIMETYPE_MINIMAL
[esp32]
build_flags = -w -g
@@ -187,15 +190,15 @@ upload_speed = 115200
# ------------------------------------------------------------------------------
lib_compat_mode = strict
lib_deps =
- FastLED@3.3.2
- NeoPixelBus@2.6.0
- ESPAsyncTCP@1.2.0
+ fastled/FastLED @ 3.3.2
+ NeoPixelBus @ 2.6.0
+ ESPAsyncTCP @ 1.2.0
ESPAsyncUDP
- AsyncTCP@1.0.3
- IRremoteESP8266@2.7.3
+ AsyncTCP @ 1.0.3
+ IRremoteESP8266 @ 2.7.3
https://github.com/lorol/LITTLEFS.git
- https://github.com/Aircoookie/ESPAsyncWebServer.git@~2.0.0
- #For use of the TTGO T-Display ESP32 Module with integrated TFT display uncomment the following line
+ https://github.com/Aircoookie/ESPAsyncWebServer.git @ ~2.0.0
+ #For use of the TTGO T-Display ESP32 Module with integrated TFT display uncomment the following line
#TFT_eSPI
#For use SSD1306 OLED display uncomment following
#U8g2@~2.27.2
@@ -228,7 +231,7 @@ platform = ${common.platform_wled_default}
platform_packages = ${common.platform_packages}
board_build.ldscript = ${common.ldscript_512k}
build_unflags = ${common.build_unflags}
-build_flags = ${common.build_flags_esp8266} -D WLED_DISABLE_OTA -D WLED_DISABLE_ALEXA -D WLED_DISABLE_BLYNK
+build_flags = ${common.build_flags_esp8266} -D WLED_DISABLE_OTA -D WLED_DISABLE_ALEXA -D WLED_DISABLE_BLYNK
-D WLED_DISABLE_CRONIXIE -D WLED_DISABLE_HUESYNC -D WLED_DISABLE_INFRARED -D WLED_DISABLE_MQTT -D WLED_DISABLE_WEBSOCKETS
# Unsupported environment due to insufficient flash
@@ -255,7 +258,7 @@ platform = ${common.platform_wled_default}
platform_packages = ${common.platform_packages}
board_build.ldscript = ${common.ldscript_4m1m}
build_unflags = ${common.build_unflags}
-build_flags = ${common.build_flags_esp8266}
+build_flags = ${common.build_flags_esp8266}
[env:d1_mini]
board = d1_mini
@@ -264,7 +267,7 @@ platform_packages = ${common.platform_packages}
upload_speed = 921600
board_build.ldscript = ${common.ldscript_4m1m}
build_unflags = ${common.build_unflags}
-build_flags = ${common.build_flags_esp8266}
+build_flags = ${common.build_flags_esp8266}
monitor_filters = esp8266_exception_decoder
[env:heltec_wifi_kit_8]
@@ -287,7 +290,7 @@ build_flags = ${common.build_flags_esp8266} -D LEDPIN=1 -D WLED_DISABLE_INFRARED
board = esp32dev
platform = espressif32@2.0
build_unflags = ${common.build_unflags}
-build_flags = ${common.build_flags_esp32}
+build_flags = ${common.build_flags_esp32}
lib_ignore =
ESPAsyncTCP
ESPAsyncUDP
@@ -324,7 +327,7 @@ platform = ${common.platform_wled_default}
platform_packages = ${common.platform_packages}
board_build.ldscript = ${common.ldscript_1m128k}
build_unflags = ${common.build_unflags}
-build_flags = ${common.build_flags_esp8266} -D WLED_DISABLE_OTA -D WLED_USE_ANALOG_LEDS -D WLED_USE_H801 -D WLED_ENABLE_5CH_LEDS
+build_flags = ${common.build_flags_esp8266} -D WLED_DISABLE_OTA -D WLED_USE_ANALOG_LEDS -D WLED_USE_H801 -D WLED_ENABLE_5CH_LEDS
[env:d1_mini_5CH_Shojo_PCB]
board = d1_mini
@@ -332,7 +335,7 @@ platform = ${common.platform_wled_default}
platform_packages = ${common.platform_packages}
board_build.ldscript = ${common.ldscript_4m1m}
build_unflags = ${common.build_unflags}
-build_flags = ${common.build_flags_esp8266} -D WLED_USE_ANALOG_LEDS -D WLED_USE_SHOJO_PCB -D WLED_ENABLE_5CH_LEDS
+build_flags = ${common.build_flags_esp8266} -D WLED_USE_ANALOG_LEDS -D WLED_USE_SHOJO_PCB -D WLED_ENABLE_5CH_LEDS
# ------------------------------------------------------------------------------
# DEVELOPMENT BOARDS
@@ -356,7 +359,7 @@ platform = ${common.platform_wled_default}
platform_packages = ${common.platform_packages}
board_build.ldscript = ${common.ldscript_4m1m}
build_unflags = ${common.build_unflags}
-build_flags = ${common.build_flags_esp8266}
+build_flags = ${common.build_flags_esp8266}
# ------------------------------------------------------------------------------
# custom board configurations
@@ -376,7 +379,7 @@ platform = ${common.platform_wled_default}
platform_packages = ${common.platform_packages}
board_build.ldscript = ${common.ldscript_4m1m}
build_unflags = ${common.build_unflags}
-build_flags = ${common.build_flags_esp8266} -D LEDPIN=16
+build_flags = ${common.build_flags_esp8266} -D LEDPIN=16
[env:custom_LEDPIN_3]
@@ -446,7 +449,7 @@ lib_ignore =
board = esp32dev
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags_esp32} -D LEDPIN=27 -D BTNPIN=39
-lib_ignore =
+lib_ignore =
ESPAsyncTCP
ESPAsyncUDP
platform = espressif32@2.0
diff --git a/platformio_override.ini.example b/platformio_override.ini.sample
similarity index 92%
rename from platformio_override.ini.example
rename to platformio_override.ini.sample
index d486dff0..5d2d09ba 100644
--- a/platformio_override.ini.example
+++ b/platformio_override.ini.sample
@@ -18,13 +18,13 @@ build_flags = ${common.build_flags_esp8266}
; *** Use custom settings from file my_config.h
-DWLED_USE_MY_CONFIG
; *********************************************************************
-; -D WLED_DISABLE_OTA
-; -D WLED_DISABLE_ALEXA
+; -D WLED_DISABLE_OTA
+; -D WLED_DISABLE_ALEXA
; -D WLED_DISABLE_BLYNK
-; -D WLED_DISABLE_CRONIXIE
-; -D WLED_DISABLE_HUESYNC
+; -D WLED_DISABLE_CRONIXIE
+; -D WLED_DISABLE_HUESYNC
; -D WLED_DISABLE_INFRARED
-; -D WLED_DISABLE_WEBSOCKETS
+; -D WLED_DISABLE_WEBSOCKETS
; PIN defines - uncomment and change, if needed:
; -D LEDPIN=2
; -D BTNPIN=0
diff --git a/wled00/FX.h b/wled00/FX.h
index 6e0b4643..ae9b1811 100644
--- a/wled00/FX.h
+++ b/wled00/FX.h
@@ -741,7 +741,7 @@ const char JSON_palette_names[] PROGMEM = R"=====([
"Pastel","Sunset 2","Beech","Vintage","Departure","Landscape","Beach","Sherbet","Hult","Hult 64",
"Drywet","Jul","Grintage","Rewhi","Tertiary","Fire","Icefire","Cyane","Light Pink","Autumn",
"Magenta","Magred","Yelmag","Yelblu","Orange & Teal","Tiamat","April Night","Orangery","C9","Sakura",
-"Aurora","Atlantica","C9 2","C9 New"
+"Aurora","Atlantica","C9 2","C9 New","Temperature"
])=====";
#endif
diff --git a/wled00/const.h b/wled00/const.h
index 421747a4..ee675536 100644
--- a/wled00/const.h
+++ b/wled00/const.h
@@ -71,6 +71,7 @@
#define DMX_MODE_EFFECT 3 //trigger standalone effects of WLED (11 channels)
#define DMX_MODE_MULTIPLE_RGB 4 //every LED is addressed with its own RGB (ledCount * 3 channels)
#define DMX_MODE_MULTIPLE_DRGB 5 //every LED is addressed with its own RGB and share a master dimmer (ledCount * 3 + 1 channels)
+#define DMX_MODE_MULTIPLE_RGBW 6 //every LED is addressed with its own RGBW (ledCount * 4 channels)
//Light capability byte (unused) 0bRRCCTTTT
//bits 0/1/2/3: specifies a type of LED driver. A single "driver" may have different chip models but must have the same protocol/behavior
diff --git a/wled00/data/settings_sync.htm b/wled00/data/settings_sync.htm
index 89030c3c..bd34c75f 100644
--- a/wled00/data/settings_sync.htm
+++ b/wled00/data/settings_sync.htm
@@ -64,6 +64,7 @@ DMX mode:
+
E1.31 info
Timeout: ms
diff --git a/wled00/e131.cpp b/wled00/e131.cpp
index b4252d34..58d63779 100644
--- a/wled00/e131.cpp
+++ b/wled00/e131.cpp
@@ -1,6 +1,7 @@
#include "wled.h"
-#define MAX_LEDS_PER_UNIVERSE 170
+#define MAX_3_CH_LEDS_PER_UNIVERSE 170
+#define MAX_4_CH_LEDS_PER_UNIVERSE 128
#define MAX_CHANNELS_PER_UNIVERSE 512
/*
@@ -161,8 +162,12 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){
case DMX_MODE_MULTIPLE_DRGB:
case DMX_MODE_MULTIPLE_RGB:
+ case DMX_MODE_MULTIPLE_RGBW:
{
realtimeLock(realtimeTimeoutMs, mde);
+ bool is4Chan = (DMXMode == DMX_MODE_MULTIPLE_RGBW);
+ const uint16_t dmxChannelsPerLed = is4Chan ? 4 : 3;
+ const uint16_t ledsPerUniverse = is4Chan ? MAX_4_CH_LEDS_PER_UNIVERSE : MAX_3_CH_LEDS_PER_UNIVERSE;
if (realtimeOverride) return;
uint16_t previousLeds, dmxOffset;
if (previousUniverses == 0) {
@@ -176,12 +181,18 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){
} else {
// All subsequent universes start at the first channel.
dmxOffset = (protocol == P_ARTNET) ? 0 : 1;
- uint16_t ledsInFirstUniverse = (MAX_CHANNELS_PER_UNIVERSE - DMXAddress) / 3;
- previousLeds = ledsInFirstUniverse + (previousUniverses - 1) * MAX_LEDS_PER_UNIVERSE;
+ uint16_t ledsInFirstUniverse = (MAX_CHANNELS_PER_UNIVERSE - DMXAddress) / dmxChannelsPerLed;
+ previousLeds = ledsInFirstUniverse + (previousUniverses - 1) * ledsPerUniverse;
}
- uint16_t ledsTotal = previousLeds + (dmxChannels - dmxOffset +1) / 3;
- for (uint16_t i = previousLeds; i < ledsTotal; i++) {
- setRealtimePixel(i, e131_data[dmxOffset++], e131_data[dmxOffset++], e131_data[dmxOffset++], 0);
+ uint16_t ledsTotal = previousLeds + (dmxChannels - dmxOffset +1) / dmxChannelsPerLed;
+ if (!is4Chan) {
+ for (uint16_t i = previousLeds; i < ledsTotal; i++) {
+ setRealtimePixel(i, e131_data[dmxOffset++], e131_data[dmxOffset++], e131_data[dmxOffset++], 0);
+ }
+ } else {
+ for (uint16_t i = previousLeds; i < ledsTotal; i++) {
+ setRealtimePixel(i, e131_data[dmxOffset++], e131_data[dmxOffset++], e131_data[dmxOffset++], e131_data[dmxOffset++]);
+ }
}
break;
}
diff --git a/wled00/html_settings.h b/wled00/html_settings.h
index 183a9e11..23b840ca 100644
--- a/wled00/html_settings.h
+++ b/wled00/html_settings.h
@@ -238,7 +238,8 @@ type="checkbox" name="ES">
DMX start address:
DMX mode:
E1.31 info
Timeout: ms
Force max brightness:
diff --git a/wled00/palettes.h b/wled00/palettes.h
index 30d28433..1753ea79 100644
--- a/wled00/palettes.h
+++ b/wled00/palettes.h
@@ -13,7 +13,7 @@
#ifndef PalettesWLED_h
#define PalettesWLED_h
-#define GRADIENT_PALETTE_COUNT 41
+#define GRADIENT_PALETTE_COUNT 42
const byte ib_jul01_gp[] PROGMEM = {
0, 194, 1, 1,
@@ -606,6 +606,30 @@ const byte Atlantica_gp[] PROGMEM = {
180, 4, 30, 114, //blue (start 191?)
255, 4, 30, 114};
+// Gradient palette "temperature_gp", originally from
+// http://soliton.vm.bytemark.co.uk/pub/cpt-city/arendal/tn/temperature.png.index.html
+// converted for FastLED with gammas (2.6, 2.2, 2.5)
+// Size: 144 bytes of program space.
+
+const byte temperature_gp[] PROGMEM = {
+ 0, 1, 27,105,
+ 14, 1, 40,127,
+ 28, 1, 70,168,
+ 42, 1, 92,197,
+ 56, 1,119,221,
+ 70, 3,130,151,
+ 84, 23,156,149,
+ 99, 67,182,112,
+ 113, 121,201, 52,
+ 127, 142,203, 11,
+ 141, 224,223, 1,
+ 155, 252,187, 2,
+ 170, 247,147, 1,
+ 184, 237, 87, 1,
+ 198, 229, 43, 1,
+ 226, 171, 2, 2,
+ 240, 80, 3, 3,
+ 255, 80, 3, 3};
// Single array of defined cpt-city color palettes.
// This will let us programmatically choose one based on
@@ -652,7 +676,8 @@ const byte* const gGradientPalettes[] PROGMEM = {
Aurora_gp, //50-37 Aurora
Atlantica_gp, //51-38 Atlantica
C9_2_gp, //52-39 C9 2
- C9_new_gp //53-40 C9 New
+ C9_new_gp, //53-40 C9 New
+ temperature_gp //54-41 Temperature
};
#endif
diff --git a/wled00/set.cpp b/wled00/set.cpp
index e2b8ff1b..0de8d553 100644
--- a/wled00/set.cpp
+++ b/wled00/set.cpp
@@ -152,7 +152,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
t = request->arg(F("DA")).toInt();
if (t >= 0 && t <= 510) DMXAddress = t;
t = request->arg(F("DM")).toInt();
- if (t >= DMX_MODE_DISABLED && t <= DMX_MODE_MULTIPLE_DRGB) DMXMode = t;
+ if (t >= DMX_MODE_DISABLED && t <= DMX_MODE_MULTIPLE_RGBW) DMXMode = t;
t = request->arg(F("ET")).toInt();
if (t > 99 && t <= 65000) realtimeTimeoutMs = t;
arlsForceMaxBri = request->hasArg(F("FB"));
diff --git a/wled00/udp.cpp b/wled00/udp.cpp
index 44b70ac0..2b098ac2 100644
--- a/wled00/udp.cpp
+++ b/wled00/udp.cpp
@@ -123,7 +123,7 @@ void handleNotifications()
}
//receive UDP notifications
- if (!udpConnected || !(receiveNotifications || receiveDirect)) return;
+ if (!udpConnected) return;
bool isSupp = false;
uint16_t packetSize = notifierUdp.parsePacket();
@@ -155,16 +155,18 @@ void handleNotifications()
return;
}
}
+
+ if (!(receiveNotifications || receiveDirect)) return;
//notifier and UDP realtime
if (!packetSize || packetSize > UDP_IN_MAXSIZE) return;
- if (!isSupp && notifierUdp.remoteIP() == Network.localIP()) return; //don't process broadcasts we send ourselves
+ if (!isSupp && notifierUdp.remoteIP() == Network.localIP()) return; //don't process broadcasts we send ourselves
uint8_t udpIn[packetSize +1];
if (isSupp) notifier2Udp.read(udpIn, packetSize);
else notifierUdp.read(udpIn, packetSize);
- //wled notifier, block if realtime packets active
+ //wled notifier, ignore if realtime packets active
if (udpIn[0] == 0 && !realtimeMode && receiveNotifications)
{
//ignore notification if received within a second after sending a notification ourselves
@@ -223,6 +225,7 @@ void handleNotifications()
colorUpdated(NOTIFIER_CALL_MODE_NOTIFICATION);
return;
}
+
if (!receiveDirect) return;
//TPM2.NET
diff --git a/wled00/wled.h b/wled00/wled.h
index 93ca1378..8915bbcd 100644
--- a/wled00/wled.h
+++ b/wled00/wled.h
@@ -8,7 +8,7 @@
*/
// version code in format yymmddb (b = daily build)
-#define VERSION 2012010
+#define VERSION 2012020
//uncomment this if you have a "my_config.h" file you'd like to use
//#define WLED_USE_MY_CONFIG