2025-01-19 09:17:33 +00:00
# pragma once
2021-03-25 19:00:08 +00:00
# ifndef WLED_FCN_DECLARE_H
# define WLED_FCN_DECLARE_H
/*
* All globally accessible functions are declared here
*/
//alexa.cpp
2023-01-12 19:35:34 +00:00
# ifndef WLED_DISABLE_ALEXA
2021-03-25 19:00:08 +00:00
void onAlexaChange ( EspalexaDevice * dev ) ;
void alexaInit ( ) ;
void handleAlexa ( ) ;
void onAlexaChange ( EspalexaDevice * dev ) ;
2023-01-12 19:35:34 +00:00
# endif
2021-03-25 19:00:08 +00:00
//button.cpp
2021-05-19 16:39:16 +00:00
void shortPressAction ( uint8_t b = 0 ) ;
2022-01-21 16:30:52 +00:00
void longPressAction ( uint8_t b = 0 ) ;
void doublePressAction ( uint8_t b = 0 ) ;
2021-05-19 16:39:16 +00:00
bool isButtonPressed ( uint8_t b = 0 ) ;
2021-03-25 19:00:08 +00:00
void handleButton ( ) ;
void handleIO ( ) ;
2024-02-18 14:52:36 +00:00
void IRAM_ATTR touchButtonISR ( ) ;
2021-03-25 19:00:08 +00:00
//cfg.cpp
2021-05-10 23:11:16 +00:00
bool deserializeConfig ( JsonObject doc , bool fromFS = false ) ;
2025-07-01 08:17:17 +00:00
bool deserializeConfigFromFS ( ) ;
2021-03-25 19:00:08 +00:00
bool deserializeConfigSec ( ) ;
2025-03-23 19:15:52 +00:00
void serializeConfig ( JsonObject doc ) ;
void serializeConfigToFS ( ) ;
2021-03-25 19:00:08 +00:00
void serializeConfigSec ( ) ;
2021-07-05 21:14:57 +00:00
template < typename DestType >
bool getJsonValue ( const JsonVariant & element , DestType & destination ) {
if ( element . isNull ( ) ) {
return false ;
}
destination = element . as < DestType > ( ) ;
return true ;
}
template < typename DestType , typename DefaultType >
bool getJsonValue ( const JsonVariant & element , DestType & destination , const DefaultType defaultValue ) {
if ( ! getJsonValue ( element , destination ) ) {
destination = defaultValue ;
return false ;
}
return true ;
}
2024-01-20 23:30:15 +00:00
typedef struct WiFiConfig {
char clientSSID [ 33 ] ;
char clientPass [ 65 ] ;
2024-12-21 18:02:24 +00:00
uint8_t bssid [ 6 ] ;
2024-01-20 23:30:15 +00:00
IPAddress staticIP ;
IPAddress staticGW ;
IPAddress staticSN ;
WiFiConfig ( const char * ssid = " " , const char * pass = " " , uint32_t ip = 0 , uint32_t gw = 0 , uint32_t subnet = 0x00FFFFFF ) // little endian
: staticIP ( ip )
, staticGW ( gw )
, staticSN ( subnet )
{
strncpy ( clientSSID , ssid , 32 ) ; clientSSID [ 32 ] = 0 ;
strncpy ( clientPass , pass , 64 ) ; clientPass [ 64 ] = 0 ;
2024-12-21 18:02:24 +00:00
memset ( bssid , 0 , sizeof ( bssid ) ) ;
2024-01-20 23:30:15 +00:00
}
} wifi_config ;
2021-07-05 21:14:57 +00:00
2021-03-25 19:00:08 +00:00
//colors.cpp
2024-09-11 19:41:42 +00:00
# define ColorFromPalette ColorFromPaletteWLED // override fastled version
2024-09-25 17:36:20 +00:00
2024-09-28 13:26:14 +00:00
// CRGBW can be used to manipulate 32bit colors faster. However: if it is passed to functions, it adds overhead compared to a uint32_t color
// use with caution and pay attention to flash size. Usually converting a uint32_t to CRGBW to extract r, g, b, w values is slower than using bitshifts
// it can be useful to avoid back and forth conversions between uint32_t and fastled CRGB
struct CRGBW {
union {
uint32_t color32 ; // Access as a 32-bit value (0xWWRRGGBB)
struct {
uint8_t b ;
uint8_t g ;
uint8_t r ;
uint8_t w ;
} ;
2024-09-28 13:38:41 +00:00
uint8_t raw [ 4 ] ; // Access as an array in the order B, G, R, W
2024-09-28 13:26:14 +00:00
} ;
// Default constructor
inline CRGBW ( ) __attribute__ ( ( always_inline ) ) = default ;
// Constructor from a 32-bit color (0xWWRRGGBB)
constexpr CRGBW ( uint32_t color ) __attribute__ ( ( always_inline ) ) : color32 ( color ) { }
// Constructor with r, g, b, w values
2024-09-28 13:38:41 +00:00
constexpr CRGBW ( uint8_t red , uint8_t green , uint8_t blue , uint8_t white = 0 ) __attribute__ ( ( always_inline ) ) : b ( blue ) , g ( green ) , r ( red ) , w ( white ) { }
2024-09-28 13:26:14 +00:00
// Constructor from CRGB
2024-09-28 13:38:41 +00:00
constexpr CRGBW ( CRGB rgb ) __attribute__ ( ( always_inline ) ) : b ( rgb . b ) , g ( rgb . g ) , r ( rgb . r ) , w ( 0 ) { }
2024-09-28 13:26:14 +00:00
// Access as an array
inline const uint8_t & operator [ ] ( uint8_t x ) const __attribute__ ( ( always_inline ) ) { return raw [ x ] ; }
// Assignment from 32-bit color
inline CRGBW & operator = ( uint32_t color ) __attribute__ ( ( always_inline ) ) { color32 = color ; return * this ; }
// Assignment from r, g, b, w
2024-09-28 13:38:41 +00:00
inline CRGBW & operator = ( const CRGB & rgb ) __attribute__ ( ( always_inline ) ) { b = rgb . b ; g = rgb . g ; r = rgb . r ; w = 0 ; return * this ; }
2024-09-28 13:26:14 +00:00
// Conversion operator to uint32_t
inline operator uint32_t ( ) const __attribute__ ( ( always_inline ) ) {
return color32 ;
}
/*
// Conversion operator to CRGB
inline operator CRGB ( ) const __attribute__ ( ( always_inline ) ) {
return CRGB ( r , g , b ) ;
}
CRGBW & scale32 ( uint8_t scaledown ) // 32bit math
{
if ( color32 = = 0 ) return * this ; // 2 extra instructions, worth it if called a lot on black (which probably is true) adding check if scaledown is zero adds much more overhead as its 8bit
uint32_t scale = scaledown + 1 ;
uint32_t rb = ( ( ( color32 & 0x00FF00FF ) * scale ) > > 8 ) & 0x00FF00FF ; // scale red and blue
uint32_t wg = ( ( ( color32 & 0xFF00FF00 ) > > 8 ) * scale ) & 0xFF00FF00 ; // scale white and green
color32 = rb | wg ;
return * this ;
} */
} ;
2024-09-25 17:36:20 +00:00
struct CHSV32 { // 32bit HSV color with 16bit hue for more accurate conversions
union {
struct {
uint16_t h ; // hue
uint8_t s ; // saturation
uint8_t v ; // value
} ;
uint32_t raw ; // 32bit access
} ;
inline CHSV32 ( ) __attribute__ ( ( always_inline ) ) = default ; // default constructor
/// Allow construction from hue, saturation, and value
/// @param ih input hue
/// @param is input saturation
/// @param iv input value
inline CHSV32 ( uint16_t ih , uint8_t is , uint8_t iv ) __attribute__ ( ( always_inline ) ) // constructor from 16bit h, s, v
: h ( ih ) , s ( is ) , v ( iv ) { }
inline CHSV32 ( uint8_t ih , uint8_t is , uint8_t iv ) __attribute__ ( ( always_inline ) ) // constructor from 8bit h, s, v
: h ( ( uint16_t ) ih < < 8 ) , s ( is ) , v ( iv ) { }
inline CHSV32 ( const CHSV & chsv ) __attribute__ ( ( always_inline ) ) // constructor from CHSV
: h ( ( uint16_t ) chsv . h < < 8 ) , s ( chsv . s ) , v ( chsv . v ) { }
inline operator CHSV ( ) const { return CHSV ( ( uint8_t ) ( h > > 8 ) , s , v ) ; } // typecast to CHSV
} ;
2023-06-10 18:43:27 +00:00
// similar to NeoPixelBus NeoGammaTableMethod but allows dynamic changes (superseded by NPB::NeoGammaDynamicTableMethod)
class NeoGammaWLEDMethod {
public :
2024-09-11 15:14:59 +00:00
[ [ gnu : : hot ] ] static uint8_t Correct ( uint8_t value ) ; // apply Gamma to single channel
[ [ gnu : : hot ] ] static uint32_t Correct32 ( uint32_t color ) ; // apply Gamma to RGBW32 color (WLED specific, not used by NPB)
2025-06-11 06:30:25 +00:00
[ [ gnu : : hot ] ] static uint32_t inverseGamma32 ( uint32_t color ) ; // apply inverse Gamma to RGBW32 color
2025-06-07 11:15:45 +00:00
static void calcGammaTable ( float gamma ) ; // re-calculates & fills gamma tables
2023-06-10 18:43:27 +00:00
static inline uint8_t rawGamma8 ( uint8_t val ) { return gammaT [ val ] ; } // get value from Gamma table (WLED specific, not used by NPB)
2025-06-07 11:15:45 +00:00
static inline uint8_t rawInverseGamma8 ( uint8_t val ) { return gammaT_inv [ val ] ; } // get value from inverse Gamma table (WLED specific, not used by NPB)
2023-06-10 18:43:27 +00:00
private :
static uint8_t gammaT [ ] ;
2025-06-07 11:15:45 +00:00
static uint8_t gammaT_inv [ ] ;
2023-06-10 18:43:27 +00:00
} ;
# define gamma32(c) NeoGammaWLEDMethod::Correct32(c)
# define gamma8(c) NeoGammaWLEDMethod::rawGamma8(c)
2025-06-11 06:30:25 +00:00
# define gamma32inv(c) NeoGammaWLEDMethod::inverseGamma32(c)
2025-06-07 11:15:45 +00:00
# define gamma8inv(c) NeoGammaWLEDMethod::rawInverseGamma8(c)
2025-01-09 12:29:06 +00:00
[ [ gnu : : hot , gnu : : pure ] ] uint32_t color_blend ( uint32_t c1 , uint32_t c2 , uint8_t blend ) ;
2024-12-19 17:20:56 +00:00
inline uint32_t color_blend16 ( uint32_t c1 , uint32_t c2 , uint16_t b ) { return color_blend ( c1 , c2 , b > > 8 ) ; } ;
2025-01-09 12:29:06 +00:00
[ [ gnu : : hot , gnu : : pure ] ] uint32_t color_add ( uint32_t , uint32_t , bool preserveCR = false ) ;
[ [ gnu : : hot , gnu : : pure ] ] uint32_t color_fade ( uint32_t c1 , uint8_t amount , bool video = false ) ;
2025-07-12 05:40:18 +00:00
[ [ gnu : : hot , gnu : : pure ] ] uint32_t adjust_color ( uint32_t rgb , uint32_t hueShift , uint32_t lighten , uint32_t brighten ) ;
2025-01-09 12:29:06 +00:00
[ [ gnu : : hot , gnu : : pure ] ] uint32_t ColorFromPaletteWLED ( const CRGBPalette16 & pal , unsigned index , uint8_t brightness = ( uint8_t ) 255U , TBlendType blendType = LINEARBLEND ) ;
2025-01-07 19:33:10 +00:00
CRGBPalette16 generateHarmonicRandomPalette ( const CRGBPalette16 & basepalette ) ;
2024-09-11 15:14:59 +00:00
CRGBPalette16 generateRandomPalette ( ) ;
2025-04-22 20:37:18 +00:00
void loadCustomPalettes ( ) ;
2025-04-26 18:08:15 +00:00
extern std : : vector < CRGBPalette16 > customPalettes ;
inline size_t getPaletteCount ( ) { return 13 + GRADIENT_PALETTE_COUNT + customPalettes . size ( ) ; }
2022-01-14 13:27:11 +00:00
inline uint32_t colorFromRgbw ( byte * rgbw ) { return uint32_t ( ( byte ( rgbw [ 3 ] ) < < 24 ) | ( byte ( rgbw [ 0 ] ) < < 16 ) | ( byte ( rgbw [ 1 ] ) < < 8 ) | ( byte ( rgbw [ 2 ] ) ) ) ; }
2024-09-25 17:36:20 +00:00
void hsv2rgb ( const CHSV32 & hsv , uint32_t & rgb ) ;
void colorHStoRGB ( uint16_t hue , byte sat , byte * rgb ) ;
void rgb2hsv ( const uint32_t rgb , CHSV32 & hsv ) ;
inline CHSV rgb2hsv ( const CRGB c ) { CHSV32 hsv ; rgb2hsv ( ( uint32_t ( ( byte ( c . r ) < < 16 ) | ( byte ( c . g ) < < 8 ) | ( byte ( c . b ) ) ) ) , hsv ) ; return CHSV ( hsv ) ; } // CRGB to hsv
2021-03-25 19:00:08 +00:00
void colorKtoRGB ( uint16_t kelvin , byte * rgb ) ;
void colorCTtoRGB ( uint16_t mired , byte * rgb ) ; //white spectrum to rgb
void colorXYtoRGB ( float x , float y , byte * rgb ) ; // only defined if huesync disabled TODO
2025-01-09 12:29:06 +00:00
void colorRGBtoXY ( const byte * rgb , float * xy ) ; // only defined if huesync disabled TODO
2025-01-07 19:33:10 +00:00
void colorFromDecOrHexString ( byte * rgb , const char * in ) ;
2021-03-25 19:00:08 +00:00
bool colorFromHexString ( byte * rgb , const char * in ) ;
2021-10-16 13:13:30 +00:00
uint32_t colorBalanceFromKelvin ( uint16_t kelvin , uint32_t rgb ) ;
2021-11-24 10:02:25 +00:00
uint16_t approximateKelvinFromRGB ( uint32_t rgb ) ;
2022-02-20 21:24:11 +00:00
void setRandomColor ( byte * rgb ) ;
2023-08-23 13:04:28 +00:00
//dmx_output.cpp
void initDMXOutput ( ) ;
2023-08-23 12:52:57 +00:00
void handleDMXOutput ( ) ;
2023-08-14 12:12:08 +00:00
//dmx_input.cpp
void initDMXInput ( ) ;
void handleDMXInput ( ) ;
2021-03-25 19:00:08 +00:00
//e131.cpp
void handleE131Packet ( e131_packet_t * p , IPAddress clientIP , byte protocol ) ;
2025-01-16 12:48:36 +00:00
void handleDMXData ( uint16_t uni , uint16_t dmxChannels , uint8_t * e131_data , uint8_t mde , uint8_t previousUniverses ) ;
2022-09-22 18:34:46 +00:00
void handleArtnetPollReply ( IPAddress ipAddress ) ;
void prepareArtnetPollReply ( ArtPollReply * reply ) ;
void sendArtnetPollReply ( ArtPollReply * reply , IPAddress ipAddress , uint16_t portAddress ) ;
2021-03-25 19:00:08 +00:00
//file.cpp
bool handleFileRead ( AsyncWebServerRequest * , String path ) ;
2025-01-07 19:33:10 +00:00
bool writeObjectToFileUsingId ( const char * file , uint16_t id , const JsonDocument * content ) ;
bool writeObjectToFile ( const char * file , const char * key , const JsonDocument * content ) ;
2025-01-20 07:59:35 +00:00
bool readObjectFromFileUsingId ( const char * file , uint16_t id , JsonDocument * dest , const JsonDocument * filter = nullptr ) ;
bool readObjectFromFile ( const char * file , const char * key , JsonDocument * dest , const JsonDocument * filter = nullptr ) ;
2021-03-25 19:00:08 +00:00
void updateFSInfo ( ) ;
void closeFile ( ) ;
2025-01-07 19:33:10 +00:00
inline bool writeObjectToFileUsingId ( const String & file , uint16_t id , const JsonDocument * content ) { return writeObjectToFileUsingId ( file . c_str ( ) , id , content ) ; } ;
inline bool writeObjectToFile ( const String & file , const char * key , const JsonDocument * content ) { return writeObjectToFile ( file . c_str ( ) , key , content ) ; } ;
2025-01-20 07:59:35 +00:00
inline bool readObjectFromFileUsingId ( const String & file , uint16_t id , JsonDocument * dest , const JsonDocument * filter = nullptr ) { return readObjectFromFileUsingId ( file . c_str ( ) , id , dest ) ; } ;
inline bool readObjectFromFile ( const String & file , const char * key , JsonDocument * dest , const JsonDocument * filter = nullptr ) { return readObjectFromFile ( file . c_str ( ) , key , dest ) ; } ;
2021-03-25 19:00:08 +00:00
//hue.cpp
void handleHue ( ) ;
void reconnectHue ( ) ;
void onHueError ( void * arg , AsyncClient * client , int8_t error ) ;
void onHueConnect ( void * arg , AsyncClient * client ) ;
void sendHuePoll ( ) ;
void onHueData ( void * arg , AsyncClient * client , void * data , size_t len ) ;
2023-06-30 21:59:29 +00:00
//image_loader.cpp
2025-04-23 16:38:34 +00:00
class Segment ;
2025-01-14 18:40:41 +00:00
# ifdef WLED_ENABLE_GIF
2023-06-30 21:59:29 +00:00
bool fileSeekCallback ( unsigned long position ) ;
unsigned long filePositionCallback ( void ) ;
int fileReadCallback ( void ) ;
int fileReadBlockCallback ( void * buffer , int numberOfBytes ) ;
int fileSizeCallback ( void ) ;
2023-07-31 16:13:03 +00:00
byte renderImageToSegment ( Segment & seg ) ;
2024-03-10 20:36:13 +00:00
void endImagePlayback ( Segment * seg ) ;
2023-07-31 16:13:03 +00:00
# endif
2023-06-30 21:59:29 +00:00
2021-11-16 22:20:26 +00:00
//improv.cpp
2023-06-26 23:51:44 +00:00
enum ImprovRPCType {
Command_Wifi = 0x01 ,
Request_State = 0x02 ,
Request_Info = 0x03 ,
Request_Scan = 0x04
} ;
2021-11-16 22:20:26 +00:00
void handleImprovPacket ( ) ;
2023-06-26 23:51:44 +00:00
void sendImprovRPCResult ( ImprovRPCType type , uint8_t n_strings = 0 , const char * * strings = nullptr ) ;
2021-11-16 22:20:26 +00:00
void sendImprovStateResponse ( uint8_t state , bool error = false ) ;
void sendImprovInfoResponse ( ) ;
2023-06-26 23:51:44 +00:00
void startImprovWifiScan ( ) ;
void handleImprovWifiScan ( ) ;
void sendImprovIPRPCResult ( ImprovRPCType type ) ;
2021-11-16 22:20:26 +00:00
2021-03-25 19:00:08 +00:00
//ir.cpp
void initIR ( ) ;
2024-05-03 13:45:15 +00:00
void deInitIR ( ) ;
2021-03-25 19:00:08 +00:00
void handleIR ( ) ;
//json.cpp
# include "ESPAsyncWebServer.h"
# include "src/dependencies/json/ArduinoJson-v6.h"
# include "src/dependencies/json/AsyncJson-v6.h"
2021-07-09 16:54:28 +00:00
bool deserializeState ( JsonObject root , byte callMode = CALL_MODE_DIRECT_CHANGE , byte presetId = 0 ) ;
2025-01-07 19:33:10 +00:00
void serializeSegment ( const JsonObject & root , const Segment & seg , byte id , bool forPreset = false , bool segmentBounds = true ) ;
2022-10-08 16:25:51 +00:00
void serializeState ( JsonObject root , bool forPreset = false , bool includeBri = true , bool segmentBounds = true , bool selectedSegmentsOnly = false ) ;
2021-03-25 19:00:08 +00:00
void serializeInfo ( JsonObject root ) ;
2025-01-09 13:39:54 +00:00
void serializeModeNames ( JsonArray arr ) ;
void serializeModeData ( JsonArray fxdata ) ;
2021-06-19 21:16:40 +00:00
void serveJson ( AsyncWebServerRequest * request ) ;
2022-02-01 11:02:04 +00:00
# ifdef WLED_ENABLE_JSONLIVE
2021-03-25 19:00:08 +00:00
bool serveLiveLeds ( AsyncWebServerRequest * request , uint32_t wsClient = 0 ) ;
2022-02-01 11:02:04 +00:00
# endif
2021-03-25 19:00:08 +00:00
//led.cpp
2022-02-25 09:24:00 +00:00
void setValuesFromSegment ( uint8_t s ) ;
2025-04-23 16:38:34 +00:00
# define setValuesFromMainSeg() setValuesFromSegment(strip.getMainSegmentId())
# define setValuesFromFirstSelectedSeg() setValuesFromSegment(strip.getFirstSelectedSegId())
2021-03-25 19:00:08 +00:00
void toggleOnOff ( ) ;
2022-02-20 21:24:11 +00:00
void applyBri ( ) ;
void applyFinalBri ( ) ;
2022-02-21 18:44:12 +00:00
void applyValuesToSelectedSegs ( ) ;
2022-02-20 21:24:11 +00:00
void colorUpdated ( byte callMode ) ;
void stateUpdated ( byte callMode ) ;
2021-03-25 19:00:08 +00:00
void updateInterfaces ( uint8_t callMode ) ;
void handleTransitions ( ) ;
void handleNightlight ( ) ;
byte scaledBri ( byte in ) ;
2023-05-30 17:36:14 +00:00
# ifdef WLED_ENABLE_LOXONE
2021-03-25 19:00:08 +00:00
//lx_parser.cpp
bool parseLx ( int lxValue , byte * rgbw ) ;
void parseLxJson ( int lxValue , byte segId , bool secondary ) ;
2023-05-30 17:36:14 +00:00
# endif
2021-03-25 19:00:08 +00:00
//mqtt.cpp
bool initMqtt ( ) ;
void publishMqtt ( ) ;
//ntp.cpp
2021-05-26 22:09:52 +00:00
void handleTime ( ) ;
2021-03-25 19:00:08 +00:00
void handleNetworkTime ( ) ;
void sendNTPPacket ( ) ;
2023-01-06 08:24:29 +00:00
bool checkNTPResponse ( ) ;
2021-03-25 19:00:08 +00:00
void updateLocalTime ( ) ;
void getTimeString ( char * out ) ;
bool checkCountdown ( ) ;
void setCountdown ( ) ;
byte weekdayMondayFirst ( ) ;
void checkTimers ( ) ;
void calculateSunriseAndSunset ( ) ;
2021-05-27 00:02:02 +00:00
void setTimeFromAPI ( uint32_t timein ) ;
2021-03-25 19:00:08 +00:00
//overlay.cpp
void handleOverlayDraw ( ) ;
void _overlayAnalogCountdown ( ) ;
void _overlayAnalogClock ( ) ;
//playlist.cpp
void shufflePlaylist ( ) ;
void unloadPlaylist ( ) ;
2021-07-11 00:38:31 +00:00
int16_t loadPlaylist ( JsonObject playlistObject , byte presetId = 0 ) ;
2021-03-25 19:00:08 +00:00
void handlePlaylist ( ) ;
2022-10-08 16:25:51 +00:00
void serializePlaylist ( JsonObject obj ) ;
2021-03-25 19:00:08 +00:00
//presets.cpp
2024-02-25 16:08:01 +00:00
const char * getPresetsFileName ( bool persistent = true ) ;
2024-12-12 18:30:56 +00:00
bool presetNeedsSaving ( ) ;
2022-11-16 19:55:21 +00:00
void initPresetsFile ( ) ;
2022-09-20 19:17:44 +00:00
void handlePresets ( ) ;
bool applyPreset ( byte index , byte callMode = CALL_MODE_DIRECT_CHANGE ) ;
2024-03-22 19:49:13 +00:00
bool applyPresetFromPlaylist ( byte index ) ;
2023-06-22 08:06:19 +00:00
void applyPresetWithFallback ( uint8_t presetID , uint8_t callMode , uint8_t effectID = 0 , uint8_t paletteID = 0 ) ;
2021-10-04 18:22:04 +00:00
inline bool applyTemporaryPreset ( ) { return applyPreset ( 255 ) ; } ;
2022-03-15 08:55:23 +00:00
void savePreset ( byte index , const char * pname = nullptr , JsonObject saveobj = JsonObject ( ) ) ;
inline void saveTemporaryPreset ( ) { savePreset ( 255 ) ; } ;
2021-03-25 19:00:08 +00:00
void deletePreset ( byte index ) ;
2023-01-06 08:24:29 +00:00
bool getPresetName ( byte index , String & name ) ;
2021-03-25 19:00:08 +00:00
2023-06-22 08:06:19 +00:00
//remote.cpp
2024-12-19 16:41:44 +00:00
void handleWiZdata ( uint8_t * incomingData , size_t len ) ;
void handleRemote ( ) ;
2023-06-22 08:06:19 +00:00
2021-03-25 19:00:08 +00:00
//set.cpp
bool isAsterisksOnly ( const char * str , byte maxLen ) ;
void handleSettingsSet ( AsyncWebServerRequest * request , byte subPage ) ;
bool handleSet ( AsyncWebServerRequest * request , const String & req , bool apply = true ) ;
//udp.cpp
void notify ( byte callMode , bool followUp = false ) ;
2025-01-07 19:33:10 +00:00
uint8_t realtimeBroadcast ( uint8_t type , IPAddress client , uint16_t length , const uint8_t * buffer , uint8_t bri = 255 , bool isRGBW = false ) ;
2021-03-25 19:00:08 +00:00
void realtimeLock ( uint32_t timeoutMs , byte md = REALTIME_MODE_GENERIC ) ;
2022-03-31 22:59:19 +00:00
void exitRealtime ( ) ;
2021-03-25 19:00:08 +00:00
void handleNotifications ( ) ;
void setRealtimePixel ( uint16_t i , byte r , byte g , byte b , byte w ) ;
void refreshNodeList ( ) ;
void sendSysInfoUDP ( ) ;
2023-09-10 16:52:14 +00:00
# ifndef WLED_DISABLE_ESPNOW
2024-02-15 19:40:55 +00:00
void espNowSentCB ( uint8_t * address , uint8_t status ) ;
2023-09-10 16:52:14 +00:00
void espNowReceiveCB ( uint8_t * address , uint8_t * data , uint8_t len , signed int rssi , bool broadcast ) ;
# endif
2021-03-25 19:00:08 +00:00
2021-10-11 12:13:34 +00:00
//network.cpp
2024-12-21 18:02:24 +00:00
bool initEthernet ( ) ; // result is informational
int getSignalQuality ( int rssi ) ;
void fillMAC2Str ( char * str , const uint8_t * mac ) ;
void fillStr2MAC ( uint8_t * mac , const char * str ) ;
int findWiFi ( bool doScan = false ) ;
bool isWiFiConfigured ( ) ;
2021-10-11 12:13:34 +00:00
void WiFiEvent ( WiFiEvent_t event ) ;
2021-03-25 19:00:08 +00:00
//um_manager.cpp
2022-06-10 22:50:29 +00:00
typedef enum UM_Data_Types {
UMT_BYTE = 0 ,
UMT_UINT16 ,
UMT_INT16 ,
UMT_UINT32 ,
UMT_INT32 ,
UMT_FLOAT ,
UMT_DOUBLE ,
UMT_BYTE_ARR ,
UMT_UINT16_ARR ,
UMT_INT16_ARR ,
UMT_UINT32_ARR ,
UMT_INT32_ARR ,
UMT_FLOAT_ARR ,
UMT_DOUBLE_ARR
} um_types_t ;
2022-06-08 19:14:01 +00:00
typedef struct UM_Exchange_Data {
2022-06-10 14:37:55 +00:00
// should just use: size_t arr_size, void **arr_ptr, byte *ptr_type
2022-06-10 22:50:29 +00:00
size_t u_size ; // size of u_data array
um_types_t * u_type ; // array of data types
void * * u_data ; // array of pointers to data
2022-06-08 19:14:01 +00:00
UM_Exchange_Data ( ) {
2022-06-10 22:50:29 +00:00
u_size = 0 ;
u_type = nullptr ;
u_data = nullptr ;
2022-06-08 19:14:01 +00:00
}
~ UM_Exchange_Data ( ) {
2022-06-10 22:50:29 +00:00
if ( u_type ) delete [ ] u_type ;
if ( u_data ) delete [ ] u_data ;
2022-06-08 19:14:01 +00:00
}
} um_data_t ;
2022-06-10 22:50:29 +00:00
const unsigned int um_data_size = sizeof ( um_data_t ) ; // 12 bytes
2022-06-08 19:14:01 +00:00
2021-03-25 19:00:08 +00:00
class Usermod {
2022-06-08 19:14:01 +00:00
protected :
um_data_t * um_data ; // um_data should be allocated using new in (derived) Usermod's setup() or constructor
2021-03-25 19:00:08 +00:00
public :
2024-09-14 19:09:47 +00:00
Usermod ( ) : um_data ( nullptr ) { } ;
2022-06-08 19:14:01 +00:00
virtual ~ Usermod ( ) { if ( um_data ) delete um_data ; }
2022-06-11 16:55:23 +00:00
virtual void setup ( ) = 0 ; // pure virtual, has to be overriden
virtual void loop ( ) = 0 ; // pure virtual, has to be overriden
2023-02-05 11:23:05 +00:00
virtual void handleOverlayDraw ( ) { } // called after all effects have been processed, just before strip.show()
virtual bool handleButton ( uint8_t b ) { return false ; } // button overrides are possible here
virtual bool getUMData ( um_data_t * * data ) { if ( data ) * data = nullptr ; return false ; } ; // usermod data exchange [see examples for audio effects]
virtual void connected ( ) { } // called when WiFi is (re)connected
2024-09-18 23:19:40 +00:00
virtual void appendConfigData ( Print & settingsScript ) ; // helper function called from usermod settings page to add metadata for entry fields
2023-02-05 11:23:05 +00:00
virtual void addToJsonState ( JsonObject & obj ) { } // add JSON objects for WLED state
virtual void addToJsonInfo ( JsonObject & obj ) { } // add JSON objects for UI Info page
virtual void readFromJsonState ( JsonObject & obj ) { } // process JSON messages received from web server
virtual void addToConfig ( JsonObject & obj ) { } // add JSON entries that go to cfg.json
2021-07-05 21:14:57 +00:00
virtual bool readFromConfig ( JsonObject & obj ) { return true ; } // Note as of 2021-06 readFromConfig() now needs to return a bool, see usermod_v2_example.h
2023-02-05 11:23:05 +00:00
virtual void onMqttConnect ( bool sessionPresent ) { } // fired when MQTT connection is established (so usermod can subscribe)
virtual bool onMqttMessage ( char * topic , char * payload ) { return false ; } // fired upon MQTT message received (wled topic)
2024-05-25 18:01:38 +00:00
virtual bool onEspNowMessage ( uint8_t * sender , uint8_t * payload , uint8_t len ) { return false ; } // fired upon ESP-NOW message received
2023-02-05 11:23:05 +00:00
virtual void onUpdateBegin ( bool ) { } // fired prior to and after unsuccessful firmware update
virtual void onStateChange ( uint8_t mode ) { } // fired upon WLED state change
2021-03-25 19:00:08 +00:00
virtual uint16_t getId ( ) { return USERMOD_ID_UNSPECIFIED ; }
2024-09-17 22:26:46 +00:00
// API shims
2021-03-25 19:00:08 +00:00
private :
2024-09-17 22:26:46 +00:00
static Print * oappend_shim ;
// old form of appendConfigData; called by default appendConfigData(Print&) with oappend_shim set up
// private so it is not accidentally invoked except via Usermod::appendConfigData(Print&)
virtual void appendConfigData ( ) { }
protected :
// Shim for oappend(), which used to exist in utils.cpp
template < typename T > static inline void oappend ( const T & t ) { oappend_shim - > print ( t ) ; } ;
2024-09-28 02:33:20 +00:00
# ifdef ESP8266
// Handle print(PSTR()) without crashing by detecting PROGMEM strings
static void oappend ( const char * c ) { if ( ( intptr_t ) c > = 0x40000000 ) oappend_shim - > print ( FPSTR ( c ) ) ; else oappend_shim - > print ( c ) ; } ;
# endif
2021-03-25 19:00:08 +00:00
} ;
2024-10-20 14:42:02 +00:00
namespace UsermodManager {
void loop ( ) ;
void handleOverlayDraw ( ) ;
bool handleButton ( uint8_t b ) ;
bool getUMData ( um_data_t * * um_data , uint8_t mod_id = USERMOD_ID_RESERVED ) ; // USERMOD_ID_RESERVED will poll all usermods
void setup ( ) ;
void connected ( ) ;
void appendConfigData ( Print & ) ;
void addToJsonState ( JsonObject & obj ) ;
void addToJsonInfo ( JsonObject & obj ) ;
void readFromJsonState ( JsonObject & obj ) ;
void addToConfig ( JsonObject & obj ) ;
bool readFromConfig ( JsonObject & obj ) ;
2024-05-25 18:01:38 +00:00
# ifndef WLED_DISABLE_MQTT
2024-10-20 14:42:02 +00:00
void onMqttConnect ( bool sessionPresent ) ;
bool onMqttMessage ( char * topic , char * payload ) ;
2024-05-25 18:01:38 +00:00
# endif
# ifndef WLED_DISABLE_ESPNOW
2024-10-20 14:42:02 +00:00
bool onEspNowMessage ( uint8_t * sender , uint8_t * payload , uint8_t len ) ;
2024-05-25 18:01:38 +00:00
# endif
2024-10-20 14:42:02 +00:00
void onUpdateBegin ( bool ) ;
void onStateChange ( uint8_t ) ;
Usermod * lookup ( uint16_t mod_id ) ;
2024-09-14 19:09:47 +00:00
size_t getModCount ( ) ;
2021-03-25 19:00:08 +00:00
} ;
2024-09-14 19:09:47 +00:00
// Register usermods by building a static list via a linker section
# define REGISTER_USERMOD(x) Usermod* const um_##x __attribute__((__section__(".dtors.tbl.usermods.1"), used)) = &x
2021-03-25 19:00:08 +00:00
2021-10-11 12:13:34 +00:00
//util.cpp
2024-12-20 18:12:29 +00:00
# ifdef ESP8266
# define HW_RND_REGISTER RANDOM_REG32
# else // ESP32 family
# include "soc/wdev_reg.h"
# define HW_RND_REGISTER REG_READ(WDEV_RND_REG)
# endif
2025-03-14 05:48:18 +00:00
# define inoise8 perlin8 // fastled legacy alias
# define inoise16 perlin16 // fastled legacy alias
2024-12-21 18:02:24 +00:00
# define hex2int(a) (((a)>='0' && (a)<='9') ? (a)-'0' : ((a)>='A' && (a)<='F') ? (a)-'A'+10 : ((a)>='a' && (a)<='f') ? (a)-'a'+10 : 0)
2025-04-22 20:37:18 +00:00
[ [ gnu : : pure ] ] int getNumVal ( const String & req , uint16_t pos ) ;
void parseNumber ( const char * str , byte & val , byte minv = 0 , byte maxv = 255 ) ;
bool getVal ( JsonVariant elem , byte & val , byte vmin = 0 , byte vmax = 255 ) ; // getVal supports inc/decrementing and random ("X~Y(r|[w]~[-][Z])" form)
2025-01-09 12:29:06 +00:00
[ [ gnu : : pure ] ] bool getBoolVal ( const JsonVariant & elem , bool dflt ) ;
2025-04-22 20:37:18 +00:00
bool updateVal ( const char * req , const char * key , byte & val , byte minv = 0 , byte maxv = 255 ) ;
2024-09-18 23:19:40 +00:00
size_t printSetFormCheckbox ( Print & settingsScript , const char * key , int val ) ;
size_t printSetFormValue ( Print & settingsScript , const char * key , int val ) ;
size_t printSetFormValue ( Print & settingsScript , const char * key , const char * val ) ;
size_t printSetFormIndex ( Print & settingsScript , const char * key , int index ) ;
size_t printSetClassElementHTML ( Print & settingsScript , const char * key , const int index , const char * val ) ;
2021-10-11 12:13:34 +00:00
void prepareHostname ( char * hostname ) ;
2025-01-09 12:29:06 +00:00
[ [ gnu : : pure ] ] bool isAsterisksOnly ( const char * str , byte maxLen ) ;
2025-01-07 19:22:52 +00:00
bool requestJSONBufferLock ( uint8_t moduleID = 255 ) ;
2021-11-12 22:33:10 +00:00
void releaseJSONBufferLock ( ) ;
2022-01-31 19:35:11 +00:00
uint8_t extractModeName ( uint8_t mode , const char * src , char * dest , uint8_t maxLen ) ;
2022-07-23 20:00:19 +00:00
uint8_t extractModeSlider ( uint8_t mode , uint8_t slider , char * dest , uint8_t maxLen , uint8_t * var = nullptr ) ;
int16_t extractModeDefaults ( uint8_t mode , const char * segVar ) ;
2023-06-14 09:53:39 +00:00
void checkSettingsPIN ( const char * pin ) ;
2022-05-20 12:48:40 +00:00
uint16_t crc16 ( const unsigned char * data_p , size_t length ) ;
Added integer based `sin()/cos()` functions, changed all trig functions to wled_math
- `sin16_t() / cos16_t()` are faster and more accurate than fastled versions
- `sin_approx() / cos_approx()` are float wrappers for `sin16_t() / cos16_t()` and are accurate enough to replace `sinf()/cosf()`
- `atan2()` is used only in octopus to calculate center offset, new approximated version saves flash
- `tan(), atan(), asin(), acos(), floor(), fmod()` are used only for sunrise/sunset calculation, using wled_math version saves flash
- `beatsinx()` replacements are to make use of new `sin16_t()/sin8_t()` functions to reduce flash size
- Extensively tested surnise/sunset calculation: deviation is 1min. max
- Tested some of the relevant FX and found no visual difference: Julia, 2D Drift, Drift Rose, Ghost rider, Rotozoomer, Palette, Arc 1D expansion
- total flash savings: 7.4k
2024-10-05 10:29:31 +00:00
uint16_t beatsin88_t ( accum88 beats_per_minute_88 , uint16_t lowest = 0 , uint16_t highest = 65535 , uint32_t timebase = 0 , uint16_t phase_offset = 0 ) ;
uint16_t beatsin16_t ( accum88 beats_per_minute , uint16_t lowest = 0 , uint16_t highest = 65535 , uint32_t timebase = 0 , uint16_t phase_offset = 0 ) ;
uint8_t beatsin8_t ( accum88 beats_per_minute , uint8_t lowest = 0 , uint8_t highest = 255 , uint32_t timebase = 0 , uint8_t phase_offset = 0 ) ;
2022-07-25 19:31:50 +00:00
um_data_t * simulateSound ( uint8_t simulationId ) ;
2022-08-10 18:53:11 +00:00
void enumerateLedmaps ( ) ;
2025-01-09 12:29:06 +00:00
[ [ gnu : : hot ] ] uint8_t get_random_wheel_index ( uint8_t pos ) ;
[ [ gnu : : hot , gnu : : pure ] ] float mapf ( float x , float in_min , float in_max , float out_min , float out_max ) ;
2024-04-03 16:38:06 +00:00
uint32_t hashInt ( uint32_t s ) ;
2025-03-08 11:48:27 +00:00
int32_t perlin1D_raw ( uint32_t x , bool is16bit = false ) ;
int32_t perlin2D_raw ( uint32_t x , uint32_t y , bool is16bit = false ) ;
int32_t perlin3D_raw ( uint32_t x , uint32_t y , uint32_t z , bool is16bit = false ) ;
2025-03-03 05:57:16 +00:00
uint16_t perlin16 ( uint32_t x ) ;
uint16_t perlin16 ( uint32_t x , uint32_t y ) ;
uint16_t perlin16 ( uint32_t x , uint32_t y , uint32_t z ) ;
2025-03-12 05:56:33 +00:00
uint8_t perlin8 ( uint16_t x ) ;
uint8_t perlin8 ( uint16_t x , uint16_t y ) ;
uint8_t perlin8 ( uint16_t x , uint16_t y , uint16_t z ) ;
2021-10-11 12:13:34 +00:00
2024-12-20 18:12:29 +00:00
// fast (true) random numbers using hardware RNG, all functions return values in the range lowerlimit to upperlimit-1
// note: for true random numbers with high entropy, do not call faster than every 200ns (5MHz)
// tests show it is still highly random reading it quickly in a loop (better than fastled PRNG)
// for 8bit and 16bit random functions: no limit check is done for best speed
// 32bit inputs are used for speed and code size, limits don't work if inverted or out of range
// inlining does save code size except for random(a,b) and 32bit random with limits
# define random hw_random // replace arduino random()
inline uint32_t hw_random ( ) { return HW_RND_REGISTER ; } ;
uint32_t hw_random ( uint32_t upperlimit ) ; // not inlined for code size
int32_t hw_random ( int32_t lowerlimit , int32_t upperlimit ) ;
inline uint16_t hw_random16 ( ) { return HW_RND_REGISTER ; } ;
inline uint16_t hw_random16 ( uint32_t upperlimit ) { return ( hw_random16 ( ) * upperlimit ) > > 16 ; } ; // input range 0-65535 (uint16_t)
inline int16_t hw_random16 ( int32_t lowerlimit , int32_t upperlimit ) { int32_t range = upperlimit - lowerlimit ; return lowerlimit + hw_random16 ( range ) ; } ; // signed limits, use int16_t ranges
inline uint8_t hw_random8 ( ) { return HW_RND_REGISTER ; } ;
inline uint8_t hw_random8 ( uint32_t upperlimit ) { return ( hw_random8 ( ) * upperlimit ) > > 8 ; } ; // input range 0-255
inline uint8_t hw_random8 ( uint32_t lowerlimit , uint32_t upperlimit ) { uint32_t range = upperlimit - lowerlimit ; return lowerlimit + hw_random8 ( range ) ; } ; // input range 0-255
2021-10-11 12:13:34 +00:00
2025-04-22 20:37:18 +00:00
// PSRAM allocation wrappers
2025-07-23 04:42:06 +00:00
# if !defined(ESP8266) && !defined(CONFIG_IDF_TARGET_ESP32C3)
2025-04-26 18:08:15 +00:00
extern " C " {
void * p_malloc ( size_t ) ; // prefer PSRAM over DRAM
void * p_calloc ( size_t , size_t ) ; // prefer PSRAM over DRAM
void * p_realloc ( void * , size_t ) ; // prefer PSRAM over DRAM
2025-07-23 04:42:06 +00:00
void * p_realloc_malloc ( void * ptr , size_t size ) ; // realloc with malloc fallback, prefer PSRAM over DRAM
2025-04-26 18:08:15 +00:00
inline void p_free ( void * ptr ) { heap_caps_free ( ptr ) ; }
void * d_malloc ( size_t ) ; // prefer DRAM over PSRAM
void * d_calloc ( size_t , size_t ) ; // prefer DRAM over PSRAM
void * d_realloc ( void * , size_t ) ; // prefer DRAM over PSRAM
2025-07-23 04:42:06 +00:00
void * d_realloc_malloc ( void * ptr , size_t size ) ; // realloc with malloc fallback, prefer DRAM over PSRAM
2025-04-26 18:08:15 +00:00
inline void d_free ( void * ptr ) { heap_caps_free ( ptr ) ; }
}
2025-04-22 20:37:18 +00:00
# else
2025-07-23 04:42:06 +00:00
extern " C " {
void * realloc_malloc ( void * ptr , size_t size ) ;
}
2025-04-26 18:08:15 +00:00
# define p_malloc malloc
# define p_calloc calloc
# define p_realloc realloc
2025-07-23 04:42:06 +00:00
# define p_realloc_malloc realloc_malloc
2025-04-26 18:08:15 +00:00
# define p_free free
2025-04-22 20:37:18 +00:00
# define d_malloc malloc
# define d_calloc calloc
# define d_realloc realloc
2025-07-23 04:42:06 +00:00
# define d_realloc_malloc realloc_malloc
2025-04-22 20:37:18 +00:00
# define d_free free
# endif
2024-01-06 15:05:18 +00:00
// RAII guard class for the JSON Buffer lock
// Modeled after std::lock_guard
class JSONBufferGuard {
bool holding_lock ;
public :
inline JSONBufferGuard ( uint8_t module = 255 ) : holding_lock ( requestJSONBufferLock ( module ) ) { } ;
inline ~ JSONBufferGuard ( ) { if ( holding_lock ) releaseJSONBufferLock ( ) ; } ;
inline JSONBufferGuard ( const JSONBufferGuard & ) = delete ; // Noncopyable
inline JSONBufferGuard & operator = ( const JSONBufferGuard & ) = delete ;
inline JSONBufferGuard ( JSONBufferGuard & & r ) : holding_lock ( r . holding_lock ) { r . holding_lock = false ; } ; // but movable
inline JSONBufferGuard & operator = ( JSONBufferGuard & & r ) { holding_lock | = r . holding_lock ; r . holding_lock = false ; return * this ; } ;
inline bool owns_lock ( ) const { return holding_lock ; }
explicit inline operator bool ( ) const { return owns_lock ( ) ; } ;
inline void release ( ) { if ( holding_lock ) releaseJSONBufferLock ( ) ; holding_lock = false ; }
} ;
2022-07-30 09:04:04 +00:00
# ifdef WLED_ADD_EEPROM_SUPPORT
2021-03-25 19:00:08 +00:00
//wled_eeprom.cpp
void applyMacro ( byte index ) ;
void deEEP ( ) ;
void deEEPSettings ( ) ;
void clearEEPROM ( ) ;
2022-07-30 09:04:04 +00:00
# endif
2021-03-25 19:00:08 +00:00
2021-10-11 12:13:34 +00:00
//wled_math.cpp
Added integer based `sin()/cos()` functions, changed all trig functions to wled_math
- `sin16_t() / cos16_t()` are faster and more accurate than fastled versions
- `sin_approx() / cos_approx()` are float wrappers for `sin16_t() / cos16_t()` and are accurate enough to replace `sinf()/cosf()`
- `atan2()` is used only in octopus to calculate center offset, new approximated version saves flash
- `tan(), atan(), asin(), acos(), floor(), fmod()` are used only for sunrise/sunset calculation, using wled_math version saves flash
- `beatsinx()` replacements are to make use of new `sin16_t()/sin8_t()` functions to reduce flash size
- Extensively tested surnise/sunset calculation: deviation is 1min. max
- Tested some of the relevant FX and found no visual difference: Julia, 2D Drift, Drift Rose, Ghost rider, Rotozoomer, Palette, Arc 1D expansion
- total flash savings: 7.4k
2024-10-05 10:29:31 +00:00
//float cos_t(float phi); // use float math
//float sin_t(float phi);
//float tan_t(float x);
int16_t sin16_t ( uint16_t theta ) ;
int16_t cos16_t ( uint16_t theta ) ;
uint8_t sin8_t ( uint8_t theta ) ;
uint8_t cos8_t ( uint8_t theta ) ;
float sin_approx ( float theta ) ; // uses integer math (converted to float), accuracy +/-0.0015 (compared to sinf())
float cos_approx ( float theta ) ;
float tan_approx ( float x ) ;
float atan2_t ( float y , float x ) ;
float acos_t ( float x ) ;
float asin_t ( float x ) ;
template < typename T > T atan_t ( T x ) ;
float floor_t ( float x ) ;
float fmod_t ( float num , float denom ) ;
2025-01-20 04:51:04 +00:00
uint32_t sqrt32_bw ( uint32_t x ) ;
Added integer based `sin()/cos()` functions, changed all trig functions to wled_math
- `sin16_t() / cos16_t()` are faster and more accurate than fastled versions
- `sin_approx() / cos_approx()` are float wrappers for `sin16_t() / cos16_t()` and are accurate enough to replace `sinf()/cosf()`
- `atan2()` is used only in octopus to calculate center offset, new approximated version saves flash
- `tan(), atan(), asin(), acos(), floor(), fmod()` are used only for sunrise/sunset calculation, using wled_math version saves flash
- `beatsinx()` replacements are to make use of new `sin16_t()/sin8_t()` functions to reduce flash size
- Extensively tested surnise/sunset calculation: deviation is 1min. max
- Tested some of the relevant FX and found no visual difference: Julia, 2D Drift, Drift Rose, Ghost rider, Rotozoomer, Palette, Arc 1D expansion
- total flash savings: 7.4k
2024-10-05 10:29:31 +00:00
# define sin_t sin_approx
# define cos_t cos_approx
# define tan_t tan_approx
2021-10-11 12:13:34 +00:00
Added integer based `sin()/cos()` functions, changed all trig functions to wled_math
- `sin16_t() / cos16_t()` are faster and more accurate than fastled versions
- `sin_approx() / cos_approx()` are float wrappers for `sin16_t() / cos16_t()` and are accurate enough to replace `sinf()/cosf()`
- `atan2()` is used only in octopus to calculate center offset, new approximated version saves flash
- `tan(), atan(), asin(), acos(), floor(), fmod()` are used only for sunrise/sunset calculation, using wled_math version saves flash
- `beatsinx()` replacements are to make use of new `sin16_t()/sin8_t()` functions to reduce flash size
- Extensively tested surnise/sunset calculation: deviation is 1min. max
- Tested some of the relevant FX and found no visual difference: Julia, 2D Drift, Drift Rose, Ghost rider, Rotozoomer, Palette, Arc 1D expansion
- total flash savings: 7.4k
2024-10-05 10:29:31 +00:00
/*
# include <math.h> // standard math functions. use a lot of flash
# define sin_t sinf
# define cos_t cosf
# define tan_t tanf
# define asin_t asinf
# define acos_t acosf
# define atan_t atanf
# define fmod_t fmodf
# define floor_t floorf
*/
2021-03-25 19:00:08 +00:00
//wled_serial.cpp
void handleSerial ( ) ;
2022-02-01 19:02:46 +00:00
void updateBaudRate ( uint32_t rate ) ;
2021-03-25 19:00:08 +00:00
//wled_server.cpp
2022-03-01 22:37:28 +00:00
void createEditHandler ( bool enable ) ;
2021-03-25 19:00:08 +00:00
void initServer ( ) ;
void serveMessage ( AsyncWebServerRequest * request , uint16_t code , const String & headl , const String & subl = " " , byte optionT = 255 ) ;
2023-12-12 14:45:57 +00:00
void serveJsonError ( AsyncWebServerRequest * request , uint16_t code , uint16_t error ) ;
2021-03-25 19:00:08 +00:00
void serveSettings ( AsyncWebServerRequest * request , bool post = false ) ;
2021-12-06 19:53:09 +00:00
void serveSettingsJS ( AsyncWebServerRequest * request ) ;
2021-03-25 19:00:08 +00:00
//ws.cpp
void handleWs ( ) ;
void wsEvent ( AsyncWebSocket * server , AsyncWebSocketClient * client , AwsEventType type , void * arg , uint8_t * data , size_t len ) ;
void sendDataWs ( AsyncWebSocketClient * client = nullptr ) ;
//xml.cpp
2024-09-06 01:13:55 +00:00
void XML_response ( Print & dest ) ;
void getSettingsJS ( byte subPage , Print & dest ) ;
2021-03-25 19:00:08 +00:00
# endif