From 579dcf083509488f6c62c5b94e04d6a191252f13 Mon Sep 17 00:00:00 2001 From: Frank <91616163+softhack007@users.noreply.github.com> Date: Tue, 6 Jun 2023 12:58:24 +0200 Subject: [PATCH] align with upstream buildenv and librararies * esp8266 core 4.1.0 * esp32 "V4" core 5.2.0 * neopixelbus 2.7.5 * use NeoPixelBusLg * Make SPI bus speed user configurable * adjust MM buildEnv to match upstream https://github.com/Aircoookie/WLED/pull/3144 https://github.com/Aircoookie/WLED/pull/3173 --- platformio.ini | 279 +++++++++++++-------- wled00/bus_manager.cpp | 19 +- wled00/bus_manager.h | 14 +- wled00/bus_wrapper.h | 554 +++++++++++++++++++++++++++++------------ wled00/cfg.cpp | 4 +- wled00/set.cpp | 2 +- wled00/xml.cpp | 45 ++-- 7 files changed, 623 insertions(+), 294 deletions(-) diff --git a/platformio.ini b/platformio.ini index d7248e8c..8790e5f7 100644 --- a/platformio.ini +++ b/platformio.ini @@ -9,8 +9,9 @@ # (use `platformio_override.ini` when building for your own board; see `platformio_override.ini.sample` for an example) # ------------------------------------------------------------------------------ -# Release / CI binaries -; default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, esp32s2_saola, esp32c3, esp32s3dev_8MB +# CI binaries +;; default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth # ESP32 variant builds are temporarily excluded from CI due to toolchain issues on the GitHub Actions Linux environment +; default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB # Release binaries ; default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB @@ -97,18 +98,28 @@ arduino_core_2_6_3 = espressif8266@2.3.3 arduino_core_2_7_4 = espressif8266@2.6.2 arduino_core_3_0_0 = espressif8266@3.0.0 arduino_core_3_2_0 = espressif8266@3.2.0 +arduino_core_4_1_0 = espressif8266@4.1.0 # Development platforms arduino_core_develop = https://github.com/platformio/platform-espressif8266#develop arduino_core_git = https://github.com/platformio/platform-espressif8266#feature/stage # Platform to use for ESP8266 -platform_wled_default = ${common.arduino_core_3_2_0} +platform_wled_default = ${common.arduino_core_4_1_0} # 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 +#platform_packages = tasmota/framework-arduinoespressif8266 @ 3.20704.7 +platform_packages = platformio/framework-arduinoespressif8266 + platformio/toolchain-xtensa @ ~2.100300.220621 #2.40802.200502 + platformio/tool-esptool #@ ~1.413.0 + platformio/tool-esptoolpy #@ ~1.30000.0 + +## previous platform for 8266, in case of problems with the new one +## you'll need makuna/NeoPixelBus@ 2.6.9 for arduino_core_3_2_0, which does not support Ucs890x +;; platform_wled_default = ${common.arduino_core_3_2_0} +;; 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 @@ -147,6 +158,7 @@ build_flags = -DBEARSSL_SSL_BASIC -D CORE_DEBUG_LEVEL=0 ;-D NDEBUG ;; WLEDMM espressif docs say NDEBUG is not recommended. see https://docs.espressif.com/projects/esp-idf/en/v4.4.4/esp32/api-guides/performance/speed.html#not-recommended + -Wno-attributes ;; silence warnings about unknown attribute 'maybe_unused' in NeoPixelBus #build_flags for the IRremoteESP8266 library (enabled decoders have to appear here) -D _IR_ENABLE_DEFAULT_=false -D DECODE_HASH=true @@ -154,7 +166,7 @@ build_flags = -D DECODE_SONY=true -D DECODE_SAMSUNG=true -D DECODE_LG=true - ; -Dregister= # remove warnings in C++17 due to use of deprecated register keyword by the FastLED library + ;-Dregister= # remove warnings in C++17 due to use of deprecated register keyword by the FastLED library ;; warning: this breaks framework code on ESP32-C3 and ESP32-S2 -DWLED_USE_MY_CONFIG ; -D USERMOD_SENSORSTOMQTT #For ADS1115 sensor uncomment following @@ -164,6 +176,7 @@ build_unflags = build_flags_esp8266 = ${common.build_flags} ${esp8266.build_flags} build_flags_esp32 = ${common.build_flags} ${esp32.build_flags} +build_flags_esp32_V4= ${common.build_flags} ${esp32_idf_V4.build_flags} ldscript_1m128k = eagle.flash.1m128.ld ldscript_2m512k = eagle.flash.2m512.ld @@ -198,25 +211,24 @@ upload_speed = 115200 # LIBRARIES: required dependencies # Please note that we don't always use the latest version of a library. # -# The following libraries have been included (and some of them changd) in the source: +# The following libraries have been included (and some of them changed) in the source: # ArduinoJson@5.13.5, E131@1.0.0(changed), Time@1.5, Timezone@1.2.1 # ------------------------------------------------------------------------------ lib_compat_mode = strict lib_deps = fastled/FastLED @ 3.5.0 IRremoteESP8266 @ 2.8.2 + ;;makuna/NeoPixelBus @ 2.7.5 ;; WLEDMM will be added in board specific sections ;;https://github.com/Aircoookie/ESPAsyncWebServer.git @ ~2.0.7 https://github.com/lost-hope/ESPAsyncWebServer.git#master ;; WLEDMM to display .log and .wled files in /edit #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.28.8 - #U8g2@~2.32.10 - #For Dallas sensor uncomment following 2 lines - #OneWire@~2.3.5 - #milesburton/DallasTemperature@^3.9.0 + #For compatible OLED display uncomment following + #U8g2 #@ ~2.33.15 + #For Dallas sensor uncomment following + #OneWire @ ~2.3.7 #For BME280 sensor uncomment following - #BME280@~3.0.0 + #BME280 @ ~3.0.0 ; adafruit/Adafruit BMP280 Library @ 2.1.0 ; adafruit/Adafruit CCS811 Library @ 1.0.4 ; adafruit/Adafruit Si7021 Library @ 1.4.0 @@ -231,8 +243,9 @@ build_flags = -DESP8266 -DFP_IN_IROM ;-Wno-deprecated-declarations - ;-Wno-register ;; leaves some warnings when compiling C files: command-line option '-Wno-register' is valid for C++/ObjC++ but not for C - ;-Wno-misleading-indentation + -Wno-register ;; leaves some warnings when compiling C files: command-line option '-Wno-register' is valid for C++/ObjC++ but not for C + ;-Dregister= # remove warnings in C++17 due to use of deprecated register keyword by the FastLED library ;; warning: this can be dangerous + -Wno-misleading-indentation ; NONOSDK22x_190703 = 2.2.2-dev(38a443e) -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_190703 ; lwIP 2 - Higher Bandwidth no Features @@ -244,12 +257,13 @@ build_flags = ; restrict to minimal mime-types -DMIMETYPE_MINIMAL -lib_deps = +lib_deps = #https://github.com/lorol/LITTLEFS.git ESPAsyncTCP @ 1.2.2 ESPAsyncUDP + ;; makuna/NeoPixelBus @ 2.6.9 ;; WLEDMM use if you have problems with 2.7.5 + makuna/NeoPixelBus @ 2.7.5 ${env.lib_deps} - makuna/NeoPixelBus @ 2.6.9 [esp32] #platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.2.3/platform-espressif32-2.0.2.3.zip @@ -258,12 +272,12 @@ platform = espressif32@3.5.0 platform_packages = framework-arduinoespressif32 @ https://github.com/Aircoookie/arduino-esp32.git#1.0.6.4 build_flags = -g - -DARDUINO_ARCH_ESP32 -DESP32 + -DARDUINO_ARCH_ESP32 #-DCONFIG_LITTLEFS_FOR_IDF_3_2 -D CONFIG_ASYNC_TCP_USE_WDT=0 -#use LITTLEFS library by lorol in ESP32 core 1.x.x instead of built-in in 2.x.x + #use LITTLEFS library by lorol in ESP32 core 1.x.x instead of built-in in 2.x.x -D LOROL_LITTLEFS - ; -DARDUINO_USB_CDC_ON_BOOT=0 ;; this flag is mandatory for "classic ESP32" when builing with arduino-esp32 >=2.0.3 + ; -DARDUINO_USB_CDC_ON_BOOT=0 ;; this flag is mandatory for "classic ESP32" when building with arduino-esp32 >=2.0.3 default_partitions = tools/WLED_ESP32_4MB_1MB_FS.csv ;; WLED standard for 4MB flash: 1.4MB firmware, 1MB filesystem ;default_partitions = tools/WLED_ESP32_4MB_256KB_FS.csv ;; Alternative for 4MB flash: 1.8MB firmware, 256KB filesystem (esptool erase_flash needed before changing) @@ -273,25 +287,26 @@ lib_deps = ; https://github.com/lorol/LITTLEFS.git ; WLEDMM specific: use patched version of lorol LittleFS https://github.com/softhack007/LITTLEFS-threadsafe.git#master + makuna/NeoPixelBus @ 2.7.5 ${env.lib_deps} - makuna/NeoPixelBus @ 2.6.9 + +;; WLEDMM begin ;; ** For compiling with latest Frameworks (IDF4.4.x and arduino-esp32 v2.0.x) ** -;;; standard V4 platform -platformV4 = espressif32@ ~5.1.1 -platformV4_packages = +;;; previous standard V4 platform +platformV4_pre = espressif32@ ~5.1.1 +platformV4_packages_pre = platformio/framework-arduinoespressif32@ ~3.20004.0 toolchain-riscv32-esp @ 8.4.0+2021r2-patch5 ; required for platform version < 5.3.0, remove this line when upgrading to platform >=5.3.0 - -;;; newer V4 platform - may help in case you experience flash corruption and boot loops -platformV4_new = espressif32@ ~5.2.0 -platformV4_new_packages = +;;; standard V4 platform +platformV4 = espressif32@5.2.0 +platformV4_packages = toolchain-riscv32-esp @ 8.4.0+2021r2-patch5 ; required for platform version < 5.3.0, remove this line when upgrading to platform >=5.3.0 -;;; tasmota platform -;platformV4 = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.5.1/platform-espressif32-2.0.5.1.zip -;platformV4_packages = -;;; V4.4.x build flags (without LOROL_LITTLEFS) +;;; experimental: V4 platform with latest arduino-esp32 2.0.9 + ESP-IDF 4.4.4 (may or may not work) +platformV4_xp = espressif32@ ~6.3.0 +platformV4_packages_xp = platformio/framework-arduinoespressif32 @ ~3.20009.0 ;; arduino-esp32 v2.0.9+ + build_flagsV4 = -g -DARDUINO_ARCH_ESP32 -DESP32 -DCONFIG_LITTLEFS_FOR_IDF_3_2 -DLFS_THREADSAFE @@ -300,28 +315,59 @@ build_flagsV4 = -g ;;; V4.4.x libraries (without LOROL_LITTLEFS; with newer NeoPixelBus) lib_depsV4 = https://github.com/pbolduc/AsyncTCP.git @ 1.2.0 ;; WLEDMM this must be first in the list, otherwise Aircoookie/ESPAsyncWebServer pulls in an older version of AsyncTCP !! + makuna/NeoPixelBus @ 2.7.5 + ${env.lib_deps} + +;; WLEDMM end + +[esp32_idf_V4] +;; experimental build environment for ESP32 using ESP-IDF 4.4.x / arduino-esp32 v2.0.5 +;; very similar to the normal ESP32 flags, but omitting Lorol LittleFS, as littlefs is included in the new framework already. +;; +;; please note that you can NOT update existing ESP32 installs with a "V4" build. Also updating by OTA will not work properly. +;; You need to completely erase your device (esptool erase_flash) first, then install the "V4" build from VSCode+platformio. +platform = espressif32@5.2.0 +platform_packages = + toolchain-riscv32-esp @ 8.4.0+2021r2-patch5 ; required for platform version < 5.3.0, remove this line when upgrading to platform >=5.3.0 +build_flags = -g + -Wshadow=compatible-local ;; emit warning in case a local variable "shadows" another local one + -DARDUINO_ARCH_ESP32 -DESP32 + #-DCONFIG_LITTLEFS_FOR_IDF_3_2 + -D CONFIG_ASYNC_TCP_USE_WDT=0 + -DARDUINO_USB_CDC_ON_BOOT=0 ;; this flag is mandatory for "classic ESP32" when building with arduino-esp32 >=2.0.3 +default_partitions = tools/WLED_ESP32_4MB_1MB_FS.csv +lib_deps = + https://github.com/pbolduc/AsyncTCP.git @ 1.2.0 + makuna/NeoPixelBus @ 2.7.5 ${env.lib_deps} - ;https://github.com/Makuna/NeoPixelBus.git#master ;; NPB 2.6.9 tends to crash whith IDF V4.4.3 -> use latest NeoPixelBus dev instead - makuna/NeoPixelBus @ 2.7.1 [esp32s2] +;; generic definitions for all ESP32-S2 boards +platform = espressif32@5.2.0 +platform_packages = + toolchain-riscv32-esp @ 8.4.0+2021r2-patch5 ; required for platform version < 5.3.0, remove this line when upgrading to platform >=5.3.0 build_flags = -g -DARDUINO_ARCH_ESP32 -DESP32 ;; WLEDMM -DARDUINO_ARCH_ESP32S2 - -DCONFIG_IDF_TARGET_ESP32S2 + -DCONFIG_IDF_TARGET_ESP32S2=1 -DCONFIG_LITTLEFS_FOR_IDF_3_2 -DLFS_THREADSAFE ;; WLEDMM -D CONFIG_ASYNC_TCP_USE_WDT=0 + -DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0 -DCO -DARDUINO_USB_MODE=0 ;; this flag is mandatory for ESP32-S2 ! ;; please make sure that the following flags are properly set (to 0 or 1) by your board.json, or included in your custom platformio_override.ini entry: - ;; ARDUINO_USB_CDC_ON_BOOT, ARDUINO_USB_MSC_ON_BOOT, ARDUINO_USB_DFU_ON_BOOT + ;; ARDUINO_USB_CDC_ON_BOOT lib_deps = - https://github.com/pbolduc/AsyncTCP.git @ 1.2.0 ;; WLEDMM this must be first in the list, otherwise Aircoookie/ESPAsyncWebServer pulls in an older version of AsyncTCP !! + https://github.com/pbolduc/AsyncTCP.git @ 1.2.0 + makuna/NeoPixelBus @ 2.7.5 ${env.lib_deps} - makuna/NeoPixelBus @ 2.7.1 ;; WLEDMM - new version is more stable on -S2 [esp32c3] +;; generic definitions for all ESP32-C3 boards +platform = espressif32@5.2.0 +platform_packages = + toolchain-riscv32-esp @ 8.4.0+2021r2-patch5 ; required for platform version < 5.3.0, remove this line when upgrading to platform >=5.3.0 build_flags = -g -DARDUINO_ARCH_ESP32 -DESP32 ;; WLEDMM -DARDUINO_ARCH_ESP32C3 @@ -334,20 +380,20 @@ build_flags = -g ;; ARDUINO_USB_CDC_ON_BOOT lib_deps = - fastled/FastLED @ 3.5.0 - IRremoteESP8266 @ ~2.8.2 https://github.com/pbolduc/AsyncTCP.git @ 1.2.0 - ;;https://github.com/Aircoookie/ESPAsyncWebServer.git @ ~2.0.7 - https://github.com/lost-hope/ESPAsyncWebServer.git#master ;; WLEDMM to display .log and .wled files in /edit - makuna/NeoPixelBus @ 2.7.3 ;; WLEDMM - new version is more stable on -C3 + makuna/NeoPixelBus @ 2.7.5 + ${env.lib_deps} [esp32s3] ;; generic definitions for all ESP32-S3 boards +platform = espressif32@5.2.0 +platform_packages = + toolchain-riscv32-esp @ 8.4.0+2021r2-patch5 ; required for platform version < 5.3.0, remove this line when upgrading to platform >=5.3.0 build_flags = -g -DESP32 -DARDUINO_ARCH_ESP32 -DARDUINO_ARCH_ESP32S3 - -DCONFIG_IDF_TARGET_ESP32S3 + -DCONFIG_IDF_TARGET_ESP32S3=1 -DCONFIG_LITTLEFS_FOR_IDF_3_2 -DLFS_THREADSAFE ;; WLEDMM -D CONFIG_ASYNC_TCP_USE_WDT=0 -DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_DFU_ON_BOOT=0 @@ -357,8 +403,8 @@ build_flags = -g lib_deps = https://github.com/pbolduc/AsyncTCP.git @ 1.2.0 + makuna/NeoPixelBus @ 2.7.5 ${env.lib_deps} - makuna/NeoPixelBus @ 2.7.3 # ------------------------------------------------------------------------------ @@ -454,6 +500,21 @@ board_build.partitions = ${esp32.default_partitions} board_build.f_flash = 80000000L board_build.flash_mode = qio +[env:esp32dev_V4_dio80] +;; experimental ESP32 env using ESP-IDF V4.4.x +;; Warning: this build environment is not stable!! +;; please erase your device before installing. +board = esp32dev +platform = ${esp32_idf_V4.platform} +platform_packages = ${esp32_idf_V4.platform_packages} +build_unflags = ${common.build_unflags} +build_flags = ${common.build_flags} ${esp32_idf_V4.build_flags} -D WLED_RELEASE_NAME=ESP32_V4_qio80 #-D WLED_DISABLE_BROWNOUT_DET +lib_deps = ${esp32_idf_V4.lib_deps} +monitor_filters = esp32_exception_decoder +board_build.partitions = ${esp32_idf_V4.default_partitions} +board_build.f_flash = 80000000L +board_build.flash_mode = dio + [env:esp32_eth] board = esp32-poe platform = ${esp32.platform} @@ -466,51 +527,45 @@ board_build.partitions = ${esp32.default_partitions} [env:esp32s2_saola] board = esp32-s2-saola-1 -;platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.2.2/platform-tasmota-espressif32-2.0.2.zip -;platform_packages = -platform = ${esp32.platformV4} -platform_packages = ${esp32.platformV4_packages} +platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.2.2/platform-tasmota-espressif32-2.0.2.zip +platform_packages = +framework = arduino board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv board_build.flash_mode = qio upload_speed = 460800 build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} ${esp32s2.build_flags} #-D WLED_RELEASE_NAME=S2_saola + -DARDUINO_USB_CDC_ON_BOOT=1 lib_deps = ${esp32s2.lib_deps} -[env:esp32c3dev] ;WLEDMM, merged with latest change on upstream (renamed from env:esp32c3) +[env:esp32c3dev] +extends = esp32c3 +platform = ${esp32c3.platform} +platform_packages = ${esp32c3.platform_packages} +framework = arduino board = esp32-c3-devkitm-1 -platform = ${esp32.platformV4} ;; standard platform, well-tested on -C3, good compatibility with WLED -platform_packages = ${esp32.platformV4_packages} ;; use with standard platform board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv -build_flags = ${common.build_flags} ${esp32c3.build_flags} -D WLED_RELEASE_NAME=ESP32-C3 +build_flags = ${common.build_flags} ${esp32c3.build_flags} #-D WLED_RELEASE_NAME=ESP32-C3 -D WLED_WATCHDOG_TIMEOUT=0 - ; -DARDUINO_USB_CDC_ON_BOOT=1 ;; for virtual USB - -DARDUINO_USB_CDC_ON_BOOT=0 ;; no virtual USB - -D CONFIG_LITTLEFS_FOR_IDF_3_2 ; WLEDMM - -D WLED_USE_MY_CONFIG ; WLEDMM - ; -D USERMOD_AUDIOREACTIVE ; WLEDMM - -D USERMOD_ARTIFX ; WLEDMM + ; -DARDUINO_USB_CDC_ON_BOOT=1 ;; for virtual CDC USB + -DARDUINO_USB_CDC_ON_BOOT=0 ;; for serial-to-USB chip upload_speed = 460800 build_unflags = ${common.build_unflags} lib_deps = ${esp32c3.lib_deps} - ; https://github.com/blazoncek/arduinoFFT.git [env:esp32s3dev_8MB] ;; ESP32-S3-DevKitC-1 development board, with 8MB FLASH, no PSRAM (flash_mode: qio) board = esp32-s3-devkitc-1 -;platform = espressif32@5.1.1 -;platform_packages = platformio/framework-arduinoespressif32@3.20004.220825 -platform = ${esp32.platformV4} -platform_packages = ${esp32.platformV4_packages} -upload_speed = 921600 +platform = ${esp32s3.platform} +platform_packages = ${esp32s3.platform_packages} +upload_speed = 921600 ; or 460800 build_unflags = ${common.build_unflags} -build_flags = ${common.build_flags} ${esp32s3.build_flags} -D CONFIG_LITTLEFS_FOR_IDF_3_2 -D WLED_WATCHDOG_TIMEOUT=0 -D ARDUINO_USB_MODE=1 -D ARDUINO_USB_CDC_ON_BOOT=0 -D ARDUINO_USB_MSC_ON_BOOT=0 - -D WLED_RELEASE_NAME=ESP32-S3 - -D WLED_USE_MY_CONFIG - -D USERMOD_AUDIOREACTIVE - -D USERMOD_ARTIFX +build_flags = ${common.build_flags} ${esp32s3.build_flags} + -D CONFIG_LITTLEFS_FOR_IDF_3_2 -D WLED_WATCHDOG_TIMEOUT=0 + -D ARDUINO_USB_CDC_ON_BOOT=0 ;; -D ARDUINO_USB_MODE=1 ;; for boards with serial-to-USB chip + ;-D ARDUINO_USB_CDC_ON_BOOT=1 ;; -D ARDUINO_USB_MODE=0 ;; for boards with USB-OTG connector only (USBCDC or "TinyUSB") + ;-D WLED_DEBUG lib_deps = ${esp32s3.lib_deps} - https://github.com/blazoncek/arduinoFFT.git board_build.partitions = tools/WLED_ESP32_8MB.csv board_build.f_flash = 80000000L board_build.flash_mode = qio @@ -522,13 +577,14 @@ monitor_filters = esp32_exception_decoder ;board = um_tinys3 ; -> needs workaround from https://github.com/Aircoookie/WLED/pull/2905#issuecomment-1328049860 ;board = esp32s3box ; -> error: 'esp32_adc2gpio' was not declared in this scope board = esp32-s3-devkitc-1 ; -> compiles, but does not support PSRAM -platform = ${esp32.platformV4_new} ;; alternative platform, might help in case you experience bootloops due to corrupted flash filesystem -platform_packages = ${esp32.platformV4_new_packages} +platform = ${esp32s3.platform} +platform_packages = ${esp32s3.platform_packages} upload_speed = 921600 build_unflags = ${common.build_unflags} -build_flags = ${common.build_flags} ${esp32s3.build_flags} +build_flags = ${common.build_flags} ${esp32s3.build_flags} -D CONFIG_LITTLEFS_FOR_IDF_3_2 -D WLED_WATCHDOG_TIMEOUT=0 - -D ARDUINO_USB_MODE=1 -D ARDUINO_USB_MSC_ON_BOOT=0 ; -D ARDUINO_USB_CDC_ON_BOOT=0 + ;-D ARDUINO_USB_CDC_ON_BOOT=0 ;; -D ARDUINO_USB_MODE=1 ;; for boards with serial-to-USB chip + -D ARDUINO_USB_CDC_ON_BOOT=1 ;; -D ARDUINO_USB_MODE=0 ;; for boards with USB-OTG connector only (USBCDC or "TinyUSB") ; -D WLED_RELEASE_NAME=ESP32-S3_PSRAM -D WLED_USE_PSRAM -DBOARD_HAS_PSRAM ; tells WLED that PSRAM shall be used lib_deps = ${esp32s3.lib_deps} @@ -600,16 +656,17 @@ build_flags = ${common.build_flags_esp8266} -D LEDPIN=12 -D IRPIN=-1 -D RLYPIN=2 lib_deps = ${esp8266.lib_deps} [env:lolin_s2_mini] -;platform = espressif32@5.1.1 -platform = ${esp32.platformV4} -platform_packages = ${esp32.platformV4_packages} +platform = ${esp32s2.platform} +platform_packages = ${esp32s2.platform_packages} board = lolin_s2_mini board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv -build_unflags = ${common.build_unflags} -build_flags = ${common.build_flags} ${esp32s2.build_flags} -D WLED_RELEASE_NAME=LolinS2 +build_unflags = ${common.build_unflags} -DARDUINO_USB_CDC_ON_BOOT=1 +build_flags = ${common.build_flags} ${esp32s2.build_flags} #-D WLED_RELEASE_NAME=LolinS2 -DBOARD_HAS_PSRAM - -D ARDUINO_USB_CDC_ON_BOOT - ;-D ARDUINO_USB_CDC_ON_BOOT=0 + -DARDUINO_USB_CDC_ON_BOOT=0 + -DARDUINO_USB_MSC_ON_BOOT=0 + -DARDUINO_USB_DFU_ON_BOOT=0 + -DLOLIN_WIFI_FIX ; seems to work much better with this -D WLED_USE_PSRAM -D WLED_WATCHDOG_TIMEOUT=0 -D CONFIG_ASYNC_TCP_USE_WDT=0 @@ -620,24 +677,38 @@ build_flags = ${common.build_flags} ${esp32s2.build_flags} -D WLED_RELEASE_NAME -D HW_PIN_SCL=35 -D HW_PIN_SDA=33 -D HW_PIN_CLOCKSPI=7 - -D HW_PIN_MOSISPI=11 ;WLEDMM renamed from HW_PIN_DATASPI + -D HW_PIN_DATASPI=11 -D HW_PIN_MISOSPI=9 - ; -D STATUSLED=15 - -D WLED_USE_MY_CONFIG - -D USERMOD_AUDIOREACTIVE - -D USERMOD_ARTIFX - +; -D STATUSLED=15 lib_deps = ${esp32s2.lib_deps} - https://github.com/blazoncek/arduinoFFT.git # ------------------------------------------------------------------------------ # custom board configurations # ------------------------------------------------------------------------------ -; WLEDMM see below +[env:esp32c3dev_2MB] +;; for ESP32-C3 boards with 2MB flash (instead of 4MB). +;; this board need a specific partition file. OTA not possible. +extends = esp32c3 +platform = ${esp32c3.platform} +platform_packages = ${esp32c3.platform_packages} +board = esp32-c3-devkitm-1 +build_flags = ${common.build_flags} ${esp32c3.build_flags} #-D WLED_RELEASE_NAME=ESP32-C3 + -D WLED_WATCHDOG_TIMEOUT=0 + -D WLED_DISABLE_OTA + ; -DARDUINO_USB_CDC_ON_BOOT=1 ;; for virtual CDC USB + -DARDUINO_USB_CDC_ON_BOOT=0 ;; for serial-to-USB chip +build_unflags = ${common.build_unflags} +upload_speed = 115200 +lib_deps = ${esp32c3.lib_deps} +board_build.partitions = tools/WLED_ESP32_2MB_noOTA.csv +board_build.flash_mode = dio + +;WLEDMM: see below ; [env:wemos_shield_esp32] ; board = esp32dev -; platform = espressif32@3.2 +; platform = ${esp32.platform} +; platform_packages = ${esp32.platform_packages} ; upload_speed = 460800 ; build_unflags = ${common.build_unflags} ; build_flags = ${common.build_flags_esp32} @@ -662,7 +733,8 @@ board = esp32dev build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp32} -D LEDPIN=27 -D BTNPIN=39 lib_deps = ${esp32.lib_deps} -platform = espressif32@3.2 +platform = ${esp32.platform} +platform_packages = ${esp32.platform_packages} board_build.partitions = ${esp32.default_partitions} [env:sp501e] @@ -768,7 +840,8 @@ lib_deps = ${esp8266.lib_deps} # ------------------------------------------------------------------------------ [env:elekstube_ips] board = esp32dev -platform = espressif32@3.2 +platform = ${esp32.platform} +platform_packages = ${esp32.platform_packages} upload_speed = 921600 build_flags = ${common.build_flags_esp32} -D WLED_DISABLE_BROWNOUT_DET -D WLED_DISABLE_INFRARED -D USERMOD_RTC @@ -1449,8 +1522,8 @@ monitor_filters = esp32_exception_decoder ;; MM environment for generic ESP32-S2, with PSRAM, 4MB flash (300kB filesystem to have more program space) [env:esp32s2_PSRAM_M] extends = esp32_4MB_V4_M_base -platform = ${esp32.platformV4_new} ;; more stable on -S2 than 5.1.1 -platform_packages = ${esp32.platformV4_new_packages} +platform = ${esp32.platformV4} ;; more stable on -S2 than 5.1.1 +platform_packages = ${esp32.platformV4_packages} board = lolin_s2_mini board_build.partitions = tools/WLED_ESP32_4MB_256KB_FS.csv ;; 1.8MB firmware, 256KB filesystem (esptool erase_flash needed when changing from "standard WLED" partitions) @@ -1495,11 +1568,9 @@ monitor_filters = esp32_exception_decoder ;; MM environment for generic ESP32-C3 -> 4MB flash, no PSRAM [env:esp32c3dev_4MB_M] extends = esp32_4MB_V4_S_base -;platform = ${esp32.platformV4} ;; standard IDF 4.4.1 platform -;platform_packages = ${esp32.platformV4_packages} ;board_build.flash_mode = dout -platform = ${esp32.platformV4_new} ;; alternative platform, might help in case you experience bootloops due to corrupted flash filesystem -platform_packages = ${esp32.platformV4_new_packages} +platform = ${esp32.platformV4} ;; alternative platform, might help in case you experience bootloops due to corrupted flash filesystem +platform_packages = ${esp32.platformV4_packages} board_build.flash_mode = qio board = esp32-c3-devkitm-1 ;board_build.partitions = tools/WLED_ESP32_4MB_256KB_FS.csv ;; 1.8MB firmware, 256KB filesystem (esptool erase_flash needed when changing from "standard WLED" partitions) @@ -1550,8 +1621,8 @@ lib_ignore = [env:seeed_esp32c3_4MB_S] extends = env:esp32c3dev_4MB_M board = seeed_xiao_esp32c3 -platform = ${esp32.platformV4} ;; standard IDF 4.4.1 platform -platform_packages = ${esp32.platformV4_packages} +platform = ${esp32.platformV4_pre} ;; standard IDF 4.4.1 platform +platform_packages = ${esp32.platformV4_packages_pre} board_build.flash_mode = qio upload_speed = 460800 build_unflags = ${env:esp32c3dev_4MB_M.build_unflags} diff --git a/wled00/bus_manager.cpp b/wled00/bus_manager.cpp index 08bb5128..e0a86a36 100644 --- a/wled00/bus_manager.cpp +++ b/wled00/bus_manager.cpp @@ -96,12 +96,14 @@ uint32_t Bus::autoWhiteCalc(uint32_t c) { BusDigital::BusDigital(BusConfig &bc, uint8_t nr, const ColorOrderMap &com) : Bus(bc.type, bc.start, bc.autoWhite), _colorOrderMap(com) { if (!IS_DIGITAL(bc.type) || !bc.count) return; if (!pinManager.allocatePin(bc.pins[0], true, PinOwner::BusDigital)) return; + _frequencykHz = 0U; _pins[0] = bc.pins[0]; if (IS_2PIN(bc.type)) { if (!pinManager.allocatePin(bc.pins[1], true, PinOwner::BusDigital)) { cleanup(); return; } _pins[1] = bc.pins[1]; + _frequencykHz = bc.frequency ? bc.frequency : 2000U; // 2MHz clock if undefined } reversed = bc.reversed; _needsRefresh = bc.refreshReq || bc.type == TYPE_TM1814; @@ -111,7 +113,7 @@ BusDigital::BusDigital(BusConfig &bc, uint8_t nr, const ColorOrderMap &com) : Bu if (_iType == I_NONE) return; uint16_t lenToCreate = _len; if (bc.type == TYPE_WS2812_1CH_X3) lenToCreate = NUM_ICS_WS2812_1CH_3X(_len); // only needs a third of "RGB" LEDs for NeoPixelBus - _busPtr = PolyBus::create(_iType, _pins, lenToCreate, nr); + _busPtr = PolyBus::create(_iType, _pins, lenToCreate, nr, _frequencykHz); _valid = (_busPtr != nullptr); _colorOrder = bc.colorOrder; DEBUG_PRINTF("%successfully inited strip %u (len %u) with type %u and pins %u,%u (itype %u)\n", _valid?"S":"Uns", nr, _len, bc.type, _pins[0],_pins[1],_iType); @@ -213,10 +215,11 @@ BusPwm::BusPwm(BusConfig &bc) : Bus(bc.type, bc.start, bc.autoWhite) { _valid = false; if (!IS_PWM(bc.type)) return; uint8_t numPins = NUM_PWM_PINS(bc.type); + _frequency = bc.frequency ? bc.frequency : WLED_PWM_FREQ; #ifdef ESP8266 analogWriteRange(255); //same range as one RGB channel - analogWriteFreq(WLED_PWM_FREQ); + analogWriteFreq(_frequency); #else _ledcStart = pinManager.allocateLedc(numPins); if (_ledcStart == 255) { //no more free LEDC channels @@ -233,7 +236,7 @@ BusPwm::BusPwm(BusConfig &bc) : Bus(bc.type, bc.start, bc.autoWhite) { #ifdef ESP8266 pinMode(_pins[i], OUTPUT); #else - ledcSetup(_ledcStart + i, WLED_PWM_FREQ, 8); + ledcSetup(_ledcStart + i, _frequency, 8); ledcAttachPin(_pins[i], _ledcStart + i); #endif } @@ -451,21 +454,21 @@ void BusNetwork::cleanup() { uint32_t BusManager::memUsage(BusConfig &bc) { uint8_t type = bc.type; uint16_t len = bc.count + bc.skipAmount; - if (type > 15 && type < 32) { + if (type > 15 && type < 32) { // digital types + if (type == TYPE_UCS8903 || type == TYPE_UCS8904) len *= 2; // 16-bit LEDs #ifdef ESP8266 if (bc.pins[0] == 3) { //8266 DMA uses 5x the mem - if (type > 29) return len*20; //RGBW + if (type > 28) return len*20; //RGBW return len*15; } - if (type > 29) return len*4; //RGBW + if (type > 28) return len*4; //RGBW return len*3; #else //ESP32 RMT uses double buffer? - if (type > 29) return len*8; //RGBW + if (type > 28) return len*8; //RGBW return len*6; #endif } if (type > 31 && type < 48) return 5; - if (type == 44 || type == 45) return len*4; //RGBW return len*3; //RGB } diff --git a/wled00/bus_manager.h b/wled00/bus_manager.h index ffb3bd14..b6d79d07 100644 --- a/wled00/bus_manager.h +++ b/wled00/bus_manager.h @@ -29,10 +29,11 @@ struct BusConfig { bool refreshReq; uint8_t autoWhite; uint8_t pins[5] = {LEDPIN, 255, 255, 255, 255}; - BusConfig(uint8_t busType, uint8_t* ppins, uint16_t pstart, uint16_t len = 1, uint8_t pcolorOrder = COL_ORDER_GRB, bool rev = false, uint8_t skip = 0, byte aw=RGBW_MODE_MANUAL_ONLY) { + uint16_t frequency; + BusConfig(uint8_t busType, uint8_t* ppins, uint16_t pstart, uint16_t len = 1, uint8_t pcolorOrder = COL_ORDER_GRB, bool rev = false, uint8_t skip = 0, byte aw=RGBW_MODE_MANUAL_ONLY, uint16_t clock_kHz=0U) { refreshReq = (bool) GET_BIT(busType,7); type = busType & 0x7F; // bit 7 may be/is hacked to include refresh info (1=refresh in off state, 0=no refresh) - count = len; start = pstart; colorOrder = pcolorOrder; reversed = rev; skipAmount = skip; autoWhite = aw; + count = len; start = pstart; colorOrder = pcolorOrder; reversed = rev; skipAmount = skip; autoWhite = aw; frequency = clock_kHz; uint8_t nPins = 1; if (type >= TYPE_NET_DDP_RGB && type < 96) nPins = 4; //virtual network bus. 4 "pins" store IP address else if (type > 47) nPins = 2; @@ -114,6 +115,7 @@ class Bus { virtual void setColorOrder() {} virtual uint8_t getColorOrder() { return COL_ORDER_RGB; } virtual uint8_t skippedLeds() { return 0; } + virtual uint16_t getFrequency() { return 0U; } inline uint16_t getStart() { return _start; } inline void setStart(uint16_t start) { _start = start; } inline uint8_t getType() { return _type; } @@ -203,6 +205,8 @@ class BusDigital : public Bus { return _skip; } + uint16_t getFrequency() { return _frequencykHz; } + void reinit(); void cleanup(); @@ -216,6 +220,7 @@ class BusDigital : public Bus { uint8_t _pins[2] = {255, 255}; uint8_t _iType = 0; //I_NONE; uint8_t _skip = 0; + uint16_t _frequencykHz = 0U; void * _busPtr = nullptr; const ColorOrderMap &_colorOrderMap; }; @@ -234,6 +239,8 @@ class BusPwm : public Bus { uint8_t getPins(uint8_t* pinArray); + uint16_t getFrequency() { return _frequency; } + void cleanup() { deallocatePins(); } @@ -248,6 +255,7 @@ class BusPwm : public Bus { #ifdef ARDUINO_ARCH_ESP32 uint8_t _ledcStart = 255; #endif + uint16_t _frequency = 0U; void deallocatePins(); }; @@ -335,7 +343,7 @@ class BusManager { void setStatusPixel(uint32_t c); - void IRAM_ATTR setPixelColor(uint16_t pix, uint32_t c, int16_t cct=-1); + void setPixelColor(uint16_t pix, uint32_t c, int16_t cct=-1); void setBrightness(uint8_t b); diff --git a/wled00/bus_wrapper.h b/wled00/bus_wrapper.h index f2b364f6..f4a9af29 100644 --- a/wled00/bus_wrapper.h +++ b/wled00/bus_wrapper.h @@ -1,7 +1,7 @@ #ifndef BusWrapper_h #define BusWrapper_h -#include "NeoPixelBrightnessBus.h" +#include "NeoPixelBusLg.h" // temporary - these defines should actually be set in platformio.ini // C3: I2S0 and I2S1 methods not supported (has one I2S bus) @@ -53,6 +53,16 @@ #define I_8266_U1_TM2_3 18 #define I_8266_DM_TM2_3 19 #define I_8266_BB_TM2_3 20 +//UCS8903 (RGB) +#define I_8266_U0_UCS_3 49 +#define I_8266_U1_UCS_3 50 +#define I_8266_DM_UCS_3 51 +#define I_8266_BB_UCS_3 52 +//UCS8904 (RGBW) +#define I_8266_U0_UCS_4 53 +#define I_8266_U1_UCS_4 54 +#define I_8266_DM_UCS_4 55 +#define I_8266_BB_UCS_4 56 /*** ESP32 Neopixel methods ***/ //RGB @@ -80,6 +90,16 @@ #define I_32_I0_TM2_3 37 #define I_32_I1_TM2_3 38 //Bit Bang theoratically possible, but very undesirable and not needed (no pin restrictions on RMT and I2S) +//UCS8903 (RGB) +#define I_32_RN_UCS_3 57 +#define I_32_I0_UCS_3 58 +#define I_32_I1_UCS_3 59 +//Bit Bang theoratically possible, but very undesirable and not needed (no pin restrictions on RMT and I2S) +//UCS8904 (RGBW) +#define I_32_RN_UCS_4 60 +#define I_32_I0_UCS_4 61 +#define I_32_I1_UCS_4 62 +//Bit Bang theoratically possible, but very undesirable and not needed (no pin restrictions on RMT and I2S) //APA102 #define I_HS_DOT_3 39 //hardware SPI @@ -105,77 +125,105 @@ /*** ESP8266 Neopixel methods ***/ #ifdef ESP8266 //RGB -#define B_8266_U0_NEO_3 NeoPixelBrightnessBus //3 chan, esp8266, gpio1 -#define B_8266_U1_NEO_3 NeoPixelBrightnessBus //3 chan, esp8266, gpio2 -#define B_8266_DM_NEO_3 NeoPixelBrightnessBus //3 chan, esp8266, gpio3 -#define B_8266_BB_NEO_3 NeoPixelBrightnessBus //3 chan, esp8266, bb (any pin but 16) +#define B_8266_U0_NEO_3 NeoPixelBusLg //3 chan, esp8266, gpio1 +#define B_8266_U1_NEO_3 NeoPixelBusLg //3 chan, esp8266, gpio2 +#define B_8266_DM_NEO_3 NeoPixelBusLg //3 chan, esp8266, gpio3 +#define B_8266_BB_NEO_3 NeoPixelBusLg //3 chan, esp8266, bb (any pin but 16) //RGBW -#define B_8266_U0_NEO_4 NeoPixelBrightnessBus //4 chan, esp8266, gpio1 -#define B_8266_U1_NEO_4 NeoPixelBrightnessBus //4 chan, esp8266, gpio2 -#define B_8266_DM_NEO_4 NeoPixelBrightnessBus //4 chan, esp8266, gpio3 -#define B_8266_BB_NEO_4 NeoPixelBrightnessBus //4 chan, esp8266, bb (any pin) +#define B_8266_U0_NEO_4 NeoPixelBusLg //4 chan, esp8266, gpio1 +#define B_8266_U1_NEO_4 NeoPixelBusLg //4 chan, esp8266, gpio2 +#define B_8266_DM_NEO_4 NeoPixelBusLg //4 chan, esp8266, gpio3 +#define B_8266_BB_NEO_4 NeoPixelBusLg //4 chan, esp8266, bb (any pin) //400Kbps -#define B_8266_U0_400_3 NeoPixelBrightnessBus //3 chan, esp8266, gpio1 -#define B_8266_U1_400_3 NeoPixelBrightnessBus //3 chan, esp8266, gpio2 -#define B_8266_DM_400_3 NeoPixelBrightnessBus //3 chan, esp8266, gpio3 -#define B_8266_BB_400_3 NeoPixelBrightnessBus //3 chan, esp8266, bb (any pin) +#define B_8266_U0_400_3 NeoPixelBusLg //3 chan, esp8266, gpio1 +#define B_8266_U1_400_3 NeoPixelBusLg //3 chan, esp8266, gpio2 +#define B_8266_DM_400_3 NeoPixelBusLg //3 chan, esp8266, gpio3 +#define B_8266_BB_400_3 NeoPixelBusLg //3 chan, esp8266, bb (any pin) //TM1814 (RGBW) -#define B_8266_U0_TM1_4 NeoPixelBrightnessBus -#define B_8266_U1_TM1_4 NeoPixelBrightnessBus -#define B_8266_DM_TM1_4 NeoPixelBrightnessBus -#define B_8266_BB_TM1_4 NeoPixelBrightnessBus +#define B_8266_U0_TM1_4 NeoPixelBusLg +#define B_8266_U1_TM1_4 NeoPixelBusLg +#define B_8266_DM_TM1_4 NeoPixelBusLg +#define B_8266_BB_TM1_4 NeoPixelBusLg //TM1829 (RGB) -#define B_8266_U0_TM2_4 NeoPixelBrightnessBus -#define B_8266_U1_TM2_4 NeoPixelBrightnessBus -#define B_8266_DM_TM2_4 NeoPixelBrightnessBus -#define B_8266_BB_TM2_4 NeoPixelBrightnessBus +#define B_8266_U0_TM2_4 NeoPixelBusLg +#define B_8266_U1_TM2_4 NeoPixelBusLg +#define B_8266_DM_TM2_4 NeoPixelBusLg +#define B_8266_BB_TM2_4 NeoPixelBusLg +//UCS8903 +#define B_8266_U0_UCS_3 NeoPixelBusLg //3 chan, esp8266, gpio1 +#define B_8266_U1_UCS_3 NeoPixelBusLg //3 chan, esp8266, gpio2 +#define B_8266_DM_UCS_3 NeoPixelBusLg //3 chan, esp8266, gpio3 +#define B_8266_BB_UCS_3 NeoPixelBusLg //3 chan, esp8266, bb (any pin but 16) +//UCS8904 RGBW +#define B_8266_U0_UCS_4 NeoPixelBusLg //4 chan, esp8266, gpio1 +#define B_8266_U1_UCS_4 NeoPixelBusLg //4 chan, esp8266, gpio2 +#define B_8266_DM_UCS_4 NeoPixelBusLg //4 chan, esp8266, gpio3 +#define B_8266_BB_UCS_4 NeoPixelBusLg //4 chan, esp8266, bb (any pin) #endif /*** ESP32 Neopixel methods ***/ #ifdef ARDUINO_ARCH_ESP32 //RGB -#define B_32_RN_NEO_3 NeoPixelBrightnessBus +#define B_32_RN_NEO_3 NeoPixelBusLg #ifndef WLED_NO_I2S0_PIXELBUS -#define B_32_I0_NEO_3 NeoPixelBrightnessBus +#define B_32_I0_NEO_3 NeoPixelBusLg #endif #ifndef WLED_NO_I2S1_PIXELBUS -#define B_32_I1_NEO_3 NeoPixelBrightnessBus +#define B_32_I1_NEO_3 NeoPixelBusLg #endif //#define B_32_BB_NEO_3 NeoPixelBrightnessBus // NeoEsp8266BitBang800KbpsMethod //RGBW -#define B_32_RN_NEO_4 NeoPixelBrightnessBus +#define B_32_RN_NEO_4 NeoPixelBusLg #ifndef WLED_NO_I2S0_PIXELBUS -#define B_32_I0_NEO_4 NeoPixelBrightnessBus +#define B_32_I0_NEO_4 NeoPixelBusLg #endif #ifndef WLED_NO_I2S1_PIXELBUS -#define B_32_I1_NEO_4 NeoPixelBrightnessBus +#define B_32_I1_NEO_4 NeoPixelBusLg #endif //#define B_32_BB_NEO_4 NeoPixelBrightnessBus // NeoEsp8266BitBang800KbpsMethod //400Kbps -#define B_32_RN_400_3 NeoPixelBrightnessBus +#define B_32_RN_400_3 NeoPixelBusLg #ifndef WLED_NO_I2S0_PIXELBUS -#define B_32_I0_400_3 NeoPixelBrightnessBus +#define B_32_I0_400_3 NeoPixelBusLg #endif #ifndef WLED_NO_I2S1_PIXELBUS -#define B_32_I1_400_3 NeoPixelBrightnessBus +#define B_32_I1_400_3 NeoPixelBusLg #endif //#define B_32_BB_400_3 NeoPixelBrightnessBus // NeoEsp8266BitBang400KbpsMethod //TM1814 (RGBW) -#define B_32_RN_TM1_4 NeoPixelBrightnessBus +#define B_32_RN_TM1_4 NeoPixelBusLg #ifndef WLED_NO_I2S0_PIXELBUS -#define B_32_I0_TM1_4 NeoPixelBrightnessBus +#define B_32_I0_TM1_4 NeoPixelBusLg #endif #ifndef WLED_NO_I2S1_PIXELBUS -#define B_32_I1_TM1_4 NeoPixelBrightnessBus +#define B_32_I1_TM1_4 NeoPixelBusLg #endif //Bit Bang theoratically possible, but very undesirable and not needed (no pin restrictions on RMT and I2S) //TM1829 (RGB) -#define B_32_RN_TM2_3 NeoPixelBrightnessBus +#define B_32_RN_TM2_3 NeoPixelBusLg #ifndef WLED_NO_I2S0_PIXELBUS -#define B_32_I0_TM2_3 NeoPixelBrightnessBus +#define B_32_I0_TM2_3 NeoPixelBusLg #endif #ifndef WLED_NO_I2S1_PIXELBUS -#define B_32_I1_TM2_3 NeoPixelBrightnessBus +#define B_32_I1_TM2_3 NeoPixelBusLg +#endif +//Bit Bang theoratically possible, but very undesirable and not needed (no pin restrictions on RMT and I2S) +//UCS8903 +#define B_32_RN_UCS_3 NeoPixelBusLg +#ifndef WLED_NO_I2S0_PIXELBUS +#define B_32_I0_UCS_3 NeoPixelBusLg +#endif +#ifndef WLED_NO_I2S1_PIXELBUS +#define B_32_I1_UCS_3 NeoPixelBusLg +#endif +//Bit Bang theoratically possible, but very undesirable and not needed (no pin restrictions on RMT and I2S) +//UCS8904 +#define B_32_RN_UCS_4 NeoPixelBusLg +#ifndef WLED_NO_I2S0_PIXELBUS +#define B_32_I0_UCS_4 NeoPixelBusLg +#endif +#ifndef WLED_NO_I2S1_PIXELBUS +#define B_32_I1_UCS_4 NeoPixelBusLg #endif //Bit Bang theoratically possible, but very undesirable and not needed (no pin restrictions on RMT and I2S) @@ -184,45 +232,47 @@ //APA102 #ifdef WLED_USE_ETHERNET // fix for #2542 (by @BlackBird77) -#define B_HS_DOT_3 NeoPixelBrightnessBus //hardware HSPI with DMA (ESP32 only) +#define B_HS_DOT_3 NeoPixelBusLg //hardware HSPI (was DotStarEsp32DmaHspi5MhzMethod in NPB @ 2.6.9) #else -#define B_HS_DOT_3 NeoPixelBrightnessBus //hardware VSPI +#define B_HS_DOT_3 NeoPixelBusLg //hardware VSPI #endif -#define B_SS_DOT_3 NeoPixelBrightnessBus //soft SPI +#define B_SS_DOT_3 NeoPixelBusLg //soft SPI //LPD8806 -#define B_HS_LPD_3 NeoPixelBrightnessBus -#define B_SS_LPD_3 NeoPixelBrightnessBus +#define B_HS_LPD_3 NeoPixelBusLg +#define B_SS_LPD_3 NeoPixelBusLg //LPD6803 -#define B_HS_LPO_3 NeoPixelBrightnessBus -#define B_SS_LPO_3 NeoPixelBrightnessBus +#define B_HS_LPO_3 NeoPixelBusLg +#define B_SS_LPO_3 NeoPixelBusLg //WS2801 -#if defined(WLED_WS2801_SPEED_KHZ) && WLED_WS2801_SPEED_KHZ==40000 -#define B_HS_WS1_3 NeoPixelBrightnessBus // fastest bus speed (not existing method?) -#elif defined(WLED_WS2801_SPEED_KHZ) && WLED_WS2801_SPEED_KHZ==20000 -#define B_HS_WS1_3 NeoPixelBrightnessBus // 20MHz -#elif defined(WLED_WS2801_SPEED_KHZ) && WLED_WS2801_SPEED_KHZ==10000 -#define B_HS_WS1_3 NeoPixelBrightnessBus // 10MHz -#elif defined(WLED_WS2801_SPEED_KHZ) && WLED_WS2801_SPEED_KHZ==2000 -#define B_HS_WS1_3 NeoPixelBrightnessBus //slower, more compatible -#elif defined(WLED_WS2801_SPEED_KHZ) && WLED_WS2801_SPEED_KHZ==1000 -#define B_HS_WS1_3 NeoPixelBrightnessBus //slower, more compatible -#elif defined(WLED_WS2801_SPEED_KHZ) && WLED_WS2801_SPEED_KHZ==500 -#define B_HS_WS1_3 NeoPixelBrightnessBus //slower, more compatible -#else -#define B_HS_WS1_3 NeoPixelBrightnessBus // 2MHz; slower, more compatible -#endif -#define B_SS_WS1_3 NeoPixelBrightnessBus +#define B_HS_WS1_3 NeoPixelBusLg +#define B_SS_WS1_3 NeoPixelBusLg //P9813 -#define B_HS_P98_3 NeoPixelBrightnessBus -#define B_SS_P98_3 NeoPixelBrightnessBus +#define B_HS_P98_3 NeoPixelBusLg +#define B_SS_P98_3 NeoPixelBusLg + +// 48bit & 64bit to 24bit & 32bit RGB(W) conversion +#define toRGBW32(c) (RGBW32((c>>40)&0xFF, (c>>24)&0xFF, (c>>8)&0xFF, (c>>56)&0xFF)) +#define RGBW32(r,g,b,w) (uint32_t((byte(w) << 24) | (byte(r) << 16) | (byte(g) << 8) | (byte(b)))) //handles pointer type conversion for all possible bus types class PolyBus { public: + // initialize SPI bus speed for DotStar methods + template + static void beginDotStar(void* busPtr, int8_t sck, int8_t miso, int8_t mosi, int8_t ss, uint16_t clock_kHz = 0U) { + T dotStar_strip = static_cast(busPtr); + #ifdef ESP8266 + dotStar_strip->Begin(); + #else + if (sck == -1 && mosi == -1) dotStar_strip->Begin(); + else dotStar_strip->Begin(sck, miso, mosi, ss); + #endif + if (clock_kHz) dotStar_strip->SetMethodSettings(NeoSpiSettings((uint32_t)clock_kHz*1000)); + } // Begin & initialize the PixelSettings for TM1814 strips. template static void beginTM1814(void* busPtr) { @@ -231,7 +281,7 @@ class PolyBus { // Max current for each LED (22.5 mA). tm1814_strip->SetPixelSettings(NeoTm1814Settings(/*R*/225, /*G*/225, /*B*/225, /*W*/225)); } - static void begin(void* busPtr, uint8_t busType, uint8_t* pins) { + static void begin(void* busPtr, uint8_t busType, uint8_t* pins, uint16_t clock_kHz = 0U) { switch (busType) { case I_NONE: break; #ifdef ESP8266 @@ -255,11 +305,19 @@ class PolyBus { case I_8266_U1_TM2_3: (static_cast(busPtr))->Begin(); break; case I_8266_DM_TM2_3: (static_cast(busPtr))->Begin(); break; case I_8266_BB_TM2_3: (static_cast(busPtr))->Begin(); break; - case I_HS_DOT_3: (static_cast(busPtr))->Begin(); break; - case I_HS_LPD_3: (static_cast(busPtr))->Begin(); break; - case I_HS_LPO_3: (static_cast(busPtr))->Begin(); break; - case I_HS_WS1_3: (static_cast(busPtr))->Begin(); break; - case I_HS_P98_3: (static_cast(busPtr))->Begin(); break; + case I_HS_DOT_3: beginDotStar(busPtr, -1, -1, -1, -1, clock_kHz); break; + case I_HS_LPD_3: beginDotStar(busPtr, -1, -1, -1, -1, clock_kHz); break; + case I_HS_LPO_3: beginDotStar(busPtr, -1, -1, -1, -1, clock_kHz); break; + case I_HS_WS1_3: beginDotStar(busPtr, -1, -1, -1, -1, clock_kHz); break; + case I_HS_P98_3: beginDotStar(busPtr, -1, -1, -1, -1, clock_kHz); break; + case I_8266_U0_UCS_3: (static_cast(busPtr))->Begin(); break; + case I_8266_U1_UCS_3: (static_cast(busPtr))->Begin(); break; + case I_8266_DM_UCS_3: (static_cast(busPtr))->Begin(); break; + case I_8266_BB_UCS_3: (static_cast(busPtr))->Begin(); break; + case I_8266_U0_UCS_4: (static_cast(busPtr))->Begin(); break; + case I_8266_U1_UCS_4: (static_cast(busPtr))->Begin(); break; + case I_8266_DM_UCS_4: (static_cast(busPtr))->Begin(); break; + case I_8266_BB_UCS_4: (static_cast(busPtr))->Begin(); break; #endif #ifdef ARDUINO_ARCH_ESP32 case I_32_RN_NEO_3: (static_cast(busPtr))->Begin(); break; @@ -296,12 +354,28 @@ class PolyBus { case I_32_I1_TM1_4: beginTM1814(busPtr); break; case I_32_I1_TM2_3: (static_cast(busPtr))->Begin(); break; #endif + case I_32_RN_UCS_3: (static_cast(busPtr))->Begin(); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_UCS_3: (static_cast(busPtr))->Begin(); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_UCS_3: (static_cast(busPtr))->Begin(); break; + #endif +// case I_32_BB_UCS_3: (static_cast(busPtr))->Begin(); break; + case I_32_RN_UCS_4: (static_cast(busPtr))->Begin(); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_UCS_4: (static_cast(busPtr))->Begin(); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_UCS_4: (static_cast(busPtr))->Begin(); break; + #endif +// case I_32_BB_UCS_4: (static_cast(busPtr))->Begin(); break; // ESP32 can (and should, to avoid inadvertantly driving the chip select signal) specify the pins used for SPI, but only in begin() - case I_HS_DOT_3: (static_cast(busPtr))->Begin(pins[1], -1, pins[0], -1); break; - case I_HS_LPD_3: (static_cast(busPtr))->Begin(pins[1], -1, pins[0], -1); break; - case I_HS_LPO_3: (static_cast(busPtr))->Begin(pins[1], -1, pins[0], -1); break; - case I_HS_WS1_3: (static_cast(busPtr))->Begin(pins[1], -1, pins[0], -1); break; - case I_HS_P98_3: (static_cast(busPtr))->Begin(pins[1], -1, pins[0], -1); break; + case I_HS_DOT_3: beginDotStar(busPtr, pins[1], -1, pins[0], -1, clock_kHz); break; + case I_HS_LPD_3: beginDotStar(busPtr, pins[1], -1, pins[0], -1, clock_kHz); break; + case I_HS_LPO_3: beginDotStar(busPtr, pins[1], -1, pins[0], -1, clock_kHz); break; + case I_HS_WS1_3: beginDotStar(busPtr, pins[1], -1, pins[0], -1, clock_kHz); break; + case I_HS_P98_3: beginDotStar(busPtr, pins[1], -1, pins[0], -1, clock_kHz); break; #endif case I_SS_DOT_3: (static_cast(busPtr))->Begin(); break; case I_SS_LPD_3: (static_cast(busPtr))->Begin(); break; @@ -310,7 +384,7 @@ class PolyBus { case I_SS_P98_3: (static_cast(busPtr))->Begin(); break; } }; - static void* create(uint8_t busType, uint8_t* pins, uint16_t len, uint8_t channel) { + static void* create(uint8_t busType, uint8_t* pins, uint16_t len, uint8_t channel, uint16_t clock_kHz = 0U) { void* busPtr = nullptr; switch (busType) { case I_NONE: break; @@ -335,6 +409,14 @@ class PolyBus { case I_8266_U1_TM2_3: busPtr = new B_8266_U1_TM2_4(len, pins[0]); break; case I_8266_DM_TM2_3: busPtr = new B_8266_DM_TM2_4(len, pins[0]); break; case I_8266_BB_TM2_3: busPtr = new B_8266_BB_TM2_4(len, pins[0]); break; + case I_8266_U0_UCS_3: busPtr = new B_8266_U0_UCS_3(len, pins[0]); break; + case I_8266_U1_UCS_3: busPtr = new B_8266_U1_UCS_3(len, pins[0]); break; + case I_8266_DM_UCS_3: busPtr = new B_8266_DM_UCS_3(len, pins[0]); break; + case I_8266_BB_UCS_3: busPtr = new B_8266_BB_UCS_3(len, pins[0]); break; + case I_8266_U0_UCS_4: busPtr = new B_8266_U0_UCS_4(len, pins[0]); break; + case I_8266_U1_UCS_4: busPtr = new B_8266_U1_UCS_4(len, pins[0]); break; + case I_8266_DM_UCS_4: busPtr = new B_8266_DM_UCS_4(len, pins[0]); break; + case I_8266_BB_UCS_4: busPtr = new B_8266_BB_UCS_4(len, pins[0]); break; #endif #ifdef ARDUINO_ARCH_ESP32 case I_32_RN_NEO_3: busPtr = new B_32_RN_NEO_3(len, pins[0], (NeoBusChannel)channel); break; @@ -371,6 +453,22 @@ class PolyBus { case I_32_I1_TM1_4: busPtr = new B_32_I1_TM1_4(len, pins[0]); break; case I_32_I1_TM2_3: busPtr = new B_32_I1_TM2_3(len, pins[0]); break; #endif + case I_32_RN_UCS_3: busPtr = new B_32_RN_UCS_3(len, pins[0], (NeoBusChannel)channel); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_UCS_3: busPtr = new B_32_I0_UCS_3(len, pins[0]); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_UCS_3: busPtr = new B_32_I1_UCS_3(len, pins[0]); break; + #endif +// case I_32_BB_UCS_3: busPtr = new B_32_BB_UCS_3(len, pins[0], (NeoBusChannel)channel); break; + case I_32_RN_UCS_4: busPtr = new B_32_RN_UCS_4(len, pins[0], (NeoBusChannel)channel); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_UCS_4: busPtr = new B_32_I0_UCS_4(len, pins[0]); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_UCS_4: busPtr = new B_32_I1_UCS_4(len, pins[0]); break; + #endif +// case I_32_BB_UCS_4: busPtr = new B_32_BB_UCS_4(len, pins[0], (NeoBusChannel)channel); break; #endif // for 2-wire: pins[1] is clk, pins[0] is dat. begin expects (len, clk, dat) case I_HS_DOT_3: busPtr = new B_HS_DOT_3(len, pins[1], pins[0]); break; @@ -384,7 +482,7 @@ class PolyBus { case I_HS_P98_3: busPtr = new B_HS_P98_3(len, pins[1], pins[0]); break; case I_SS_P98_3: busPtr = new B_SS_P98_3(len, pins[1], pins[0]); break; } - begin(busPtr, busType, pins); + begin(busPtr, busType, pins, clock_kHz); return busPtr; }; static void show(void* busPtr, uint8_t busType) { @@ -411,6 +509,14 @@ class PolyBus { case I_8266_U1_TM2_3: (static_cast(busPtr))->Show(); break; case I_8266_DM_TM2_3: (static_cast(busPtr))->Show(); break; case I_8266_BB_TM2_3: (static_cast(busPtr))->Show(); break; + case I_8266_U0_UCS_3: (static_cast(busPtr))->Show(); break; + case I_8266_U1_UCS_3: (static_cast(busPtr))->Show(); break; + case I_8266_DM_UCS_3: (static_cast(busPtr))->Show(); break; + case I_8266_BB_UCS_3: (static_cast(busPtr))->Show(); break; + case I_8266_U0_UCS_4: (static_cast(busPtr))->Show(); break; + case I_8266_U1_UCS_4: (static_cast(busPtr))->Show(); break; + case I_8266_DM_UCS_4: (static_cast(busPtr))->Show(); break; + case I_8266_BB_UCS_4: (static_cast(busPtr))->Show(); break; #endif #ifdef ARDUINO_ARCH_ESP32 case I_32_RN_NEO_3: (static_cast(busPtr))->Show(); break; @@ -447,6 +553,22 @@ class PolyBus { case I_32_I1_TM1_4: (static_cast(busPtr))->Show(); break; case I_32_I1_TM2_3: (static_cast(busPtr))->Show(); break; #endif + case I_32_RN_UCS_3: (static_cast(busPtr))->Show(); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_UCS_3: (static_cast(busPtr))->Show(); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_UCS_3: (static_cast(busPtr))->Show(); break; + #endif +// case I_32_BB_UCS_3: (static_cast(busPtr))->Show(); break; + case I_32_RN_UCS_4: (static_cast(busPtr))->Show(); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_UCS_4: (static_cast(busPtr))->Show(); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_UCS_4: (static_cast(busPtr))->Show(); break; + #endif +// case I_32_BB_UCS_4: (static_cast(busPtr))->Show(); break; #endif case I_HS_DOT_3: (static_cast(busPtr))->Show(); break; case I_SS_DOT_3: (static_cast(busPtr))->Show(); break; @@ -484,6 +606,13 @@ class PolyBus { case I_8266_U1_TM2_3: return (static_cast(busPtr))->CanShow(); break; case I_8266_DM_TM2_3: return (static_cast(busPtr))->CanShow(); break; case I_8266_BB_TM2_3: return (static_cast(busPtr))->CanShow(); break; + case I_8266_U0_UCS_3: return (static_cast(busPtr))->CanShow(); break; + case I_8266_U1_UCS_3: return (static_cast(busPtr))->CanShow(); break; + case I_8266_DM_UCS_3: return (static_cast(busPtr))->CanShow(); break; + case I_8266_BB_UCS_3: return (static_cast(busPtr))->CanShow(); break; + case I_8266_U0_UCS_4: return (static_cast(busPtr))->CanShow(); break; + case I_8266_U1_UCS_4: return (static_cast(busPtr))->CanShow(); break; + case I_8266_DM_UCS_4: return (static_cast(busPtr))->CanShow(); break; #endif #ifdef ARDUINO_ARCH_ESP32 case I_32_RN_NEO_3: return (static_cast(busPtr))->CanShow(); break; @@ -520,6 +649,22 @@ class PolyBus { case I_32_I1_TM1_4: return (static_cast(busPtr))->CanShow(); break; case I_32_I1_TM2_3: return (static_cast(busPtr))->CanShow(); break; #endif + case I_32_RN_UCS_3: return (static_cast(busPtr))->CanShow(); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_UCS_3: return (static_cast(busPtr))->CanShow(); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_UCS_3: return (static_cast(busPtr))->CanShow(); break; + #endif +// case I_32_BB_UCS_3: return (static_cast(busPtr))->CanShow(); break; + case I_32_RN_UCS_4: return (static_cast(busPtr))->CanShow(); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_UCS_4: return (static_cast(busPtr))->CanShow(); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_UCS_4: return (static_cast(busPtr))->CanShow(); break; + #endif +// case I_32_BB_UCS_4: return (static_cast(busPtr))->CanShow(); break; #endif case I_HS_DOT_3: return (static_cast(busPtr))->CanShow(); break; case I_SS_DOT_3: return (static_cast(busPtr))->CanShow(); break; @@ -561,34 +706,42 @@ class PolyBus { switch (busType) { case I_NONE: break; #ifdef ESP8266 - case I_8266_U0_NEO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; - case I_8266_U1_NEO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; - case I_8266_DM_NEO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; - case I_8266_BB_NEO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; + case I_8266_U0_NEO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; + case I_8266_U1_NEO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; + case I_8266_DM_NEO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; + case I_8266_BB_NEO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; case I_8266_U0_NEO_4: (static_cast(busPtr))->SetPixelColor(pix, col); break; case I_8266_U1_NEO_4: (static_cast(busPtr))->SetPixelColor(pix, col); break; case I_8266_DM_NEO_4: (static_cast(busPtr))->SetPixelColor(pix, col); break; case I_8266_BB_NEO_4: (static_cast(busPtr))->SetPixelColor(pix, col); break; - case I_8266_U0_400_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; - case I_8266_U1_400_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; - case I_8266_DM_400_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; - case I_8266_BB_400_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; + case I_8266_U0_400_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; + case I_8266_U1_400_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; + case I_8266_DM_400_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; + case I_8266_BB_400_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; case I_8266_U0_TM1_4: (static_cast(busPtr))->SetPixelColor(pix, col); break; case I_8266_U1_TM1_4: (static_cast(busPtr))->SetPixelColor(pix, col); break; case I_8266_DM_TM1_4: (static_cast(busPtr))->SetPixelColor(pix, col); break; case I_8266_BB_TM1_4: (static_cast(busPtr))->SetPixelColor(pix, col); break; - case I_8266_U0_TM2_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; - case I_8266_U1_TM2_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; - case I_8266_DM_TM2_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; - case I_8266_BB_TM2_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; + case I_8266_U0_TM2_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; + case I_8266_U1_TM2_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; + case I_8266_DM_TM2_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; + case I_8266_BB_TM2_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; + case I_8266_U0_UCS_3: (static_cast(busPtr))->SetPixelColor(pix, Rgb48Color(RgbColor(col))); break; + case I_8266_U1_UCS_3: (static_cast(busPtr))->SetPixelColor(pix, Rgb48Color(RgbColor(col))); break; + case I_8266_DM_UCS_3: (static_cast(busPtr))->SetPixelColor(pix, Rgb48Color(RgbColor(col))); break; + case I_8266_BB_UCS_3: (static_cast(busPtr))->SetPixelColor(pix, Rgb48Color(RgbColor(col))); break; + case I_8266_U0_UCS_4: (static_cast(busPtr))->SetPixelColor(pix, Rgbw64Color(col)); break; + case I_8266_U1_UCS_4: (static_cast(busPtr))->SetPixelColor(pix, Rgbw64Color(col)); break; + case I_8266_DM_UCS_4: (static_cast(busPtr))->SetPixelColor(pix, Rgbw64Color(col)); break; + case I_8266_BB_UCS_4: (static_cast(busPtr))->SetPixelColor(pix, Rgbw64Color(col)); break; #endif #ifdef ARDUINO_ARCH_ESP32 - case I_32_RN_NEO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; + case I_32_RN_NEO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; #ifndef WLED_NO_I2S0_PIXELBUS - case I_32_I0_NEO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; + case I_32_I0_NEO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; #endif #ifndef WLED_NO_I2S1_PIXELBUS - case I_32_I1_NEO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; + case I_32_I1_NEO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; #endif // case I_32_BB_NEO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; case I_32_RN_NEO_4: (static_cast(busPtr))->SetPixelColor(pix, col); break; @@ -599,108 +752,147 @@ class PolyBus { case I_32_I1_NEO_4: (static_cast(busPtr))->SetPixelColor(pix, col); break; #endif // case I_32_BB_NEO_4: (static_cast(busPtr))->SetPixelColor(pix, col); break; - case I_32_RN_400_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; + case I_32_RN_400_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; #ifndef WLED_NO_I2S0_PIXELBUS - case I_32_I0_400_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; + case I_32_I0_400_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; #endif #ifndef WLED_NO_I2S1_PIXELBUS - case I_32_I1_400_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; + case I_32_I1_400_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; #endif // case I_32_BB_400_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; case I_32_RN_TM1_4: (static_cast(busPtr))->SetPixelColor(pix, col); break; - case I_32_RN_TM2_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; + case I_32_RN_TM2_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_TM1_4: (static_cast(busPtr))->SetPixelColor(pix, col); break; - case I_32_I0_TM2_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; + case I_32_I0_TM2_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; #endif #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_TM1_4: (static_cast(busPtr))->SetPixelColor(pix, col); break; - case I_32_I1_TM2_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; + case I_32_I1_TM2_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; #endif + case I_32_RN_UCS_3: (static_cast(busPtr))->SetPixelColor(pix, Rgb48Color(RgbColor(col))); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_UCS_3: (static_cast(busPtr))->SetPixelColor(pix, Rgb48Color(RgbColor(col))); break; #endif - case I_HS_DOT_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; - case I_SS_DOT_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; - case I_HS_LPD_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; - case I_SS_LPD_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; - case I_HS_LPO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; - case I_SS_LPO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; - case I_HS_WS1_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; - case I_SS_WS1_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; - case I_HS_P98_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; - case I_SS_P98_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col.R,col.G,col.B)); break; + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_UCS_3: (static_cast(busPtr))->SetPixelColor(pix, Rgb48Color(RgbColor(col))); break; + #endif +// case I_32_BB_UCS_3: (static_cast(busPtr))->SetPixelColor(pix, Rgb48Color(RgbColor(col))); break; + case I_32_RN_UCS_4: (static_cast(busPtr))->SetPixelColor(pix, Rgbw64Color(col)); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_UCS_4: (static_cast(busPtr))->SetPixelColor(pix, Rgbw64Color(col)); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_UCS_4: (static_cast(busPtr))->SetPixelColor(pix, Rgbw64Color(col)); break; + #endif +// case I_32_BB_UCS_4: (static_cast(busPtr))->SetPixelColor(pix, Rgbw64Color(col)); break; + #endif + case I_HS_DOT_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; + case I_SS_DOT_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; + case I_HS_LPD_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; + case I_SS_LPD_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; + case I_HS_LPO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; + case I_SS_LPO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; + case I_HS_WS1_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; + case I_SS_WS1_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; + case I_HS_P98_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; + case I_SS_P98_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; } }; static void setBrightness(void* busPtr, uint8_t busType, uint8_t b) { switch (busType) { case I_NONE: break; #ifdef ESP8266 - case I_8266_U0_NEO_3: (static_cast(busPtr))->SetBrightness(b); break; - case I_8266_U1_NEO_3: (static_cast(busPtr))->SetBrightness(b); break; - case I_8266_DM_NEO_3: (static_cast(busPtr))->SetBrightness(b); break; - case I_8266_BB_NEO_3: (static_cast(busPtr))->SetBrightness(b); break; - case I_8266_U0_NEO_4: (static_cast(busPtr))->SetBrightness(b); break; - case I_8266_U1_NEO_4: (static_cast(busPtr))->SetBrightness(b); break; - case I_8266_DM_NEO_4: (static_cast(busPtr))->SetBrightness(b); break; - case I_8266_BB_NEO_4: (static_cast(busPtr))->SetBrightness(b); break; - case I_8266_U0_400_3: (static_cast(busPtr))->SetBrightness(b); break; - case I_8266_U1_400_3: (static_cast(busPtr))->SetBrightness(b); break; - case I_8266_DM_400_3: (static_cast(busPtr))->SetBrightness(b); break; - case I_8266_BB_400_3: (static_cast(busPtr))->SetBrightness(b); break; - case I_8266_U0_TM1_4: (static_cast(busPtr))->SetBrightness(b); break; - case I_8266_U1_TM1_4: (static_cast(busPtr))->SetBrightness(b); break; - case I_8266_DM_TM1_4: (static_cast(busPtr))->SetBrightness(b); break; - case I_8266_BB_TM1_4: (static_cast(busPtr))->SetBrightness(b); break; - case I_8266_U0_TM2_3: (static_cast(busPtr))->SetBrightness(b); break; - case I_8266_U1_TM2_3: (static_cast(busPtr))->SetBrightness(b); break; - case I_8266_DM_TM2_3: (static_cast(busPtr))->SetBrightness(b); break; - case I_8266_BB_TM2_3: (static_cast(busPtr))->SetBrightness(b); break; + case I_8266_U0_NEO_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_U1_NEO_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_DM_NEO_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_BB_NEO_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_U0_NEO_4: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_U1_NEO_4: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_DM_NEO_4: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_BB_NEO_4: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_U0_400_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_U1_400_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_DM_400_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_BB_400_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_U0_TM1_4: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_U1_TM1_4: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_DM_TM1_4: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_BB_TM1_4: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_U0_TM2_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_U1_TM2_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_DM_TM2_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_BB_TM2_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_U0_UCS_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_U1_UCS_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_DM_UCS_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_BB_UCS_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_U0_UCS_4: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_U1_UCS_4: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_DM_UCS_4: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_BB_UCS_4: (static_cast(busPtr))->SetLuminance(b); break; #endif #ifdef ARDUINO_ARCH_ESP32 - case I_32_RN_NEO_3: (static_cast(busPtr))->SetBrightness(b); break; + case I_32_RN_NEO_3: (static_cast(busPtr))->SetLuminance(b); break; #ifndef WLED_NO_I2S0_PIXELBUS - case I_32_I0_NEO_3: (static_cast(busPtr))->SetBrightness(b); break; + case I_32_I0_NEO_3: (static_cast(busPtr))->SetLuminance(b); break; #endif #ifndef WLED_NO_I2S1_PIXELBUS - case I_32_I1_NEO_3: (static_cast(busPtr))->SetBrightness(b); break; + case I_32_I1_NEO_3: (static_cast(busPtr))->SetLuminance(b); break; #endif -// case I_32_BB_NEO_3: (static_cast(busPtr))->SetBrightness(b); break; - case I_32_RN_NEO_4: (static_cast(busPtr))->SetBrightness(b); break; +// case I_32_BB_NEO_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_32_RN_NEO_4: (static_cast(busPtr))->SetLuminance(b); break; #ifndef WLED_NO_I2S0_PIXELBUS - case I_32_I0_NEO_4: (static_cast(busPtr))->SetBrightness(b); break; + case I_32_I0_NEO_4: (static_cast(busPtr))->SetLuminance(b); break; #endif #ifndef WLED_NO_I2S1_PIXELBUS - case I_32_I1_NEO_4: (static_cast(busPtr))->SetBrightness(b); break; + case I_32_I1_NEO_4: (static_cast(busPtr))->SetLuminance(b); break; #endif -// case I_32_BB_NEO_4: (static_cast(busPtr))->SetBrightness(b); break; - case I_32_RN_400_3: (static_cast(busPtr))->SetBrightness(b); break; +// case I_32_BB_NEO_4: (static_cast(busPtr))->SetLuminance(b); break; + case I_32_RN_400_3: (static_cast(busPtr))->SetLuminance(b); break; #ifndef WLED_NO_I2S0_PIXELBUS - case I_32_I0_400_3: (static_cast(busPtr))->SetBrightness(b); break; + case I_32_I0_400_3: (static_cast(busPtr))->SetLuminance(b); break; #endif #ifndef WLED_NO_I2S1_PIXELBUS - case I_32_I1_400_3: (static_cast(busPtr))->SetBrightness(b); break; + case I_32_I1_400_3: (static_cast(busPtr))->SetLuminance(b); break; #endif -// case I_32_BB_400_3: (static_cast(busPtr))->SetBrightness(b); break; - case I_32_RN_TM1_4: (static_cast(busPtr))->SetBrightness(b); break; - case I_32_RN_TM2_3: (static_cast(busPtr))->SetBrightness(b); break; +// case I_32_BB_400_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_32_RN_TM1_4: (static_cast(busPtr))->SetLuminance(b); break; + case I_32_RN_TM2_3: (static_cast(busPtr))->SetLuminance(b); break; #ifndef WLED_NO_I2S0_PIXELBUS - case I_32_I0_TM1_4: (static_cast(busPtr))->SetBrightness(b); break; - case I_32_I0_TM2_3: (static_cast(busPtr))->SetBrightness(b); break; + case I_32_I0_TM1_4: (static_cast(busPtr))->SetLuminance(b); break; + case I_32_I0_TM2_3: (static_cast(busPtr))->SetLuminance(b); break; #endif #ifndef WLED_NO_I2S1_PIXELBUS - case I_32_I1_TM1_4: (static_cast(busPtr))->SetBrightness(b); break; - case I_32_I1_TM2_3: (static_cast(busPtr))->SetBrightness(b); break; + case I_32_I1_TM1_4: (static_cast(busPtr))->SetLuminance(b); break; + case I_32_I1_TM2_3: (static_cast(busPtr))->SetLuminance(b); break; + #endif + case I_32_RN_UCS_3: (static_cast(busPtr))->SetLuminance(b); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_UCS_3: (static_cast(busPtr))->SetLuminance(b); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_UCS_3: (static_cast(busPtr))->SetLuminance(b); break; + #endif +// case I_32_BB_UCS_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_32_RN_UCS_4: (static_cast(busPtr))->SetLuminance(b); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_UCS_4: (static_cast(busPtr))->SetLuminance(b); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_UCS_4: (static_cast(busPtr))->SetLuminance(b); break; #endif #endif - case I_HS_DOT_3: (static_cast(busPtr))->SetBrightness(b); break; - case I_SS_DOT_3: (static_cast(busPtr))->SetBrightness(b); break; - case I_HS_LPD_3: (static_cast(busPtr))->SetBrightness(b); break; - case I_SS_LPD_3: (static_cast(busPtr))->SetBrightness(b); break; - case I_HS_LPO_3: (static_cast(busPtr))->SetBrightness(b); break; - case I_SS_LPO_3: (static_cast(busPtr))->SetBrightness(b); break; - case I_HS_WS1_3: (static_cast(busPtr))->SetBrightness(b); break; - case I_SS_WS1_3: (static_cast(busPtr))->SetBrightness(b); break; - case I_HS_P98_3: (static_cast(busPtr))->SetBrightness(b); break; - case I_SS_P98_3: (static_cast(busPtr))->SetBrightness(b); break; + case I_HS_DOT_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_SS_DOT_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_HS_LPD_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_SS_LPD_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_HS_LPO_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_SS_LPO_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_HS_WS1_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_SS_WS1_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_HS_P98_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_SS_P98_3: (static_cast(busPtr))->SetLuminance(b); break; } }; static uint32_t getPixelColor(void* busPtr, uint8_t busType, uint16_t pix, uint8_t co) { @@ -728,6 +920,14 @@ class PolyBus { case I_8266_U1_TM2_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; case I_8266_DM_TM2_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; case I_8266_BB_TM2_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; + case I_8266_U0_UCS_3: { Rgb48Color c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,0); } break; + case I_8266_U1_UCS_3: { Rgb48Color c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,0); } break; + case I_8266_DM_UCS_3: { Rgb48Color c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,0); } break; + case I_8266_BB_UCS_3: { Rgb48Color c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,0); } break; + case I_8266_U0_UCS_4: { Rgbw64Color c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.W>>8); } break; + case I_8266_U1_UCS_4: { Rgbw64Color c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.W>>8); } break; + case I_8266_DM_UCS_4: { Rgbw64Color c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.W>>8); } break; + case I_8266_BB_UCS_4: { Rgbw64Color c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.W>>8); } break; #endif #ifdef ARDUINO_ARCH_ESP32 case I_32_RN_NEO_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; @@ -764,6 +964,22 @@ class PolyBus { case I_32_I1_TM1_4: col = (static_cast(busPtr))->GetPixelColor(pix); break; case I_32_I1_TM2_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; #endif + case I_32_RN_UCS_3: { Rgb48Color c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,0); } break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_UCS_3: { Rgb48Color c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,0); } break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_UCS_3: { Rgb48Color c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,0); } break; + #endif +// case I_32_BB_UCS_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; + case I_32_RN_UCS_4: { Rgbw64Color c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.W>>8); } break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_UCS_4: { Rgbw64Color c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.W>>8); } break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_UCS_4: { Rgbw64Color c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.W>>8); } break; + #endif +// case I_32_BB_UCS_4: col = (static_cast(busPtr))->GetPixelColor(pix); break; #endif case I_HS_DOT_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; case I_SS_DOT_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; @@ -821,6 +1037,14 @@ class PolyBus { case I_8266_U1_TM2_3: delete (static_cast(busPtr)); break; case I_8266_DM_TM2_3: delete (static_cast(busPtr)); break; case I_8266_BB_TM2_3: delete (static_cast(busPtr)); break; + case I_8266_U0_UCS_3: delete (static_cast(busPtr)); break; + case I_8266_U1_UCS_3: delete (static_cast(busPtr)); break; + case I_8266_DM_UCS_3: delete (static_cast(busPtr)); break; + case I_8266_BB_UCS_3: delete (static_cast(busPtr)); break; + case I_8266_U0_UCS_4: delete (static_cast(busPtr)); break; + case I_8266_U1_UCS_4: delete (static_cast(busPtr)); break; + case I_8266_DM_UCS_4: delete (static_cast(busPtr)); break; + case I_8266_BB_UCS_4: delete (static_cast(busPtr)); break; #endif #ifdef ARDUINO_ARCH_ESP32 case I_32_RN_NEO_3: delete (static_cast(busPtr)); break; @@ -857,6 +1081,22 @@ class PolyBus { case I_32_I1_TM1_4: delete (static_cast(busPtr)); break; case I_32_I1_TM2_3: delete (static_cast(busPtr)); break; #endif + case I_32_RN_UCS_3: delete (static_cast(busPtr)); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_UCS_3: delete (static_cast(busPtr)); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_UCS_3: delete (static_cast(busPtr)); break; + #endif +// case I_32_BB_UCS_3: delete (static_cast(busPtr)); break; + case I_32_RN_UCS_4: delete (static_cast(busPtr)); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_UCS_4: delete (static_cast(busPtr)); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_UCS_4: delete (static_cast(busPtr)); break; + #endif +// case I_32_BB_UCS_4: delete (static_cast(busPtr)); break; #endif case I_HS_DOT_3: delete (static_cast(busPtr)); break; case I_SS_DOT_3: delete (static_cast(busPtr)); break; @@ -912,6 +1152,10 @@ class PolyBus { return I_8266_U0_TM1_4 + offset; case TYPE_TM1829: return I_8266_U0_TM2_3 + offset; + case TYPE_UCS8903: + return I_8266_U0_UCS_3 + offset; + case TYPE_UCS8904: + return I_8266_U0_UCS_4 + offset; } #else //ESP32 uint8_t offset = 0; //0 = RMT (num 0-7) 8 = I2S0 9 = I2S1 @@ -946,6 +1190,10 @@ class PolyBus { return I_32_RN_TM1_4 + offset; case TYPE_TM1829: return I_32_RN_TM2_3 + offset; + case TYPE_UCS8903: + return I_32_RN_UCS_3 + offset; + case TYPE_UCS8904: + return I_32_RN_UCS_4 + offset; } #endif } diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index baa4081b..827e0210 100644 --- a/wled00/cfg.cpp +++ b/wled00/cfg.cpp @@ -196,7 +196,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { ledType |= refresh << 7; // hack bit 7 to indicate strip requires off refresh uint8_t AWmode = elm[F("rgbwm")] | autoWhiteMode; if (fromFS) { - BusConfig bc = BusConfig(ledType, pins, start, length, colorOrder, reversed, skipFirst, AWmode); //WLEDMM to do bus , freqkHz + BusConfig bc = BusConfig(ledType, pins, start, length, colorOrder, reversed, skipFirst, AWmode, freqkHz); mem += BusManager::memUsage(bc); if (mem <= MAX_LED_MEMORY) if (busses.add(bc) == -1) break; // finalization will be done in WLED::beginStrip() } else { @@ -802,7 +802,7 @@ void serializeConfig() { ins["type"] = bus->getType() & 0x7F; ins["ref"] = bus->isOffRefreshRequired(); ins[F("rgbwm")] = bus->getAutoWhiteMode(); - // ins[F("freq")] = bus->getFrequency(); WLEDMM to do bus + ins[F("freq")] = bus->getFrequency(); } JsonArray hw_com = hw.createNestedArray(F("com")); diff --git a/wled00/set.cpp b/wled00/set.cpp index 634f071d..05503578 100644 --- a/wled00/set.cpp +++ b/wled00/set.cpp @@ -159,7 +159,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) // actual finalization is done in WLED::loop() (removing old busses and adding new) // this may happen even before this loop is finished so we do "doInitBusses" after the loop if (busConfigs[s] != nullptr) delete busConfigs[s]; - busConfigs[s] = new BusConfig(type, pins, start, length, colorOrder | (channelSwap<<4), request->hasArg(cv), skip, awmode); //WLEDMM to do bus, freqHz + busConfigs[s] = new BusConfig(type, pins, start, length, colorOrder | (channelSwap<<4), request->hasArg(cv), skip, awmode, freqHz); busesChanged = true; } //doInitBusses = busesChanged; // we will do that below to ensure all input data is processed diff --git a/wled00/xml.cpp b/wled00/xml.cpp index 26c6395f..87b59d8f 100644 --- a/wled00/xml.cpp +++ b/wled00/xml.cpp @@ -415,7 +415,7 @@ void getSettingsJS(AsyncWebServerRequest* request, byte subPage, char* dest) //W char rf[4] = "RF"; rf[2] = 48+s; rf[3] = 0; //off refresh char aw[4] = "AW"; aw[2] = 48+s; aw[3] = 0; //auto white mode char wo[4] = "WO"; wo[2] = 48+s; wo[3] = 0; //swap channels - // char sp[4] = "SP"; sp[2] = 48+s; sp[3] = 0; //bus clock speed WLEDMM to do bus + char sp[4] = "SP"; sp[2] = 48+s; sp[3] = 0; //bus clock speed oappend(SET_F("addLEDs(1);")); uint8_t pins[5]; uint8_t nPins = bus->getPins(pins); @@ -432,28 +432,27 @@ void getSettingsJS(AsyncWebServerRequest* request, byte subPage, char* dest) //W sappend('c',rf,bus->isOffRefreshRequired()); sappend('v',aw,bus->getAutoWhiteMode()); sappend('v',wo,bus->getColorOrder() >> 4); - //WLEDMM to do bus freq - // uint16_t speed = bus->getFrequency(); - // if (bus->getType() > TYPE_ONOFF && bus->getType() < 48) { - // switch (speed) { - // case WLED_PWM_FREQ/3 : speed = 0; break; - // case WLED_PWM_FREQ/2 : speed = 1; break; - // default: - // case WLED_PWM_FREQ : speed = 2; break; - // case WLED_PWM_FREQ*2 : speed = 3; break; - // case WLED_PWM_FREQ*3 : speed = 4; break; - // } - // } else { - // switch (speed) { - // case 1000 : speed = 0; break; - // case 2000 : speed = 1; break; - // default: - // case 5000 : speed = 2; break; - // case 10000 : speed = 3; break; - // case 20000 : speed = 4; break; - // } - // } - // sappend('v',sp,speed); + uint16_t speed = bus->getFrequency(); + if (bus->getType() > TYPE_ONOFF && bus->getType() < 48) { + switch (speed) { + case WLED_PWM_FREQ/3 : speed = 0; break; + case WLED_PWM_FREQ/2 : speed = 1; break; + default: + case WLED_PWM_FREQ : speed = 2; break; + case WLED_PWM_FREQ*2 : speed = 3; break; + case WLED_PWM_FREQ*3 : speed = 4; break; + } + } else { + switch (speed) { + case 1000 : speed = 0; break; + case 2000 : speed = 1; break; + default: + case 5000 : speed = 2; break; + case 10000 : speed = 3; break; + case 20000 : speed = 4; break; + } + } + sappend('v',sp,speed); } sappend('v',SET_F("MA"),strip.ablMilliampsMax); sappend('v',SET_F("LA"),strip.milliampsPerLed);