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