mirror of
https://github.com/wled/WLED.git
synced 2025-07-27 04:36:33 +00:00
Merge branch '0_15' into blending-styles
This commit is contained in:
commit
8e8ffa30a6
142
platformio.ini
142
platformio.ini
@ -10,7 +10,7 @@
|
|||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
# CI/release binaries
|
# CI/release binaries
|
||||||
default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, nodemcuv2_160, esp8266_2m_160, esp01_1m_full_160, esp32dev, esp32_eth, esp32dev_audioreactive, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB, esp32s3dev_8MB_PSRAM_opi, esp32s3_4M_PSRAM_qspi, esp32_wrover
|
default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, nodemcuv2_160, esp8266_2m_160, esp01_1m_full_160, esp32dev, esp32_eth, esp32dev_audioreactive, lolin_s2_mini, esp32c3dev, esp32s3dev_16MB_opi, esp32s3dev_8MB_opi, esp32s3_4M_qspi, esp32_wrover
|
||||||
|
|
||||||
src_dir = ./wled00
|
src_dir = ./wled00
|
||||||
data_dir = ./wled00/data
|
data_dir = ./wled00/data
|
||||||
@ -86,7 +86,6 @@ debug_flags = -D DEBUG=1 -D WLED_DEBUG
|
|||||||
# This reduces the OTA size with ~45KB, so it's especially useful on low memory boards (512k/1m).
|
# This reduces the OTA size with ~45KB, so it's especially useful on low memory boards (512k/1m).
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
build_flags =
|
build_flags =
|
||||||
-Wno-attributes
|
|
||||||
-DMQTT_MAX_PACKET_SIZE=1024
|
-DMQTT_MAX_PACKET_SIZE=1024
|
||||||
-DSECURE_CLIENT=SECURE_CLIENT_BEARSSL
|
-DSECURE_CLIENT=SECURE_CLIENT_BEARSSL
|
||||||
-DBEARSSL_SSL_BASIC
|
-DBEARSSL_SSL_BASIC
|
||||||
@ -104,10 +103,6 @@ build_flags =
|
|||||||
|
|
||||||
build_unflags =
|
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_1m128k = eagle.flash.1m128.ld
|
||||||
ldscript_2m512k = eagle.flash.2m512.ld
|
ldscript_2m512k = eagle.flash.2m512.ld
|
||||||
ldscript_2m1m = eagle.flash.2m1m.ld
|
ldscript_2m1m = eagle.flash.2m1m.ld
|
||||||
@ -174,7 +169,7 @@ lib_deps =
|
|||||||
# SHT85
|
# SHT85
|
||||||
;robtillaart/SHT85@~0.3.3
|
;robtillaart/SHT85@~0.3.3
|
||||||
# Audioreactive usermod
|
# Audioreactive usermod
|
||||||
;kosme/arduinoFFT @ 2.0.0
|
;kosme/arduinoFFT @ 2.0.1
|
||||||
|
|
||||||
extra_scripts = ${scripts_defaults.extra_scripts}
|
extra_scripts = ${scripts_defaults.extra_scripts}
|
||||||
|
|
||||||
@ -218,14 +213,19 @@ build_flags = -g
|
|||||||
#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
|
-D LOROL_LITTLEFS
|
||||||
; -DARDUINO_USB_CDC_ON_BOOT=0 ;; this flag is mandatory for "classic ESP32" when building 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
|
||||||
|
tiny_partitions = tools/WLED_ESP32_2MB_noOTA.csv
|
||||||
default_partitions = tools/WLED_ESP32_4MB_1MB_FS.csv
|
default_partitions = tools/WLED_ESP32_4MB_1MB_FS.csv
|
||||||
|
extended_partitions = tools/WLED_ESP32_4MB_700k_FS.csv
|
||||||
|
big_partitions = tools/WLED_ESP32_4MB_256KB_FS.csv ;; 1.8MB firmware, 256KB filesystem, coredump support
|
||||||
|
large_partitions = tools/WLED_ESP32_8MB.csv
|
||||||
|
extreme_partitions = tools/WLED_ESP32_16MB_9MB_FS.csv
|
||||||
lib_deps =
|
lib_deps =
|
||||||
https://github.com/lorol/LITTLEFS.git
|
https://github.com/lorol/LITTLEFS.git
|
||||||
https://github.com/pbolduc/AsyncTCP.git @ 1.2.0
|
https://github.com/pbolduc/AsyncTCP.git @ 1.2.0
|
||||||
${env.lib_deps}
|
${env.lib_deps}
|
||||||
# additional build flags for audioreactive
|
# additional build flags for audioreactive
|
||||||
AR_build_flags = -D USERMOD_AUDIOREACTIVE
|
AR_build_flags = -D USERMOD_AUDIOREACTIVE
|
||||||
AR_lib_deps = kosme/arduinoFFT @ 2.0.0
|
AR_lib_deps = kosme/arduinoFFT @ 2.0.1
|
||||||
|
|
||||||
[esp32_idf_V4]
|
[esp32_idf_V4]
|
||||||
;; experimental build environment for ESP32 using ESP-IDF 4.4.x / arduino-esp32 v2.0.5
|
;; experimental build environment for ESP32 using ESP-IDF 4.4.x / arduino-esp32 v2.0.5
|
||||||
@ -233,24 +233,21 @@ AR_lib_deps = kosme/arduinoFFT @ 2.0.0
|
|||||||
;;
|
;;
|
||||||
;; please note that you can NOT update existing ESP32 installs with a "V4" build. Also updating by OTA will not work properly.
|
;; 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.
|
;; You need to completely erase your device (esptool erase_flash) first, then install the "V4" build from VSCode+platformio.
|
||||||
platform = espressif32@5.3.0
|
platform = espressif32@ ~6.3.2
|
||||||
platform_packages =
|
platform_packages = platformio/framework-arduinoespressif32 @ 3.20009.0 ;; select arduino-esp32 v2.0.9 (arduino-esp32 2.0.10 thru 2.0.14 are buggy so avoid them)
|
||||||
build_flags = -g
|
build_flags = -g
|
||||||
-Wshadow=compatible-local ;; emit warning in case a local variable "shadows" another local one
|
-Wshadow=compatible-local ;; emit warning in case a local variable "shadows" another local one
|
||||||
-DARDUINO_ARCH_ESP32 -DESP32
|
-DARDUINO_ARCH_ESP32 -DESP32
|
||||||
#-DCONFIG_LITTLEFS_FOR_IDF_3_2
|
|
||||||
-D CONFIG_ASYNC_TCP_USE_WDT=0
|
-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
|
-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 =
|
lib_deps =
|
||||||
https://github.com/pbolduc/AsyncTCP.git @ 1.2.0
|
https://github.com/pbolduc/AsyncTCP.git @ 1.2.0
|
||||||
${env.lib_deps}
|
${env.lib_deps}
|
||||||
|
|
||||||
[esp32s2]
|
[esp32s2]
|
||||||
;; generic definitions for all ESP32-S2 boards
|
;; generic definitions for all ESP32-S2 boards
|
||||||
platform = espressif32@5.3.0
|
platform = espressif32@ ~6.3.2
|
||||||
platform_packages =
|
platform_packages = platformio/framework-arduinoespressif32 @ 3.20009.0 ;; select arduino-esp32 v2.0.9 (arduino-esp32 2.0.10 thru 2.0.14 are buggy so avoid them)
|
||||||
default_partitions = tools/WLED_ESP32_4MB_1MB_FS.csv
|
|
||||||
build_flags = -g
|
build_flags = -g
|
||||||
-DARDUINO_ARCH_ESP32
|
-DARDUINO_ARCH_ESP32
|
||||||
-DARDUINO_ARCH_ESP32S2
|
-DARDUINO_ARCH_ESP32S2
|
||||||
@ -267,8 +264,8 @@ lib_deps =
|
|||||||
|
|
||||||
[esp32c3]
|
[esp32c3]
|
||||||
;; generic definitions for all ESP32-C3 boards
|
;; generic definitions for all ESP32-C3 boards
|
||||||
platform = espressif32@5.3.0
|
platform = espressif32@ ~6.3.2
|
||||||
platform_packages =
|
platform_packages = platformio/framework-arduinoespressif32 @ 3.20009.0 ;; select arduino-esp32 v2.0.9 (arduino-esp32 2.0.10 thru 2.0.14 are buggy so avoid them)
|
||||||
build_flags = -g
|
build_flags = -g
|
||||||
-DARDUINO_ARCH_ESP32
|
-DARDUINO_ARCH_ESP32
|
||||||
-DARDUINO_ARCH_ESP32C3
|
-DARDUINO_ARCH_ESP32C3
|
||||||
@ -284,8 +281,8 @@ lib_deps =
|
|||||||
|
|
||||||
[esp32s3]
|
[esp32s3]
|
||||||
;; generic definitions for all ESP32-S3 boards
|
;; generic definitions for all ESP32-S3 boards
|
||||||
platform = espressif32@5.3.0
|
platform = espressif32@ ~6.3.2
|
||||||
platform_packages =
|
platform_packages = platformio/framework-arduinoespressif32 @ 3.20009.0 ;; select arduino-esp32 v2.0.9 (arduino-esp32 2.0.10 thru 2.0.14 are buggy so avoid them)
|
||||||
build_flags = -g
|
build_flags = -g
|
||||||
-DESP32
|
-DESP32
|
||||||
-DARDUINO_ARCH_ESP32
|
-DARDUINO_ARCH_ESP32
|
||||||
@ -296,7 +293,6 @@ build_flags = -g
|
|||||||
-DCO
|
-DCO
|
||||||
;; 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:
|
;; 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_MODE, ARDUINO_USB_CDC_ON_BOOT
|
;; ARDUINO_USB_MODE, ARDUINO_USB_CDC_ON_BOOT
|
||||||
|
|
||||||
lib_deps =
|
lib_deps =
|
||||||
https://github.com/pbolduc/AsyncTCP.git @ 1.2.0
|
https://github.com/pbolduc/AsyncTCP.git @ 1.2.0
|
||||||
${env.lib_deps}
|
${env.lib_deps}
|
||||||
@ -312,14 +308,14 @@ platform = ${common.platform_wled_default}
|
|||||||
platform_packages = ${common.platform_packages}
|
platform_packages = ${common.platform_packages}
|
||||||
board_build.ldscript = ${common.ldscript_4m1m}
|
board_build.ldscript = ${common.ldscript_4m1m}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP8266 #-DWLED_DISABLE_2D
|
build_flags = ${common.build_flags} ${esp8266.build_flags} -D WLED_RELEASE_NAME=ESP8266 #-DWLED_DISABLE_2D
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
monitor_filters = esp8266_exception_decoder
|
monitor_filters = esp8266_exception_decoder
|
||||||
|
|
||||||
[env:nodemcuv2_160]
|
[env:nodemcuv2_160]
|
||||||
extends = env:nodemcuv2
|
extends = env:nodemcuv2
|
||||||
board_build.f_cpu = 160000000L
|
board_build.f_cpu = 160000000L
|
||||||
build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP8266_160 #-DWLED_DISABLE_2D
|
build_flags = ${common.build_flags} ${esp8266.build_flags} -D WLED_RELEASE_NAME=ESP8266_160 #-DWLED_DISABLE_2D
|
||||||
|
|
||||||
[env:esp8266_2m]
|
[env:esp8266_2m]
|
||||||
board = esp_wroom_02
|
board = esp_wroom_02
|
||||||
@ -327,13 +323,13 @@ platform = ${common.platform_wled_default}
|
|||||||
platform_packages = ${common.platform_packages}
|
platform_packages = ${common.platform_packages}
|
||||||
board_build.ldscript = ${common.ldscript_2m512k}
|
board_build.ldscript = ${common.ldscript_2m512k}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP02
|
build_flags = ${common.build_flags} ${esp8266.build_flags} -D WLED_RELEASE_NAME=ESP02
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
|
|
||||||
[env:esp8266_2m_160]
|
[env:esp8266_2m_160]
|
||||||
extends = env:esp8266_2m
|
extends = env:esp8266_2m
|
||||||
board_build.f_cpu = 160000000L
|
board_build.f_cpu = 160000000L
|
||||||
build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP02_160
|
build_flags = ${common.build_flags} ${esp8266.build_flags} -D WLED_RELEASE_NAME=ESP02_160
|
||||||
|
|
||||||
[env:esp01_1m_full]
|
[env:esp01_1m_full]
|
||||||
board = esp01_1m
|
board = esp01_1m
|
||||||
@ -341,14 +337,14 @@ platform = ${common.platform_wled_default}
|
|||||||
platform_packages = ${common.platform_packages}
|
platform_packages = ${common.platform_packages}
|
||||||
board_build.ldscript = ${common.ldscript_1m128k}
|
board_build.ldscript = ${common.ldscript_1m128k}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP01 -D WLED_DISABLE_OTA
|
build_flags = ${common.build_flags} ${esp8266.build_flags} -D WLED_RELEASE_NAME=ESP01 -D WLED_DISABLE_OTA
|
||||||
; -D WLED_USE_UNREAL_MATH ;; may cause wrong sunset/sunrise times, but saves 7064 bytes FLASH and 975 bytes RAM
|
; -D WLED_USE_UNREAL_MATH ;; may cause wrong sunset/sunrise times, but saves 7064 bytes FLASH and 975 bytes RAM
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
|
|
||||||
[env:esp01_1m_full_160]
|
[env:esp01_1m_full_160]
|
||||||
extends = env:esp01_1m_full
|
extends = env:esp01_1m_full
|
||||||
board_build.f_cpu = 160000000L
|
board_build.f_cpu = 160000000L
|
||||||
build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP01_160 -D WLED_DISABLE_OTA
|
build_flags = ${common.build_flags} ${esp8266.build_flags} -D WLED_RELEASE_NAME=ESP01_160 -D WLED_DISABLE_OTA
|
||||||
; -D WLED_USE_UNREAL_MATH ;; may cause wrong sunset/sunrise times, but saves 7064 bytes FLASH and 975 bytes RAM
|
; -D WLED_USE_UNREAL_MATH ;; may cause wrong sunset/sunrise times, but saves 7064 bytes FLASH and 975 bytes RAM
|
||||||
|
|
||||||
[env:esp32dev]
|
[env:esp32dev]
|
||||||
@ -356,17 +352,30 @@ board = esp32dev
|
|||||||
platform = ${esp32.platform}
|
platform = ${esp32.platform}
|
||||||
platform_packages = ${esp32.platform_packages}
|
platform_packages = ${esp32.platform_packages}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp32} -D WLED_RELEASE_NAME=ESP32 #-D WLED_DISABLE_BROWNOUT_DET
|
build_flags = ${common.build_flags} ${esp32.build_flags} -D WLED_RELEASE_NAME=ESP32 #-D WLED_DISABLE_BROWNOUT_DET
|
||||||
lib_deps = ${esp32.lib_deps}
|
lib_deps = ${esp32.lib_deps}
|
||||||
monitor_filters = esp32_exception_decoder
|
monitor_filters = esp32_exception_decoder
|
||||||
board_build.partitions = ${esp32.default_partitions}
|
board_build.partitions = ${esp32.default_partitions}
|
||||||
|
|
||||||
|
[env:esp32dev_8M]
|
||||||
|
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_8M #-D WLED_DISABLE_BROWNOUT_DET
|
||||||
|
${esp32.AR_build_flags}
|
||||||
|
lib_deps = ${esp32_idf_V4.lib_deps}
|
||||||
|
${esp32.AR_lib_deps}
|
||||||
|
monitor_filters = esp32_exception_decoder
|
||||||
|
board_build.partitions = ${esp32.large_partitions}
|
||||||
|
; board_build.f_flash = 80000000L
|
||||||
|
|
||||||
[env:esp32dev_audioreactive]
|
[env:esp32dev_audioreactive]
|
||||||
board = esp32dev
|
board = esp32dev
|
||||||
platform = ${esp32.platform}
|
platform = ${esp32.platform}
|
||||||
platform_packages = ${esp32.platform_packages}
|
platform_packages = ${esp32.platform_packages}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp32} -D WLED_RELEASE_NAME=ESP32_audioreactive #-D WLED_DISABLE_BROWNOUT_DET
|
build_flags = ${common.build_flags} ${esp32.build_flags} -D WLED_RELEASE_NAME=ESP32_audioreactive #-D WLED_DISABLE_BROWNOUT_DET
|
||||||
${esp32.AR_build_flags}
|
${esp32.AR_build_flags}
|
||||||
lib_deps = ${esp32.lib_deps}
|
lib_deps = ${esp32.lib_deps}
|
||||||
${esp32.AR_lib_deps}
|
${esp32.AR_lib_deps}
|
||||||
@ -381,22 +390,26 @@ platform = ${esp32.platform}
|
|||||||
platform_packages = ${esp32.platform_packages}
|
platform_packages = ${esp32.platform_packages}
|
||||||
upload_speed = 921600
|
upload_speed = 921600
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp32} -D WLED_RELEASE_NAME=ESP32_Ethernet -D RLYPIN=-1 -D WLED_USE_ETHERNET -D BTNPIN=-1
|
build_flags = ${common.build_flags} ${esp32.build_flags} -D WLED_RELEASE_NAME=ESP32_Ethernet -D RLYPIN=-1 -D WLED_USE_ETHERNET -D BTNPIN=-1
|
||||||
-D WLED_DISABLE_ESPNOW ;; ESP-NOW requires wifi, may crash with ethernet only
|
-D WLED_DISABLE_ESPNOW ;; ESP-NOW requires wifi, may crash with ethernet only
|
||||||
lib_deps = ${esp32.lib_deps}
|
lib_deps = ${esp32.lib_deps}
|
||||||
board_build.partitions = ${esp32.default_partitions}
|
board_build.partitions = ${esp32.default_partitions}
|
||||||
|
|
||||||
[env:esp32_wrover]
|
[env:esp32_wrover]
|
||||||
platform = ${esp32.platform}
|
extends = esp32_idf_V4
|
||||||
|
platform = ${esp32_idf_V4.platform}
|
||||||
|
platform_packages = ${esp32_idf_V4.platform_packages}
|
||||||
board = ttgo-t7-v14-mini32
|
board = ttgo-t7-v14-mini32
|
||||||
board_build.f_flash = 80000000L
|
board_build.f_flash = 80000000L
|
||||||
board_build.flash_mode = qio
|
board_build.flash_mode = qio
|
||||||
board_build.partitions = tools/WLED_ESP32-wrover_4MB.csv
|
board_build.partitions = ${esp32.default_partitions}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp32} -D WLED_RELEASE_NAME=ESP32_WROVER
|
build_flags = ${common.build_flags} ${esp32_idf_V4.build_flags} -D WLED_RELEASE_NAME=ESP32_WROVER
|
||||||
-DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue ;; Older ESP32 (rev.<3) need a PSRAM fix (increases static RAM used) https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-guides/external-ram.html
|
-DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue ;; Older ESP32 (rev.<3) need a PSRAM fix (increases static RAM used) https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-guides/external-ram.html
|
||||||
-D LEDPIN=25
|
-D LEDPIN=25
|
||||||
lib_deps = ${esp32.lib_deps}
|
; ${esp32.AR_build_flags}
|
||||||
|
lib_deps = ${esp32_idf_V4.lib_deps}
|
||||||
|
; ${esp32.AR_lib_deps}
|
||||||
|
|
||||||
[env:esp32c3dev]
|
[env:esp32c3dev]
|
||||||
extends = esp32c3
|
extends = esp32c3
|
||||||
@ -404,7 +417,7 @@ platform = ${esp32c3.platform}
|
|||||||
platform_packages = ${esp32c3.platform_packages}
|
platform_packages = ${esp32c3.platform_packages}
|
||||||
framework = arduino
|
framework = arduino
|
||||||
board = esp32-c3-devkitm-1
|
board = esp32-c3-devkitm-1
|
||||||
board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv
|
board_build.partitions = ${esp32.default_partitions}
|
||||||
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
|
-D WLED_WATCHDOG_TIMEOUT=0
|
||||||
-DLOLIN_WIFI_FIX ; seems to work much better with this
|
-DLOLIN_WIFI_FIX ; seems to work much better with this
|
||||||
@ -414,35 +427,15 @@ upload_speed = 460800
|
|||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
lib_deps = ${esp32c3.lib_deps}
|
lib_deps = ${esp32c3.lib_deps}
|
||||||
|
|
||||||
[env:esp32s3dev_8MB]
|
[env:esp32s3dev_16MB_opi]
|
||||||
;; ESP32-S3-DevKitC-1 development board, with 8MB FLASH, no PSRAM (flash_mode: qio)
|
;; ESP32-S3 development board, with 16MB FLASH and >= 8MB PSRAM (memory_type: qio_opi)
|
||||||
board = esp32-s3-devkitc-1
|
|
||||||
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 WLED_RELEASE_NAME=ESP32-S3_8MB
|
|
||||||
-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=1 ;; for boards with USB-OTG connector only (USBCDC or "TinyUSB")
|
|
||||||
${esp32.AR_build_flags}
|
|
||||||
lib_deps = ${esp32s3.lib_deps}
|
|
||||||
${esp32.AR_lib_deps}
|
|
||||||
board_build.partitions = tools/WLED_ESP32_8MB.csv
|
|
||||||
board_build.f_flash = 80000000L
|
|
||||||
board_build.flash_mode = qio
|
|
||||||
; board_build.flash_mode = dio ;; try this if you have problems at startup
|
|
||||||
monitor_filters = esp32_exception_decoder
|
|
||||||
|
|
||||||
[env:esp32s3dev_8MB_PSRAM_opi]
|
|
||||||
;; ESP32-S3 development board, with 8MB FLASH and >= 8MB PSRAM (memory_type: qio_opi)
|
|
||||||
board = esp32-s3-devkitc-1 ;; generic dev board; the next line adds PSRAM support
|
board = esp32-s3-devkitc-1 ;; generic dev board; the next line adds PSRAM support
|
||||||
board_build.arduino.memory_type = qio_opi ;; use with PSRAM: 8MB or 16MB
|
board_build.arduino.memory_type = qio_opi ;; use with PSRAM: 8MB or 16MB
|
||||||
platform = ${esp32s3.platform}
|
platform = ${esp32s3.platform}
|
||||||
platform_packages = ${esp32s3.platform_packages}
|
platform_packages = ${esp32s3.platform_packages}
|
||||||
upload_speed = 921600
|
upload_speed = 921600
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags} ${esp32s3.build_flags} -D WLED_RELEASE_NAME=ESP32-S3_8MB_PSRAM_opi
|
build_flags = ${common.build_flags} ${esp32s3.build_flags} -D WLED_RELEASE_NAME=ESP32-S3_16MB_opi
|
||||||
-D CONFIG_LITTLEFS_FOR_IDF_3_2 -D WLED_WATCHDOG_TIMEOUT=0
|
-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=0 ;; -D ARDUINO_USB_MODE=1 ;; for boards with serial-to-USB chip
|
||||||
-D ARDUINO_USB_CDC_ON_BOOT=1 -D ARDUINO_USB_MODE=1 ;; for boards with USB-OTG connector only (USBCDC or "TinyUSB")
|
-D ARDUINO_USB_CDC_ON_BOOT=1 -D ARDUINO_USB_MODE=1 ;; for boards with USB-OTG connector only (USBCDC or "TinyUSB")
|
||||||
@ -450,12 +443,33 @@ build_flags = ${common.build_flags} ${esp32s3.build_flags} -D WLED_RELEASE_NAME=
|
|||||||
${esp32.AR_build_flags}
|
${esp32.AR_build_flags}
|
||||||
lib_deps = ${esp32s3.lib_deps}
|
lib_deps = ${esp32s3.lib_deps}
|
||||||
${esp32.AR_lib_deps}
|
${esp32.AR_lib_deps}
|
||||||
board_build.partitions = tools/WLED_ESP32_8MB.csv
|
board_build.partitions = ${esp32.extreme_partitions}
|
||||||
board_build.f_flash = 80000000L
|
board_build.f_flash = 80000000L
|
||||||
board_build.flash_mode = qio
|
board_build.flash_mode = qio
|
||||||
monitor_filters = esp32_exception_decoder
|
monitor_filters = esp32_exception_decoder
|
||||||
|
|
||||||
[env:esp32s3_4M_PSRAM_qspi]
|
[env:esp32s3dev_8MB_opi]
|
||||||
|
;; ESP32-S3 development board, with 8MB FLASH and >= 8MB PSRAM (memory_type: qio_opi)
|
||||||
|
board = esp32-s3-devkitc-1 ;; generic dev board; the next line adds PSRAM support
|
||||||
|
board_build.arduino.memory_type = qio_opi ;; use with PSRAM: 8MB or 16MB
|
||||||
|
platform = ${esp32s3.platform}
|
||||||
|
platform_packages = ${esp32s3.platform_packages}
|
||||||
|
upload_speed = 921600
|
||||||
|
build_unflags = ${common.build_unflags}
|
||||||
|
build_flags = ${common.build_flags} ${esp32s3.build_flags} -D WLED_RELEASE_NAME=ESP32-S3_8MB_opi
|
||||||
|
-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=1 ;; for boards with USB-OTG connector only (USBCDC or "TinyUSB")
|
||||||
|
-DBOARD_HAS_PSRAM
|
||||||
|
${esp32.AR_build_flags}
|
||||||
|
lib_deps = ${esp32s3.lib_deps}
|
||||||
|
${esp32.AR_lib_deps}
|
||||||
|
board_build.partitions = ${esp32.large_partitions}
|
||||||
|
board_build.f_flash = 80000000L
|
||||||
|
board_build.flash_mode = qio
|
||||||
|
monitor_filters = esp32_exception_decoder
|
||||||
|
|
||||||
|
[env:esp32s3_4M_qspi]
|
||||||
;; ESP32-S3, with 4MB FLASH and <= 4MB PSRAM (memory_type: qio_qspi)
|
;; ESP32-S3, with 4MB FLASH and <= 4MB PSRAM (memory_type: qio_qspi)
|
||||||
board = esp32-s3-devkitc-1 ;; generic dev board; the next line adds PSRAM support
|
board = esp32-s3-devkitc-1 ;; generic dev board; the next line adds PSRAM support
|
||||||
board_build.arduino.memory_type = qio_qspi ;; use with PSRAM: 2MB or 4MB
|
board_build.arduino.memory_type = qio_qspi ;; use with PSRAM: 2MB or 4MB
|
||||||
@ -463,14 +477,14 @@ platform = ${esp32s3.platform}
|
|||||||
platform_packages = ${esp32s3.platform_packages}
|
platform_packages = ${esp32s3.platform_packages}
|
||||||
upload_speed = 921600
|
upload_speed = 921600
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags} ${esp32s3.build_flags} -D WLED_RELEASE_NAME=ESP32-S3_4M_PSRAM_qspi
|
build_flags = ${common.build_flags} ${esp32s3.build_flags} -D WLED_RELEASE_NAME=ESP32-S3_4M_qspi
|
||||||
-DARDUINO_USB_CDC_ON_BOOT=1 -DARDUINO_USB_MODE=1 ;; for boards with USB-OTG connector only (USBCDC or "TinyUSB")
|
-DARDUINO_USB_CDC_ON_BOOT=1 -DARDUINO_USB_MODE=1 ;; for boards with USB-OTG connector only (USBCDC or "TinyUSB")
|
||||||
-DBOARD_HAS_PSRAM
|
-DBOARD_HAS_PSRAM
|
||||||
-D WLED_WATCHDOG_TIMEOUT=0
|
-D WLED_WATCHDOG_TIMEOUT=0
|
||||||
${esp32.AR_build_flags}
|
${esp32.AR_build_flags}
|
||||||
lib_deps = ${esp32s3.lib_deps}
|
lib_deps = ${esp32s3.lib_deps}
|
||||||
${esp32.AR_lib_deps}
|
${esp32.AR_lib_deps}
|
||||||
board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv
|
board_build.partitions = ${esp32.default_partitions}
|
||||||
board_build.f_flash = 80000000L
|
board_build.f_flash = 80000000L
|
||||||
board_build.flash_mode = qio
|
board_build.flash_mode = qio
|
||||||
monitor_filters = esp32_exception_decoder
|
monitor_filters = esp32_exception_decoder
|
||||||
@ -479,9 +493,9 @@ monitor_filters = esp32_exception_decoder
|
|||||||
platform = ${esp32s2.platform}
|
platform = ${esp32s2.platform}
|
||||||
platform_packages = ${esp32s2.platform_packages}
|
platform_packages = ${esp32s2.platform_packages}
|
||||||
board = lolin_s2_mini
|
board = lolin_s2_mini
|
||||||
board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv
|
board_build.partitions = ${esp32.default_partitions}
|
||||||
;board_build.flash_mode = qio
|
board_build.flash_mode = qio
|
||||||
;board_build.f_flash = 80000000L
|
board_build.f_flash = 80000000L
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags} ${esp32s2.build_flags} -D WLED_RELEASE_NAME=ESP32-S2
|
build_flags = ${common.build_flags} ${esp32s2.build_flags} -D WLED_RELEASE_NAME=ESP32-S2
|
||||||
-DARDUINO_USB_CDC_ON_BOOT=1
|
-DARDUINO_USB_CDC_ON_BOOT=1
|
||||||
|
@ -28,12 +28,15 @@ lib_deps = ${esp8266.lib_deps}
|
|||||||
; robtillaart/SHT85@~0.3.3
|
; robtillaart/SHT85@~0.3.3
|
||||||
; gmag11/QuickESPNow ;@ 0.6.2
|
; gmag11/QuickESPNow ;@ 0.6.2
|
||||||
; https://github.com/blazoncek/QuickESPNow.git#optional-debug ;; exludes debug library
|
; https://github.com/blazoncek/QuickESPNow.git#optional-debug ;; exludes debug library
|
||||||
; https://github.com/kosme/arduinoFFT#develop @ 1.9.2+sha.419d7b0 ;; used for USERMOD_AUDIOREACTIVE - using "known working" hash
|
; https://github.com/kosme/arduinoFFT#develop @ 2.0.1 ;; used for USERMOD_AUDIOREACTIVE
|
||||||
; build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp8266}
|
build_flags = ${common.build_flags} ${esp8266.build_flags}
|
||||||
;
|
;
|
||||||
; *** To use the below defines/overrides, copy and paste each onto it's own line just below build_flags in the section above.
|
; *** To use the below defines/overrides, copy and paste each onto it's own line just below build_flags in the section above.
|
||||||
;
|
;
|
||||||
|
; Set a release name that may be used to distinguish required binary for flashing
|
||||||
|
; -D WLED_RELEASE_NAME=ESP32_MULTI_USREMODS
|
||||||
|
;
|
||||||
; disable specific features
|
; disable specific features
|
||||||
; -D WLED_DISABLE_OTA
|
; -D WLED_DISABLE_OTA
|
||||||
; -D WLED_DISABLE_ALEXA
|
; -D WLED_DISABLE_ALEXA
|
||||||
@ -56,6 +59,7 @@ build_flags = ${common.build_flags_esp8266}
|
|||||||
; -D IRPIN=4
|
; -D IRPIN=4
|
||||||
; -D RLYPIN=12
|
; -D RLYPIN=12
|
||||||
; -D RLYMDE=1
|
; -D RLYMDE=1
|
||||||
|
; -D RLYODRAIN=0
|
||||||
; -D LED_BUILTIN=2 # GPIO of built-in LED
|
; -D LED_BUILTIN=2 # GPIO of built-in LED
|
||||||
;
|
;
|
||||||
; Limit max buses
|
; Limit max buses
|
||||||
@ -179,7 +183,7 @@ platform = ${common.platform_wled_default}
|
|||||||
platform_packages = ${common.platform_packages}
|
platform_packages = ${common.platform_packages}
|
||||||
board_build.ldscript = ${common.ldscript_4m1m}
|
board_build.ldscript = ${common.ldscript_4m1m}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp8266}
|
build_flags = ${common.build_flags} ${esp8266.build_flags}
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
|
|
||||||
[env:d1_mini]
|
[env:d1_mini]
|
||||||
@ -189,7 +193,7 @@ platform_packages = ${common.platform_packages}
|
|||||||
upload_speed = 921600
|
upload_speed = 921600
|
||||||
board_build.ldscript = ${common.ldscript_4m1m}
|
board_build.ldscript = ${common.ldscript_4m1m}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp8266}
|
build_flags = ${common.build_flags} ${esp8266.build_flags}
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
monitor_filters = esp8266_exception_decoder
|
monitor_filters = esp8266_exception_decoder
|
||||||
|
|
||||||
@ -199,7 +203,7 @@ platform = ${common.platform_wled_default}
|
|||||||
platform_packages = ${common.platform_packages}
|
platform_packages = ${common.platform_packages}
|
||||||
board_build.ldscript = ${common.ldscript_4m1m}
|
board_build.ldscript = ${common.ldscript_4m1m}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp8266}
|
build_flags = ${common.build_flags} ${esp8266.build_flags}
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
|
|
||||||
[env:h803wf]
|
[env:h803wf]
|
||||||
@ -208,7 +212,7 @@ platform = ${common.platform_wled_default}
|
|||||||
platform_packages = ${common.platform_packages}
|
platform_packages = ${common.platform_packages}
|
||||||
board_build.ldscript = ${common.ldscript_4m1m}
|
board_build.ldscript = ${common.ldscript_4m1m}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp8266} -D LEDPIN=1 -D WLED_DISABLE_INFRARED
|
build_flags = ${common.build_flags} ${esp8266.build_flags} -D LEDPIN=1 -D WLED_DISABLE_INFRARED
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
|
|
||||||
[env:esp32dev_qio80]
|
[env:esp32dev_qio80]
|
||||||
@ -216,7 +220,7 @@ board = esp32dev
|
|||||||
platform = ${esp32.platform}
|
platform = ${esp32.platform}
|
||||||
platform_packages = ${esp32.platform_packages}
|
platform_packages = ${esp32.platform_packages}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp32} -D WLED_RELEASE_NAME=ESP32_qio80 #-D WLED_DISABLE_BROWNOUT_DET
|
build_flags = ${common.build_flags} ${esp32.build_flags} #-D WLED_DISABLE_BROWNOUT_DET
|
||||||
lib_deps = ${esp32.lib_deps}
|
lib_deps = ${esp32.lib_deps}
|
||||||
monitor_filters = esp32_exception_decoder
|
monitor_filters = esp32_exception_decoder
|
||||||
board_build.partitions = ${esp32.default_partitions}
|
board_build.partitions = ${esp32.default_partitions}
|
||||||
@ -231,7 +235,7 @@ board = esp32dev
|
|||||||
platform = ${esp32_idf_V4.platform}
|
platform = ${esp32_idf_V4.platform}
|
||||||
platform_packages = ${esp32_idf_V4.platform_packages}
|
platform_packages = ${esp32_idf_V4.platform_packages}
|
||||||
build_unflags = ${common.build_unflags}
|
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
|
build_flags = ${common.build_flags} ${esp32_idf_V4.build_flags} #-D WLED_DISABLE_BROWNOUT_DET
|
||||||
lib_deps = ${esp32_idf_V4.lib_deps}
|
lib_deps = ${esp32_idf_V4.lib_deps}
|
||||||
monitor_filters = esp32_exception_decoder
|
monitor_filters = esp32_exception_decoder
|
||||||
board_build.partitions = ${esp32_idf_V4.default_partitions}
|
board_build.partitions = ${esp32_idf_V4.default_partitions}
|
||||||
@ -240,14 +244,14 @@ board_build.flash_mode = dio
|
|||||||
|
|
||||||
[env:esp32s2_saola]
|
[env:esp32s2_saola]
|
||||||
board = esp32-s2-saola-1
|
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 = ${esp32s2.platform}
|
||||||
platform_packages =
|
platform_packages = ${esp32s2.platform_packages}
|
||||||
framework = arduino
|
framework = arduino
|
||||||
board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv
|
board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv
|
||||||
board_build.flash_mode = qio
|
board_build.flash_mode = qio
|
||||||
upload_speed = 460800
|
upload_speed = 460800
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags} ${esp32s2.build_flags} #-D WLED_RELEASE_NAME=S2_saola
|
build_flags = ${common.build_flags} ${esp32s2.build_flags}
|
||||||
;-DLOLIN_WIFI_FIX ;; try this in case Wifi does not work
|
;-DLOLIN_WIFI_FIX ;; try this in case Wifi does not work
|
||||||
-DARDUINO_USB_CDC_ON_BOOT=1
|
-DARDUINO_USB_CDC_ON_BOOT=1
|
||||||
lib_deps = ${esp32s2.lib_deps}
|
lib_deps = ${esp32s2.lib_deps}
|
||||||
@ -265,7 +269,7 @@ platform = ${common.platform_wled_default}
|
|||||||
platform_packages = ${common.platform_packages}
|
platform_packages = ${common.platform_packages}
|
||||||
board_build.ldscript = ${common.ldscript_1m128k}
|
board_build.ldscript = ${common.ldscript_1m128k}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp8266} -D WLED_DISABLE_OTA
|
build_flags = ${common.build_flags} ${esp8266.build_flags} -D WLED_DISABLE_OTA
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
|
|
||||||
[env:esp8285_H801]
|
[env:esp8285_H801]
|
||||||
@ -274,7 +278,7 @@ platform = ${common.platform_wled_default}
|
|||||||
platform_packages = ${common.platform_packages}
|
platform_packages = ${common.platform_packages}
|
||||||
board_build.ldscript = ${common.ldscript_1m128k}
|
board_build.ldscript = ${common.ldscript_1m128k}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp8266} -D WLED_DISABLE_OTA
|
build_flags = ${common.build_flags} ${esp8266.build_flags} -D WLED_DISABLE_OTA
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
|
|
||||||
[env:d1_mini_5CH_Shojo_PCB]
|
[env:d1_mini_5CH_Shojo_PCB]
|
||||||
@ -283,7 +287,7 @@ platform = ${common.platform_wled_default}
|
|||||||
platform_packages = ${common.platform_packages}
|
platform_packages = ${common.platform_packages}
|
||||||
board_build.ldscript = ${common.ldscript_4m1m}
|
board_build.ldscript = ${common.ldscript_4m1m}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp8266} -D WLED_USE_SHOJO_PCB
|
build_flags = ${common.build_flags} ${esp8266.build_flags} -D WLED_USE_SHOJO_PCB
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
|
|
||||||
[env:d1_mini_debug]
|
[env:d1_mini_debug]
|
||||||
@ -293,7 +297,7 @@ platform = ${common.platform_wled_default}
|
|||||||
platform_packages = ${common.platform_packages}
|
platform_packages = ${common.platform_packages}
|
||||||
board_build.ldscript = ${common.ldscript_4m1m}
|
board_build.ldscript = ${common.ldscript_4m1m}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp8266} ${common.debug_flags}
|
build_flags = ${common.build_flags} ${esp8266.build_flags} ${common.debug_flags}
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
|
|
||||||
[env:d1_mini_ota]
|
[env:d1_mini_ota]
|
||||||
@ -305,7 +309,7 @@ platform = ${common.platform_wled_default}
|
|||||||
platform_packages = ${common.platform_packages}
|
platform_packages = ${common.platform_packages}
|
||||||
board_build.ldscript = ${common.ldscript_4m1m}
|
board_build.ldscript = ${common.ldscript_4m1m}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp8266}
|
build_flags = ${common.build_flags} ${esp8266.build_flags}
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
|
|
||||||
[env:anavi_miracle_controller]
|
[env:anavi_miracle_controller]
|
||||||
@ -314,7 +318,7 @@ platform = ${common.platform_wled_default}
|
|||||||
platform_packages = ${common.platform_packages}
|
platform_packages = ${common.platform_packages}
|
||||||
board_build.ldscript = ${common.ldscript_4m1m}
|
board_build.ldscript = ${common.ldscript_4m1m}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp8266} -D LEDPIN=12 -D IRPIN=-1 -D RLYPIN=2
|
build_flags = ${common.build_flags} ${esp8266.build_flags} -D LEDPIN=12 -D IRPIN=-1 -D RLYPIN=2
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
|
|
||||||
[env:esp32c3dev_2MB]
|
[env:esp32c3dev_2MB]
|
||||||
@ -324,7 +328,7 @@ extends = esp32c3
|
|||||||
platform = ${esp32c3.platform}
|
platform = ${esp32c3.platform}
|
||||||
platform_packages = ${esp32c3.platform_packages}
|
platform_packages = ${esp32c3.platform_packages}
|
||||||
board = esp32-c3-devkitm-1
|
board = esp32-c3-devkitm-1
|
||||||
build_flags = ${common.build_flags} ${esp32c3.build_flags} #-D WLED_RELEASE_NAME=ESP32-C3
|
build_flags = ${common.build_flags} ${esp32c3.build_flags}
|
||||||
-D WLED_WATCHDOG_TIMEOUT=0
|
-D WLED_WATCHDOG_TIMEOUT=0
|
||||||
-D WLED_DISABLE_OTA
|
-D WLED_DISABLE_OTA
|
||||||
; -DARDUINO_USB_CDC_ON_BOOT=1 ;; for virtual CDC USB
|
; -DARDUINO_USB_CDC_ON_BOOT=1 ;; for virtual CDC USB
|
||||||
@ -341,7 +345,7 @@ platform = ${esp32.platform}
|
|||||||
platform_packages = ${esp32.platform_packages}
|
platform_packages = ${esp32.platform_packages}
|
||||||
upload_speed = 460800
|
upload_speed = 460800
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp32}
|
build_flags = ${common.build_flags} ${esp32.build_flags}
|
||||||
-D LEDPIN=16
|
-D LEDPIN=16
|
||||||
-D RLYPIN=19
|
-D RLYPIN=19
|
||||||
-D BTNPIN=17
|
-D BTNPIN=17
|
||||||
@ -361,7 +365,7 @@ board_build.partitions = ${esp32.default_partitions}
|
|||||||
[env:m5atom]
|
[env:m5atom]
|
||||||
board = esp32dev
|
board = esp32dev
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp32} -D LEDPIN=27 -D BTNPIN=39
|
build_flags = ${common.build_flags} ${esp32.build_flags} -D LEDPIN=27 -D BTNPIN=39
|
||||||
lib_deps = ${esp32.lib_deps}
|
lib_deps = ${esp32.lib_deps}
|
||||||
platform = ${esp32.platform}
|
platform = ${esp32.platform}
|
||||||
platform_packages = ${esp32.platform_packages}
|
platform_packages = ${esp32.platform_packages}
|
||||||
@ -371,14 +375,14 @@ board_build.partitions = ${esp32.default_partitions}
|
|||||||
board = esp_wroom_02
|
board = esp_wroom_02
|
||||||
platform = ${common.platform_wled_default}
|
platform = ${common.platform_wled_default}
|
||||||
board_build.ldscript = ${common.ldscript_2m512k}
|
board_build.ldscript = ${common.ldscript_2m512k}
|
||||||
build_flags = ${common.build_flags_esp8266} -D LEDPIN=3 -D BTNPIN=1
|
build_flags = ${common.build_flags} ${esp8266.build_flags} -D LEDPIN=3 -D BTNPIN=1
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
|
|
||||||
[env:sp511e]
|
[env:sp511e]
|
||||||
board = esp_wroom_02
|
board = esp_wroom_02
|
||||||
platform = ${common.platform_wled_default}
|
platform = ${common.platform_wled_default}
|
||||||
board_build.ldscript = ${common.ldscript_2m512k}
|
board_build.ldscript = ${common.ldscript_2m512k}
|
||||||
build_flags = ${common.build_flags_esp8266} -D LEDPIN=3 -D BTNPIN=2 -D IRPIN=5 -D WLED_MAX_BUTTONS=3
|
build_flags = ${common.build_flags} ${esp8266.build_flags} -D LEDPIN=3 -D BTNPIN=2 -D IRPIN=5 -D WLED_MAX_BUTTONS=3
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
|
|
||||||
[env:Athom_RGBCW] ;7w and 5w(GU10) bulbs
|
[env:Athom_RGBCW] ;7w and 5w(GU10) bulbs
|
||||||
@ -387,7 +391,7 @@ platform = ${common.platform_wled_default}
|
|||||||
platform_packages = ${common.platform_packages}
|
platform_packages = ${common.platform_packages}
|
||||||
board_build.ldscript = ${common.ldscript_2m512k}
|
board_build.ldscript = ${common.ldscript_2m512k}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP8266 -D BTNPIN=-1 -D RLYPIN=-1 -D DATA_PINS=4,12,14,13,5
|
build_flags = ${common.build_flags} ${esp8266.build_flags} -D BTNPIN=-1 -D RLYPIN=-1 -D DATA_PINS=4,12,14,13,5
|
||||||
-D DEFAULT_LED_TYPE=TYPE_ANALOG_5CH -D WLED_DISABLE_INFRARED -D WLED_MAX_CCT_BLEND=0
|
-D DEFAULT_LED_TYPE=TYPE_ANALOG_5CH -D WLED_DISABLE_INFRARED -D WLED_MAX_CCT_BLEND=0
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
|
|
||||||
@ -397,7 +401,7 @@ platform = ${common.platform_wled_default}
|
|||||||
platform_packages = ${common.platform_packages}
|
platform_packages = ${common.platform_packages}
|
||||||
board_build.ldscript = ${common.ldscript_2m512k}
|
board_build.ldscript = ${common.ldscript_2m512k}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP8266 -D BTNPIN=-1 -D RLYPIN=-1 -D DATA_PINS=4,12,14,5,13
|
build_flags = ${common.build_flags} ${esp8266.build_flags} -D BTNPIN=-1 -D RLYPIN=-1 -D DATA_PINS=4,12,14,5,13
|
||||||
-D DEFAULT_LED_TYPE=TYPE_ANALOG_5CH -D WLED_DISABLE_INFRARED -D WLED_MAX_CCT_BLEND=0 -D WLED_USE_IC_CCT
|
-D DEFAULT_LED_TYPE=TYPE_ANALOG_5CH -D WLED_DISABLE_INFRARED -D WLED_MAX_CCT_BLEND=0 -D WLED_USE_IC_CCT
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
|
|
||||||
@ -407,7 +411,7 @@ platform = ${common.platform_wled_default}
|
|||||||
platform_packages = ${common.platform_packages}
|
platform_packages = ${common.platform_packages}
|
||||||
board_build.ldscript = ${common.ldscript_2m512k}
|
board_build.ldscript = ${common.ldscript_2m512k}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP8266 -D BTNPIN=0 -D RLYPIN=-1 -D LEDPIN=1 -D WLED_DISABLE_INFRARED
|
build_flags = ${common.build_flags} ${esp8266.build_flags} -D BTNPIN=0 -D RLYPIN=-1 -D LEDPIN=1 -D WLED_DISABLE_INFRARED
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
|
|
||||||
[env:Athom_4Pin_Controller] ; With clock and data interface
|
[env:Athom_4Pin_Controller] ; With clock and data interface
|
||||||
@ -416,7 +420,7 @@ platform = ${common.platform_wled_default}
|
|||||||
platform_packages = ${common.platform_packages}
|
platform_packages = ${common.platform_packages}
|
||||||
board_build.ldscript = ${common.ldscript_2m512k}
|
board_build.ldscript = ${common.ldscript_2m512k}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP8266 -D BTNPIN=0 -D RLYPIN=12 -D LEDPIN=1 -D WLED_DISABLE_INFRARED
|
build_flags = ${common.build_flags} ${esp8266.build_flags} -D BTNPIN=0 -D RLYPIN=12 -D LEDPIN=1 -D WLED_DISABLE_INFRARED
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
|
|
||||||
[env:Athom_5Pin_Controller] ;Analog light strip controller
|
[env:Athom_5Pin_Controller] ;Analog light strip controller
|
||||||
@ -425,7 +429,7 @@ platform = ${common.platform_wled_default}
|
|||||||
platform_packages = ${common.platform_packages}
|
platform_packages = ${common.platform_packages}
|
||||||
board_build.ldscript = ${common.ldscript_2m512k}
|
board_build.ldscript = ${common.ldscript_2m512k}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP8266 -D BTNPIN=0 -D RLYPIN=-1 DATA_PINS=4,12,14,13 -D WLED_DISABLE_INFRARED
|
build_flags = ${common.build_flags} ${esp8266.build_flags} -D BTNPIN=0 -D RLYPIN=-1 DATA_PINS=4,12,14,13 -D WLED_DISABLE_INFRARED
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
|
|
||||||
[env:MY9291]
|
[env:MY9291]
|
||||||
@ -434,7 +438,7 @@ platform = ${common.platform_wled_default}
|
|||||||
platform_packages = ${common.platform_packages}
|
platform_packages = ${common.platform_packages}
|
||||||
board_build.ldscript = ${common.ldscript_1m128k}
|
board_build.ldscript = ${common.ldscript_1m128k}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP01 -D WLED_DISABLE_OTA -D USERMOD_MY9291
|
build_flags = ${common.build_flags} ${esp8266.build_flags} -D WLED_DISABLE_OTA -D USERMOD_MY9291
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
@ -448,7 +452,7 @@ platform = ${common.platform_wled_default}
|
|||||||
platform_packages = ${common.platform_packages}
|
platform_packages = ${common.platform_packages}
|
||||||
board_build.ldscript = ${common.ldscript_2m512k}
|
board_build.ldscript = ${common.ldscript_2m512k}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp8266}
|
build_flags = ${common.build_flags} ${esp8266.build_flags}
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
|
|
||||||
[env:codm-controller-0_6-rev2]
|
[env:codm-controller-0_6-rev2]
|
||||||
@ -457,7 +461,7 @@ platform = ${common.platform_wled_default}
|
|||||||
platform_packages = ${common.platform_packages}
|
platform_packages = ${common.platform_packages}
|
||||||
board_build.ldscript = ${common.ldscript_4m1m}
|
board_build.ldscript = ${common.ldscript_4m1m}
|
||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp8266}
|
build_flags = ${common.build_flags} ${esp8266.build_flags}
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
@ -468,7 +472,7 @@ board = esp32dev
|
|||||||
platform = ${esp32.platform}
|
platform = ${esp32.platform}
|
||||||
platform_packages = ${esp32.platform_packages}
|
platform_packages = ${esp32.platform_packages}
|
||||||
upload_speed = 921600
|
upload_speed = 921600
|
||||||
build_flags = ${common.build_flags_esp32} -D WLED_DISABLE_BROWNOUT_DET -D WLED_DISABLE_INFRARED
|
build_flags = ${common.build_flags} ${esp32.build_flags} -D WLED_DISABLE_BROWNOUT_DET -D WLED_DISABLE_INFRARED
|
||||||
-D USERMOD_RTC
|
-D USERMOD_RTC
|
||||||
-D USERMOD_ELEKSTUBE_IPS
|
-D USERMOD_ELEKSTUBE_IPS
|
||||||
-D LEDPIN=12
|
-D LEDPIN=12
|
||||||
|
7
tools/WLED_ESP32_4MB_256KB_FS.csv
Normal file
7
tools/WLED_ESP32_4MB_256KB_FS.csv
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# Name, Type, SubType, Offset, Size, Flags
|
||||||
|
nvs, data, nvs, 0x9000, 0x5000,
|
||||||
|
otadata, data, ota, 0xe000, 0x2000,
|
||||||
|
app0, app, ota_0, 0x10000, 0x1D0000,
|
||||||
|
app1, app, ota_1, 0x1E0000,0x1D0000,
|
||||||
|
spiffs, data, spiffs, 0x3B0000,0x40000,
|
||||||
|
coredump, data, coredump,,64K
|
|
6
tools/WLED_ESP32_4MB_700k_FS.csv
Normal file
6
tools/WLED_ESP32_4MB_700k_FS.csv
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# Name, Type, SubType, Offset, Size, Flags
|
||||||
|
nvs, data, nvs, 0x9000, 0x5000,
|
||||||
|
otadata, data, ota, 0xe000, 0x2000,
|
||||||
|
app0, app, ota_0, 0x10000, 0x1A0000,
|
||||||
|
app1, app, ota_1, 0x1B0000,0x1A0000,
|
||||||
|
spiffs, data, spiffs, 0x350000,0xB0000,
|
|
@ -59,7 +59,7 @@ private:
|
|||||||
bool sensorFound = false;
|
bool sensorFound = false;
|
||||||
|
|
||||||
// Home Assistant and MQTT
|
// Home Assistant and MQTT
|
||||||
String mqttLuminanceTopic = F("");
|
String mqttLuminanceTopic;
|
||||||
bool mqttInitialized = false;
|
bool mqttInitialized = false;
|
||||||
bool HomeAssistantDiscovery = true; // Publish Home Assistant Discovery messages
|
bool HomeAssistantDiscovery = true; // Publish Home Assistant Discovery messages
|
||||||
|
|
||||||
|
@ -71,7 +71,7 @@
|
|||||||
* if you want to receive two channels, one is the actual data from microphone and another channel is suppose to receive 0, it's different data in two channels, you need to choose I2S_CHANNEL_FMT_RIGHT_LEFT in this case.
|
* if you want to receive two channels, one is the actual data from microphone and another channel is suppose to receive 0, it's different data in two channels, you need to choose I2S_CHANNEL_FMT_RIGHT_LEFT in this case.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 4, 0)) && (ESP_IDF_VERSION <= ESP_IDF_VERSION_VAL(4, 4, 4))
|
#if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 4, 0)) && (ESP_IDF_VERSION <= ESP_IDF_VERSION_VAL(4, 4, 6))
|
||||||
// espressif bug: only_left has no sound, left and right are swapped
|
// espressif bug: only_left has no sound, left and right are swapped
|
||||||
// https://github.com/espressif/esp-idf/issues/9635 I2S mic not working since 4.4 (IDFGH-8138)
|
// https://github.com/espressif/esp-idf/issues/9635 I2S mic not working since 4.4 (IDFGH-8138)
|
||||||
// https://github.com/espressif/esp-idf/issues/8538 I2S channel selection issue? (IDFGH-6918)
|
// https://github.com/espressif/esp-idf/issues/8538 I2S channel selection issue? (IDFGH-6918)
|
||||||
|
@ -27,18 +27,11 @@ Currently ESP8266 is not supported, due to low speed and small RAM of this chip.
|
|||||||
There are however plans to create a lightweight audioreactive for the 8266, with reduced features.
|
There are however plans to create a lightweight audioreactive for the 8266, with reduced features.
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
### using customised _arduinoFFT_ library for use with this usermod
|
### using latest _arduinoFFT_ library version 2.x
|
||||||
Add `-D USERMOD_AUDIOREACTIVE` to your PlatformIO environment `build_flags`, as well as `https://github.com/blazoncek/arduinoFFT.git` to your `lib_deps`.
|
The latest arduinoFFT release version should be used for audioreactive.
|
||||||
If you are not using PlatformIO (which you should) try adding `#define USERMOD_AUDIOREACTIVE` to *my_config.h* and make sure you have _arduinoFFT_ library downloaded and installed.
|
|
||||||
|
|
||||||
Customised _arduinoFFT_ library for use with this usermod can be found at https://github.com/blazoncek/arduinoFFT.git
|
* `build_flags` = `-D USERMOD_AUDIOREACTIVE`
|
||||||
|
* `lib_deps`= `kosme/arduinoFFT @ 2.0.1`
|
||||||
### using latest (develop) _arduinoFFT_ library
|
|
||||||
Alternatively, you can use the latest arduinoFFT development version.
|
|
||||||
ArduinoFFT `develop` library is slightly more accurate, and slightly faster than our customised library, however also needs additional 2kB RAM.
|
|
||||||
|
|
||||||
* `build_flags` = `-D USERMOD_AUDIOREACTIVE` `-D UM_AUDIOREACTIVE_USE_NEW_FFT`
|
|
||||||
* `lib_deps`= `https://github.com/kosme/arduinoFFT#develop @ 1.9.2`
|
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
|
@ -667,7 +667,7 @@ void MultiRelay::addToJsonInfo(JsonObject &root) {
|
|||||||
for (int i=0; i<MULTI_RELAY_MAX_RELAYS; i++) {
|
for (int i=0; i<MULTI_RELAY_MAX_RELAYS; i++) {
|
||||||
if (_relay[i].pin<0 || !_relay[i].external) continue;
|
if (_relay[i].pin<0 || !_relay[i].external) continue;
|
||||||
uiDomString = F("Relay "); uiDomString += i;
|
uiDomString = F("Relay "); uiDomString += i;
|
||||||
JsonArray infoArr = user.createNestedArray(uiDomString); // timer value
|
infoArr = user.createNestedArray(uiDomString); // timer value
|
||||||
|
|
||||||
uiDomString = F("<button class=\"btn btn-xs\" onclick=\"requestJson({");
|
uiDomString = F("<button class=\"btn btn-xs\" onclick=\"requestJson({");
|
||||||
uiDomString += FPSTR(_name);
|
uiDomString += FPSTR(_name);
|
||||||
|
@ -1135,10 +1135,12 @@ bool FourLineDisplayUsermod::handleButton(uint8_t b) {
|
|||||||
return handled;
|
return handled;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CONFIG_FREERTOS_UNICORE
|
#ifndef ARDUINO_RUNNING_CORE
|
||||||
#define ARDUINO_RUNNING_CORE 0
|
#if CONFIG_FREERTOS_UNICORE
|
||||||
#else
|
#define ARDUINO_RUNNING_CORE 0
|
||||||
#define ARDUINO_RUNNING_CORE 1
|
#else
|
||||||
|
#define ARDUINO_RUNNING_CORE 1
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
void FourLineDisplayUsermod::onUpdateBegin(bool init) {
|
void FourLineDisplayUsermod::onUpdateBegin(bool init) {
|
||||||
#if defined(ARDUINO_ARCH_ESP32) && defined(FLD_ESP32_USE_THREADS)
|
#if defined(ARDUINO_ARCH_ESP32) && defined(FLD_ESP32_USE_THREADS)
|
||||||
|
12
wled00/FX.h
12
wled00/FX.h
@ -608,7 +608,7 @@ typedef struct Segment {
|
|||||||
bool isPixelClipped(int i);
|
bool isPixelClipped(int i);
|
||||||
uint32_t getPixelColor(int i);
|
uint32_t getPixelColor(int i);
|
||||||
// 1D support functions (some implement 2D as well)
|
// 1D support functions (some implement 2D as well)
|
||||||
void blur(uint8_t);
|
void blur(uint8_t, bool smear = false);
|
||||||
void fill(uint32_t c);
|
void fill(uint32_t c);
|
||||||
void fade_out(uint8_t r);
|
void fade_out(uint8_t r);
|
||||||
void fadeToBlackBy(uint8_t fadeBy);
|
void fadeToBlackBy(uint8_t fadeBy);
|
||||||
@ -637,7 +637,7 @@ typedef struct Segment {
|
|||||||
inline void setPixelColorXY(float x, float y, CRGB c, bool aa = true) { setPixelColorXY(x, y, RGBW32(c.r,c.g,c.b,0), aa); }
|
inline void setPixelColorXY(float x, float y, CRGB c, bool aa = true) { setPixelColorXY(x, y, RGBW32(c.r,c.g,c.b,0), aa); }
|
||||||
#endif
|
#endif
|
||||||
bool isPixelXYClipped(int x, int y);
|
bool isPixelXYClipped(int x, int y);
|
||||||
uint32_t getPixelColorXY(uint16_t x, uint16_t y);
|
uint32_t getPixelColorXY(int x, int y);
|
||||||
// 2D support functions
|
// 2D support functions
|
||||||
inline void blendPixelColorXY(uint16_t x, uint16_t y, uint32_t color, uint8_t blend) { setPixelColorXY(x, y, color_blend(getPixelColorXY(x,y), color, blend)); }
|
inline void blendPixelColorXY(uint16_t x, uint16_t y, uint32_t color, uint8_t blend) { setPixelColorXY(x, y, color_blend(getPixelColorXY(x,y), color, blend)); }
|
||||||
inline void blendPixelColorXY(uint16_t x, uint16_t y, CRGB c, uint8_t blend) { blendPixelColorXY(x, y, RGBW32(c.r,c.g,c.b,0), blend); }
|
inline void blendPixelColorXY(uint16_t x, uint16_t y, CRGB c, uint8_t blend) { blendPixelColorXY(x, y, RGBW32(c.r,c.g,c.b,0), blend); }
|
||||||
@ -646,8 +646,8 @@ typedef struct Segment {
|
|||||||
inline void addPixelColorXY(int x, int y, CRGB c, bool fast = false) { addPixelColorXY(x, y, RGBW32(c.r,c.g,c.b,0), fast); }
|
inline void addPixelColorXY(int x, int y, CRGB c, bool fast = false) { addPixelColorXY(x, y, RGBW32(c.r,c.g,c.b,0), fast); }
|
||||||
inline void fadePixelColorXY(uint16_t x, uint16_t y, uint8_t fade) { setPixelColorXY(x, y, color_fade(getPixelColorXY(x,y), fade, true)); }
|
inline void fadePixelColorXY(uint16_t x, uint16_t y, uint8_t fade) { setPixelColorXY(x, y, color_fade(getPixelColorXY(x,y), fade, true)); }
|
||||||
void box_blur(uint16_t i, bool vertical, fract8 blur_amount); // 1D box blur (with weight)
|
void box_blur(uint16_t i, bool vertical, fract8 blur_amount); // 1D box blur (with weight)
|
||||||
void blurRow(uint16_t row, fract8 blur_amount);
|
void blurRow(uint32_t row, fract8 blur_amount, bool smear = false);
|
||||||
void blurCol(uint16_t col, fract8 blur_amount);
|
void blurCol(uint32_t col, fract8 blur_amount, bool smear = false);
|
||||||
void moveX(int8_t delta, bool wrap = false);
|
void moveX(int8_t delta, bool wrap = false);
|
||||||
void moveY(int8_t delta, bool wrap = false);
|
void moveY(int8_t delta, bool wrap = false);
|
||||||
void move(uint8_t dir, uint8_t delta, bool wrap = false);
|
void move(uint8_t dir, uint8_t delta, bool wrap = false);
|
||||||
@ -683,8 +683,8 @@ typedef struct Segment {
|
|||||||
inline void addPixelColorXY(int x, int y, CRGB c, bool fast = false) { addPixelColor(x, RGBW32(c.r,c.g,c.b,0), fast); }
|
inline void addPixelColorXY(int x, int y, CRGB c, bool fast = false) { addPixelColor(x, RGBW32(c.r,c.g,c.b,0), fast); }
|
||||||
inline void fadePixelColorXY(uint16_t x, uint16_t y, uint8_t fade) { fadePixelColor(x, fade); }
|
inline void fadePixelColorXY(uint16_t x, uint16_t y, uint8_t fade) { fadePixelColor(x, fade); }
|
||||||
inline void box_blur(uint16_t i, bool vertical, fract8 blur_amount) {}
|
inline void box_blur(uint16_t i, bool vertical, fract8 blur_amount) {}
|
||||||
inline void blurRow(uint16_t row, fract8 blur_amount) {}
|
inline void blurRow(uint32_t row, fract8 blur_amount, bool smear = false) {}
|
||||||
inline void blurCol(uint16_t col, fract8 blur_amount) {}
|
inline void blurCol(uint32_t col, fract8 blur_amount, bool smear = false) {}
|
||||||
inline void moveX(int8_t delta, bool wrap = false) {}
|
inline void moveX(int8_t delta, bool wrap = false) {}
|
||||||
inline void moveY(int8_t delta, bool wrap = false) {}
|
inline void moveY(int8_t delta, bool wrap = false) {}
|
||||||
inline void move(uint8_t dir, uint8_t delta, bool wrap = false) {}
|
inline void move(uint8_t dir, uint8_t delta, bool wrap = false) {}
|
||||||
|
@ -110,11 +110,11 @@ void WS2812FX::setUpMatrix() {
|
|||||||
releaseJSONBufferLock();
|
releaseJSONBufferLock();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t x, y, pix=0; //pixel
|
unsigned x, y, pix=0; //pixel
|
||||||
for (size_t pan = 0; pan < panel.size(); pan++) {
|
for (size_t pan = 0; pan < panel.size(); pan++) {
|
||||||
Panel &p = panel[pan];
|
Panel &p = panel[pan];
|
||||||
uint16_t h = p.vertical ? p.height : p.width;
|
unsigned h = p.vertical ? p.height : p.width;
|
||||||
uint16_t v = p.vertical ? p.width : p.height;
|
unsigned v = p.vertical ? p.width : p.height;
|
||||||
for (size_t j = 0; j < v; j++){
|
for (size_t j = 0; j < v; j++){
|
||||||
for(size_t i = 0; i < h; i++) {
|
for(size_t i = 0; i < h; i++) {
|
||||||
y = (p.vertical?p.rightStart:p.bottomStart) ? v-j-1 : j;
|
y = (p.vertical?p.rightStart:p.bottomStart) ? v-j-1 : j;
|
||||||
@ -163,8 +163,8 @@ void WS2812FX::setUpMatrix() {
|
|||||||
// XY(x,y) - gets pixel index within current segment (often used to reference leds[] array element)
|
// XY(x,y) - gets pixel index within current segment (often used to reference leds[] array element)
|
||||||
uint16_t IRAM_ATTR Segment::XY(uint16_t x, uint16_t y)
|
uint16_t IRAM_ATTR Segment::XY(uint16_t x, uint16_t y)
|
||||||
{
|
{
|
||||||
uint16_t width = virtualWidth(); // segment width in logical pixels (can be 0 if segment is inactive)
|
unsigned width = virtualWidth(); // segment width in logical pixels (can be 0 if segment is inactive)
|
||||||
uint16_t height = virtualHeight(); // segment height in logical pixels (is always >= 1)
|
unsigned height = virtualHeight(); // segment height in logical pixels (is always >= 1)
|
||||||
return isActive() ? (x%width) + (y%height) * width : 0;
|
return isActive() ? (x%width) + (y%height) * width : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -206,16 +206,12 @@ void IRAM_ATTR Segment::setPixelColorXY(int x, int y, uint32_t col)
|
|||||||
|
|
||||||
uint8_t _bri_t = currentBri();
|
uint8_t _bri_t = currentBri();
|
||||||
if (_bri_t < 255) {
|
if (_bri_t < 255) {
|
||||||
byte r = scale8(R(col), _bri_t);
|
col = color_fade(col, _bri_t);
|
||||||
byte g = scale8(G(col), _bri_t);
|
|
||||||
byte b = scale8(B(col), _bri_t);
|
|
||||||
byte w = scale8(W(col), _bri_t);
|
|
||||||
col = RGBW32(r, g, b, w);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reverse ) x = virtualWidth() - x - 1;
|
if (reverse ) x = virtualWidth() - x - 1;
|
||||||
if (reverse_y) y = virtualHeight() - y - 1;
|
if (reverse_y) y = virtualHeight() - y - 1;
|
||||||
if (transpose) { uint16_t t = x; x = y; y = t; } // swap X & Y if segment transposed
|
if (transpose) { unsigned t = x; x = y; y = t; } // swap X & Y if segment transposed
|
||||||
|
|
||||||
x *= groupLength(); // expand to physical pixels
|
x *= groupLength(); // expand to physical pixels
|
||||||
y *= groupLength(); // expand to physical pixels
|
y *= groupLength(); // expand to physical pixels
|
||||||
@ -224,7 +220,7 @@ void IRAM_ATTR Segment::setPixelColorXY(int x, int y, uint32_t col)
|
|||||||
uint32_t tmpCol = col;
|
uint32_t tmpCol = col;
|
||||||
for (int j = 0; j < grouping; j++) { // groupping vertically
|
for (int j = 0; j < grouping; j++) { // groupping vertically
|
||||||
for (int g = 0; g < grouping; g++) { // groupping horizontally
|
for (int g = 0; g < grouping; g++) { // groupping horizontally
|
||||||
uint16_t xX = (x+g), yY = (y+j);
|
unsigned xX = (x+g), yY = (y+j);
|
||||||
if (xX >= width() || yY >= height()) continue; // we have reached one dimension's end
|
if (xX >= width() || yY >= height()) continue; // we have reached one dimension's end
|
||||||
|
|
||||||
#ifndef WLED_DISABLE_MODE_BLEND
|
#ifndef WLED_DISABLE_MODE_BLEND
|
||||||
@ -256,16 +252,16 @@ void Segment::setPixelColorXY(float x, float y, uint32_t col, bool aa)
|
|||||||
if (!isActive()) return; // not active
|
if (!isActive()) return; // not active
|
||||||
if (x<0.0f || x>1.0f || y<0.0f || y>1.0f) return; // not normalized
|
if (x<0.0f || x>1.0f || y<0.0f || y>1.0f) return; // not normalized
|
||||||
|
|
||||||
const uint16_t cols = virtualWidth();
|
const unsigned cols = virtualWidth();
|
||||||
const uint16_t rows = virtualHeight();
|
const unsigned rows = virtualHeight();
|
||||||
|
|
||||||
float fX = x * (cols-1);
|
float fX = x * (cols-1);
|
||||||
float fY = y * (rows-1);
|
float fY = y * (rows-1);
|
||||||
if (aa) {
|
if (aa) {
|
||||||
uint16_t xL = roundf(fX-0.49f);
|
unsigned xL = roundf(fX-0.49f);
|
||||||
uint16_t xR = roundf(fX+0.49f);
|
unsigned xR = roundf(fX+0.49f);
|
||||||
uint16_t yT = roundf(fY-0.49f);
|
unsigned yT = roundf(fY-0.49f);
|
||||||
uint16_t yB = roundf(fY+0.49f);
|
unsigned yB = roundf(fY+0.49f);
|
||||||
float dL = (fX - xL)*(fX - xL);
|
float dL = (fX - xL)*(fX - xL);
|
||||||
float dR = (xR - fX)*(xR - fX);
|
float dR = (xR - fX)*(xR - fX);
|
||||||
float dT = (fY - yT)*(fY - yT);
|
float dT = (fY - yT)*(fY - yT);
|
||||||
@ -296,12 +292,12 @@ void Segment::setPixelColorXY(float x, float y, uint32_t col, bool aa)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// returns RGBW values of pixel
|
// returns RGBW values of pixel
|
||||||
uint32_t IRAM_ATTR Segment::getPixelColorXY(uint16_t x, uint16_t y) {
|
uint32_t IRAM_ATTR Segment::getPixelColorXY(int x, int y) {
|
||||||
if (!isActive()) return 0; // not active
|
if (!isActive()) return 0; // not active
|
||||||
if (x >= virtualWidth() || y >= virtualHeight() || x<0 || y<0 || isPixelXYClipped(x,y)) return 0; // if pixel would fall out of virtual segment just exit
|
if (x >= virtualWidth() || y >= virtualHeight() || x<0 || y<0 || isPixelXYClipped(x,y)) return 0; // if pixel would fall out of virtual segment just exit
|
||||||
if (reverse ) x = virtualWidth() - x - 1;
|
if (reverse ) x = virtualWidth() - x - 1;
|
||||||
if (reverse_y) y = virtualHeight() - y - 1;
|
if (reverse_y) y = virtualHeight() - y - 1;
|
||||||
if (transpose) { uint16_t t = x; x = y; y = t; } // swap X & Y if segment transposed
|
if (transpose) { unsigned t = x; x = y; y = t; } // swap X & Y if segment transposed
|
||||||
x *= groupLength(); // expand to physical pixels
|
x *= groupLength(); // expand to physical pixels
|
||||||
y *= groupLength(); // expand to physical pixels
|
y *= groupLength(); // expand to physical pixels
|
||||||
if (x >= width() || y >= height()) return 0;
|
if (x >= width() || y >= height()) return 0;
|
||||||
@ -309,92 +305,102 @@ uint32_t IRAM_ATTR Segment::getPixelColorXY(uint16_t x, uint16_t y) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// blurRow: perform a blur on a row of a rectangular matrix
|
// blurRow: perform a blur on a row of a rectangular matrix
|
||||||
void Segment::blurRow(uint16_t row, fract8 blur_amount) {
|
void Segment::blurRow(uint32_t row, fract8 blur_amount, bool smear){
|
||||||
if (!isActive() || blur_amount == 0) return; // not active
|
if (!isActive() || blur_amount == 0) return; // not active
|
||||||
const uint_fast16_t cols = virtualWidth();
|
const unsigned cols = virtualWidth();
|
||||||
const uint_fast16_t rows = virtualHeight();
|
const unsigned rows = virtualHeight();
|
||||||
|
|
||||||
if (row >= rows) return;
|
if (row >= rows) return;
|
||||||
// blur one row
|
// blur one row
|
||||||
uint8_t keep = 255 - blur_amount;
|
uint8_t keep = smear ? 255 : 255 - blur_amount;
|
||||||
uint8_t seep = blur_amount >> 1;
|
uint8_t seep = blur_amount >> 1;
|
||||||
CRGB carryover = CRGB::Black;
|
uint32_t carryover = BLACK;
|
||||||
|
uint32_t lastnew;
|
||||||
|
uint32_t last;
|
||||||
|
uint32_t curnew = BLACK;
|
||||||
for (unsigned x = 0; x < cols; x++) {
|
for (unsigned x = 0; x < cols; x++) {
|
||||||
CRGB cur = getPixelColorXY(x, row);
|
uint32_t cur = getPixelColorXY(x, row);
|
||||||
CRGB before = cur; // remember color before blur
|
uint32_t part = color_fade(cur, seep);
|
||||||
CRGB part = cur;
|
curnew = color_fade(cur, keep);
|
||||||
part.nscale8(seep);
|
if (x > 0) {
|
||||||
cur.nscale8(keep);
|
if (carryover)
|
||||||
cur += carryover;
|
curnew = color_add(curnew, carryover, true);
|
||||||
if (x>0) {
|
uint32_t prev = color_add(lastnew, part, true);
|
||||||
CRGB prev = CRGB(getPixelColorXY(x-1, row)) + part;
|
if (last != prev) // optimization: only set pixel if color has changed
|
||||||
setPixelColorXY(x-1, row, prev);
|
setPixelColorXY(x - 1, row, prev);
|
||||||
}
|
} else // first pixel
|
||||||
if (before != cur) // optimization: only set pixel if color has changed
|
setPixelColorXY(x, row, curnew);
|
||||||
setPixelColorXY(x, row, cur);
|
lastnew = curnew;
|
||||||
|
last = cur; // save original value for comparison on next iteration
|
||||||
carryover = part;
|
carryover = part;
|
||||||
}
|
}
|
||||||
|
setPixelColorXY(cols-1, row, curnew); // set last pixel
|
||||||
}
|
}
|
||||||
|
|
||||||
// blurCol: perform a blur on a column of a rectangular matrix
|
// blurCol: perform a blur on a column of a rectangular matrix
|
||||||
void Segment::blurCol(uint16_t col, fract8 blur_amount) {
|
void Segment::blurCol(uint32_t col, fract8 blur_amount, bool smear) {
|
||||||
if (!isActive() || blur_amount == 0) return; // not active
|
if (!isActive() || blur_amount == 0) return; // not active
|
||||||
const uint_fast16_t cols = virtualWidth();
|
const unsigned cols = virtualWidth();
|
||||||
const uint_fast16_t rows = virtualHeight();
|
const unsigned rows = virtualHeight();
|
||||||
|
|
||||||
if (col >= cols) return;
|
if (col >= cols) return;
|
||||||
// blur one column
|
// blur one column
|
||||||
uint8_t keep = 255 - blur_amount;
|
uint8_t keep = smear ? 255 : 255 - blur_amount;
|
||||||
uint8_t seep = blur_amount >> 1;
|
uint8_t seep = blur_amount >> 1;
|
||||||
CRGB carryover = CRGB::Black;
|
uint32_t carryover = BLACK;
|
||||||
|
uint32_t lastnew;
|
||||||
|
uint32_t last;
|
||||||
|
uint32_t curnew = BLACK;
|
||||||
for (unsigned y = 0; y < rows; y++) {
|
for (unsigned y = 0; y < rows; y++) {
|
||||||
CRGB cur = getPixelColorXY(col, y);
|
uint32_t cur = getPixelColorXY(col, y);
|
||||||
CRGB part = cur;
|
uint32_t part = color_fade(cur, seep);
|
||||||
CRGB before = cur; // remember color before blur
|
curnew = color_fade(cur, keep);
|
||||||
part.nscale8(seep);
|
if (y > 0) {
|
||||||
cur.nscale8(keep);
|
if (carryover)
|
||||||
cur += carryover;
|
curnew = color_add(curnew, carryover, true);
|
||||||
if (y>0) {
|
uint32_t prev = color_add(lastnew, part, true);
|
||||||
CRGB prev = CRGB(getPixelColorXY(col, y-1)) + part;
|
if (last != prev) // optimization: only set pixel if color has changed
|
||||||
setPixelColorXY(col, y-1, prev);
|
setPixelColorXY(col, y - 1, prev);
|
||||||
}
|
} else // first pixel
|
||||||
if (before != cur) // optimization: only set pixel if color has changed
|
setPixelColorXY(col, y, curnew);
|
||||||
setPixelColorXY(col, y, cur);
|
lastnew = curnew;
|
||||||
|
last = cur; //save original value for comparison on next iteration
|
||||||
carryover = part;
|
carryover = part;
|
||||||
}
|
}
|
||||||
|
setPixelColorXY(col, rows - 1, curnew);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1D Box blur (with added weight - blur_amount: [0=no blur, 255=max blur])
|
// 1D Box blur (with added weight - blur_amount: [0=no blur, 255=max blur])
|
||||||
void Segment::box_blur(uint16_t i, bool vertical, fract8 blur_amount) {
|
void Segment::box_blur(uint16_t i, bool vertical, fract8 blur_amount) {
|
||||||
if (!isActive() || blur_amount == 0) return; // not active
|
if (!isActive() || blur_amount == 0) return; // not active
|
||||||
const uint16_t cols = virtualWidth();
|
const unsigned cols = virtualWidth();
|
||||||
const uint16_t rows = virtualHeight();
|
const unsigned rows = virtualHeight();
|
||||||
const uint16_t dim1 = vertical ? rows : cols;
|
const unsigned dim1 = vertical ? rows : cols;
|
||||||
const uint16_t dim2 = vertical ? cols : rows;
|
const unsigned dim2 = vertical ? cols : rows;
|
||||||
if (i >= dim2) return;
|
if (i >= dim2) return;
|
||||||
const float seep = blur_amount/255.f;
|
const float seep = blur_amount/255.f;
|
||||||
const float keep = 3.f - 2.f*seep;
|
const float keep = 3.f - 2.f*seep;
|
||||||
// 1D box blur
|
// 1D box blur
|
||||||
CRGB tmp[dim1];
|
CRGB tmp[dim1];
|
||||||
for (int j = 0; j < dim1; j++) {
|
for (unsigned j = 0; j < dim1; j++) {
|
||||||
uint16_t x = vertical ? i : j;
|
unsigned x = vertical ? i : j;
|
||||||
uint16_t y = vertical ? j : i;
|
unsigned y = vertical ? j : i;
|
||||||
int16_t xp = vertical ? x : x-1; // "signed" to prevent underflow
|
int xp = vertical ? x : x-1; // "signed" to prevent underflow
|
||||||
int16_t yp = vertical ? y-1 : y; // "signed" to prevent underflow
|
int yp = vertical ? y-1 : y; // "signed" to prevent underflow
|
||||||
uint16_t xn = vertical ? x : x+1;
|
unsigned xn = vertical ? x : x+1;
|
||||||
uint16_t yn = vertical ? y+1 : y;
|
unsigned yn = vertical ? y+1 : y;
|
||||||
CRGB curr = getPixelColorXY(x,y);
|
CRGB curr = getPixelColorXY(x,y);
|
||||||
CRGB prev = (xp<0 || yp<0) ? CRGB::Black : getPixelColorXY(xp,yp);
|
CRGB prev = (xp<0 || yp<0) ? CRGB::Black : getPixelColorXY(xp,yp);
|
||||||
CRGB next = ((vertical && yn>=dim1) || (!vertical && xn>=dim1)) ? CRGB::Black : getPixelColorXY(xn,yn);
|
CRGB next = ((vertical && yn>=dim1) || (!vertical && xn>=dim1)) ? CRGB::Black : getPixelColorXY(xn,yn);
|
||||||
uint16_t r, g, b;
|
unsigned r, g, b;
|
||||||
r = (curr.r*keep + (prev.r + next.r)*seep) / 3;
|
r = (curr.r*keep + (prev.r + next.r)*seep) / 3;
|
||||||
g = (curr.g*keep + (prev.g + next.g)*seep) / 3;
|
g = (curr.g*keep + (prev.g + next.g)*seep) / 3;
|
||||||
b = (curr.b*keep + (prev.b + next.b)*seep) / 3;
|
b = (curr.b*keep + (prev.b + next.b)*seep) / 3;
|
||||||
tmp[j] = CRGB(r,g,b);
|
tmp[j] = CRGB(r,g,b);
|
||||||
}
|
}
|
||||||
for (int j = 0; j < dim1; j++) {
|
for (unsigned j = 0; j < dim1; j++) {
|
||||||
uint16_t x = vertical ? i : j;
|
unsigned x = vertical ? i : j;
|
||||||
uint16_t y = vertical ? j : i;
|
unsigned y = vertical ? j : i;
|
||||||
setPixelColorXY(x, y, tmp[j]);
|
setPixelColorXY(x, y, tmp[j]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -414,14 +420,14 @@ void Segment::box_blur(uint16_t i, bool vertical, fract8 blur_amount) {
|
|||||||
// it can be used to (slowly) clear the LEDs to black.
|
// it can be used to (slowly) clear the LEDs to black.
|
||||||
|
|
||||||
void Segment::blur1d(fract8 blur_amount) {
|
void Segment::blur1d(fract8 blur_amount) {
|
||||||
const uint16_t rows = virtualHeight();
|
const unsigned rows = virtualHeight();
|
||||||
for (unsigned y = 0; y < rows; y++) blurRow(y, blur_amount);
|
for (unsigned y = 0; y < rows; y++) blurRow(y, blur_amount);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Segment::moveX(int8_t delta, bool wrap) {
|
void Segment::moveX(int8_t delta, bool wrap) {
|
||||||
if (!isActive()) return; // not active
|
if (!isActive()) return; // not active
|
||||||
const uint16_t cols = virtualWidth();
|
const int cols = virtualWidth();
|
||||||
const uint16_t rows = virtualHeight();
|
const int rows = virtualHeight();
|
||||||
if (!delta || abs(delta) >= cols) return;
|
if (!delta || abs(delta) >= cols) return;
|
||||||
uint32_t newPxCol[cols];
|
uint32_t newPxCol[cols];
|
||||||
for (int y = 0; y < rows; y++) {
|
for (int y = 0; y < rows; y++) {
|
||||||
@ -438,8 +444,8 @@ void Segment::moveX(int8_t delta, bool wrap) {
|
|||||||
|
|
||||||
void Segment::moveY(int8_t delta, bool wrap) {
|
void Segment::moveY(int8_t delta, bool wrap) {
|
||||||
if (!isActive()) return; // not active
|
if (!isActive()) return; // not active
|
||||||
const uint16_t cols = virtualWidth();
|
const int cols = virtualWidth();
|
||||||
const uint16_t rows = virtualHeight();
|
const int rows = virtualHeight();
|
||||||
if (!delta || abs(delta) >= rows) return;
|
if (!delta || abs(delta) >= rows) return;
|
||||||
uint32_t newPxCol[rows];
|
uint32_t newPxCol[rows];
|
||||||
for (int x = 0; x < cols; x++) {
|
for (int x = 0; x < cols; x++) {
|
||||||
@ -499,13 +505,13 @@ void Segment::draw_circle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB col) {
|
|||||||
// by stepko, taken from https://editor.soulmatelights.com/gallery/573-blobs
|
// by stepko, taken from https://editor.soulmatelights.com/gallery/573-blobs
|
||||||
void Segment::fill_circle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB col) {
|
void Segment::fill_circle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB col) {
|
||||||
if (!isActive() || radius == 0) return; // not active
|
if (!isActive() || radius == 0) return; // not active
|
||||||
const uint16_t cols = virtualWidth();
|
const int cols = virtualWidth();
|
||||||
const uint16_t rows = virtualHeight();
|
const int rows = virtualHeight();
|
||||||
for (int16_t y = -radius; y <= radius; y++) {
|
for (int y = -radius; y <= radius; y++) {
|
||||||
for (int16_t x = -radius; x <= radius; x++) {
|
for (int x = -radius; x <= radius; x++) {
|
||||||
if (x * x + y * y <= radius * radius &&
|
if (x * x + y * y <= radius * radius &&
|
||||||
int16_t(cx)+x>=0 && int16_t(cy)+y>=0 &&
|
int(cx)+x>=0 && int(cy)+y>=0 &&
|
||||||
int16_t(cx)+x<cols && int16_t(cy)+y<rows)
|
int(cx)+x<cols && int(cy)+y<rows)
|
||||||
setPixelColorXY(cx + x, cy + y, col);
|
setPixelColorXY(cx + x, cy + y, col);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -513,9 +519,9 @@ void Segment::fill_circle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB col) {
|
|||||||
|
|
||||||
void Segment::nscale8(uint8_t scale) {
|
void Segment::nscale8(uint8_t scale) {
|
||||||
if (!isActive()) return; // not active
|
if (!isActive()) return; // not active
|
||||||
const uint16_t cols = virtualWidth();
|
const unsigned cols = virtualWidth();
|
||||||
const uint16_t rows = virtualHeight();
|
const unsigned rows = virtualHeight();
|
||||||
for (int y = 0; y < rows; y++) for (int x = 0; x < cols; x++) {
|
for (unsigned y = 0; y < rows; y++) for (unsigned x = 0; x < cols; x++) {
|
||||||
setPixelColorXY(x, y, CRGB(getPixelColorXY(x, y)).nscale8(scale));
|
setPixelColorXY(x, y, CRGB(getPixelColorXY(x, y)).nscale8(scale));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -523,12 +529,12 @@ void Segment::nscale8(uint8_t scale) {
|
|||||||
//line function
|
//line function
|
||||||
void Segment::drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint32_t c) {
|
void Segment::drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint32_t c) {
|
||||||
if (!isActive()) return; // not active
|
if (!isActive()) return; // not active
|
||||||
const uint16_t cols = virtualWidth();
|
const unsigned cols = virtualWidth();
|
||||||
const uint16_t rows = virtualHeight();
|
const unsigned rows = virtualHeight();
|
||||||
if (x0 >= cols || x1 >= cols || y0 >= rows || y1 >= rows) return;
|
if (x0 >= cols || x1 >= cols || y0 >= rows || y1 >= rows) return;
|
||||||
const int16_t dx = abs(x1-x0), sx = x0<x1 ? 1 : -1;
|
const int dx = abs(x1-x0), sx = x0<x1 ? 1 : -1;
|
||||||
const int16_t dy = abs(y1-y0), sy = y0<y1 ? 1 : -1;
|
const int dy = abs(y1-y0), sy = y0<y1 ? 1 : -1;
|
||||||
int16_t err = (dx>dy ? dx : -dy)/2, e2;
|
int err = (dx>dy ? dx : -dy)/2, e2;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
setPixelColorXY(x0,y0,c);
|
setPixelColorXY(x0,y0,c);
|
||||||
if (x0==x1 && y0==y1) break;
|
if (x0==x1 && y0==y1) break;
|
||||||
@ -550,8 +556,8 @@ void Segment::drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w,
|
|||||||
if (!isActive()) return; // not active
|
if (!isActive()) return; // not active
|
||||||
if (chr < 32 || chr > 126) return; // only ASCII 32-126 supported
|
if (chr < 32 || chr > 126) return; // only ASCII 32-126 supported
|
||||||
chr -= 32; // align with font table entries
|
chr -= 32; // align with font table entries
|
||||||
const uint16_t cols = virtualWidth();
|
const int cols = virtualWidth();
|
||||||
const uint16_t rows = virtualHeight();
|
const int rows = virtualHeight();
|
||||||
const int font = w*h;
|
const int font = w*h;
|
||||||
|
|
||||||
CRGB col = CRGB(color);
|
CRGB col = CRGB(color);
|
||||||
@ -590,7 +596,7 @@ void Segment::drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w,
|
|||||||
void Segment::wu_pixel(uint32_t x, uint32_t y, CRGB c) { //awesome wu_pixel procedure by reddit u/sutaburosu
|
void Segment::wu_pixel(uint32_t x, uint32_t y, CRGB c) { //awesome wu_pixel procedure by reddit u/sutaburosu
|
||||||
if (!isActive()) return; // not active
|
if (!isActive()) return; // not active
|
||||||
// extract the fractional parts and derive their inverses
|
// extract the fractional parts and derive their inverses
|
||||||
uint8_t xx = x & 0xff, yy = y & 0xff, ix = 255 - xx, iy = 255 - yy;
|
unsigned xx = x & 0xff, yy = y & 0xff, ix = 255 - xx, iy = 255 - yy;
|
||||||
// calculate the intensities for each affected pixel
|
// calculate the intensities for each affected pixel
|
||||||
uint8_t wu[4] = {WU_WEIGHT(ix, iy), WU_WEIGHT(xx, iy),
|
uint8_t wu[4] = {WU_WEIGHT(ix, iy), WU_WEIGHT(xx, iy),
|
||||||
WU_WEIGHT(ix, yy), WU_WEIGHT(xx, yy)};
|
WU_WEIGHT(ix, yy), WU_WEIGHT(xx, yy)};
|
||||||
|
@ -327,7 +327,7 @@ void Segment::stopTransition() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Segment::handleTransition() {
|
void Segment::handleTransition() {
|
||||||
uint16_t _progress = progress();
|
unsigned _progress = progress();
|
||||||
if (_progress == 0xFFFFU) stopTransition();
|
if (_progress == 0xFFFFU) stopTransition();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -430,7 +430,7 @@ uint8_t IRAM_ATTR Segment::currentBri(bool useCct) {
|
|||||||
|
|
||||||
uint8_t IRAM_ATTR Segment::currentMode() {
|
uint8_t IRAM_ATTR Segment::currentMode() {
|
||||||
#ifndef WLED_DISABLE_MODE_BLEND
|
#ifndef WLED_DISABLE_MODE_BLEND
|
||||||
uint16_t prog = progress();
|
unsigned prog = progress();
|
||||||
if (prog < 0xFFFFU) return _t->_modeT;
|
if (prog < 0xFFFFU) return _t->_modeT;
|
||||||
#endif
|
#endif
|
||||||
return mode;
|
return mode;
|
||||||
@ -450,7 +450,7 @@ uint32_t IRAM_ATTR Segment::currentColor(uint8_t slot) {
|
|||||||
|
|
||||||
CRGBPalette16 IRAM_ATTR &Segment::currentPalette(CRGBPalette16 &targetPalette, uint8_t pal) {
|
CRGBPalette16 IRAM_ATTR &Segment::currentPalette(CRGBPalette16 &targetPalette, uint8_t pal) {
|
||||||
loadPalette(targetPalette, pal);
|
loadPalette(targetPalette, pal);
|
||||||
uint16_t prog = progress();
|
unsigned prog = progress();
|
||||||
#ifndef WLED_DISABLE_MODE_BLEND
|
#ifndef WLED_DISABLE_MODE_BLEND
|
||||||
if (prog < 0xFFFFU && blendingStyle > BLEND_STYLE_FADE && _modeBlend && mode != _t->_modeT) targetPalette = _t->_palT; // not fade/blend transition, each effect uses its palette
|
if (prog < 0xFFFFU && blendingStyle > BLEND_STYLE_FADE && _modeBlend && mode != _t->_modeT) targetPalette = _t->_palT; // not fade/blend transition, each effect uses its palette
|
||||||
else
|
else
|
||||||
@ -459,8 +459,8 @@ CRGBPalette16 IRAM_ATTR &Segment::currentPalette(CRGBPalette16 &targetPalette, u
|
|||||||
// blend palettes
|
// blend palettes
|
||||||
// there are about 255 blend passes of 48 "blends" to completely blend two palettes (in _dur time)
|
// there are about 255 blend passes of 48 "blends" to completely blend two palettes (in _dur time)
|
||||||
// minimum blend time is 100ms maximum is 65535ms
|
// minimum blend time is 100ms maximum is 65535ms
|
||||||
uint16_t noOfBlends = ((255U * prog) / 0xFFFFU) - _t->_prevPaletteBlends;
|
unsigned noOfBlends = ((255U * prog) / 0xFFFFU) - _t->_prevPaletteBlends;
|
||||||
for (int i=0; i<noOfBlends; i++, _t->_prevPaletteBlends++) nblendPaletteTowardPalette(_t->_palT, targetPalette, 48);
|
for (unsigned i=0; i<noOfBlends; i++, _t->_prevPaletteBlends++) nblendPaletteTowardPalette(_t->_palT, targetPalette, 48);
|
||||||
targetPalette = _t->_palT; // copy transitioning/temporary palette
|
targetPalette = _t->_palT; // copy transitioning/temporary palette
|
||||||
}
|
}
|
||||||
return targetPalette;
|
return targetPalette;
|
||||||
@ -587,7 +587,7 @@ void Segment::setMode(uint8_t fx, bool loadDefaults) {
|
|||||||
mode = fx;
|
mode = fx;
|
||||||
// load default values from effect string
|
// load default values from effect string
|
||||||
if (loadDefaults) {
|
if (loadDefaults) {
|
||||||
int16_t sOpt;
|
int sOpt;
|
||||||
sOpt = extractModeDefaults(fx, "sx"); speed = (sOpt >= 0) ? sOpt : DEFAULT_SPEED;
|
sOpt = extractModeDefaults(fx, "sx"); speed = (sOpt >= 0) ? sOpt : DEFAULT_SPEED;
|
||||||
sOpt = extractModeDefaults(fx, "ix"); intensity = (sOpt >= 0) ? sOpt : DEFAULT_INTENSITY;
|
sOpt = extractModeDefaults(fx, "ix"); intensity = (sOpt >= 0) ? sOpt : DEFAULT_INTENSITY;
|
||||||
sOpt = extractModeDefaults(fx, "c1"); custom1 = (sOpt >= 0) ? sOpt : DEFAULT_C1;
|
sOpt = extractModeDefaults(fx, "c1"); custom1 = (sOpt >= 0) ? sOpt : DEFAULT_C1;
|
||||||
@ -621,21 +621,21 @@ void Segment::setPalette(uint8_t pal) {
|
|||||||
|
|
||||||
// 2D matrix
|
// 2D matrix
|
||||||
uint16_t IRAM_ATTR Segment::virtualWidth() const {
|
uint16_t IRAM_ATTR Segment::virtualWidth() const {
|
||||||
uint16_t groupLen = groupLength();
|
unsigned groupLen = groupLength();
|
||||||
uint16_t vWidth = ((transpose ? height() : width()) + groupLen - 1) / groupLen;
|
unsigned vWidth = ((transpose ? height() : width()) + groupLen - 1) / groupLen;
|
||||||
if (mirror) vWidth = (vWidth + 1) /2; // divide by 2 if mirror, leave at least a single LED
|
if (mirror) vWidth = (vWidth + 1) /2; // divide by 2 if mirror, leave at least a single LED
|
||||||
return vWidth;
|
return vWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t IRAM_ATTR Segment::virtualHeight() const {
|
uint16_t IRAM_ATTR Segment::virtualHeight() const {
|
||||||
uint16_t groupLen = groupLength();
|
unsigned groupLen = groupLength();
|
||||||
uint16_t vHeight = ((transpose ? width() : height()) + groupLen - 1) / groupLen;
|
unsigned vHeight = ((transpose ? width() : height()) + groupLen - 1) / groupLen;
|
||||||
if (mirror_y) vHeight = (vHeight + 1) /2; // divide by 2 if mirror, leave at least a single LED
|
if (mirror_y) vHeight = (vHeight + 1) /2; // divide by 2 if mirror, leave at least a single LED
|
||||||
return vHeight;
|
return vHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t IRAM_ATTR Segment::nrOfVStrips() const {
|
uint16_t IRAM_ATTR Segment::nrOfVStrips() const {
|
||||||
uint16_t vLen = 1;
|
unsigned vLen = 1;
|
||||||
#ifndef WLED_DISABLE_2D
|
#ifndef WLED_DISABLE_2D
|
||||||
if (is2D()) {
|
if (is2D()) {
|
||||||
switch (map1D2D) {
|
switch (map1D2D) {
|
||||||
@ -652,9 +652,9 @@ uint16_t IRAM_ATTR Segment::nrOfVStrips() const {
|
|||||||
uint16_t IRAM_ATTR Segment::virtualLength() const {
|
uint16_t IRAM_ATTR Segment::virtualLength() const {
|
||||||
#ifndef WLED_DISABLE_2D
|
#ifndef WLED_DISABLE_2D
|
||||||
if (is2D()) {
|
if (is2D()) {
|
||||||
uint16_t vW = virtualWidth();
|
unsigned vW = virtualWidth();
|
||||||
uint16_t vH = virtualHeight();
|
unsigned vH = virtualHeight();
|
||||||
uint16_t vLen = vW * vH; // use all pixels from segment
|
unsigned vLen = vW * vH; // use all pixels from segment
|
||||||
switch (map1D2D) {
|
switch (map1D2D) {
|
||||||
case M12_pBar:
|
case M12_pBar:
|
||||||
vLen = vH;
|
vLen = vH;
|
||||||
@ -667,8 +667,8 @@ uint16_t IRAM_ATTR Segment::virtualLength() const {
|
|||||||
return vLen;
|
return vLen;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
uint16_t groupLen = groupLength(); // is always >= 1
|
unsigned groupLen = groupLength(); // is always >= 1
|
||||||
uint16_t vLength = (length() + groupLen - 1) / groupLen;
|
unsigned vLength = (length() + groupLen - 1) / groupLen;
|
||||||
if (mirror) vLength = (vLength + 1) /2; // divide by 2 if mirror, leave at least a single LED
|
if (mirror) vLength = (vLength + 1) /2; // divide by 2 if mirror, leave at least a single LED
|
||||||
return vLength;
|
return vLength;
|
||||||
}
|
}
|
||||||
@ -711,8 +711,8 @@ void IRAM_ATTR Segment::setPixelColor(int i, uint32_t col)
|
|||||||
|
|
||||||
#ifndef WLED_DISABLE_2D
|
#ifndef WLED_DISABLE_2D
|
||||||
if (is2D()) {
|
if (is2D()) {
|
||||||
uint16_t vH = virtualHeight(); // segment height in logical pixels
|
int vH = virtualHeight(); // segment height in logical pixels
|
||||||
uint16_t vW = virtualWidth();
|
int vW = virtualWidth();
|
||||||
switch (map1D2D) {
|
switch (map1D2D) {
|
||||||
case M12_Pixels:
|
case M12_Pixels:
|
||||||
// use all available pixels as a long strip
|
// use all available pixels as a long strip
|
||||||
@ -771,14 +771,10 @@ void IRAM_ATTR Segment::setPixelColor(int i, uint32_t col)
|
|||||||
|
|
||||||
if (isPixelClipped(i)) return; // handle clipping on 1D
|
if (isPixelClipped(i)) return; // handle clipping on 1D
|
||||||
|
|
||||||
uint16_t len = length();
|
unsigned len = length();
|
||||||
uint8_t _bri_t = currentBri();
|
uint8_t _bri_t = currentBri();
|
||||||
if (_bri_t < 255) {
|
if (_bri_t < 255) {
|
||||||
byte r = scale8(R(col), _bri_t);
|
col = color_fade(col, _bri_t);
|
||||||
byte g = scale8(G(col), _bri_t);
|
|
||||||
byte b = scale8(B(col), _bri_t);
|
|
||||||
byte w = scale8(W(col), _bri_t);
|
|
||||||
col = RGBW32(r, g, b, w);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// expand pixel (taking into account start, grouping, spacing [and offset])
|
// expand pixel (taking into account start, grouping, spacing [and offset])
|
||||||
@ -830,8 +826,8 @@ void Segment::setPixelColor(float i, uint32_t col, bool aa)
|
|||||||
|
|
||||||
float fC = i * (virtualLength()-1);
|
float fC = i * (virtualLength()-1);
|
||||||
if (aa) {
|
if (aa) {
|
||||||
uint16_t iL = roundf(fC-0.49f);
|
unsigned iL = roundf(fC-0.49f);
|
||||||
uint16_t iR = roundf(fC+0.49f);
|
unsigned iR = roundf(fC+0.49f);
|
||||||
float dL = (fC - iL)*(fC - iL);
|
float dL = (fC - iL)*(fC - iL);
|
||||||
float dR = (iR - fC)*(iR - fC);
|
float dR = (iR - fC)*(iR - fC);
|
||||||
uint32_t cIL = getPixelColor(iL | (vStrip<<16));
|
uint32_t cIL = getPixelColor(iL | (vStrip<<16));
|
||||||
@ -848,7 +844,7 @@ void Segment::setPixelColor(float i, uint32_t col, bool aa)
|
|||||||
setPixelColor(iL | (vStrip<<16), col);
|
setPixelColor(iL | (vStrip<<16), col);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
setPixelColor(uint16_t(roundf(fC)) | (vStrip<<16), col);
|
setPixelColor(int(roundf(fC)) | (vStrip<<16), col);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -863,8 +859,8 @@ uint32_t IRAM_ATTR Segment::getPixelColor(int i)
|
|||||||
|
|
||||||
#ifndef WLED_DISABLE_2D
|
#ifndef WLED_DISABLE_2D
|
||||||
if (is2D()) {
|
if (is2D()) {
|
||||||
uint16_t vH = virtualHeight(); // segment height in logical pixels
|
unsigned vH = virtualHeight(); // segment height in logical pixels
|
||||||
uint16_t vW = virtualWidth();
|
unsigned vW = virtualWidth();
|
||||||
switch (map1D2D) {
|
switch (map1D2D) {
|
||||||
case M12_Pixels:
|
case M12_Pixels:
|
||||||
return getPixelColorXY(i % vW, i / vW);
|
return getPixelColorXY(i % vW, i / vW);
|
||||||
@ -922,9 +918,9 @@ uint8_t Segment::differs(Segment& b) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Segment::refreshLightCapabilities() {
|
void Segment::refreshLightCapabilities() {
|
||||||
uint8_t capabilities = 0;
|
unsigned capabilities = 0;
|
||||||
uint16_t segStartIdx = 0xFFFFU;
|
unsigned segStartIdx = 0xFFFFU;
|
||||||
uint16_t segStopIdx = 0;
|
unsigned segStopIdx = 0;
|
||||||
|
|
||||||
if (!isActive()) {
|
if (!isActive()) {
|
||||||
_capabilities = 0;
|
_capabilities = 0;
|
||||||
@ -934,7 +930,7 @@ void Segment::refreshLightCapabilities() {
|
|||||||
if (start < Segment::maxWidth * Segment::maxHeight) {
|
if (start < Segment::maxWidth * Segment::maxHeight) {
|
||||||
// we are withing 2D matrix (includes 1D segments)
|
// we are withing 2D matrix (includes 1D segments)
|
||||||
for (int y = startY; y < stopY; y++) for (int x = start; x < stop; x++) {
|
for (int y = startY; y < stopY; y++) for (int x = start; x < stop; x++) {
|
||||||
uint16_t index = strip.getMappedPixelIndex(x + Segment::maxWidth * y); // convert logical address to physical
|
unsigned index = strip.getMappedPixelIndex(x + Segment::maxWidth * y); // convert logical address to physical
|
||||||
if (index < 0xFFFFU) {
|
if (index < 0xFFFFU) {
|
||||||
if (segStartIdx > index) segStartIdx = index;
|
if (segStartIdx > index) segStartIdx = index;
|
||||||
if (segStopIdx < index) segStopIdx = index;
|
if (segStopIdx < index) segStopIdx = index;
|
||||||
@ -959,7 +955,7 @@ void Segment::refreshLightCapabilities() {
|
|||||||
if (!cctFromRgb && bus->hasCCT()) capabilities |= SEG_CAPABILITY_CCT;
|
if (!cctFromRgb && bus->hasCCT()) capabilities |= SEG_CAPABILITY_CCT;
|
||||||
if (correctWB && (bus->hasRGB() || bus->hasCCT())) capabilities |= SEG_CAPABILITY_CCT; //white balance correction (CCT slider)
|
if (correctWB && (bus->hasRGB() || bus->hasCCT())) capabilities |= SEG_CAPABILITY_CCT; //white balance correction (CCT slider)
|
||||||
if (bus->hasWhite()) {
|
if (bus->hasWhite()) {
|
||||||
uint8_t aWM = Bus::getGlobalAWMode() == AW_GLOBAL_DISABLED ? bus->getAutoWhiteMode() : Bus::getGlobalAWMode();
|
unsigned aWM = Bus::getGlobalAWMode() == AW_GLOBAL_DISABLED ? bus->getAutoWhiteMode() : Bus::getGlobalAWMode();
|
||||||
bool whiteSlider = (aWM == RGBW_MODE_DUAL || aWM == RGBW_MODE_MANUAL_ONLY); // white slider allowed
|
bool whiteSlider = (aWM == RGBW_MODE_DUAL || aWM == RGBW_MODE_MANUAL_ONLY); // white slider allowed
|
||||||
// if auto white calculation from RGB is active (Accurate/Brighter), force RGB controls even if there are no RGB busses
|
// if auto white calculation from RGB is active (Accurate/Brighter), force RGB controls even if there are no RGB busses
|
||||||
if (!whiteSlider) capabilities |= SEG_CAPABILITY_RGB;
|
if (!whiteSlider) capabilities |= SEG_CAPABILITY_RGB;
|
||||||
@ -975,8 +971,8 @@ void Segment::refreshLightCapabilities() {
|
|||||||
*/
|
*/
|
||||||
void Segment::fill(uint32_t c) {
|
void Segment::fill(uint32_t c) {
|
||||||
if (!isActive()) return; // not active
|
if (!isActive()) return; // not active
|
||||||
const uint16_t cols = is2D() ? virtualWidth() : virtualLength();
|
const int cols = is2D() ? virtualWidth() : virtualLength();
|
||||||
const uint16_t rows = virtualHeight(); // will be 1 for 1D
|
const int rows = virtualHeight(); // will be 1 for 1D
|
||||||
for (int y = 0; y < rows; y++) for (int x = 0; x < cols; x++) {
|
for (int y = 0; y < rows; y++) for (int x = 0; x < cols; x++) {
|
||||||
if (is2D()) setPixelColorXY(x, y, c);
|
if (is2D()) setPixelColorXY(x, y, c);
|
||||||
else setPixelColor(x, c);
|
else setPixelColor(x, c);
|
||||||
@ -988,8 +984,8 @@ void Segment::fill(uint32_t c) {
|
|||||||
*/
|
*/
|
||||||
void Segment::fade_out(uint8_t rate) {
|
void Segment::fade_out(uint8_t rate) {
|
||||||
if (!isActive()) return; // not active
|
if (!isActive()) return; // not active
|
||||||
const uint16_t cols = is2D() ? virtualWidth() : virtualLength();
|
const int cols = is2D() ? virtualWidth() : virtualLength();
|
||||||
const uint16_t rows = virtualHeight(); // will be 1 for 1D
|
const int rows = virtualHeight(); // will be 1 for 1D
|
||||||
|
|
||||||
rate = (255-rate) >> 1;
|
rate = (255-rate) >> 1;
|
||||||
float mappedRate = float(rate) +1.1f;
|
float mappedRate = float(rate) +1.1f;
|
||||||
@ -1026,8 +1022,8 @@ void Segment::fade_out(uint8_t rate) {
|
|||||||
// fades all pixels to black using nscale8()
|
// fades all pixels to black using nscale8()
|
||||||
void Segment::fadeToBlackBy(uint8_t fadeBy) {
|
void Segment::fadeToBlackBy(uint8_t fadeBy) {
|
||||||
if (!isActive() || fadeBy == 0) return; // optimization - no scaling to apply
|
if (!isActive() || fadeBy == 0) return; // optimization - no scaling to apply
|
||||||
const uint16_t cols = is2D() ? virtualWidth() : virtualLength();
|
const int cols = is2D() ? virtualWidth() : virtualLength();
|
||||||
const uint16_t rows = virtualHeight(); // will be 1 for 1D
|
const int rows = virtualHeight(); // will be 1 for 1D
|
||||||
|
|
||||||
for (int y = 0; y < rows; y++) for (int x = 0; x < cols; x++) {
|
for (int y = 0; y < rows; y++) for (int x = 0; x < cols; x++) {
|
||||||
if (is2D()) setPixelColorXY(x, y, color_fade(getPixelColorXY(x,y), 255-fadeBy));
|
if (is2D()) setPixelColorXY(x, y, color_fade(getPixelColorXY(x,y), 255-fadeBy));
|
||||||
@ -1038,33 +1034,43 @@ void Segment::fadeToBlackBy(uint8_t fadeBy) {
|
|||||||
/*
|
/*
|
||||||
* blurs segment content, source: FastLED colorutils.cpp
|
* blurs segment content, source: FastLED colorutils.cpp
|
||||||
*/
|
*/
|
||||||
void Segment::blur(uint8_t blur_amount) {
|
void Segment::blur(uint8_t blur_amount, bool smear) {
|
||||||
if (!isActive() || blur_amount == 0) return; // optimization: 0 means "don't blur"
|
if (!isActive() || blur_amount == 0) return; // optimization: 0 means "don't blur"
|
||||||
#ifndef WLED_DISABLE_2D
|
#ifndef WLED_DISABLE_2D
|
||||||
if (is2D()) {
|
if (is2D()) {
|
||||||
// compatibility with 2D
|
// compatibility with 2D
|
||||||
const unsigned cols = virtualWidth();
|
const unsigned cols = virtualWidth();
|
||||||
const unsigned rows = virtualHeight();
|
const unsigned rows = virtualHeight();
|
||||||
for (unsigned i = 0; i < rows; i++) blurRow(i, blur_amount); // blur all rows
|
for (unsigned i = 0; i < rows; i++) blurRow(i, blur_amount, smear); // blur all rows
|
||||||
for (unsigned k = 0; k < cols; k++) blurCol(k, blur_amount); // blur all columns
|
for (unsigned k = 0; k < cols; k++) blurCol(k, blur_amount, smear); // blur all columns
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
uint8_t keep = 255 - blur_amount;
|
uint8_t keep = smear ? 255 : 255 - blur_amount;
|
||||||
uint8_t seep = blur_amount >> 1;
|
uint8_t seep = blur_amount >> 1;
|
||||||
uint32_t carryover = BLACK;
|
|
||||||
unsigned vlength = virtualLength();
|
unsigned vlength = virtualLength();
|
||||||
|
uint32_t carryover = BLACK;
|
||||||
|
uint32_t lastnew;
|
||||||
|
uint32_t last;
|
||||||
|
uint32_t curnew = BLACK;
|
||||||
for (unsigned i = 0; i < vlength; i++) {
|
for (unsigned i = 0; i < vlength; i++) {
|
||||||
uint32_t cur = getPixelColor(i);
|
uint32_t cur = getPixelColor(i);
|
||||||
uint32_t part = color_fade(cur, seep);
|
uint32_t part = color_fade(cur, seep);
|
||||||
cur = color_add(color_fade(cur, keep), carryover, true);
|
curnew = color_fade(cur, keep);
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
uint32_t c = getPixelColor(i-1);
|
if (carryover)
|
||||||
setPixelColor(i-1, color_add(c, part, true));
|
curnew = color_add(curnew, carryover, true);
|
||||||
|
uint32_t prev = color_add(lastnew, part, true);
|
||||||
|
if (last != prev) // optimization: only set pixel if color has changed
|
||||||
|
setPixelColor(i - 1, prev);
|
||||||
}
|
}
|
||||||
setPixelColor(i, cur);
|
else // first pixel
|
||||||
|
setPixelColor(i, curnew);
|
||||||
|
lastnew = curnew;
|
||||||
|
last = cur; // save original value for comparison on next iteration
|
||||||
carryover = part;
|
carryover = part;
|
||||||
}
|
}
|
||||||
|
setPixelColor(vlength - 1, curnew);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1102,7 +1108,7 @@ uint32_t Segment::color_from_palette(uint16_t i, bool mapping, bool wrap, uint8_
|
|||||||
// default palette or no RGB support on segment
|
// default palette or no RGB support on segment
|
||||||
if ((palette == 0 && mcol < NUM_COLORS) || !_isRGB) return (pbri == 255) ? color : color_fade(color, pbri, true);
|
if ((palette == 0 && mcol < NUM_COLORS) || !_isRGB) return (pbri == 255) ? color : color_fade(color, pbri, true);
|
||||||
|
|
||||||
uint8_t paletteIndex = i;
|
unsigned paletteIndex = i;
|
||||||
if (mapping && virtualLength() > 1) paletteIndex = (i*255)/(virtualLength() -1);
|
if (mapping && virtualLength() > 1) paletteIndex = (i*255)/(virtualLength() -1);
|
||||||
// paletteBlend: 0 - wrap when moving, 1 - always wrap, 2 - never wrap, 3 - none (undefined)
|
// paletteBlend: 0 - wrap when moving, 1 - always wrap, 2 - never wrap, 3 - none (undefined)
|
||||||
if (!wrap && strip.paletteBlend != 3) paletteIndex = scale8(paletteIndex, 240); //cut off blend at palette "end"
|
if (!wrap && strip.paletteBlend != 3) paletteIndex = scale8(paletteIndex, 240); //cut off blend at palette "end"
|
||||||
@ -1136,21 +1142,24 @@ void WS2812FX::finalizeInit(void) {
|
|||||||
//if busses failed to load, add default (fresh install, FS issue, ...)
|
//if busses failed to load, add default (fresh install, FS issue, ...)
|
||||||
if (BusManager::getNumBusses() == 0) {
|
if (BusManager::getNumBusses() == 0) {
|
||||||
DEBUG_PRINTLN(F("No busses, init default"));
|
DEBUG_PRINTLN(F("No busses, init default"));
|
||||||
const uint8_t defDataPins[] = {DATA_PINS};
|
const unsigned defDataPins[] = {DATA_PINS};
|
||||||
const uint16_t defCounts[] = {PIXEL_COUNTS};
|
const unsigned defCounts[] = {PIXEL_COUNTS};
|
||||||
const uint8_t defNumBusses = ((sizeof defDataPins) / (sizeof defDataPins[0]));
|
const unsigned defNumPins = ((sizeof defDataPins) / (sizeof defDataPins[0]));
|
||||||
const uint8_t defNumCounts = ((sizeof defCounts) / (sizeof defCounts[0]));
|
const unsigned defNumCounts = ((sizeof defCounts) / (sizeof defCounts[0]));
|
||||||
uint16_t prevLen = 0;
|
const unsigned defNumBusses = defNumPins > defNumCounts && defNumCounts > 1 && defNumPins%defNumCounts == 0 ? defNumCounts : defNumPins;
|
||||||
for (int i = 0; i < defNumBusses && i < WLED_MAX_BUSSES+WLED_MIN_VIRTUAL_BUSSES; i++) {
|
const unsigned pinsPerBus = defNumPins / defNumBusses;
|
||||||
uint8_t defPin[] = {defDataPins[i]};
|
unsigned prevLen = 0;
|
||||||
|
for (unsigned i = 0; i < defNumBusses && i < WLED_MAX_BUSSES+WLED_MIN_VIRTUAL_BUSSES; i++) {
|
||||||
|
uint8_t defPin[5]; // max 5 pins
|
||||||
|
for (unsigned j = 0; j < pinsPerBus; j++) defPin[j] = defDataPins[i*pinsPerBus + j];
|
||||||
// when booting without config (1st boot) we need to make sure GPIOs defined for LED output don't clash with hardware
|
// when booting without config (1st boot) we need to make sure GPIOs defined for LED output don't clash with hardware
|
||||||
// i.e. DEBUG (GPIO1), DMX (2), SPI RAM/FLASH (16&17 on ESP32-WROVER/PICO), etc
|
// i.e. DEBUG (GPIO1), DMX (2), SPI RAM/FLASH (16&17 on ESP32-WROVER/PICO), etc
|
||||||
if (pinManager.isPinAllocated(defPin[0])) {
|
if (pinManager.isPinAllocated(defPin[0])) {
|
||||||
defPin[0] = 1; // start with GPIO1 and work upwards
|
defPin[0] = 1; // start with GPIO1 and work upwards
|
||||||
while (pinManager.isPinAllocated(defPin[0]) && defPin[0] < WLED_NUM_PINS) defPin[0]++;
|
while (pinManager.isPinAllocated(defPin[0]) && defPin[0] < WLED_NUM_PINS) defPin[0]++;
|
||||||
}
|
}
|
||||||
uint16_t start = prevLen;
|
unsigned start = prevLen;
|
||||||
uint16_t count = defCounts[(i < defNumCounts) ? i : defNumCounts -1];
|
unsigned count = defCounts[(i < defNumCounts) ? i : defNumCounts -1];
|
||||||
prevLen += count;
|
prevLen += count;
|
||||||
BusConfig defCfg = BusConfig(DEFAULT_LED_TYPE, defPin, start, count, DEFAULT_LED_COLOR_ORDER, false, 0, RGBW_MODE_MANUAL_ONLY);
|
BusConfig defCfg = BusConfig(DEFAULT_LED_TYPE, defPin, start, count, DEFAULT_LED_COLOR_ORDER, false, 0, RGBW_MODE_MANUAL_ONLY);
|
||||||
if (BusManager::add(defCfg) == -1) break;
|
if (BusManager::add(defCfg) == -1) break;
|
||||||
@ -1166,7 +1175,7 @@ void WS2812FX::finalizeInit(void) {
|
|||||||
_hasWhiteChannel |= bus->hasWhite();
|
_hasWhiteChannel |= bus->hasWhite();
|
||||||
//refresh is required to remain off if at least one of the strips requires the refresh.
|
//refresh is required to remain off if at least one of the strips requires the refresh.
|
||||||
_isOffRefreshRequired |= bus->isOffRefreshRequired();
|
_isOffRefreshRequired |= bus->isOffRefreshRequired();
|
||||||
uint16_t busEnd = bus->getStart() + bus->getLength();
|
unsigned busEnd = bus->getStart() + bus->getLength();
|
||||||
if (busEnd > _length) _length = busEnd;
|
if (busEnd > _length) _length = busEnd;
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
if ((!IS_DIGITAL(bus->getType()) || IS_2PIN(bus->getType()))) continue;
|
if ((!IS_DIGITAL(bus->getType()) || IS_2PIN(bus->getType()))) continue;
|
||||||
@ -1210,10 +1219,10 @@ void WS2812FX::service() {
|
|||||||
if (nowUp > seg.next_time || _triggered || (doShow && seg.mode == FX_MODE_STATIC))
|
if (nowUp > seg.next_time || _triggered || (doShow && seg.mode == FX_MODE_STATIC))
|
||||||
{
|
{
|
||||||
doShow = true;
|
doShow = true;
|
||||||
uint16_t delay = FRAMETIME;
|
unsigned delay = FRAMETIME;
|
||||||
|
|
||||||
if (!seg.freeze) { //only run effect function if not frozen
|
if (!seg.freeze) { //only run effect function if not frozen
|
||||||
int16_t oldCCT = BusManager::getSegmentCCT(); // store original CCT value (actually it is not Segment based)
|
int oldCCT = BusManager::getSegmentCCT(); // store original CCT value (actually it is not Segment based)
|
||||||
_virtualSegmentLength = seg.virtualLength(); //SEGLEN
|
_virtualSegmentLength = seg.virtualLength(); //SEGLEN
|
||||||
_colors_t[0] = gamma32(seg.currentColor(0));
|
_colors_t[0] = gamma32(seg.currentColor(0));
|
||||||
_colors_t[1] = gamma32(seg.currentColor(1));
|
_colors_t[1] = gamma32(seg.currentColor(1));
|
||||||
@ -1288,7 +1297,7 @@ void WS2812FX::service() {
|
|||||||
Segment::modeBlend(true); // set semaphore
|
Segment::modeBlend(true); // set semaphore
|
||||||
seg.swapSegenv(_tmpSegData); // temporarily store new mode state (and swap it with transitional state)
|
seg.swapSegenv(_tmpSegData); // temporarily store new mode state (and swap it with transitional state)
|
||||||
_virtualSegmentLength = seg.virtualLength(); // update SEGLEN (mapping may have changed)
|
_virtualSegmentLength = seg.virtualLength(); // update SEGLEN (mapping may have changed)
|
||||||
uint16_t d2 = (*_mode[tmpMode])(); // run old mode
|
unsigned d2 = (*_mode[tmpMode])(); // run old mode
|
||||||
seg.restoreSegenv(_tmpSegData); // restore mode state (will also update transitional state)
|
seg.restoreSegenv(_tmpSegData); // restore mode state (will also update transitional state)
|
||||||
delay = MIN(delay,d2); // use shortest delay
|
delay = MIN(delay,d2); // use shortest delay
|
||||||
Segment::modeBlend(false); // unset semaphore
|
Segment::modeBlend(false); // unset semaphore
|
||||||
@ -1466,13 +1475,13 @@ uint8_t WS2812FX::getActiveSegmentsNum(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint16_t WS2812FX::getLengthTotal(void) {
|
uint16_t WS2812FX::getLengthTotal(void) {
|
||||||
uint16_t len = Segment::maxWidth * Segment::maxHeight; // will be _length for 1D (see finalizeInit()) but should cover whole matrix for 2D
|
unsigned len = Segment::maxWidth * Segment::maxHeight; // will be _length for 1D (see finalizeInit()) but should cover whole matrix for 2D
|
||||||
if (isMatrix && _length > len) len = _length; // for 2D with trailing strip
|
if (isMatrix && _length > len) len = _length; // for 2D with trailing strip
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t WS2812FX::getLengthPhysical(void) {
|
uint16_t WS2812FX::getLengthPhysical(void) {
|
||||||
uint16_t len = 0;
|
unsigned len = 0;
|
||||||
for (size_t b = 0; b < BusManager::getNumBusses(); b++) {
|
for (size_t b = 0; b < BusManager::getNumBusses(); b++) {
|
||||||
Bus *bus = BusManager::getBus(b);
|
Bus *bus = BusManager::getBus(b);
|
||||||
if (bus->getType() >= TYPE_NET_DDP_RGB) continue; //exclude non-physical network busses
|
if (bus->getType() >= TYPE_NET_DDP_RGB) continue; //exclude non-physical network busses
|
||||||
@ -1549,8 +1558,8 @@ void WS2812FX::resetSegments() {
|
|||||||
|
|
||||||
void WS2812FX::makeAutoSegments(bool forceReset) {
|
void WS2812FX::makeAutoSegments(bool forceReset) {
|
||||||
if (autoSegments) { //make one segment per bus
|
if (autoSegments) { //make one segment per bus
|
||||||
uint16_t segStarts[MAX_NUM_SEGMENTS] = {0};
|
unsigned segStarts[MAX_NUM_SEGMENTS] = {0};
|
||||||
uint16_t segStops [MAX_NUM_SEGMENTS] = {0};
|
unsigned segStops [MAX_NUM_SEGMENTS] = {0};
|
||||||
size_t s = 0;
|
size_t s = 0;
|
||||||
|
|
||||||
#ifndef WLED_DISABLE_2D
|
#ifndef WLED_DISABLE_2D
|
||||||
@ -1755,12 +1764,18 @@ bool WS2812FX::deserializeMap(uint8_t n) {
|
|||||||
return false; // if file does not load properly then exit
|
return false; // if file does not load properly then exit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JsonObject root = pDoc->as<JsonObject>();
|
||||||
|
// if we are loading default ledmap (at boot) set matrix width and height from the ledmap (compatible with WLED MM ledmaps)
|
||||||
|
if (isMatrix && n == 0 && (!root[F("width")].isNull() || !root[F("height")].isNull())) {
|
||||||
|
Segment::maxWidth = min(max(root[F("width")].as<int>(), 1), 128);
|
||||||
|
Segment::maxHeight = min(max(root[F("height")].as<int>(), 1), 128);
|
||||||
|
}
|
||||||
|
|
||||||
if (customMappingTable) delete[] customMappingTable;
|
if (customMappingTable) delete[] customMappingTable;
|
||||||
customMappingTable = new uint16_t[getLengthTotal()];
|
customMappingTable = new uint16_t[getLengthTotal()];
|
||||||
|
|
||||||
if (customMappingTable) {
|
if (customMappingTable) {
|
||||||
DEBUG_PRINT(F("Reading LED map from ")); DEBUG_PRINTLN(fileName);
|
DEBUG_PRINT(F("Reading LED map from ")); DEBUG_PRINTLN(fileName);
|
||||||
JsonObject root = pDoc->as<JsonObject>();
|
|
||||||
JsonArray map = root[F("map")];
|
JsonArray map = root[F("map")];
|
||||||
if (!map.isNull() && map.size()) { // not an empty map
|
if (!map.isNull() && map.size()) { // not an empty map
|
||||||
customMappingSize = min((unsigned)map.size(), (unsigned)getLengthTotal());
|
customMappingSize = min((unsigned)map.size(), (unsigned)getLengthTotal());
|
||||||
|
@ -466,7 +466,22 @@ void BusPwm::setPixelColor(uint16_t pix, uint32_t c) {
|
|||||||
//does no index check
|
//does no index check
|
||||||
uint32_t BusPwm::getPixelColor(uint16_t pix) {
|
uint32_t BusPwm::getPixelColor(uint16_t pix) {
|
||||||
if (!_valid) return 0;
|
if (!_valid) return 0;
|
||||||
return RGBW32(_data[0], _data[1], _data[2], _data[3]);
|
// TODO getting the reverse from CCT is involved (a quick approximation when CCT blending is ste to 0 implemented)
|
||||||
|
switch (_type) {
|
||||||
|
case TYPE_ANALOG_1CH: //one channel (white), relies on auto white calculation
|
||||||
|
return RGBW32(0, 0, 0, _data[0]);
|
||||||
|
case TYPE_ANALOG_2CH: //warm white + cold white
|
||||||
|
if (cctICused) return RGBW32(0, 0, 0, _data[0]);
|
||||||
|
else return RGBW32(0, 0, 0, _data[0] + _data[1]);
|
||||||
|
case TYPE_ANALOG_5CH: //RGB + warm white + cold white
|
||||||
|
if (cctICused) return RGBW32(_data[0], _data[1], _data[2], _data[3]);
|
||||||
|
else return RGBW32(_data[0], _data[1], _data[2], _data[3] + _data[4]);
|
||||||
|
case TYPE_ANALOG_4CH: //RGBW
|
||||||
|
return RGBW32(_data[0], _data[1], _data[2], _data[3]);
|
||||||
|
case TYPE_ANALOG_3CH: //standard dumb RGB
|
||||||
|
return RGBW32(_data[0], _data[1], _data[2], 0);
|
||||||
|
}
|
||||||
|
return RGBW32(_data[0], _data[0], _data[0], _data[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef ESP8266
|
#ifndef ESP8266
|
||||||
|
@ -496,6 +496,11 @@ class PolyBus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void* create(uint8_t busType, uint8_t* pins, uint16_t len, uint8_t channel, uint16_t clock_kHz = 0U) {
|
static void* create(uint8_t busType, uint8_t* pins, uint16_t len, uint8_t channel, uint16_t clock_kHz = 0U) {
|
||||||
|
#if defined(ARDUINO_ARCH_ESP32) && !(defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3))
|
||||||
|
// NOTE: "channel" is only used on ESP32 (and its variants) for RMT channel allocation
|
||||||
|
// since 0.15.0-b3 I2S1 is favoured for classic ESP32 and moved to position 0 (channel 0) so we need to subtract 1 for correct RMT allocation
|
||||||
|
if (channel > 1) channel--; // accommodate I2S1 which is used as 1st bus on classic ESP32
|
||||||
|
#endif
|
||||||
void* busPtr = nullptr;
|
void* busPtr = nullptr;
|
||||||
switch (busType) {
|
switch (busType) {
|
||||||
case I_NONE: break;
|
case I_NONE: break;
|
||||||
|
@ -379,7 +379,7 @@ void handleIO()
|
|||||||
esp32RMTInvertIdle();
|
esp32RMTInvertIdle();
|
||||||
#endif
|
#endif
|
||||||
if (rlyPin>=0) {
|
if (rlyPin>=0) {
|
||||||
pinMode(rlyPin, OUTPUT);
|
pinMode(rlyPin, rlyOpenDrain ? OUTPUT_OPEN_DRAIN : OUTPUT);
|
||||||
digitalWrite(rlyPin, rlyMde);
|
digitalWrite(rlyPin, rlyMde);
|
||||||
}
|
}
|
||||||
offMode = false;
|
offMode = false;
|
||||||
@ -400,7 +400,7 @@ void handleIO()
|
|||||||
esp32RMTInvertIdle();
|
esp32RMTInvertIdle();
|
||||||
#endif
|
#endif
|
||||||
if (rlyPin>=0) {
|
if (rlyPin>=0) {
|
||||||
pinMode(rlyPin, OUTPUT);
|
pinMode(rlyPin, rlyOpenDrain ? OUTPUT_OPEN_DRAIN : OUTPUT);
|
||||||
digitalWrite(rlyPin, !rlyMde);
|
digitalWrite(rlyPin, !rlyMde);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -335,12 +335,14 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
|
|||||||
CJSON(irApplyToAllSelected, hw["ir"]["sel"]);
|
CJSON(irApplyToAllSelected, hw["ir"]["sel"]);
|
||||||
|
|
||||||
JsonObject relay = hw[F("relay")];
|
JsonObject relay = hw[F("relay")];
|
||||||
|
|
||||||
|
rlyOpenDrain = relay[F("odrain")] | rlyOpenDrain;
|
||||||
int hw_relay_pin = relay["pin"] | -2;
|
int hw_relay_pin = relay["pin"] | -2;
|
||||||
if (hw_relay_pin > -2) {
|
if (hw_relay_pin > -2) {
|
||||||
pinManager.deallocatePin(rlyPin, PinOwner::Relay);
|
pinManager.deallocatePin(rlyPin, PinOwner::Relay);
|
||||||
if (pinManager.allocatePin(hw_relay_pin,true, PinOwner::Relay)) {
|
if (pinManager.allocatePin(hw_relay_pin,true, PinOwner::Relay)) {
|
||||||
rlyPin = hw_relay_pin;
|
rlyPin = hw_relay_pin;
|
||||||
pinMode(rlyPin, OUTPUT);
|
pinMode(rlyPin, rlyOpenDrain ? OUTPUT_OPEN_DRAIN : OUTPUT);
|
||||||
} else {
|
} else {
|
||||||
rlyPin = -1;
|
rlyPin = -1;
|
||||||
}
|
}
|
||||||
@ -865,6 +867,7 @@ void serializeConfig() {
|
|||||||
JsonObject hw_relay = hw.createNestedObject(F("relay"));
|
JsonObject hw_relay = hw.createNestedObject(F("relay"));
|
||||||
hw_relay["pin"] = rlyPin;
|
hw_relay["pin"] = rlyPin;
|
||||||
hw_relay["rev"] = !rlyMde;
|
hw_relay["rev"] = !rlyMde;
|
||||||
|
hw_relay[F("odrain")] = rlyOpenDrain;
|
||||||
|
|
||||||
hw[F("baud")] = serialBaud;
|
hw[F("baud")] = serialBaud;
|
||||||
|
|
||||||
|
@ -65,24 +65,30 @@ uint32_t color_add(uint32_t c1, uint32_t c2, bool fast)
|
|||||||
* fades color toward black
|
* fades color toward black
|
||||||
* if using "video" method the resulting color will never become black unless it is already black
|
* if using "video" method the resulting color will never become black unless it is already black
|
||||||
*/
|
*/
|
||||||
|
|
||||||
uint32_t color_fade(uint32_t c1, uint8_t amount, bool video)
|
uint32_t color_fade(uint32_t c1, uint8_t amount, bool video)
|
||||||
{
|
{
|
||||||
uint8_t r = R(c1);
|
uint32_t scaledcolor; // color order is: W R G B from MSB to LSB
|
||||||
uint8_t g = G(c1);
|
uint32_t r = R(c1);
|
||||||
uint8_t b = B(c1);
|
uint32_t g = G(c1);
|
||||||
uint8_t w = W(c1);
|
uint32_t b = B(c1);
|
||||||
if (video) {
|
uint32_t w = W(c1);
|
||||||
r = scale8_video(r, amount);
|
if (video) {
|
||||||
g = scale8_video(g, amount);
|
uint32_t scale = amount; // 32bit for faster calculation
|
||||||
b = scale8_video(b, amount);
|
scaledcolor = (((r * scale) >> 8) << 16) + ((r && scale) ? 1 : 0);
|
||||||
w = scale8_video(w, amount);
|
scaledcolor |= (((g * scale) >> 8) << 8) + ((g && scale) ? 1 : 0);
|
||||||
} else {
|
scaledcolor |= ((b * scale) >> 8) + ((b && scale) ? 1 : 0);
|
||||||
r = scale8(r, amount);
|
scaledcolor |= (((w * scale) >> 8) << 24) + ((w && scale) ? 1 : 0);
|
||||||
g = scale8(g, amount);
|
return scaledcolor;
|
||||||
b = scale8(b, amount);
|
}
|
||||||
w = scale8(w, amount);
|
else {
|
||||||
|
uint32_t scale = 1 + amount;
|
||||||
|
scaledcolor = ((r * scale) >> 8) << 16;
|
||||||
|
scaledcolor |= ((g * scale) >> 8) << 8;
|
||||||
|
scaledcolor |= (b * scale) >> 8;
|
||||||
|
scaledcolor |= ((w * scale) >> 8) << 24;
|
||||||
|
return scaledcolor;
|
||||||
}
|
}
|
||||||
return RGBW32(r, g, b, w);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setRandomColor(byte* rgb)
|
void setRandomColor(byte* rgb)
|
||||||
|
@ -358,7 +358,7 @@ button {
|
|||||||
|
|
||||||
#putil, #segutil, #segutil2 {
|
#putil, #segutil, #segutil2 {
|
||||||
min-height: 42px;
|
min-height: 42px;
|
||||||
margin: 13px auto 0;
|
margin: 0 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
#segutil .segin {
|
#segutil .segin {
|
||||||
|
@ -430,7 +430,7 @@ function presetError(empty)
|
|||||||
if (bckstr.length > 10) hasBackup = true;
|
if (bckstr.length > 10) hasBackup = true;
|
||||||
} catch (e) {}
|
} catch (e) {}
|
||||||
|
|
||||||
var cn = `<div class="pres c" ${empty?'style="padding:8px;margin-top: 16px;"':'onclick="pmtLast=0;loadPresets();" style="cursor:pointer;padding:8px;margin-top: 16px;"'}>`;
|
var cn = `<div class="pres c" style="padding:8px;margin-bottom:8px;${empty?'':'cursor:pointer;'}" ${empty?'':'onclick="pmtLast=0;loadPresets();"'}>`;
|
||||||
if (empty)
|
if (empty)
|
||||||
cn += `You have no presets yet!`;
|
cn += `You have no presets yet!`;
|
||||||
else
|
else
|
||||||
@ -442,8 +442,8 @@ function presetError(empty)
|
|||||||
cn += `However, there is backup preset data of a previous installation available.<br>(Saving a preset will hide this and overwrite the backup)`;
|
cn += `However, there is backup preset data of a previous installation available.<br>(Saving a preset will hide this and overwrite the backup)`;
|
||||||
else
|
else
|
||||||
cn += `Here is a backup of the last known good state:`;
|
cn += `Here is a backup of the last known good state:`;
|
||||||
cn += `<textarea id="bck"></textarea><br><button class="btn" onclick="cpBck()">Copy to clipboard</button>`;
|
cn += `<textarea id="bck"></textarea><br><button class="btn" style="margin-top:12px;" onclick="cpBck()">Copy to clipboard</button>`;
|
||||||
cn += `<br><button type="button" class="btn" onclick="restore(gId('bck').value)">Restore</button>`;
|
cn += `<br><button type="button" class="btn" style="margin-top:12px;" onclick="restore(gId('bck').value)">Restore</button>`;
|
||||||
}
|
}
|
||||||
cn += `</div>`;
|
cn += `</div>`;
|
||||||
gId('pcont').innerHTML = cn;
|
gId('pcont').innerHTML = cn;
|
||||||
@ -863,14 +863,11 @@ function populateSegments(s)
|
|||||||
gId("segcont").classList.remove("hide");
|
gId("segcont").classList.remove("hide");
|
||||||
let noNewSegs = (lowestUnused >= maxSeg);
|
let noNewSegs = (lowestUnused >= maxSeg);
|
||||||
resetUtil(noNewSegs);
|
resetUtil(noNewSegs);
|
||||||
if (gId('selall')) gId('selall').checked = true;
|
|
||||||
for (var i = 0; i <= lSeg; i++) {
|
for (var i = 0; i <= lSeg; i++) {
|
||||||
if (!gId(`seg${i}`)) continue;
|
if (!gId(`seg${i}`)) continue;
|
||||||
updateLen(i);
|
updateLen(i);
|
||||||
updateTrail(gId(`seg${i}bri`));
|
updateTrail(gId(`seg${i}bri`));
|
||||||
gId(`segr${i}`).classList.add("hide");
|
gId(`segr${i}`).classList.add("hide");
|
||||||
//if (i<lSeg) gId(`segd${i}`).classList.add("hide"); // hide delete button for all but last
|
|
||||||
if (!gId(`seg${i}sel`).checked && gId('selall')) gId('selall').checked = false; // uncheck if at least one is unselected.
|
|
||||||
}
|
}
|
||||||
if (segCount < 2) {
|
if (segCount < 2) {
|
||||||
gId(`segd${lSeg}`).classList.add("hide"); // hide delete if only one segment
|
gId(`segd${lSeg}`).classList.add("hide"); // hide delete if only one segment
|
||||||
@ -1465,8 +1462,6 @@ function readState(s,command=false)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s.seg.length>2) d.querySelectorAll(".pop").forEach((e)=>{e.classList.remove("hide");});
|
|
||||||
|
|
||||||
var cd = gId('csl').querySelectorAll("button");
|
var cd = gId('csl').querySelectorAll("button");
|
||||||
for (let e = cd.length-1; e >= 0; e--) {
|
for (let e = cd.length-1; e >= 0; e--) {
|
||||||
cd[e].dataset.r = i.col[e][0];
|
cd[e].dataset.r = i.col[e][0];
|
||||||
@ -1842,7 +1837,7 @@ function makeSeg()
|
|||||||
});
|
});
|
||||||
var cn = `<div class="seg lstI expanded">`+
|
var cn = `<div class="seg lstI expanded">`+
|
||||||
`<div class="segin">`+
|
`<div class="segin">`+
|
||||||
`<input type="text" id="seg${lu}t" autocomplete="off" maxlength=32 value="" placeholder="New segment ${lu}"/>`+
|
`<input class="ptxt show" type="text" id="seg${lu}t" autocomplete="off" maxlength=32 value="" placeholder="New segment ${lu}"/>`+
|
||||||
`<table class="segt">`+
|
`<table class="segt">`+
|
||||||
`<tr>`+
|
`<tr>`+
|
||||||
`<td width="38%">${isM?'Start X':'Start LED'}</td>`+
|
`<td width="38%">${isM?'Start X':'Start LED'}</td>`+
|
||||||
@ -1868,13 +1863,19 @@ function makeSeg()
|
|||||||
|
|
||||||
function resetUtil(off=false)
|
function resetUtil(off=false)
|
||||||
{
|
{
|
||||||
gId('segutil').innerHTML = `<div class="seg btn btn-s${off?' off':''}" style="padding:0;">`
|
gId('segutil').innerHTML = `<div class="seg btn btn-s${off?' off':''}" style="padding:0;margin-bottom:12px;">`
|
||||||
+ '<label class="check schkl"><input type="checkbox" id="selall" onchange="selSegAll(this)"><span class="checkmark"></span></label>'
|
+ '<label class="check schkl"><input type="checkbox" id="selall" onchange="selSegAll(this)"><span class="checkmark"></span></label>'
|
||||||
+ `<div class="segname" ${off?'':'onclick="makeSeg()"'}><i class="icons btn-icon"></i>Add segment</div>`
|
+ `<div class="segname" ${off?'':'onclick="makeSeg()"'}><i class="icons btn-icon"></i>Add segment</div>`
|
||||||
+ '<div class="pop hide" onclick="event.stopPropagation();">'
|
+ '<div class="pop hide" onclick="event.stopPropagation();">'
|
||||||
+ `<i class="icons g-icon" title="Select group" onclick="this.nextElementSibling.classList.toggle('hide');"></i>`
|
+ `<i class="icons g-icon" title="Select group" onclick="this.nextElementSibling.classList.toggle('hide');"></i>`
|
||||||
+ '<div class="pop-c hide"><span style="color:var(--c-f);" onclick="selGrp(0);">➊</span><span style="color:var(--c-r);" onclick="selGrp(1);">➋</span><span style="color:var(--c-g);" onclick="selGrp(2);">➌</span><span style="color:var(--c-l);" onclick="selGrp(3);">➍</span></div>'
|
+ '<div class="pop-c hide"><span style="color:var(--c-f);" onclick="selGrp(0);">➊</span><span style="color:var(--c-r);" onclick="selGrp(1);">➋</span><span style="color:var(--c-g);" onclick="selGrp(2);">➌</span><span style="color:var(--c-l);" onclick="selGrp(3);">➍</span></div>'
|
||||||
+ '</div></div>';
|
+ '</div></div>';
|
||||||
|
gId('selall').checked = true;
|
||||||
|
for (var i = 0; i <= lSeg; i++) {
|
||||||
|
if (!gId(`seg${i}`)) continue;
|
||||||
|
if (!gId(`seg${i}sel`).checked) gId('selall').checked = false; // uncheck if at least one is unselected.
|
||||||
|
}
|
||||||
|
if (lSeg>2) d.querySelectorAll("#Segments .pop").forEach((e)=>{e.classList.remove("hide");});
|
||||||
}
|
}
|
||||||
|
|
||||||
function makePlSel(el, incPl=false)
|
function makePlSel(el, incPl=false)
|
||||||
|
@ -619,7 +619,8 @@ Swap: <select id="xw${i}" name="XW${i}">
|
|||||||
}
|
}
|
||||||
if (c.hw.relay) {
|
if (c.hw.relay) {
|
||||||
d.getElementsByName("RL")[0].value = c.hw.relay.pin;
|
d.getElementsByName("RL")[0].value = c.hw.relay.pin;
|
||||||
d.getElementsByName("RM")[0].checked = c.hw.relay.inv;
|
d.getElementsByName("RM")[0].checked = c.hw.relay.rev;
|
||||||
|
d.getElementsByName("RO")[0].checked = c.hw.relay.odrain;
|
||||||
}
|
}
|
||||||
UI();
|
UI();
|
||||||
}
|
}
|
||||||
@ -822,7 +823,7 @@ Swap: <select id="xw${i}" name="XW${i}">
|
|||||||
Apply IR change to main segment only: <input type="checkbox" name="MSO"><br>
|
Apply IR change to main segment only: <input type="checkbox" name="MSO"><br>
|
||||||
<div id="json" style="display:none;">JSON file: <input type="file" name="data" accept=".json"><button type="button" class="sml" onclick="uploadFile('/ir.json')">Upload</button><br></div>
|
<div id="json" style="display:none;">JSON file: <input type="file" name="data" accept=".json"><button type="button" class="sml" onclick="uploadFile('/ir.json')">Upload</button><br></div>
|
||||||
<a href="https://kno.wled.ge/interfaces/infrared/" target="_blank">IR info</a><br>
|
<a href="https://kno.wled.ge/interfaces/infrared/" target="_blank">IR info</a><br>
|
||||||
Relay GPIO: <input type="number" min="-1" max="48" name="RL" onchange="UI()" class="xs"> Invert <input type="checkbox" name="RM"><span style="cursor: pointer;" onclick="off('RL')"> ✕</span><br>
|
Relay GPIO: <input type="number" min="-1" max="48" name="RL" onchange="UI()" class="xs"><span style="cursor: pointer;" onclick="off('RL')"> ✕</span> Invert <input type="checkbox" name="RM"> Open drain <input type="checkbox" name="RO"><br>
|
||||||
<hr class="sml">
|
<hr class="sml">
|
||||||
<h3>Defaults</h3>
|
<h3>Defaults</h3>
|
||||||
Turn LEDs on after power up/reset: <input type="checkbox" name="BO"><br>
|
Turn LEDs on after power up/reset: <input type="checkbox" name="BO"><br>
|
||||||
|
@ -52,40 +52,42 @@
|
|||||||
}
|
}
|
||||||
scanLoops = 0;
|
scanLoops = 0;
|
||||||
|
|
||||||
let cs = d.querySelectorAll("#wifi_entries input[type=text]");
|
if (networks.length > 0) {
|
||||||
for (let input of (cs||[])) {
|
let cs = d.querySelectorAll("#wifi_entries input[type=text]");
|
||||||
let found = false;
|
for (let input of (cs||[])) {
|
||||||
let select = cE("select");
|
let found = false;
|
||||||
select.id = input.id;
|
let select = cE("select");
|
||||||
select.name = input.name;
|
select.id = input.id;
|
||||||
select.setAttribute("onchange", "T(this)");
|
select.name = input.name;
|
||||||
preScanSSID = input.value;
|
select.setAttribute("onchange", "T(this)");
|
||||||
|
preScanSSID = input.value;
|
||||||
|
|
||||||
for (let i = 0; i < select.children.length; i++) {
|
for (let i = 0; i < select.children.length; i++) {
|
||||||
select.removeChild(select.children[i]);
|
select.removeChild(select.children[i]);
|
||||||
}
|
|
||||||
|
|
||||||
for (let i = 0; i < networks.length; i++) {
|
|
||||||
const option = cE("option");
|
|
||||||
|
|
||||||
option.setAttribute("value", networks[i].ssid);
|
|
||||||
option.textContent = `${networks[i].ssid} (${networks[i].rssi} dBm)`;
|
|
||||||
|
|
||||||
if (networks[i].ssid === input.value) {
|
|
||||||
option.setAttribute("selected", "selected");
|
|
||||||
found = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (let i = 0; i < networks.length; i++) {
|
||||||
|
const option = cE("option");
|
||||||
|
|
||||||
|
option.setAttribute("value", networks[i].ssid);
|
||||||
|
option.textContent = `${networks[i].ssid} (${networks[i].rssi} dBm)`;
|
||||||
|
|
||||||
|
if (networks[i].ssid === input.value) {
|
||||||
|
option.setAttribute("selected", "selected");
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
select.appendChild(option);
|
||||||
|
}
|
||||||
|
const option = cE("option");
|
||||||
|
|
||||||
|
option.setAttribute("value", "!Cs");
|
||||||
|
option.textContent = "Other network...";
|
||||||
select.appendChild(option);
|
select.appendChild(option);
|
||||||
|
|
||||||
|
if (input.value === "" || input.value === "Your_Network" || found) input.replaceWith(select);
|
||||||
|
else select.remove();
|
||||||
}
|
}
|
||||||
const option = cE("option");
|
|
||||||
|
|
||||||
option.setAttribute("value", "!Cs");
|
|
||||||
option.textContent = "Other network...";
|
|
||||||
select.appendChild(option);
|
|
||||||
|
|
||||||
if (input.value === "" || input.value === "Your_Network" || found) input.replaceWith(select);
|
|
||||||
else select.remove();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
button.disabled = false;
|
button.disabled = false;
|
||||||
|
@ -276,8 +276,8 @@ bool deserializeSegment(JsonObject elem, byte it, byte presetId)
|
|||||||
seg.fill(BLACK);
|
seg.fill(BLACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t start = 0, stop = 0;
|
start = 0, stop = 0;
|
||||||
byte set = 0; //0 nothing set, 1 start set, 2 range set
|
set = 0; //0 nothing set, 1 start set, 2 range set
|
||||||
|
|
||||||
for (size_t i = 0; i < iarr.size(); i++) {
|
for (size_t i = 0; i < iarr.size(); i++) {
|
||||||
if(iarr[i].is<JsonInteger>()) {
|
if(iarr[i].is<JsonInteger>()) {
|
||||||
@ -644,6 +644,7 @@ void serializeInfo(JsonObject root)
|
|||||||
root[F("ver")] = versionString;
|
root[F("ver")] = versionString;
|
||||||
root[F("vid")] = VERSION;
|
root[F("vid")] = VERSION;
|
||||||
root[F("cn")] = F(WLED_CODENAME);
|
root[F("cn")] = F(WLED_CODENAME);
|
||||||
|
root[F("release")] = FPSTR(releaseString);
|
||||||
|
|
||||||
JsonObject leds = root.createNestedObject(F("leds"));
|
JsonObject leds = root.createNestedObject(F("leds"));
|
||||||
leds[F("count")] = strip.getLengthTotal();
|
leds[F("count")] = strip.getLengthTotal();
|
||||||
|
@ -243,6 +243,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
|||||||
rlyPin = -1;
|
rlyPin = -1;
|
||||||
}
|
}
|
||||||
rlyMde = (bool)request->hasArg(F("RM"));
|
rlyMde = (bool)request->hasArg(F("RM"));
|
||||||
|
rlyOpenDrain = (bool)request->hasArg(F("RO"));
|
||||||
|
|
||||||
disablePullUp = (bool)request->hasArg(F("IP"));
|
disablePullUp = (bool)request->hasArg(F("IP"));
|
||||||
touchThreshold = request->arg(F("TT")).toInt();
|
touchThreshold = request->arg(F("TT")).toInt();
|
||||||
|
@ -243,27 +243,32 @@ using PSRAMDynamicJsonDocument = BasicJsonDocument<PSRAM_Allocator>;
|
|||||||
// int arr[]{0,1,2} becomes WLED_GLOBAL int arr[] _INIT_N(({0,1,2}));
|
// int arr[]{0,1,2} becomes WLED_GLOBAL int arr[] _INIT_N(({0,1,2}));
|
||||||
|
|
||||||
#ifndef WLED_DEFINE_GLOBAL_VARS
|
#ifndef WLED_DEFINE_GLOBAL_VARS
|
||||||
# define WLED_GLOBAL extern
|
#define WLED_GLOBAL extern
|
||||||
# define _INIT(x)
|
#define _INIT(x)
|
||||||
# define _INIT_N(x)
|
#define _INIT_N(x)
|
||||||
|
#define _INIT_PROGMEM(x)
|
||||||
#else
|
#else
|
||||||
# define WLED_GLOBAL
|
#define WLED_GLOBAL
|
||||||
# define _INIT(x) = x
|
#define _INIT(x) = x
|
||||||
|
//needed to ignore commas in array definitions
|
||||||
//needed to ignore commas in array definitions
|
#define UNPACK( ... ) __VA_ARGS__
|
||||||
#define UNPACK( ... ) __VA_ARGS__
|
#define _INIT_N(x) UNPACK x
|
||||||
# define _INIT_N(x) UNPACK x
|
#define _INIT_PROGMEM(x) PROGMEM = x
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define STRINGIFY(X) #X
|
#define STRINGIFY(X) #X
|
||||||
#define TOSTRING(X) STRINGIFY(X)
|
#define TOSTRING(X) STRINGIFY(X)
|
||||||
|
|
||||||
#ifndef WLED_VERSION
|
#ifndef WLED_VERSION
|
||||||
#define WLED_VERSION "dev"
|
#define WLED_VERSION dev
|
||||||
|
#endif
|
||||||
|
#ifndef WLED_RELEASE_NAME
|
||||||
|
#define WLED_RELEASE_NAME dev_release
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Global Variable definitions
|
// Global Variable definitions
|
||||||
WLED_GLOBAL char versionString[] _INIT(TOSTRING(WLED_VERSION));
|
WLED_GLOBAL char versionString[] _INIT(TOSTRING(WLED_VERSION));
|
||||||
|
WLED_GLOBAL char releaseString[] _INIT_PROGMEM(TOSTRING(WLED_RELEASE_NAME)); // somehow this will not work if using "const char releaseString[]
|
||||||
#define WLED_CODENAME "Kōsen"
|
#define WLED_CODENAME "Kōsen"
|
||||||
|
|
||||||
// AP and OTA default passwords (for maximum security change them!)
|
// AP and OTA default passwords (for maximum security change them!)
|
||||||
@ -288,6 +293,12 @@ WLED_GLOBAL bool rlyMde _INIT(true);
|
|||||||
#else
|
#else
|
||||||
WLED_GLOBAL bool rlyMde _INIT(RLYMDE);
|
WLED_GLOBAL bool rlyMde _INIT(RLYMDE);
|
||||||
#endif
|
#endif
|
||||||
|
//Use open drain (floating pin) when relay should be off
|
||||||
|
#ifndef RLYODRAIN
|
||||||
|
WLED_GLOBAL bool rlyOpenDrain _INIT(false);
|
||||||
|
#else
|
||||||
|
WLED_GLOBAL bool rlyOpenDrain _INIT(RLYODRAIN);
|
||||||
|
#endif
|
||||||
#ifndef IRPIN
|
#ifndef IRPIN
|
||||||
#define IRPIN -1
|
#define IRPIN -1
|
||||||
#endif
|
#endif
|
||||||
|
@ -455,6 +455,7 @@ void getSettingsJS(byte subPage, char* dest)
|
|||||||
sappend('i',SET_F("PB"),strip.paletteBlend);
|
sappend('i',SET_F("PB"),strip.paletteBlend);
|
||||||
sappend('v',SET_F("RL"),rlyPin);
|
sappend('v',SET_F("RL"),rlyPin);
|
||||||
sappend('c',SET_F("RM"),rlyMde);
|
sappend('c',SET_F("RM"),rlyMde);
|
||||||
|
sappend('c',SET_F("RO"),rlyOpenDrain);
|
||||||
for (uint8_t i=0; i<WLED_MAX_BUTTONS; i++) {
|
for (uint8_t i=0; i<WLED_MAX_BUTTONS; i++) {
|
||||||
oappend(SET_F("addBtn("));
|
oappend(SET_F("addBtn("));
|
||||||
oappend(itoa(i,nS,10)); oappend(",");
|
oappend(itoa(i,nS,10)); oappend(",");
|
||||||
@ -719,6 +720,8 @@ void getSettingsJS(byte subPage, char* dest)
|
|||||||
sappends('m',SET_F("(\"sip\")[0]"),(char*)F("WLED "));
|
sappends('m',SET_F("(\"sip\")[0]"),(char*)F("WLED "));
|
||||||
olen -= 2; //delete ";
|
olen -= 2; //delete ";
|
||||||
oappend(versionString);
|
oappend(versionString);
|
||||||
|
oappend(SET_F("<br>"));
|
||||||
|
oappend((char*)FPSTR(releaseString));
|
||||||
oappend(SET_F("<br>("));
|
oappend(SET_F("<br>("));
|
||||||
#if defined(ARDUINO_ARCH_ESP32)
|
#if defined(ARDUINO_ARCH_ESP32)
|
||||||
oappend(ESP.getChipModel());
|
oappend(ESP.getChipModel());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user