From 1c3fdb73fb46f26144691e2e397c04436d526e12 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 9fbcb0a4..f3caa585 100644 --- a/platformio.ini +++ b/platformio.ini @@ -352,6 +352,7 @@ platform_packages = ${common.platform_packages} 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] @@ -605,6 +606,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 471e5f07..c9c4874b 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 */ @@ -426,7 +441,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;