From 886a5f32e56d29dfbcbe70a4a4b48bdf10705e95 Mon Sep 17 00:00:00 2001 From: CommanderRedYT Date: Fri, 1 Apr 2022 15:41:18 +0200 Subject: [PATCH] Improved performance --- main/displays/menus/timesettingsmenu.cpp | 17 +++++------------ main/globals.cpp | 4 ++++ main/globals.h | 4 ++++ main/ledstrip.cpp | 22 ++++++++++++++-------- main/time_bobbycar.cpp | 16 ++++++++++++++++ main/time_bobbycar.h | 1 + 6 files changed, 44 insertions(+), 20 deletions(-) diff --git a/main/displays/menus/timesettingsmenu.cpp b/main/displays/menus/timesettingsmenu.cpp index 507a644..e47c00e 100644 --- a/main/displays/menus/timesettingsmenu.cpp +++ b/main/displays/menus/timesettingsmenu.cpp @@ -59,18 +59,11 @@ class SuntimeText : public virtual espgui::TextInterface public: std::string text() const override { - SunSet sunSet; - sunSet.setPosition(47.076668, 15.421371, 2); // Vienna - sunSet.setTZOffset(2); - const auto today = toDateTime(espchrono::utc_clock::now()); - sunSet.setCurrentDate(static_cast(today.date.year()), static_cast(today.date.month()), static_cast(today.date.day())); - const auto sunrise = static_cast(sunSet.calcSunrise()); - const auto sunset = static_cast(sunSet.calcSunset()); - const int sunriseHour = sunrise / 60; - const int sunriseMinute = sunrise % 60; - const int sunsetHour = sunset / 60; - const int sunsetMinute = sunset % 60; - return fmt::format("sunrise: {}:{:02d} sunset: {}:{:02d}", sunriseHour, sunriseMinute, sunsetHour, sunsetMinute); + if (!sunrise && !sunset) + { + return "no sunrise/sunset"; + } + return fmt::format("sunrise: {:02d}:{:02d} sunset: {:02d}:{:02d}", *sunrise / 60, *sunrise % 60, *sunset / 60, *sunset % 60); } }; diff --git a/main/globals.cpp b/main/globals.cpp index 542e3da..0ba006d 100644 --- a/main/globals.cpp +++ b/main/globals.cpp @@ -17,6 +17,10 @@ float avgSpeedKmh{}; float sumCurrent{}; bool isLocked{}; +std::optional sunrise; +std::optional sunset; +std::optional sunrise_dt; + #ifdef GLOBALS_SOURCE GLOBALS_SOURCE #endif diff --git a/main/globals.h b/main/globals.h index 6eb72af..3f86d84 100644 --- a/main/globals.h +++ b/main/globals.h @@ -39,6 +39,10 @@ extern float gametrakY; extern float gametrakDist; #endif +extern std::optional sunrise; +extern std::optional sunset; +extern std::optional sunrise_dt; + extern float avgSpeed; extern float avgSpeedKmh; extern float sumCurrent; diff --git a/main/ledstrip.cpp b/main/ledstrip.cpp index 52a050e..30c2d07 100644 --- a/main/ledstrip.cpp +++ b/main/ledstrip.cpp @@ -3,13 +3,13 @@ // 3rdparty lib includes #include #include -#include // local includes #include "globals.h" #include "ledstripdefines.h" #include "newsettings.h" #include "ota.h" +#include "time_bobbycar.h" #include "utils.h" using namespace std::chrono_literals; @@ -359,14 +359,20 @@ void showCustomColor() [[nodiscard]] bool activateAutomaticFrontLight() { + using namespace std::chrono_literals; if (!configs.ledstrip.automaticLight.value) return false; - SunSet sunSet; - sunSet.setPosition(47.076668, 15.421371, 0); // Vienna - sunSet.setTZOffset(0); const auto today = toDateTime(espchrono::utc_clock::now()); - sunSet.setCurrentDate(static_cast(today.date.year()), static_cast(today.date.month()), static_cast(today.date.day())); - const auto sunrise = static_cast(sunSet.calcSunrise()) / 60; - const auto sunset = static_cast(sunSet.calcSunset()) / 60; - return (today.hour >= sunrise && today.hour < sunset); + + if (static_cast(today.date.year()) < 2000) + return false; + + if (!sunrise_dt || (*sunrise_dt).date.day() != today.date.day()) + { + sunrise_dt = today; + calculate_sun(); + } + + const int currentTimeInMinutes = today.hour * 60 + today.minute; + return (currentTimeInMinutes <= sunrise || currentTimeInMinutes >= sunset); } diff --git a/main/time_bobbycar.cpp b/main/time_bobbycar.cpp index 21871c6..307128b 100644 --- a/main/time_bobbycar.cpp +++ b/main/time_bobbycar.cpp @@ -7,8 +7,11 @@ // 3rdparty lib includes #include +#include +#include // local includes +#include "globals.h" #include "newsettings.h" espchrono::time_zone get_default_timezone() noexcept @@ -124,3 +127,16 @@ void time_set_now(espchrono::utc_clock::time_point now) }; settimeofday(&ts, &tz); } + +void calculate_sun() +{ + if (!sunrise_dt) + return; + + SunSet sunSet; + sunSet.setPosition(47.076668, 15.421371, 0); // Vienna + sunSet.setTZOffset(0); + sunSet.setCurrentDate(static_cast((*sunrise_dt).date.year()), static_cast((*sunrise_dt).date.month()), static_cast((*sunrise_dt).date.day())); + sunrise = static_cast(sunSet.calcSunrise()); + sunset = static_cast(sunSet.calcSunset()); +} diff --git a/main/time_bobbycar.h b/main/time_bobbycar.h index 358a873..c7949e2 100644 --- a/main/time_bobbycar.h +++ b/main/time_bobbycar.h @@ -11,3 +11,4 @@ void initTime(); void updateTime(); void time_set_now(espchrono::utc_clock::time_point now); +void calculate_sun();