diff --git a/.gitignore b/.gitignore index db3138f5..74e5dde3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .pio +.cache .pioenvs .piolibdeps .vscode @@ -6,6 +7,8 @@ /wled00/Release /wled00/extLibs /platformio_override.ini +/wled00/user_config_override.h +/build_output .DS_Store .gitignore .clang-format diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile new file mode 100644 index 00000000..29d75d19 --- /dev/null +++ b/.gitpod.Dockerfile @@ -0,0 +1,5 @@ +FROM gitpod/workspace-full + +USER gitpod + +RUN pip3 install -U platformio diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 00000000..cc416b1c --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,12 @@ +tasks: + - command: platformio run + +image: + file: .gitpod.Dockerfile + +vscode: + extensions: + - ms-vscode.cpptools@0.26.3:u3GsZ5PK12Ddr79vh4TWgQ== + - eamodio.gitlens@10.2.1:e0IYyp0efFqVsrZwsIe8CA== + - Atishay-Jain.All-Autocomplete@0.0.23:fbZNfSpnd8XkAHGfAPS2rA== + - 2gua.rainbow-brackets@0.0.6:Tbu8dTz0i+/bgcKQTQ5b8g== diff --git a/pio/gzip-firmware.py b/pio/gzip-firmware.py new file mode 100644 index 00000000..2d028301 --- /dev/null +++ b/pio/gzip-firmware.py @@ -0,0 +1,23 @@ +Import('env') +import os +import shutil +import gzip + +OUTPUT_DIR = "build_output{}".format(os.path.sep) + +def bin_gzip(source, target, env): + variant = str(target[0]).split(os.path.sep)[2] + + # create string with location and file names based on variant + bin_file = "{}firmware{}{}.bin".format(OUTPUT_DIR, os.path.sep, variant) + gzip_file = "{}firmware{}{}.bin.gz".format(OUTPUT_DIR, os.path.sep, variant) + + # check if new target files exist and remove if necessary + if os.path.isfile(gzip_file): os.remove(gzip_file) + + # write gzip firmware file + with open(bin_file,"rb") as fp: + with gzip.open(gzip_file, "wb", compresslevel = 9) as f: + shutil.copyfileobj(fp, f) + +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [bin_gzip]) diff --git a/pio/name-firmware.py b/pio/name-firmware.py new file mode 100644 index 00000000..90ea9867 --- /dev/null +++ b/pio/name-firmware.py @@ -0,0 +1,34 @@ +Import('env') +import os +import shutil + +OUTPUT_DIR = "build_output{}".format(os.path.sep) + +def bin_rename_copy(source, target, env): + variant = str(target[0]).split(os.path.sep)[2] + + # check if output directories exist and create if necessary + if not os.path.isdir(OUTPUT_DIR): + os.mkdir(OUTPUT_DIR) + + for d in ['firmware', 'map']: + if not os.path.isdir("{}{}".format(OUTPUT_DIR, d)): + os.mkdir("{}{}".format(OUTPUT_DIR, d)) + + # create string with location and file names based on variant + map_file = "{}map{}{}.map".format(OUTPUT_DIR, os.path.sep, variant) + bin_file = "{}firmware{}{}.bin".format(OUTPUT_DIR, os.path.sep, variant) + + # check if new target files exist and remove if necessary + for f in [map_file, bin_file]: + if os.path.isfile(f): + os.remove(f) + + # copy firmware.bin to firmware/.bin + shutil.copy(str(target[0]), bin_file) + + # copy firmware.map to map/.map + if os.path.isfile("firmware.map"): + shutil.move("firmware.map", map_file) + +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [bin_rename_copy]) diff --git a/pio/obj-dump.py b/pio/obj-dump.py new file mode 100644 index 00000000..91bc3de5 --- /dev/null +++ b/pio/obj-dump.py @@ -0,0 +1,9 @@ +# Little convenience script to get an object dump + +Import('env') + +def obj_dump_after_elf(source, target, env): + print("Create firmware.asm") + env.Execute("xtensa-lx106-elf-objdump "+ "-D " + str(target[0]) + " > "+ "${PROGNAME}.asm") + +env.AddPostAction("$BUILD_DIR/${PROGNAME}.elf", [obj_dump_after_elf]) diff --git a/pio/override_copy.py b/pio/override_copy.py new file mode 100644 index 00000000..82549e75 --- /dev/null +++ b/pio/override_copy.py @@ -0,0 +1,9 @@ +Import('env') +import os +import shutil + +# copy WLED00/user_config_override_sample.h to WLED00/user_config_override.h +if os.path.isfile("wled00/user_config_override.h"): + print ("*** use provided user_config_override.h as planned ***") +else: + shutil.copy("wled00/user_config_override_sample.h", "wled00/user_config_override.h") diff --git a/pio/strip-floats.py b/pio/strip-floats.py new file mode 100644 index 00000000..da916ebe --- /dev/null +++ b/pio/strip-floats.py @@ -0,0 +1,15 @@ +Import('env') + +# +# Dump build environment (for debug) +#print env.Dump() +# + +flags = " ".join(env['LINKFLAGS']) +flags = flags.replace("-u _printf_float", "") +flags = flags.replace("-u _scanf_float", "") +newflags = flags.split() + +env.Replace( + LINKFLAGS=newflags +) \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index 139eaf30..3e2a3ef8 100644 --- a/platformio.ini +++ b/platformio.ini @@ -79,8 +79,9 @@ arduino_core_git = https://github.com/platformio/platform-espressif8266#feature/ # Platform to use for ESP8266 platform_wled_default = ${common.arduino_core_2_7_4} -# We use 2.7.0+ on analog boards because of PWM flicker fix platform_latest = ${common.arduino_core_2_7_4} +# We use 2.7.4.7 for all, includes PWM flicker fix and Wstring optimization +platform_packages = tasmota/framework-arduinoespressif8266 @ 3.20704.7 # ------------------------------------------------------------------------------ # FLAGS: DEBUG @@ -114,18 +115,44 @@ debug_flags = -D DEBUG=1 -D WLED_DEBUG -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT # TLS_RSA_WITH_AES_256_CBC_SHA / AES256-SHA # This reduces the OTA size with ~45KB, so it's especially useful on low memory boards (512k/1m). # ------------------------------------------------------------------------------ -build_flags = -g -w -DMQTT_MAX_PACKET_SIZE=1024 -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH - -DSECURE_CLIENT=SECURE_CLIENT_BEARSSL -DBEARSSL_SSL_BASIC - #build_flags for the IRremoteESP8266 library (enabled decoders have to appear here) +build_flags = + -Wno-switch + -Wno-deprecated-declarations + -Wno-write-strings + -Wno-unused-variable + -Wno-unused-value + -Wno-sign-compare + -Wno-unused-but-set-variable + -Wno-return-type + -Wno-sequence-point + -DMQTT_MAX_PACKET_SIZE=1024 + -DSECURE_CLIENT=SECURE_CLIENT_BEARSSL + -DBEARSSL_SSL_BASIC + -D CORE_DEBUG_LEVEL=0 + -D NDEBUG + -DFP_IN_IROM +; NONOSDK22x_190703 = 2.2.2-dev(38a443e) + -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_190703 +; lwIP 2 - Higher Bandwidth no Features + -DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH_LOW_FLASH +; VTABLES in Flash + -DVTABLES_IN_FLASH +; restrict to minimal mime-types + -DMIMETYPE_MINIMAL +#build_flags for the IRremoteESP8266 library (enabled decoders have to appear here) -D _IR_ENABLE_DEFAULT_=false -D DECODE_HASH=true -D DECODE_NEC=true -D DECODE_SONY=true -D DECODE_SAMSUNG=true -D DECODE_LG=true - + +build_unflags = + -Wall + -Wdeprecated-declarations + build_flags_esp8266 = ${common.build_flags} -DESP8266 -build_flags_esp32 = ${common.build_flags} -DARDUINO_ARCH_ESP32 +build_flags_esp32 = ${esp32.build_flags} -DARDUINO_ARCH_ESP32 # enables all features for travis CI build_flags_all_features = @@ -145,6 +172,27 @@ ldscript_4m3m = eagle.flash.4m3m.ld shared_libdeps_dir = ./wled00/src +[esp32] +build_flags = -w -g + -DMQTT_MAX_PACKET_SIZE=1024 + -DSECURE_CLIENT=SECURE_CLIENT_BEARSSL + -DBEARSSL_SSL_BASIC + -D CORE_DEBUG_LEVEL=0 + -D NDEBUG +#build_flags for the IRremoteESP8266 library (enabled decoders have to appear here) + -D _IR_ENABLE_DEFAULT_=false + -D DECODE_HASH=true + -D DECODE_NEC=true + -D DECODE_SONY=true + -D DECODE_SAMSUNG=true + -D DECODE_LG=true + +[scripts_defaults] +extra_scripts = pio/name-firmware.py + pio/gzip-firmware.py + pio/strip-floats.py + pio/override_copy.py + # ------------------------------------------------------------------------------ # COMMON SETTINGS: # ------------------------------------------------------------------------------ @@ -153,6 +201,10 @@ framework = arduino board_build.flash_mode = dout monitor_speed = 115200 upload_speed = 115200 +; *** Upload Serial reset method for Wemos and NodeMCU +upload_resetmethod = nodemcu +upload_port = COM5 + lib_extra_dirs = ${common.shared_libdeps_dir} @@ -184,6 +236,8 @@ lib_deps = lib_ignore = AsyncTCP +extra_scripts = ${scripts_defaults.extra_scripts} + # ------------------------------------------------------------------------------ # WLED BUILDS # ------------------------------------------------------------------------------ @@ -191,14 +245,18 @@ lib_ignore = [env:nodemcuv2] board = nodemcuv2 platform = ${common.platform_wled_default} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_4m1m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} # Unsupported environment due to insufficient flash [env:esp01] board = esp01 platform = ${common.platform_wled_default} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_512k} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} -D WLED_DISABLE_OTA -D WLED_DISABLE_ALEXA -D WLED_DISABLE_BLYNK -D WLED_DISABLE_CRONIXIE -D WLED_DISABLE_HUESYNC -D WLED_DISABLE_INFRARED -D WLED_DISABLE_MQTT -D WLED_DISABLE_WEBSOCKETS @@ -206,44 +264,57 @@ build_flags = ${common.build_flags_esp8266} -D WLED_DISABLE_OTA -D WLED_DISABLE_ [env:esp01_1m_ota] board = esp01_1m platform = ${common.platform_wled_default} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_1m0m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} -D WLED_DISABLE_ALEXA -D WLED_DISABLE_BLYNK -D WLED_DISABLE_CRONIXIE -D WLED_DISABLE_HUESYNC -D WLED_DISABLE_INFRARED -D WLED_DISABLE_MQTT -D WLED_DISABLE_WEBSOCKETS [env:esp01_1m_full] board = esp01_1m platform = ${common.platform_wled_default} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_1m0m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} -D WLED_DISABLE_OTA [env:esp07] board = esp07 platform = ${common.platform_wled_default} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_4m1m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} [env:d1_mini] board = d1_mini platform = ${common.platform_wled_default} +platform_packages = ${common.platform_packages} upload_speed = 921600 board_build.ldscript = ${common.ldscript_4m1m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} [env:heltec_wifi_kit_8] board = d1_mini platform = ${common.platform_wled_default} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_4m1m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} [env:h803wf] board = d1_mini platform = ${common.platform_wled_default} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_4m1m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} -D LEDPIN=1 -D WLED_DISABLE_INFRARED [env:esp32dev] board = esp32dev -platform = espressif32@1.12.4 +platform = espressif32@2.0 +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp32} lib_ignore = ESPAsyncTCP @@ -261,25 +332,33 @@ lib_ignore = [env:esp8285_4CH_MagicHome] board = esp8285 platform = ${common.platform_latest} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_1m0m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} -D WLED_DISABLE_HUESYNC -D WLED_USE_ANALOG_LEDS [env:esp8285_4CH_H801] board = esp8285 platform = ${common.platform_latest} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_1m0m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} -D WLED_DISABLE_HUESYNC -D WLED_USE_ANALOG_LEDS -D WLED_USE_H801 [env:esp8285_5CH_H801] board = esp8285 platform = ${common.platform_latest} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_1m0m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} -D WLED_DISABLE_HUESYNC -D WLED_USE_ANALOG_LEDS -D WLED_USE_H801 -D WLED_ENABLE_5CH_LEDS [env:d1_mini_5CH_Shojo_PCB] board = d1_mini platform = ${common.platform_latest} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_4m1m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} -D WLED_USE_ANALOG_LEDS -D WLED_USE_SHOJO_PCB -D WLED_ENABLE_5CH_LEDS # ------------------------------------------------------------------------------ @@ -290,7 +369,9 @@ build_flags = ${common.build_flags_esp8266} -D WLED_USE_ANALOG_LEDS -D WLED_USE_ board = d1_mini build_type = debug platform = ${common.platform_wled_default} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_4m1m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} ${common.debug_flags} [env:d1_mini_ota] @@ -299,7 +380,9 @@ upload_protocol = espota # exchange for your WLED IP upload_port = "10.10.1.27" platform = ${common.platform_wled_default} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_4m1m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} # ------------------------------------------------------------------------------ @@ -309,37 +392,48 @@ build_flags = ${common.build_flags_esp8266} [env:custom_LEDPIN_4] board = d1_mini platform = ${common.platform_latest} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_4m1m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} -D LEDPIN=4 -D IRPIN=5 [env:custom_LEDPIN_16] board = d1_mini platform = ${common.platform_latest} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_4m1m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} -D LEDPIN=16 [env:custom_LEDPIN_3] board = d1_mini platform = ${common.platform_latest} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_4m1m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} -D LEDPIN=3 [env:custom_APA102] board = d1_mini platform = ${common.platform_latest} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_4m1m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} -D USE_APA102 [env:custom_WS2801] board = d1_mini platform = ${common.platform_latest} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_4m1m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} -D USE_WS2801 [env:custom32_LEDPIN_16] board = esp32dev -platform = espressif32@1.12.4 +platform = espressif32@2.0 +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp32} -D LEDPIN=16 lib_ignore = ESPAsyncTCP @@ -347,7 +441,8 @@ lib_ignore = [env:custom32_TOUCHPIN_T0] board = esp32dev -platform = espressif32@1.12.4 +platform = espressif32@2.0 +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp32} -D TOUCHPIN=T0 lib_ignore = ESPAsyncTCP @@ -355,10 +450,11 @@ lib_ignore = [env:wemos_shield_esp32] board = esp32dev -platform = espressif32@1.12.4 +platform = espressif32@2.0 upload_port = /dev/cu.SLAB_USBtoUART monitor_port = /dev/cu.SLAB_USBtoUART upload_speed = 460800 +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp32} -D LEDPIN=16 -D RLYPIN=19 -D BTNPIN=17 lib_ignore = ESPAsyncTCP @@ -366,11 +462,12 @@ lib_ignore = [env:m5atom] board = esp32dev +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp32} -D LEDPIN=27 -D BTNPIN=39 lib_ignore = ESPAsyncTCP ESPAsyncUDP -platform = espressif32@1.12.4 +platform = espressif32@2.0 [env:sp501e] board = esp_wroom_02 @@ -385,11 +482,13 @@ build_flags = ${common.build_flags_esp8266} -D LEDPIN=3 -D BTNPIN=1 [env:travis_esp8266] extends = env:d1_mini build_type = debug +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} ${common.debug_flags} ${common.build_flags_all_features} [env:travis_esp32] extends = env:esp32dev build_type = debug +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp32} ${common.debug_flags} ${common.build_flags_all_features} # ------------------------------------------------------------------------------ @@ -399,35 +498,47 @@ build_flags = ${common.build_flags_esp32} ${common.debug_flags} ${common.build_f [env:codm-controller-0.4] board = esp_wroom_02 platform = ${common.platform_wled_default} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_2m1m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} -D LEDPIN=3 [env:codm-controller-0.4-WS2801] board = esp_wroom_02 platform = ${common.platform_latest} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_2m1m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} -D USE_WS2801 -D CLKPIN=13 -D DATAPIN=3 [env:codm-controller-0.4-APA102] board = esp_wroom_02 platform = ${common.platform_latest} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_2m1m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} -D USE_APA102 -D CLKPIN=13 -D DATAPIN=3 [env:codm-controller-0.5] board = esp_wroom_02 platform = ${common.platform_wled_default} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_2m1m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} [env:codm-controller-0.5-WS2801] board = esp_wroom_02 platform = ${common.platform_latest} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_2m1m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} -D USE_WS2801 #-D CLKPIN=0 -D DATAPIN=2 [env:codm-controller-0.5-APA102] board = esp_wroom_02 platform = ${common.platform_latest} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_2m1m} +build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} -D USE_APA102 #-D CLKPIN=0 -D DATAPIN=2 diff --git a/platformio_override.ini.example b/platformio_override.ini.example index 240c486a..e6c636a3 100644 --- a/platformio_override.ini.example +++ b/platformio_override.ini.example @@ -5,19 +5,26 @@ # Please visit documentation: https://docs.platformio.org/page/projectconf.html [platformio] -default_envs = esp8266_1m_custom +default_envs = WLED_tasmota_1M -[env:esp8266_1m_custom] +[env:WLED_tasmota_1M] board = esp01_1m -platform = ${common.arduino_core_2_4_2} +platform = ${common.platform_wled_default} +platform_packages = ${common.platform_packages} board_build.ldscript = ${common.ldscript_1m0m} -build_flags = ${common.build_flags_esp8266} - -D WLED_DISABLE_OTA - -D WLED_DISABLE_ALEXA - -D WLED_DISABLE_BLYNK - -D WLED_DISABLE_CRONIXIE - -D WLED_DISABLE_HUESYNC - -D WLED_DISABLE_INFRARED +build_unflags = ${common.build_unflags} +build_flags = ${common.build_flags_esp8266} +; ********************************************************************* +; *** Use custom settings from file user_config_override.h + -DUSE_CONFIG_OVERRIDE +; ********************************************************************* +; -D WLED_DISABLE_OTA +; -D WLED_DISABLE_ALEXA +; -D WLED_DISABLE_BLYNK +; -D WLED_DISABLE_CRONIXIE +; -D WLED_DISABLE_HUESYNC +; -D WLED_DISABLE_INFRARED +; -D WLED_DISABLE_WEBSOCKETS ; PIN defines - uncomment and change, if needed: ; -D LEDPIN=2 ; -D BTNPIN=0 @@ -30,11 +37,11 @@ build_flags = ${common.build_flags_esp8266} ; -D USE_WS2801 ; -D USE_LPD8806 ; PIN defines for 2 wire LEDs -; -D CLKPIN=0 -; -D DATAPIN=2 + -D CLKPIN=0 + -D DATAPIN=2 ; to drive analog LED strips (aka 5050), uncomment the following ; PWM pins 5,12,13,15 are used with Magic Home LED Controller (default) -; -D WLED_USE_ANALOG_LEDS + -D WLED_USE_ANALOG_LEDS ; for the H801 controller (PINs 15,13,12,14 (W2 = 04)) uncomment this ; -D WLED_USE_H801 ; for the BW-LT11 controller (PINs 12,4,14,5 ) uncomment this diff --git a/readme.md b/readme.md index c3a1f2ad..a1112bd9 100644 --- a/readme.md +++ b/readme.md @@ -6,6 +6,7 @@ +

