sleep_timer.cc 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include "sleep_timer.h"
  2. #include "application.h"
  3. #include "board.h"
  4. #include "display.h"
  5. #include <esp_log.h>
  6. #include <esp_sleep.h>
  7. #include <esp_lvgl_port.h>
  8. #define TAG "SleepTimer"
  9. SleepTimer::SleepTimer(int seconds_to_light_sleep, int seconds_to_deep_sleep)
  10. : seconds_to_light_sleep_(seconds_to_light_sleep), seconds_to_deep_sleep_(seconds_to_deep_sleep) {
  11. esp_timer_create_args_t timer_args = {
  12. .callback = [](void* arg) {
  13. auto self = static_cast<SleepTimer*>(arg);
  14. self->CheckTimer();
  15. },
  16. .arg = this,
  17. .dispatch_method = ESP_TIMER_TASK,
  18. .name = "sleep_timer",
  19. .skip_unhandled_events = true,
  20. };
  21. ESP_ERROR_CHECK(esp_timer_create(&timer_args, &sleep_timer_));
  22. }
  23. SleepTimer::~SleepTimer() {
  24. esp_timer_stop(sleep_timer_);
  25. esp_timer_delete(sleep_timer_);
  26. }
  27. void SleepTimer::SetEnabled(bool enabled) {
  28. if (enabled && !enabled_) {
  29. ticks_ = 0;
  30. enabled_ = enabled;
  31. ESP_ERROR_CHECK(esp_timer_start_periodic(sleep_timer_, 1000000));
  32. ESP_LOGI(TAG, "Sleep timer enabled");
  33. } else if (!enabled && enabled_) {
  34. ESP_ERROR_CHECK(esp_timer_stop(sleep_timer_));
  35. enabled_ = enabled;
  36. WakeUp();
  37. ESP_LOGI(TAG, "Sleep timer disabled");
  38. }
  39. }
  40. void SleepTimer::OnEnterLightSleepMode(std::function<void()> callback) {
  41. on_enter_light_sleep_mode_ = callback;
  42. }
  43. void SleepTimer::OnExitLightSleepMode(std::function<void()> callback) {
  44. on_exit_light_sleep_mode_ = callback;
  45. }
  46. void SleepTimer::OnEnterDeepSleepMode(std::function<void()> callback) {
  47. on_enter_deep_sleep_mode_ = callback;
  48. }
  49. void SleepTimer::CheckTimer() {
  50. auto& app = Application::GetInstance();
  51. if (!app.CanEnterSleepMode()) {
  52. ticks_ = 0;
  53. return;
  54. }
  55. ticks_++;
  56. if (seconds_to_light_sleep_ != -1 && ticks_ >= seconds_to_light_sleep_) {
  57. if (!in_light_sleep_mode_) {
  58. in_light_sleep_mode_ = true;
  59. if (on_enter_light_sleep_mode_) {
  60. on_enter_light_sleep_mode_();
  61. }
  62. app.Schedule([this, &app]() {
  63. while (in_light_sleep_mode_) {
  64. auto& board = Board::GetInstance();
  65. board.GetDisplay()->UpdateStatusBar(true);
  66. lv_refr_now(nullptr);
  67. lvgl_port_stop();
  68. // 配置timer唤醒源(30秒后自动唤醒)
  69. esp_sleep_enable_timer_wakeup(30 * 1000000);
  70. // 进入light sleep模式
  71. esp_light_sleep_start();
  72. lvgl_port_resume();
  73. auto wakeup_reason = esp_sleep_get_wakeup_cause();
  74. if (wakeup_reason != ESP_SLEEP_WAKEUP_TIMER) {
  75. break;
  76. }
  77. }
  78. WakeUp();
  79. });
  80. }
  81. }
  82. if (seconds_to_deep_sleep_ != -1 && ticks_ >= seconds_to_deep_sleep_) {
  83. if (on_enter_deep_sleep_mode_) {
  84. on_enter_deep_sleep_mode_();
  85. }
  86. esp_deep_sleep_start();
  87. }
  88. }
  89. void SleepTimer::WakeUp() {
  90. ticks_ = 0;
  91. if (in_light_sleep_mode_) {
  92. in_light_sleep_mode_ = false;
  93. if (on_exit_light_sleep_mode_) {
  94. on_exit_light_sleep_mode_();
  95. }
  96. }
  97. }