diff --git a/src/main.cpp b/src/main.cpp index cc57bff..4b4af9f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,7 +2,6 @@ #include #include #include "ui/ui.h" -#include "sys/sleep_mgmt.h" #include #include // #include "ui/screens/sree.h" @@ -28,16 +27,18 @@ Screen *global_screens[] = { &screen_settings, &screen_timer_alert, &screen_timer_countdown, - &screen_timer_set}; + &screen_timer_set, + &screen_sleep}; ; void log_cb(lv_log_level_t level, const char *buf) { Serial.println(buf); } -void update_timezone() { +void update_timezone() +{ String timezone = ha->getTimezone(); log_d("Timezone: %s", timezone); - if (timezone.length() ==0) + if (timezone.length() == 0) return; String tz = lookup_posix_timezone_tz(timezone.c_str()); settings.putString("ntp_timezone", timezone); @@ -128,16 +129,15 @@ void loop() { improvSerial.handleSerial(); m5dial_lvgl_next(); - server.handleClient(); - monitor_sleep(); - + server.handleClient(); + if (initialized) { clock_timer.update(); // log_d("HA is setup? %d %s", ha->isSetup(), settings.getString("ha_refresh", "none")); if (ha->isSetup() and not initialized_ha) - { - log_d("Initializing HA"); + { + log_d("Initializing HA"); ha->createEntities(); ha->updateAllStates(); initialized_ha = true; diff --git a/src/sys/sleep_mgmt.h b/src/sys/sleep_mgmt.h deleted file mode 100644 index fa0929e..0000000 --- a/src/sys/sleep_mgmt.h +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include -bool isSleeping = false; - -inline void enter_sleep() -{ - M5.Lcd.setBrightness(0); - isSleeping = true; -} -inline void exit_sleep(){ - M5.Lcd.setBrightness(255); - isSleeping = false; -} - -inline void monitor_sleep(){ - if (isSleeping) { - if (lv_display_get_inactive_time(NULL) < 1000) - { - exit_sleep(); - } - } else { - if (lv_display_get_inactive_time(NULL) > 10 * 1000) - { - enter_sleep(); - } - } - -} \ No newline at end of file diff --git a/src/ui/screens/Screen.cpp b/src/ui/screens/Screen.cpp index 0392bfc..ae72b78 100644 --- a/src/ui/screens/Screen.cpp +++ b/src/ui/screens/Screen.cpp @@ -33,4 +33,6 @@ void Screen::initialize() { _initialize(); create(); -}; \ No newline at end of file +}; +size_t Screen::instanceCount; +Screen * Screen::instances[30]; \ No newline at end of file diff --git a/src/ui/screens/Screen.h b/src/ui/screens/Screen.h index dffa583..83a663b 100644 --- a/src/ui/screens/Screen.h +++ b/src/ui/screens/Screen.h @@ -9,6 +9,7 @@ class Screen lv_obj_t *_lv_screen; lv_group_t *_lv_group; lv_timer_t *_updateTimer; + Screen *last_screen = NULL; inline void _initialize() { _lv_screen = lv_obj_create(NULL); @@ -21,14 +22,27 @@ class Screen static void _load(lv_event_t *event); static void _unload(lv_event_t *event); static void _update(lv_timer_t *timer); +private: + static size_t instanceCount; + static Screen *instances[30]; public: - Screen(){}; + Screen(){ + instances[instanceCount++] = this; + }; + virtual void makeActive() { if (lv_screen_active() != _lv_screen) + last_screen = getActiveInstance(); + if (last_screen != NULL) + last_screen->unload(NULL); load(NULL); lv_screen_load(_lv_screen); }; + virtual void makeLastActive() { + if (last_screen != NULL) + last_screen->makeActive(); + }; virtual bool isActive() { return lv_screen_active() == _lv_screen; }; void initialize(); virtual void create() = 0; @@ -52,6 +66,14 @@ class Screen inline lv_obj_t * getLvScreen() { return _lv_screen; } + static Screen * getActiveInstance() { + for (size_t i = 0; i < instanceCount; i++) + { + if (instances[i]->isActive()) + return instances[i]; + }; + return NULL; + } }; diff --git a/src/ui/screens/Screen_Sleep.cpp b/src/ui/screens/Screen_Sleep.cpp new file mode 100644 index 0000000..2dfd1f8 --- /dev/null +++ b/src/ui/screens/Screen_Sleep.cpp @@ -0,0 +1,33 @@ +#include "Screen_Sleep.h" +#include + + +void Screen_Sleep::load(lv_event_t *event) +{ + M5.Lcd.setBrightness(0); +}; +void Screen_Sleep::unload(lv_event_t *event) +{ + M5.Lcd.setBrightness(255); +}; +void Screen_Sleep::create() { + lv_timer_create(monitorSleep, 100, this); +}; +void Screen_Sleep::monitorSleep(lv_timer_t *timer) { + Screen_Sleep *screen = (Screen_Sleep*)timer->user_data; + if (screen->isActive()) + { + if (lv_display_get_inactive_time(NULL) < 1000) + { + screen->makeLastActive(); + } + } + else + { + if (lv_display_get_inactive_time(NULL) > 10 * 1000) + { + screen->makeActive(); + } + } +}; +Screen_Sleep screen_sleep; \ No newline at end of file diff --git a/src/ui/screens/Screen_Sleep.h b/src/ui/screens/Screen_Sleep.h new file mode 100644 index 0000000..1a415fb --- /dev/null +++ b/src/ui/screens/Screen_Sleep.h @@ -0,0 +1,15 @@ +#pragma once +#ifndef SCREEN_SLEEP +#define SCREEN_SLEEP +#include +#include "Screen.h" +class Screen_Sleep : public Screen +{ + void create(); + void load(lv_event_t *event); + void unload(lv_event_t *event); + static void monitorSleep(lv_timer_t *timer); +}; +extern Screen_Sleep screen_sleep; + +#endif diff --git a/src/ui/screens/screens.h b/src/ui/screens/screens.h index 1505b22..ea37162 100644 --- a/src/ui/screens/screens.h +++ b/src/ui/screens/screens.h @@ -7,6 +7,7 @@ #include "Screen_On_Off.h" #include "Screen_Main_Menu.h" #include "Screen_Settings.h" +#include "Screen_Sleep.h" #include "timer/Screen_Timer.h" extern Screen * global_screens[];