From 15cea2b00af091178c364790b5e293a5bf860211 Mon Sep 17 00:00:00 2001 From: Frank Date: Sun, 1 Oct 2023 19:04:30 +0200 Subject: [PATCH] optimization: only use "float" math functions - saves 5KB flash and some RAM -allow to build with -D WLED_USE_UNREAL_MATH, to restore old behaviour and save another 6KB flash --- platformio.ini | 2 ++ wled00/ntp.cpp | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index f7d60a57f4..c089a1c0fd 100644 --- a/platformio.ini +++ b/platformio.ini @@ -461,6 +461,7 @@ lib_deps = ${esp8266.lib_deps} ; board_build.ldscript = ${common.ldscript_1m128k} ; build_unflags = ${common.build_unflags} ; build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP01 -D WLED_DISABLE_OTA +; ; -D WLED_USE_UNREAL_MATH ;; may cause wrong sunset/sunrise times, but saves 7064 bytes FLASH and 975 bytes RAM ; lib_deps = ${esp8266.lib_deps} [env:esp07] @@ -691,6 +692,7 @@ build_flags = ${common.build_flags} ${esp32s2.build_flags} #-D WLED_RELEASE_NAME -DARDUINO_USB_DFU_ON_BOOT=0 -DLOLIN_WIFI_FIX ; seems to work much better with this -D WLED_USE_PSRAM + ; -D WLED_USE_UNREAL_MATH ;; may cause wrong sunset/sunrise times, but saves 6792 bytes FLASH -D WLED_WATCHDOG_TIMEOUT=0 -D CONFIG_ASYNC_TCP_USE_WDT=0 -D LEDPIN=16 diff --git a/wled00/ntp.cpp b/wled00/ntp.cpp index b784779f8e..7d056d3c46 100644 --- a/wled00/ntp.cpp +++ b/wled00/ntp.cpp @@ -2,6 +2,21 @@ #include "wled.h" #include "fcn_declare.h" +// on esp8266, building with `-D WLED_USE_UNREAL_MATH` saves around 7Kb flash and 1KB RAM +// warning: causes errors in sunset calculations, see #3400 +#if defined(WLED_USE_UNREAL_MATH) +#define sinf sin_t +#define asinf asin_t +#define cosf cos_t +#define acosf acos_t +#define tanf tan_t +#define atanf atan_t +#define fmodf fmod_t +#define floorf floor_t +#else +#include +#endif + /* * Acquires time from NTP server */ @@ -433,7 +448,7 @@ int getSunriseUTC(int year, int month, int day, float lat, float lon, bool sunse float L = fmodf(M + (1.916f * sinf(DEG_TO_RAD*M)) + (0.02f * sinf(2*DEG_TO_RAD*M)) + 282.634f, 360.0f); //5a. calculate the Sun's right ascension - float RA = fmodf(RAD_TO_DEG*atan(0.91764f * tan(DEG_TO_RAD*L)), 360.0f); + float RA = fmodf(RAD_TO_DEG*atanf(0.91764f * tanf(DEG_TO_RAD*L)), 360.0f); //5b. right ascension value needs to be in the same quadrant as L float Lquadrant = floorf( L/90) * 90;