diff --git a/wled00/user_config_override_sample.h b/wled00/user_config_override_sample.h new file mode 100644 index 00000000..39a61d16 --- /dev/null +++ b/wled00/user_config_override_sample.h @@ -0,0 +1,550 @@ +// force the compiler to show a warning to confirm that this file is included +#warning **** user_config_override.h: Using Settings from this File **** + +/* Uncomment and use your WIFI settings +#define CLIENT_SSID "Your_SSID" +#define CLIENT_PASS "Your_Password" +*/ + +// ESP8266-01 (blue) got too little storage space to work with all features of WLED. To use it, you must use ESP8266 Arduino Core v2.4.2 and the setting 512K(No SPIFFS). +// ESP8266-01 (black) has 1MB flash and can thus fit the whole program. Use 1M(64K SPIFFS). +// Uncomment some of the following lines to disable features to compile for ESP8266-01 (max flash size 434kB): +// Alternatively, with platformio pass your chosen flags to your custom build target in platformio.ini.override + +// You are required to disable over-the-air updates: +//#define WLED_DISABLE_OTA // saves 14kb + +// You need to choose some of these features to disable: +//#define WLED_DISABLE_ALEXA // saves 11kb +//#define WLED_DISABLE_BLYNK // saves 6kb +//#define WLED_DISABLE_CRONIXIE // saves 3kb +//#define WLED_DISABLE_HUESYNC // saves 4kb +//#define WLED_DISABLE_INFRARED // there is no pin left for this on ESP8266-01, saves 12kb +#ifndef WLED_DISABLE_MQTT + #define WLED_ENABLE_MQTT // saves 12kb +#endif +#define WLED_ENABLE_ADALIGHT // saves 500b only +//#define WLED_ENABLE_DMX // uses 3.5kb (use LEDPIN other than 2) +#define WLED_ENABLE_LOXONE // uses 1.2kb +#ifndef WLED_DISABLE_WEBSOCKETS + #define WLED_ENABLE_WEBSOCKETS +#endif + +#define WLED_DISABLE_FILESYSTEM // SPIFFS is not used by any WLED feature yet +//#define WLED_ENABLE_FS_SERVING // Enable sending html file from SPIFFS before serving progmem version +//#define WLED_ENABLE_FS_EDITOR // enable /edit page for editing SPIFFS content. Will also be disabled with OTA lock + +// to toggle usb serial debug (un)comment the following line +//#define WLED_DEBUG + +// Library inclusions. +#include +#ifdef ESP8266 + #include + #include + #include + extern "C" + { + #include + } +#else // ESP32 + #include + #include "esp_wifi.h" + #include + #include + #include "SPIFFS.h" +#endif + +#include +#include +#include +#include +#ifndef WLED_DISABLE_OTA + #include +#endif +#include +#include "src/dependencies/time/TimeLib.h" +#include "src/dependencies/timezone/Timezone.h" + +#ifndef WLED_DISABLE_ALEXA + #define ESPALEXA_ASYNC + #define ESPALEXA_NO_SUBPAGE + #define ESPALEXA_MAXDEVICES 1 + // #define ESPALEXA_DEBUG + #include "src/dependencies/espalexa/Espalexa.h" +#endif +#ifndef WLED_DISABLE_BLYNK + #include "src/dependencies/blynk/BlynkSimpleEsp.h" +#endif + +#ifdef WLED_ENABLE_DMX + #include "src/dependencies/dmx/ESPDMX.h" +#endif + +#include "src/dependencies/e131/ESPAsyncE131.h" +#include "src/dependencies/async-mqtt-client/AsyncMqttClient.h" + +#define ARDUINOJSON_DECODE_UNICODE 0 +#include "src/dependencies/json/AsyncJson-v6.h" +#include "src/dependencies/json/ArduinoJson-v6.h" + +#include "fcn_declare.h" +#include "html_ui.h" +#include "html_settings.h" +#include "html_other.h" +#include "FX.h" +#include "ir_codes.h" +#include "const.h" + +#ifndef CLIENT_SSID + #define CLIENT_SSID DEFAULT_CLIENT_SSID +#endif + +#ifndef CLIENT_PASS + #define CLIENT_PASS "" +#endif + +#if IR_PIN < 0 + #ifndef WLED_DISABLE_INFRARED + #define WLED_DISABLE_INFRARED + #endif +#endif + +#ifndef WLED_DISABLE_INFRARED + #include + #include + #include +#endif + +// remove flicker because PWM signal of RGB channels can become out of phase (part of core as of Arduino core v2.7.0) +//#if defined(WLED_USE_ANALOG_LEDS) && defined(ESP8266) +// #include "src/dependencies/arduino/core_esp8266_waveform.h" +//#endif + +// enable additional debug output +#ifdef WLED_DEBUG + #ifndef ESP8266 + #include + #endif + #define DEBUG_PRINT(x) Serial.print(x) + #define DEBUG_PRINTLN(x) Serial.println(x) + #define DEBUG_PRINTF(x) Serial.printf(x) +#else + #define DEBUG_PRINT(x) + #define DEBUG_PRINTLN(x) + #define DEBUG_PRINTF(x) +#endif + +// GLOBAL VARIABLES +// both declared and defined in header (solution from http://www.keil.com/support/docs/1868.htm) +// +//e.g. byte test = 2 becomes WLED_GLOBAL byte test _INIT(2); +// int arr[]{0,1,2} becomes WLED_GLOBAL int arr[] _INIT_N(({0,1,2})); + +#ifndef WLED_DEFINE_GLOBAL_VARS +# define WLED_GLOBAL extern +# define _INIT(x) +# define _INIT_N(x) +#else +# define WLED_GLOBAL +# define _INIT(x) = x + +//needed to ignore commas in array definitions +#define UNPACK( ... ) __VA_ARGS__ +# define _INIT_N(x) UNPACK x +#endif + +// Global Variable definitions +WLED_GLOBAL char versionString[] _INIT("0.10.2"); +#define WLED_CODENAME "Fumikiri" + +// AP and OTA default passwords (for maximum security change them!) +WLED_GLOBAL char apPass[65] _INIT(DEFAULT_AP_PASS); +WLED_GLOBAL char otaPass[33] _INIT(DEFAULT_OTA_PASS); + +// Hardware CONFIG (only changeble HERE, not at runtime) +// LED strip pin, button pin and IR pin changeable in NpbWrapper.h! + +WLED_GLOBAL byte auxDefaultState _INIT(0); // 0: input 1: high 2: low +WLED_GLOBAL byte auxTriggeredState _INIT(0); // 0: input 1: high 2: low +WLED_GLOBAL char ntpServerName[33] _INIT("0.wled.pool.ntp.org"); // NTP server to use + +// WiFi CONFIG (all these can be changed via web UI, no need to set them here) +WLED_GLOBAL char clientSSID[33] _INIT(CLIENT_SSID); +WLED_GLOBAL char clientPass[65] _INIT(CLIENT_PASS); +WLED_GLOBAL char cmDNS[33] _INIT("x"); // mDNS address (placeholder, is replaced by wledXXXXXX.local) +WLED_GLOBAL char apSSID[33] _INIT(""); // AP off by default (unless setup) +WLED_GLOBAL byte apChannel _INIT(1); // 2.4GHz WiFi AP channel (1-13) +WLED_GLOBAL byte apHide _INIT(0); // hidden AP SSID +WLED_GLOBAL byte apBehavior _INIT(AP_BEHAVIOR_BOOT_NO_CONN); // access point opens when no connection after boot by default +WLED_GLOBAL IPAddress staticIP _INIT_N((( 0, 0, 0, 0))); // static IP of ESP +WLED_GLOBAL IPAddress staticGateway _INIT_N((( 0, 0, 0, 0))); // gateway (router) IP +WLED_GLOBAL IPAddress staticSubnet _INIT_N(((255, 255, 255, 0))); // most common subnet in home networks +WLED_GLOBAL bool noWifiSleep _INIT(false); // disabling modem sleep modes will increase heat output and power usage, but may help with connection issues + +// LED CONFIG +WLED_GLOBAL uint16_t ledCount _INIT(30); // overcurrent prevented by ABL +WLED_GLOBAL bool useRGBW _INIT(false); // SK6812 strips can contain an extra White channel +WLED_GLOBAL bool turnOnAtBoot _INIT(true); // turn on LEDs at power-up +WLED_GLOBAL byte bootPreset _INIT(0); // save preset to load after power-up + +WLED_GLOBAL byte col[] _INIT_N(({ 255, 160, 0, 0 })); // current RGB(W) primary color. col[] should be updated if you want to change the color. +WLED_GLOBAL byte colSec[] _INIT_N(({ 0, 0, 0, 0 })); // current RGB(W) secondary color +WLED_GLOBAL byte briS _INIT(128); // default brightness + +WLED_GLOBAL byte nightlightTargetBri _INIT(0); // brightness after nightlight is over +WLED_GLOBAL byte nightlightDelayMins _INIT(60); +WLED_GLOBAL byte nightlightMode _INIT(NL_MODE_FADE); // See const.h for available modes. Was nightlightFade +WLED_GLOBAL bool fadeTransition _INIT(true); // enable crossfading color transition +WLED_GLOBAL uint16_t transitionDelay _INIT(750); // default crossfade duration in ms + +WLED_GLOBAL bool skipFirstLed _INIT(false); // ignore first LED in strip (useful if you need the LED as signal repeater) +WLED_GLOBAL byte briMultiplier _INIT(100); // % of brightness to set (to limit power, if you set it to 50 and set bri to 255, actual brightness will be 127) + +// User Interface CONFIG +WLED_GLOBAL char serverDescription[33] _INIT("WLED"); // Name of module +WLED_GLOBAL bool syncToggleReceive _INIT(false); // UIs which only have a single button for sync should toggle send+receive if this is true, only send otherwise + +// Sync CONFIG +WLED_GLOBAL bool buttonEnabled _INIT(true); +WLED_GLOBAL byte irEnabled _INIT(0); // Infrared receiver + +WLED_GLOBAL uint16_t udpPort _INIT(21324); // WLED notifier default port +WLED_GLOBAL uint16_t udpPort2 _INIT(65506); // WLED notifier supplemental port +WLED_GLOBAL uint16_t udpRgbPort _INIT(19446); // Hyperion port + +WLED_GLOBAL bool receiveNotificationBrightness _INIT(true); // apply brightness from incoming notifications +WLED_GLOBAL bool receiveNotificationColor _INIT(true); // apply color +WLED_GLOBAL bool receiveNotificationEffects _INIT(true); // apply effects setup +WLED_GLOBAL bool notifyDirect _INIT(false); // send notification if change via UI or HTTP API +WLED_GLOBAL bool notifyButton _INIT(false); // send if updated by button or infrared remote +WLED_GLOBAL bool notifyAlexa _INIT(false); // send notification if updated via Alexa +WLED_GLOBAL bool notifyMacro _INIT(false); // send notification for macro +WLED_GLOBAL bool notifyHue _INIT(true); // send notification if Hue light changes +WLED_GLOBAL bool notifyTwice _INIT(false); // notifications use UDP: enable if devices don't sync reliably + +WLED_GLOBAL bool alexaEnabled _INIT(false); // enable device discovery by Amazon Echo +WLED_GLOBAL char alexaInvocationName[33] _INIT("Light"); // speech control name of device. Choose something voice-to-text can understand + +WLED_GLOBAL char blynkApiKey[36] _INIT(""); // Auth token for Blynk server. If empty, no connection will be made + +WLED_GLOBAL uint16_t realtimeTimeoutMs _INIT(2500); // ms timeout of realtime mode before returning to normal mode +WLED_GLOBAL int arlsOffset _INIT(0); // realtime LED offset +WLED_GLOBAL bool receiveDirect _INIT(true); // receive UDP realtime +WLED_GLOBAL bool arlsDisableGammaCorrection _INIT(true); // activate if gamma correction is handled by the source +WLED_GLOBAL bool arlsForceMaxBri _INIT(false); // enable to force max brightness if source has very dark colors that would be black + +#ifdef WLED_ENABLE_DMX +WLED_GLOBAL DMXESPSerial dmx; +WLED_GLOBAL uint16_t e131ProxyUniverse _INIT(0); // output this E1.31 (sACN) / ArtNet universe via MAX485 (0 = disabled) +#endif +WLED_GLOBAL uint16_t e131Universe _INIT(1); // settings for E1.31 (sACN) protocol (only DMX_MODE_MULTIPLE_* can span over consequtive universes) +WLED_GLOBAL uint16_t e131Port _INIT(5568); // DMX in port. E1.31 default is 5568, Art-Net is 6454 +WLED_GLOBAL byte DMXMode _INIT(DMX_MODE_MULTIPLE_RGB); // DMX mode (s.a.) +WLED_GLOBAL uint16_t DMXAddress _INIT(1); // DMX start address of fixture, a.k.a. first Channel [for E1.31 (sACN) protocol] +WLED_GLOBAL byte DMXOldDimmer _INIT(0); // only update brightness on change +WLED_GLOBAL byte e131LastSequenceNumber[E131_MAX_UNIVERSE_COUNT]; // to detect packet loss +WLED_GLOBAL bool e131Multicast _INIT(false); // multicast or unicast +WLED_GLOBAL bool e131SkipOutOfSequence _INIT(false); // freeze instead of flickering + +WLED_GLOBAL bool mqttEnabled _INIT(true); +WLED_GLOBAL char mqttDeviceTopic[33] _INIT(""); // main MQTT topic (individual per device, default is wled/mac) +WLED_GLOBAL char mqttGroupTopic[33] _INIT("wled/all"); // second MQTT topic (for example to group devices) +WLED_GLOBAL char mqttServer[33] _INIT("your_broker.ip"); // both domains and IPs should work (no SSL) +WLED_GLOBAL char mqttUser[41] _INIT("your_mqtt_user"); // optional: username for MQTT auth +WLED_GLOBAL char mqttPass[41] _INIT("your_mqtt_pwd"); // optional: password for MQTT auth +WLED_GLOBAL char mqttClientID[41] _INIT(""); // override the client ID +WLED_GLOBAL uint16_t mqttPort _INIT(1883); + +WLED_GLOBAL bool huePollingEnabled _INIT(false); // poll hue bridge for light state +WLED_GLOBAL uint16_t huePollIntervalMs _INIT(2500); // low values (< 1sec) may cause lag but offer quicker response +WLED_GLOBAL char hueApiKey[47] _INIT("api"); // key token will be obtained from bridge +WLED_GLOBAL byte huePollLightId _INIT(1); // ID of hue lamp to sync to. Find the ID in the hue app ("about" section) +WLED_GLOBAL IPAddress hueIP _INIT((0, 0, 0, 0)); // IP address of the bridge +WLED_GLOBAL bool hueApplyOnOff _INIT(true); +WLED_GLOBAL bool hueApplyBri _INIT(true); +WLED_GLOBAL bool hueApplyColor _INIT(true); + +// Time CONFIG +WLED_GLOBAL bool ntpEnabled _INIT(true); // get internet time. Only required if you use clock overlays or time-activated macros +WLED_GLOBAL bool useAMPM _INIT(false); // 12h/24h clock format +WLED_GLOBAL byte currentTimezone _INIT(2); // Timezone ID. Refer to timezones array in wled10_ntp.ino +WLED_GLOBAL int utcOffsetSecs _INIT(0); // Seconds to offset from UTC before timzone calculation + +WLED_GLOBAL byte overlayDefault _INIT(0); // 0: no overlay 1: analog clock 2: single-digit clocl 3: cronixie +WLED_GLOBAL byte overlayMin _INIT(0), overlayMax _INIT(ledCount - 1); // boundaries of overlay mode + +WLED_GLOBAL byte analogClock12pixel _INIT(0); // The pixel in your strip where "midnight" would be +WLED_GLOBAL bool analogClockSecondsTrail _INIT(false); // Display seconds as trail of LEDs instead of a single pixel +WLED_GLOBAL bool analogClock5MinuteMarks _INIT(false); // Light pixels at every 5-minute position + +WLED_GLOBAL char cronixieDisplay[7] _INIT("HHMMSS"); // Cronixie Display mask. See wled13_cronixie.ino +WLED_GLOBAL bool cronixieBacklight _INIT(true); // Allow digits to be back-illuminated + +WLED_GLOBAL bool countdownMode _INIT(false); // Clock will count down towards date +WLED_GLOBAL byte countdownYear _INIT(20), countdownMonth _INIT(1); // Countdown target date, year is last two digits +WLED_GLOBAL byte countdownDay _INIT(1) , countdownHour _INIT(0); +WLED_GLOBAL byte countdownMin _INIT(0) , countdownSec _INIT(0); + +WLED_GLOBAL byte macroBoot _INIT(0); // macro loaded after startup +WLED_GLOBAL byte macroNl _INIT(0); // after nightlight delay over +WLED_GLOBAL byte macroCountdown _INIT(0); +WLED_GLOBAL byte macroAlexaOn _INIT(0), macroAlexaOff _INIT(0); +WLED_GLOBAL byte macroButton _INIT(0), macroLongPress _INIT(0), macroDoublePress _INIT(0); + +// Security CONFIG +WLED_GLOBAL bool otaLock _INIT(false); // prevents OTA firmware updates without password. ALWAYS enable if system exposed to any public networks +WLED_GLOBAL bool wifiLock _INIT(false); // prevents access to WiFi settings when OTA lock is enabled +WLED_GLOBAL bool aOtaEnabled _INIT(false); // ArduinoOTA allows easy updates directly from the IDE. Careful, it does not auto-disable when OTA lock is on + +WLED_GLOBAL uint16_t userVar0 _INIT(0), userVar1 _INIT(0); //available for use in usermod + +#ifdef WLED_ENABLE_DMX + // dmx CONFIG + WLED_GLOBAL byte DMXChannels _INIT(7); // number of channels per fixture + WLED_GLOBAL byte DMXFixtureMap[15] _INIT_N(({ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 })); + // assigns the different channels to different functions. See wled21_dmx.ino for more information. + WLED_GLOBAL uint16_t DMXGap _INIT(10); // gap between the fixtures. makes addressing easier because you don't have to memorize odd numbers when climbing up onto a rig. + WLED_GLOBAL uint16_t DMXStart _INIT(10); // start address of the first fixture + WLED_GLOBAL uint16_t DMXStartLED _INIT(0); // LED from which DMX fixtures start +#endif + +// internal global variable declarations +// wifi +WLED_GLOBAL bool apActive _INIT(false); +WLED_GLOBAL bool forceReconnect _INIT(false); +WLED_GLOBAL uint32_t lastReconnectAttempt _INIT(0); +WLED_GLOBAL bool interfacesInited _INIT(false); +WLED_GLOBAL bool wasConnected _INIT(false); + +// color +WLED_GLOBAL byte colOld[] _INIT_N(({ 0, 0, 0, 0 })); // color before transition +WLED_GLOBAL byte colT[] _INIT_N(({ 0, 0, 0, 0 })); // color that is currently displayed on the LEDs +WLED_GLOBAL byte colIT[] _INIT_N(({ 0, 0, 0, 0 })); // color that was last sent to LEDs +WLED_GLOBAL byte colSecT[] _INIT_N(({ 0, 0, 0, 0 })); +WLED_GLOBAL byte colSecOld[] _INIT_N(({ 0, 0, 0, 0 })); +WLED_GLOBAL byte colSecIT[] _INIT_N(({ 0, 0, 0, 0 })); + +WLED_GLOBAL byte lastRandomIndex _INIT(0); // used to save last random color so the new one is not the same + +// transitions +WLED_GLOBAL bool transitionActive _INIT(false); +WLED_GLOBAL uint16_t transitionDelayDefault _INIT(transitionDelay); +WLED_GLOBAL uint16_t transitionDelayTemp _INIT(transitionDelay); +WLED_GLOBAL unsigned long transitionStartTime; +WLED_GLOBAL float tperLast _INIT(0); // crossfade transition progress, 0.0f - 1.0f +WLED_GLOBAL bool jsonTransitionOnce _INIT(false); + +// nightlight +WLED_GLOBAL bool nightlightActive _INIT(false); +WLED_GLOBAL bool nightlightActiveOld _INIT(false); +WLED_GLOBAL uint32_t nightlightDelayMs _INIT(10); +WLED_GLOBAL byte nightlightDelayMinsDefault _INIT(nightlightDelayMins); +WLED_GLOBAL unsigned long nightlightStartTime; +WLED_GLOBAL byte briNlT _INIT(0); // current nightlight brightness +WLED_GLOBAL byte colNlT[] _INIT_N(({ 0, 0, 0, 0 })); // current nightlight color + +// brightness +WLED_GLOBAL unsigned long lastOnTime _INIT(0); +WLED_GLOBAL bool offMode _INIT(!turnOnAtBoot); +WLED_GLOBAL byte bri _INIT(briS); +WLED_GLOBAL byte briOld _INIT(0); +WLED_GLOBAL byte briT _INIT(0); +WLED_GLOBAL byte briIT _INIT(0); +WLED_GLOBAL byte briLast _INIT(128); // brightness before turned off. Used for toggle function +WLED_GLOBAL byte whiteLast _INIT(128); // white channel before turned off. Used for toggle function + +// button +WLED_GLOBAL bool buttonPressedBefore _INIT(false); +WLED_GLOBAL bool buttonLongPressed _INIT(false); +WLED_GLOBAL unsigned long buttonPressedTime _INIT(0); +WLED_GLOBAL unsigned long buttonWaitTime _INIT(0); + +// notifications +WLED_GLOBAL bool notifyDirectDefault _INIT(notifyDirect); +WLED_GLOBAL bool receiveNotifications _INIT(true); +WLED_GLOBAL unsigned long notificationSentTime _INIT(0); +WLED_GLOBAL byte notificationSentCallMode _INIT(NOTIFIER_CALL_MODE_INIT); +WLED_GLOBAL bool notificationTwoRequired _INIT(false); + +// effects +WLED_GLOBAL byte effectCurrent _INIT(0); +WLED_GLOBAL byte effectSpeed _INIT(128); +WLED_GLOBAL byte effectIntensity _INIT(128); +WLED_GLOBAL byte effectPalette _INIT(0); + +// network +WLED_GLOBAL bool udpConnected _INIT(false), udp2Connected _INIT(false), udpRgbConnected _INIT(false); + +// ui style +WLED_GLOBAL bool showWelcomePage _INIT(false); + +// hue +WLED_GLOBAL byte hueError _INIT(HUE_ERROR_INACTIVE); +// WLED_GLOBAL uint16_t hueFailCount _INIT(0); +WLED_GLOBAL float hueXLast _INIT(0), hueYLast _INIT(0); +WLED_GLOBAL uint16_t hueHueLast _INIT(0), hueCtLast _INIT(0); +WLED_GLOBAL byte hueSatLast _INIT(0), hueBriLast _INIT(0); +WLED_GLOBAL unsigned long hueLastRequestSent _INIT(0); +WLED_GLOBAL bool hueAuthRequired _INIT(false); +WLED_GLOBAL bool hueReceived _INIT(false); +WLED_GLOBAL bool hueStoreAllowed _INIT(false), hueNewKey _INIT(false); + +// overlays +WLED_GLOBAL byte overlayCurrent _INIT(overlayDefault); +WLED_GLOBAL byte overlaySpeed _INIT(200); +WLED_GLOBAL unsigned long overlayRefreshMs _INIT(200); +WLED_GLOBAL unsigned long overlayRefreshedTime; + +// cronixie +WLED_GLOBAL byte dP[] _INIT_N(({ 0, 0, 0, 0, 0, 0 })); +WLED_GLOBAL bool cronixieInit _INIT(false); + +// countdown +WLED_GLOBAL unsigned long countdownTime _INIT(1514764800L); +WLED_GLOBAL bool countdownOverTriggered _INIT(true); + +// timer +WLED_GLOBAL byte lastTimerMinute _INIT(0); +WLED_GLOBAL byte timerHours[] _INIT_N(({ 0, 0, 0, 0, 0, 0, 0, 0 })); +WLED_GLOBAL byte timerMinutes[] _INIT_N(({ 0, 0, 0, 0, 0, 0, 0, 0 })); +WLED_GLOBAL byte timerMacro[] _INIT_N(({ 0, 0, 0, 0, 0, 0, 0, 0 })); +WLED_GLOBAL byte timerWeekday[] _INIT_N(({ 255, 255, 255, 255, 255, 255, 255, 255 })); // weekdays to activate on +// bit pattern of arr elem: 0b11111111: sun,sat,fri,thu,wed,tue,mon,validity + +// blynk +WLED_GLOBAL bool blynkEnabled _INIT(false); + +// preset cycling +WLED_GLOBAL bool presetCyclingEnabled _INIT(false); +WLED_GLOBAL byte presetCycleMin _INIT(1), presetCycleMax _INIT(5); +WLED_GLOBAL uint16_t presetCycleTime _INIT(12); +WLED_GLOBAL unsigned long presetCycledTime _INIT(0); +WLED_GLOBAL byte presetCycCurr _INIT(presetCycleMin); +WLED_GLOBAL bool presetApplyBri _INIT(true); +WLED_GLOBAL bool saveCurrPresetCycConf _INIT(false); + +// realtime +WLED_GLOBAL byte realtimeMode _INIT(REALTIME_MODE_INACTIVE); +WLED_GLOBAL byte realtimeOverride _INIT(REALTIME_OVERRIDE_NONE); +WLED_GLOBAL IPAddress realtimeIP _INIT((0, 0, 0, 0)); +WLED_GLOBAL unsigned long realtimeTimeout _INIT(0); +WLED_GLOBAL uint8_t tpmPacketCount _INIT(0); +WLED_GLOBAL uint16_t tpmPayloadFrameSize _INIT(0); + +// mqtt +WLED_GLOBAL long lastMqttReconnectAttempt _INIT(0); +WLED_GLOBAL long lastInterfaceUpdate _INIT(0); +WLED_GLOBAL byte interfaceUpdateCallMode _INIT(NOTIFIER_CALL_MODE_INIT); +WLED_GLOBAL char mqttStatusTopic[40] _INIT(""); // this must be global because of async handlers + +#if AUXPIN >= 0 + // auxiliary debug pin + WLED_GLOBAL byte auxTime _INIT(0); + WLED_GLOBAL unsigned long auxStartTime _INIT(0); + WLED_GLOBAL bool auxActive _INIT(false, auxActiveBefore _INIT(false); +#endif + +// alexa udp +WLED_GLOBAL String escapedMac; +#ifndef WLED_DISABLE_ALEXA + WLED_GLOBAL Espalexa espalexa; + WLED_GLOBAL EspalexaDevice* espalexaDevice; +#endif + +// dns server +WLED_GLOBAL DNSServer dnsServer; + +// network time +WLED_GLOBAL bool ntpConnected _INIT(false); +WLED_GLOBAL time_t localTime _INIT(0); +WLED_GLOBAL unsigned long ntpLastSyncTime _INIT(999000000L); +WLED_GLOBAL unsigned long ntpPacketSentTime _INIT(999000000L); +WLED_GLOBAL IPAddress ntpServerIP; +WLED_GLOBAL uint16_t ntpLocalPort _INIT(2390); +WLED_GLOBAL uint16_t rolloverMillis _INIT(0); + +// Temp buffer +WLED_GLOBAL char* obuf; +WLED_GLOBAL uint16_t olen _INIT(0); + +// presets +WLED_GLOBAL uint16_t savedPresets _INIT(0); +WLED_GLOBAL int8_t currentPreset _INIT(-1); +WLED_GLOBAL bool isPreset _INIT(false); + +WLED_GLOBAL byte errorFlag _INIT(0); + +WLED_GLOBAL String messageHead, messageSub; +WLED_GLOBAL byte optionType; + +WLED_GLOBAL bool doReboot _INIT(false); // flag to initiate reboot from async handlers +WLED_GLOBAL bool doPublishMqtt _INIT(false); + +// server library objects +WLED_GLOBAL AsyncWebServer server _INIT_N(((80))); +#ifdef WLED_ENABLE_WEBSOCKETS +WLED_GLOBAL AsyncWebSocket ws _INIT_N((("/ws"))); +#endif +WLED_GLOBAL AsyncClient* hueClient _INIT(NULL); +WLED_GLOBAL AsyncMqttClient* mqtt _INIT(NULL); + +// udp interface objects +WLED_GLOBAL WiFiUDP notifierUdp, rgbUdp, notifier2Udp; +WLED_GLOBAL WiFiUDP ntpUdp; +WLED_GLOBAL ESPAsyncE131 e131 _INIT_N(((handleE131Packet))); +WLED_GLOBAL bool e131NewData _INIT(false); + +// led fx library object +WLED_GLOBAL WS2812FX strip _INIT(WS2812FX()); + +// Usermod manager +WLED_GLOBAL UsermodManager usermods _INIT(UsermodManager()); + +// Status LED +#if STATUSLED && STATUSLED != LEDPIN + WLED_GLOBAL unsigned long ledStatusLastMillis _INIT(0); + WLED_GLOBAL unsigned short ledStatusType _INIT(0); // current status type - corresponds to number of blinks per second + WLED_GLOBAL bool ledStatusState _INIT(0); // the current LED state +#endif + +// debug macro variable definitions +#ifdef WLED_DEBUG + WLED_GLOBAL unsigned long debugTime _INIT(0); + WLED_GLOBAL int lastWifiState _INIT(3); + WLED_GLOBAL unsigned long wifiStateChangedTime _INIT(0); + WLED_GLOBAL int loops _INIT(0); +#endif + + +#define WLED_CONNECTED (WiFi.status() == WL_CONNECTED) +#define WLED_WIFI_CONFIGURED (strlen(clientSSID) >= 1 && strcmp(clientSSID, DEFAULT_CLIENT_SSID) != 0) +#define WLED_MQTT_CONNECTED (mqtt != nullptr && mqtt->connected()) + +// append new c string to temp buffer efficiently +bool oappend(const char* txt); +// append new number to temp buffer efficiently +bool oappendi(int i); + +class WLED { +public: + WLED(); + static WLED& instance() + { + static WLED instance; + return instance; + } + + // boot starts here + void setup(); + + void loop(); + void reset(); + + void beginStrip(); + void handleConnection(); + void initAP(bool resetAP = false); + void initConnection(); + void initInterfaces(); + void handleStatusLED(); +}; diff --git a/wled00/wled.h b/wled00/wled.h index efd58eb7..f266e8df 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -12,6 +12,7 @@ // ESP8266-01 (blue) got too little storage space to work with all features of WLED. To use it, you must use ESP8266 Arduino Core v2.4.2 and the setting 512K(No SPIFFS). +#ifndef USE_CONFIG_OVERRIDE // ESP8266-01 (black) has 1MB flash and can thus fit the whole program. Use 1M(64K SPIFFS). // Uncomment some of the following lines to disable features to compile for ESP8266-01 (max flash size 434kB): // Alternatively, with platformio pass your chosen flags to your custom build target in platformio.ini.override @@ -559,4 +560,11 @@ public: void initInterfaces(); void handleStatusLED(); }; +#endif // USE_CONFIG_OVERRIDE + +// User settings in file "user_config_override.h" added in gitignore so it will not be overwritten +#ifdef USE_CONFIG_OVERRIDE + #include "user_config_override.h" // Configuration overrides +#endif + #endif // WLED_H