2020-04-10 12:30:08 +02:00
# ifndef WLED_H
# define WLED_H
/*
Main sketch , global variable declarations
@ title WLED project sketch
2021-07-10 16:14:17 +02:00
@ version 0.13 .0 - b2
2020-04-10 12:30:08 +02:00
@ author Christian Schwinne
*/
// version code in format yymmddb (b = daily build)
2021-07-10 16:14:17 +02:00
# define VERSION 2107100
2020-04-10 12:30:08 +02:00
2020-11-18 00:54:41 +01:00
//uncomment this if you have a "my_config.h" file you'd like to use
//#define WLED_USE_MY_CONFIG
2020-09-09 09:51:04 +02:00
// ESP8266-01 (blue) got too little storage space to work with WLED. 0.10.2 is the last release supporting this unit.
2020-04-10 12:30:08 +02:00
2020-09-09 09:51:04 +02:00
// ESP8266-01 (black) has 1MB flash and can thus fit the whole program, although OTA update is not possible. Use 1M(128K SPIFFS).
2021-04-03 00:15:28 +02:00
// Uncomment some of the following lines to disable features:
// Alternatively, with platformio pass your chosen flags to your custom build target in platformio_override.ini
2020-04-10 12:30:08 +02:00
// You are required to disable over-the-air updates:
//#define WLED_DISABLE_OTA // saves 14kb
2020-12-22 13:15:57 +01:00
// You can choose some of these features to disable:
2020-04-10 12:30:08 +02:00
//#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
2020-05-28 02:20:02 +02:00
# ifndef WLED_DISABLE_MQTT
# define WLED_ENABLE_MQTT // saves 12kb
# endif
2020-04-10 12:30:08 +02:00
# define WLED_ENABLE_ADALIGHT // saves 500b only
//#define WLED_ENABLE_DMX // uses 3.5kb (use LEDPIN other than 2)
2020-09-27 11:43:28 +02:00
# define WLED_ENABLE_LOXONE // uses 1.2kb
2020-08-31 17:03:07 +02:00
# ifndef WLED_DISABLE_WEBSOCKETS
# define WLED_ENABLE_WEBSOCKETS
# endif
2020-04-10 12:30:08 +02:00
2020-11-15 15:45:51 +01:00
# define WLED_ENABLE_FS_EDITOR // enable /edit page for editing FS content. Will also be disabled with OTA lock
2020-04-10 12:30:08 +02:00
// to toggle usb serial debug (un)comment the following line
//#define WLED_DEBUG
2020-09-13 22:00:47 +02:00
// filesystem specific debugging
2020-10-23 17:48:01 +02:00
//#define WLED_DEBUG_FS
2020-09-13 22:00:47 +02:00
2021-04-03 17:18:29 +02:00
//optionally disable brownout detector on ESP32.
//This is generally a terrible idea, but improves boot success on boards with a 3.3v regulator + cap setup that can't provide 400mA peaks
//#define WLED_DISABLE_BROWNOUT_DET
2021-04-22 00:41:36 +02:00
// Library inclusions.
2020-04-10 12:30:08 +02:00
# include <Arduino.h>
# ifdef ESP8266
# include <ESP8266WiFi.h>
# include <ESP8266mDNS.h>
# include <ESPAsyncTCP.h>
2020-09-13 22:00:47 +02:00
# include <LittleFS.h>
2020-04-10 12:30:08 +02:00
extern " C "
{
# include <user_interface.h>
}
# else // ESP32
# include <WiFi.h>
2020-11-13 18:25:13 +01:00
# include <ETH.h>
2020-04-10 12:30:08 +02:00
# include "esp_wifi.h"
# include <ESPmDNS.h>
# include <AsyncTCP.h>
2020-11-08 23:44:10 +01:00
//#include "SPIFFS.h"
2021-02-27 00:20:31 +01:00
# ifndef CONFIG_LITTLEFS_FOR_IDF_3_2
# define CONFIG_LITTLEFS_FOR_IDF_3_2
# endif
2020-11-08 23:44:10 +01:00
# include <LITTLEFS.h>
2020-04-10 12:30:08 +02:00
# endif
2020-11-17 08:57:05 +01:00
# include "src/dependencies/network/Network.h"
2020-11-13 18:25:13 +01:00
2020-11-18 00:54:41 +01:00
# ifdef WLED_USE_MY_CONFIG
# include "my_config.h"
# endif
2020-04-10 12:30:08 +02:00
# include <ESPAsyncWebServer.h>
# include <EEPROM.h>
# include <WiFiUdp.h>
# include <DNSServer.h>
# ifndef WLED_DISABLE_OTA
# include <ArduinoOTA.h>
# endif
# include <SPIFFSEditor.h>
# include "src/dependencies/time/TimeLib.h"
# include "src/dependencies/timezone/Timezone.h"
2021-05-24 14:34:03 +02:00
# include "src/dependencies/toki/Toki.h"
2020-04-10 12:30:08 +02:00
# 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
2020-04-21 22:56:14 +02:00
# ifdef WLED_ENABLE_DMX
# include "src/dependencies/dmx/ESPDMX.h"
# endif
2020-04-10 12:30:08 +02:00
# include "src/dependencies/e131/ESPAsyncE131.h"
# include "src/dependencies/async-mqtt-client/AsyncMqttClient.h"
2020-09-20 01:18:31 +02:00
# define ARDUINOJSON_DECODE_UNICODE 0
2020-04-10 12:30:08 +02:00
# include "src/dependencies/json/AsyncJson-v6.h"
# include "src/dependencies/json/ArduinoJson-v6.h"
2021-05-20 19:54:07 +02:00
// ESP32-WROVER features SPI RAM (aka PSRAM) which can be allocated using ps_malloc()
// we can create custom PSRAMDynamicJsonDocument to use such feature (replacing DynamicJsonDocument)
// The following is a construct to enable code to compile without it.
// There is a code thet will still not use PSRAM though:
// AsyncJsonResponse is a derived class that implements DynamicJsonDocument (AsyncJson-v6.h)
2021-05-30 01:31:04 +02:00
# if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_PSRAM)
2021-05-20 19:54:07 +02:00
struct PSRAM_Allocator {
void * allocate ( size_t size ) {
if ( psramFound ( ) ) return ps_malloc ( size ) ; // use PSRAM if it exists
else return malloc ( size ) ; // fallback
}
void deallocate ( void * pointer ) {
free ( pointer ) ;
}
} ;
using PSRAMDynamicJsonDocument = BasicJsonDocument < PSRAM_Allocator > ;
# else
# define PSRAMDynamicJsonDocument DynamicJsonDocument
# endif
2020-04-10 12:30:08 +02:00
# 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"
2021-01-22 16:17:18 +01:00
# include "NodeStruct.h"
2021-01-16 00:50:43 +01:00
# include "pin_manager.h"
2021-01-21 01:21:16 +01:00
# include "bus_manager.h"
2021-07-12 16:33:43 +02:00
//#include "wasmfx.h"
2020-04-10 12:30:08 +02:00
# ifndef CLIENT_SSID
# define CLIENT_SSID DEFAULT_CLIENT_SSID
# endif
# ifndef CLIENT_PASS
# define CLIENT_PASS ""
# endif
2020-11-09 11:09:47 +01:00
# ifndef SPIFFS_EDITOR_AIRCOOOKIE
2020-11-03 00:35:04 +01:00
# error You are not using the Aircoookie fork of the ESPAsyncWebserver library.\
Using upstream puts your WiFi password at risk of being served by the filesystem . \
Comment out this error message to build regardless .
2020-11-09 11:09:47 +01:00
# endif
2020-11-03 00:35:04 +01:00
2020-04-10 12:30:08 +02:00
# ifndef WLED_DISABLE_INFRARED
# include <IRremoteESP8266.h>
# include <IRrecv.h>
# include <IRutils.h>
# endif
2020-11-08 23:44:10 +01:00
//Filesystem to use for preset and config files. SPIFFS or LittleFS on ESP8266, SPIFFS only on ESP32 (now using LITTLEFS port by lorol)
2020-09-14 00:31:38 +02:00
# ifdef ESP8266
# define WLED_FS LittleFS
# else
2020-11-08 23:44:10 +01:00
# define WLED_FS LITTLEFS
2020-09-14 00:31:38 +02:00
# endif
2020-09-09 09:51:04 +02:00
2020-04-10 12:30:08 +02:00
// 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
2021-04-22 00:41:36 +02:00
# define STRINGIFY(X) #X
# define TOSTRING(X) STRINGIFY(X)
# ifndef WLED_VERSION
# define WLED_VERSION "dev"
# endif
2020-04-10 12:30:08 +02:00
// Global Variable definitions
2021-04-22 00:41:36 +02:00
WLED_GLOBAL char versionString [ ] _INIT ( TOSTRING ( WLED_VERSION ) ) ;
2021-06-30 01:23:35 +02:00
# define WLED_CODENAME "Toki"
2020-04-10 12:30:08 +02:00
// 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 ) ;
2021-06-30 00:45:36 +02:00
// Hardware and pin config
2021-01-17 00:20:31 +01:00
# ifndef BTNPIN
2021-05-20 19:54:07 +02:00
WLED_GLOBAL int8_t btnPin [ WLED_MAX_BUTTONS ] _INIT ( { 0 } ) ;
2021-01-17 00:20:31 +01:00
# else
2021-05-20 19:54:07 +02:00
WLED_GLOBAL int8_t btnPin [ WLED_MAX_BUTTONS ] _INIT ( { BTNPIN } ) ;
2021-01-17 00:20:31 +01:00
# endif
# ifndef RLYPIN
2021-04-14 01:16:32 +02:00
WLED_GLOBAL int8_t rlyPin _INIT ( 12 ) ;
2021-01-17 00:20:31 +01:00
# else
WLED_GLOBAL int8_t rlyPin _INIT ( RLYPIN ) ;
# endif
2021-03-04 12:10:18 +01:00
//Relay mode (1 = active high, 0 = active low, flipped in cfg.json)
2021-01-17 00:20:31 +01:00
# ifndef RLYMDE
2021-03-04 12:10:18 +01:00
WLED_GLOBAL bool rlyMde _INIT ( true ) ;
2021-01-17 00:20:31 +01:00
# else
WLED_GLOBAL bool rlyMde _INIT ( RLYMDE ) ;
# endif
# ifndef IRPIN
2021-05-20 21:41:39 +02:00
# ifdef WLED_DISABLE_INFRARED
WLED_GLOBAL int8_t irPin _INIT ( - 1 ) ;
# else
WLED_GLOBAL int8_t irPin _INIT ( 4 ) ;
# endif
2021-01-17 00:20:31 +01:00
# else
WLED_GLOBAL int8_t irPin _INIT ( IRPIN ) ;
# endif
2020-04-10 12:30:08 +02:00
2021-04-22 00:41:36 +02:00
//WLED_GLOBAL byte presetToApply _INIT(0);
2020-05-05 09:01:09 +02:00
2020-04-10 12:30:08 +02:00
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
2021-06-09 12:57:16 +02:00
# ifdef ARDUINO_ARCH_ESP32
WLED_GLOBAL bool noWifiSleep _INIT ( true ) ; // disabling modem sleep modes will increase heat output and power usage, but may help with connection issues
# else
WLED_GLOBAL bool noWifiSleep _INIT ( false ) ;
# endif
2021-01-15 10:37:45 +01:00
# ifdef WLED_USE_ETHERNET
2021-02-20 10:18:37 +01:00
# ifdef WLED_ETH_DEFAULT // default ethernet board type if specified
2021-02-20 09:54:54 +01:00
WLED_GLOBAL int ethernetType _INIT ( WLED_ETH_DEFAULT ) ; // ethernet board type
# else
2021-02-20 10:18:37 +01:00
WLED_GLOBAL int ethernetType _INIT ( WLED_ETH_NONE ) ; // use none for ethernet board type if default not defined
2021-04-22 00:41:36 +02:00
# endif
2021-01-15 10:37:45 +01:00
# endif
2020-04-10 12:30:08 +02:00
// LED CONFIG
2021-04-15 10:55:22 +02:00
WLED_GLOBAL uint16_t ledCount _INIT ( DEFAULT_LED_COUNT ) ; // overcurrent prevented by ABL
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
2020-04-10 12:30:08 +02:00
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 ) ;
2020-06-22 12:30:31 +02:00
WLED_GLOBAL byte nightlightMode _INIT ( NL_MODE_FADE ) ; // See const.h for available modes. Was nightlightFade
2020-04-10 12:30:08 +02:00
WLED_GLOBAL bool fadeTransition _INIT ( true ) ; // enable crossfading color transition
WLED_GLOBAL uint16_t transitionDelay _INIT ( 750 ) ; // default crossfade duration in ms
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
2021-01-22 16:17:18 +01:00
WLED_GLOBAL NodesMap Nodes ;
2021-03-13 22:04:37 +01:00
WLED_GLOBAL bool nodeListEnabled _INIT ( true ) ;
WLED_GLOBAL bool nodeBroadcastEnabled _INIT ( true ) ;
2021-01-22 16:17:18 +01:00
2021-05-20 19:54:07 +02:00
WLED_GLOBAL byte buttonType [ WLED_MAX_BUTTONS ] _INIT ( { BTN_TYPE_PUSH } ) ;
2020-04-10 12:30:08 +02:00
WLED_GLOBAL byte irEnabled _INIT ( 0 ) ; // Infrared receiver
WLED_GLOBAL uint16_t udpPort _INIT ( 21324 ) ; // WLED notifier default port
2020-09-27 11:43:28 +02:00
WLED_GLOBAL uint16_t udpPort2 _INIT ( 65506 ) ; // WLED notifier supplemental port
2020-04-10 12:30:08 +02:00
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
2020-05-09 00:29:42 +02:00
WLED_GLOBAL bool alexaEnabled _INIT ( false ) ; // enable device discovery by Amazon Echo
2020-04-10 12:30:08 +02:00
WLED_GLOBAL char alexaInvocationName [ 33 ] _INIT ( " Light " ) ; // speech control name of device. Choose something voice-to-text can understand
2021-05-20 19:54:07 +02:00
# ifndef WLED_DISABLE_BLYNK
2020-04-10 12:30:08 +02:00
WLED_GLOBAL char blynkApiKey [ 36 ] _INIT ( " " ) ; // Auth token for Blynk server. If empty, no connection will be made
2020-12-22 00:44:16 +01:00
WLED_GLOBAL char blynkHost [ 33 ] _INIT ( " blynk-cloud.com " ) ; // Default Blynk host
WLED_GLOBAL uint16_t blynkPort _INIT ( 80 ) ; // Default Blynk port
2021-05-20 19:54:07 +02:00
# endif
2020-04-10 12:30:08 +02:00
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
2020-04-21 22:56:14 +02:00
# 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
2020-04-10 12:30:08 +02:00
WLED_GLOBAL uint16_t e131Universe _INIT ( 1 ) ; // settings for E1.31 (sACN) protocol (only DMX_MODE_MULTIPLE_* can span over consequtive universes)
2020-04-13 00:42:27 +02:00
WLED_GLOBAL uint16_t e131Port _INIT ( 5568 ) ; // DMX in port. E1.31 default is 5568, Art-Net is 6454
2020-04-10 12:30:08 +02:00
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 ( false ) ;
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 ( " " ) ; // both domains and IPs should work (no SSL)
WLED_GLOBAL char mqttUser [ 41 ] _INIT ( " " ) ; // optional: username for MQTT auth
2021-06-30 01:23:35 +02:00
WLED_GLOBAL char mqttPass [ 65 ] _INIT ( " " ) ; // optional: password for MQTT auth
2020-04-10 12:30:08 +02:00
WLED_GLOBAL char mqttClientID [ 41 ] _INIT ( " " ) ; // override the client ID
WLED_GLOBAL uint16_t mqttPort _INIT ( 1883 ) ;
2021-05-20 19:54:07 +02:00
# ifndef WLED_DISABLE_HUESYNC
2020-04-10 12:30:08 +02:00
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)
2021-02-27 01:16:06 +01:00
WLED_GLOBAL IPAddress hueIP _INIT_N ( ( ( 0 , 0 , 0 , 0 ) ) ) ; // IP address of the bridge
2020-04-10 12:30:08 +02:00
WLED_GLOBAL bool hueApplyOnOff _INIT ( true ) ;
WLED_GLOBAL bool hueApplyBri _INIT ( true ) ;
WLED_GLOBAL bool hueApplyColor _INIT ( true ) ;
2021-05-20 19:54:07 +02:00
# endif
2020-04-10 12:30:08 +02:00
// Time CONFIG
WLED_GLOBAL bool ntpEnabled _INIT ( false ) ; // 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 ( 0 ) ; // Timezone ID. Refer to timezones array in wled10_ntp.ino
WLED_GLOBAL int utcOffsetSecs _INIT ( 0 ) ; // Seconds to offset from UTC before timzone calculation
2021-05-27 00:09:52 +02:00
WLED_GLOBAL byte overlayDefault _INIT ( 0 ) ; // 0: no overlay 1: analog clock 2: single-digit clock 3: cronixie
2020-04-10 12:30:08 +02:00
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
2021-05-20 19:54:07 +02:00
# ifndef WLED_DISABLE_CRONIXIE
2020-04-10 12:30:08 +02:00
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
2021-05-20 19:54:07 +02:00
# endif
2020-04-10 12:30:08 +02:00
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 macroNl _INIT ( 0 ) ; // after nightlight delay over
WLED_GLOBAL byte macroCountdown _INIT ( 0 ) ;
WLED_GLOBAL byte macroAlexaOn _INIT ( 0 ) , macroAlexaOff _INIT ( 0 ) ;
2021-05-20 19:54:07 +02:00
WLED_GLOBAL byte macroButton [ WLED_MAX_BUTTONS ] _INIT ( { 0 } ) ;
WLED_GLOBAL byte macroLongPress [ WLED_MAX_BUTTONS ] _INIT ( { 0 } ) ;
WLED_GLOBAL byte macroDoublePress [ WLED_MAX_BUTTONS ] _INIT ( { 0 } ) ;
2020-04-10 12:30:08 +02:00
// 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 ( true ) ; // 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 colIT [ ] _INIT_N ( ( { 0 , 0 , 0 , 0 } ) ) ; // color that was last sent to LEDs
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
2021-07-01 20:51:52 +02:00
WLED_GLOBAL bool buttonPublishMqtt _INIT ( false ) ;
2021-05-20 19:54:07 +02:00
WLED_GLOBAL bool buttonPressedBefore [ WLED_MAX_BUTTONS ] _INIT ( { false } ) ;
WLED_GLOBAL bool buttonLongPressed [ WLED_MAX_BUTTONS ] _INIT ( { false } ) ;
WLED_GLOBAL unsigned long buttonPressedTime [ WLED_MAX_BUTTONS ] _INIT ( { 0 } ) ;
WLED_GLOBAL unsigned long buttonWaitTime [ WLED_MAX_BUTTONS ] _INIT ( { 0 } ) ;
WLED_GLOBAL byte touchThreshold _INIT ( TOUCH_THRESHOLD ) ;
2020-04-10 12:30:08 +02:00
// notifications
WLED_GLOBAL bool notifyDirectDefault _INIT ( notifyDirect ) ;
WLED_GLOBAL bool receiveNotifications _INIT ( true ) ;
WLED_GLOBAL unsigned long notificationSentTime _INIT ( 0 ) ;
2021-07-09 18:54:28 +02:00
WLED_GLOBAL byte notificationSentCallMode _INIT ( CALL_MODE_INIT ) ;
2020-04-10 12:30:08 +02:00
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 ) ;
2021-03-01 22:44:28 +01:00
WLED_GLOBAL bool effectChanged _INIT ( false ) ;
2020-04-10 12:30:08 +02:00
// network
2020-09-27 11:43:28 +02:00
WLED_GLOBAL bool udpConnected _INIT ( false ) , udp2Connected _INIT ( false ) , udpRgbConnected _INIT ( false ) ;
2020-04-10 12:30:08 +02:00
// 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 ) ;
// cronixie
2021-05-27 00:09:52 +02:00
WLED_GLOBAL byte dP [ ] _INIT_N ( ( { 255 , 255 , 255 , 255 , 255 , 255 } ) ) ;
2020-04-10 12:30:08 +02:00
// countdown
WLED_GLOBAL unsigned long countdownTime _INIT ( 1514764800L ) ;
WLED_GLOBAL bool countdownOverTriggered _INIT ( true ) ;
// timer
WLED_GLOBAL byte lastTimerMinute _INIT ( 0 ) ;
2021-04-12 21:53:22 +02:00
WLED_GLOBAL byte timerHours [ ] _INIT_N ( ( { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ) ) ;
WLED_GLOBAL int8_t timerMinutes [ ] _INIT_N ( ( { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ) ) ;
WLED_GLOBAL byte timerMacro [ ] _INIT_N ( ( { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ) ) ;
WLED_GLOBAL byte timerWeekday [ ] _INIT_N ( ( { 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 } ) ) ; // weekdays to activate on
2020-04-10 12:30:08 +02:00
// bit pattern of arr elem: 0b11111111: sun,sat,fri,thu,wed,tue,mon,validity
// blynk
WLED_GLOBAL bool blynkEnabled _INIT ( false ) ;
2021-06-30 01:48:38 +02:00
//playlists
2020-04-10 12:30:08 +02:00
WLED_GLOBAL unsigned long presetCycledTime _INIT ( 0 ) ;
2021-07-10 16:14:17 +02:00
WLED_GLOBAL int16_t currentPlaylist _INIT ( - 1 ) ;
2021-07-04 13:23:45 +02:00
//still used for "PL=~" HTTP API command
WLED_GLOBAL byte presetCycleMin _INIT ( 1 ) , presetCycleMax _INIT ( 5 ) ;
WLED_GLOBAL byte presetCycCurr _INIT ( presetCycleMin ) ;
2020-11-11 23:48:14 +01:00
2020-04-10 12:30:08 +02:00
// realtime
WLED_GLOBAL byte realtimeMode _INIT ( REALTIME_MODE_INACTIVE ) ;
2020-04-30 01:52:36 +02:00
WLED_GLOBAL byte realtimeOverride _INIT ( REALTIME_OVERRIDE_NONE ) ;
2021-02-27 00:20:31 +01:00
WLED_GLOBAL IPAddress realtimeIP _INIT_N ( ( ( 0 , 0 , 0 , 0 ) ) ) ; ;
2020-04-10 12:30:08 +02:00
WLED_GLOBAL unsigned long realtimeTimeout _INIT ( 0 ) ;
2020-08-19 10:40:16 +02:00
WLED_GLOBAL uint8_t tpmPacketCount _INIT ( 0 ) ;
WLED_GLOBAL uint16_t tpmPayloadFrameSize _INIT ( 0 ) ;
2020-04-10 12:30:08 +02:00
// mqtt
2021-02-27 01:16:06 +01:00
WLED_GLOBAL unsigned long lastMqttReconnectAttempt _INIT ( 0 ) ;
WLED_GLOBAL unsigned long lastInterfaceUpdate _INIT ( 0 ) ;
2021-07-09 18:54:28 +02:00
WLED_GLOBAL byte interfaceUpdateCallMode _INIT ( CALL_MODE_INIT ) ;
2020-04-10 12:30:08 +02:00
WLED_GLOBAL char mqttStatusTopic [ 40 ] _INIT ( " " ) ; // this must be global because of async handlers
// 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 ) ;
2020-08-04 15:32:54 +02:00
WLED_GLOBAL time_t localTime _INIT ( 0 ) ;
2020-04-10 12:30:08 +02:00
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 ) ;
2020-04-30 01:52:36 +02:00
WLED_GLOBAL uint16_t rolloverMillis _INIT ( 0 ) ;
2021-04-12 21:53:22 +02:00
WLED_GLOBAL float longitude _INIT ( 0.0 ) ;
WLED_GLOBAL float latitude _INIT ( 0.0 ) ;
WLED_GLOBAL time_t sunrise _INIT ( 0 ) ;
WLED_GLOBAL time_t sunset _INIT ( 0 ) ;
2021-05-24 14:34:03 +02:00
WLED_GLOBAL Toki toki _INIT ( Toki ( ) ) ;
2020-04-10 12:30:08 +02:00
// Temp buffer
WLED_GLOBAL char * obuf ;
WLED_GLOBAL uint16_t olen _INIT ( 0 ) ;
2020-10-07 17:48:22 +02:00
// General filesystem
WLED_GLOBAL size_t fsBytesUsed _INIT ( 0 ) ;
WLED_GLOBAL size_t fsBytesTotal _INIT ( 0 ) ;
WLED_GLOBAL unsigned long presetsModifiedTime _INIT ( 0L ) ;
2020-10-08 00:52:15 +02:00
WLED_GLOBAL JsonDocument * fileDoc ;
2020-10-13 01:39:34 +02:00
WLED_GLOBAL bool doCloseFile _INIT ( false ) ;
2020-10-07 17:48:22 +02:00
2020-04-10 12:30:08 +02:00
// presets
2020-10-03 00:29:36 +02:00
WLED_GLOBAL int16_t currentPreset _INIT ( - 1 ) ;
2020-04-10 12:30:08 +02:00
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 ) ) ) ;
2020-06-26 17:28:35 +02:00
# ifdef WLED_ENABLE_WEBSOCKETS
WLED_GLOBAL AsyncWebSocket ws _INIT_N ( ( ( " /ws " ) ) ) ;
# endif
2020-04-10 12:30:08 +02:00
WLED_GLOBAL AsyncClient * hueClient _INIT ( NULL ) ;
WLED_GLOBAL AsyncMqttClient * mqtt _INIT ( NULL ) ;
// udp interface objects
2020-09-27 11:43:28 +02:00
WLED_GLOBAL WiFiUDP notifierUdp , rgbUdp , notifier2Udp ;
2020-04-10 12:30:08 +02:00
WLED_GLOBAL WiFiUDP ntpUdp ;
WLED_GLOBAL ESPAsyncE131 e131 _INIT_N ( ( ( handleE131Packet ) ) ) ;
WLED_GLOBAL bool e131NewData _INIT ( false ) ;
// led fx library object
2021-01-21 01:21:16 +01:00
WLED_GLOBAL BusManager busses _INIT ( BusManager ( ) ) ;
2020-04-10 12:30:08 +02:00
WLED_GLOBAL WS2812FX strip _INIT ( WS2812FX ( ) ) ;
2021-04-22 00:41:36 +02:00
WLED_GLOBAL BusConfig * busConfigs [ WLED_MAX_BUSSES ] _INIT ( { nullptr } ) ; //temporary, to remember values from network callback until after
2021-03-23 03:10:24 +01:00
WLED_GLOBAL bool doInitBusses _INIT ( false ) ;
2020-04-10 12:30:08 +02:00
2021-07-12 16:33:43 +02:00
// WASM
WLED_GLOBAL WASMFX wasmfx _INIT ( WASMFX ( ) ) ;
2020-05-28 02:20:02 +02:00
// Usermod manager
WLED_GLOBAL UsermodManager usermods _INIT ( UsermodManager ( ) ) ;
2020-10-19 18:08:45 +02:00
// Status LED
2021-01-17 00:20:31 +01:00
# if STATUSLED
2020-10-19 18:08:45 +02:00
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
2020-09-09 09:51:04 +02:00
// enable additional debug output
# ifdef WLED_DEBUG
# ifndef ESP8266
# include <rom/rtc.h>
# endif
# define DEBUG_PRINT(x) Serial.print(x)
# define DEBUG_PRINTLN(x) Serial.println(x)
2020-09-13 22:00:47 +02:00
# define DEBUG_PRINTF(x...) Serial.printf(x)
2020-09-09 09:51:04 +02:00
# else
# define DEBUG_PRINT(x)
# define DEBUG_PRINTLN(x)
2021-04-02 18:04:10 +02:00
# define DEBUG_PRINTF(x...)
2020-09-09 09:51:04 +02:00
# endif
# ifdef WLED_DEBUG_FS
# define DEBUGFS_PRINT(x) Serial.print(x)
# define DEBUGFS_PRINTLN(x) Serial.println(x)
2020-09-13 22:00:47 +02:00
# define DEBUGFS_PRINTF(x...) Serial.printf(x)
2020-09-09 09:51:04 +02:00
# else
# define DEBUGFS_PRINT(x)
# define DEBUGFS_PRINTLN(x)
2020-10-23 17:48:01 +02:00
# define DEBUGFS_PRINTF(x...)
2020-09-09 09:51:04 +02:00
# endif
2020-04-10 12:30:08 +02:00
// 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
2020-11-13 18:25:13 +01:00
# ifdef ARDUINO_ARCH_ESP32
# define WLED_CONNECTED (WiFi.status() == WL_CONNECTED || ETH.localIP()[0] != 0)
# else
# define WLED_CONNECTED (WiFi.status() == WL_CONNECTED)
# endif
2020-04-10 12:30:08 +02:00
# define WLED_WIFI_CONFIGURED (strlen(clientSSID) >= 1 && strcmp(clientSSID, DEFAULT_CLIENT_SSID) != 0)
2020-05-28 02:20:02 +02:00
# define WLED_MQTT_CONNECTED (mqtt != nullptr && mqtt->connected())
2020-04-10 12:30:08 +02:00
// 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 ( ) ;
2020-10-19 18:08:45 +02:00
void handleStatusLED ( ) ;
2020-04-10 12:30:08 +02:00
} ;
# endif // WLED_H