power_save_timer.cc 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #include "power_save_timer.h"
  2. #include "application.h"
  3. #include <esp_log.h>
  4. #define TAG "PowerSaveTimer"
  5. PowerSaveTimer::PowerSaveTimer(int cpu_max_freq, int seconds_to_sleep, int seconds_to_shutdown)
  6. : cpu_max_freq_(cpu_max_freq), seconds_to_sleep_(seconds_to_sleep), seconds_to_shutdown_(seconds_to_shutdown) {
  7. esp_timer_create_args_t timer_args = {
  8. .callback = [](void* arg) {
  9. auto self = static_cast<PowerSaveTimer*>(arg);
  10. self->PowerSaveCheck();
  11. },
  12. .arg = this,
  13. .dispatch_method = ESP_TIMER_TASK,
  14. .name = "power_save_timer",
  15. .skip_unhandled_events = true,
  16. };
  17. ESP_ERROR_CHECK(esp_timer_create(&timer_args, &power_save_timer_));
  18. }
  19. PowerSaveTimer::~PowerSaveTimer() {
  20. esp_timer_stop(power_save_timer_);
  21. esp_timer_delete(power_save_timer_);
  22. }
  23. void PowerSaveTimer::SetEnabled(bool enabled) {
  24. if (enabled && !enabled_) {
  25. ticks_ = 0;
  26. enabled_ = enabled;
  27. ESP_ERROR_CHECK(esp_timer_start_periodic(power_save_timer_, 1000000));
  28. ESP_LOGI(TAG, "Power save timer enabled");
  29. } else if (!enabled && enabled_) {
  30. ESP_ERROR_CHECK(esp_timer_stop(power_save_timer_));
  31. enabled_ = enabled;
  32. WakeUp();
  33. ESP_LOGI(TAG, "Power save timer disabled");
  34. }
  35. }
  36. void PowerSaveTimer::OnEnterSleepMode(std::function<void()> callback) {
  37. on_enter_sleep_mode_ = callback;
  38. }
  39. void PowerSaveTimer::OnExitSleepMode(std::function<void()> callback) {
  40. on_exit_sleep_mode_ = callback;
  41. }
  42. void PowerSaveTimer::OnShutdownRequest(std::function<void()> callback) {
  43. on_shutdown_request_ = callback;
  44. }
  45. void PowerSaveTimer::PowerSaveCheck() {
  46. auto& app = Application::GetInstance();
  47. if (!in_sleep_mode_ && !app.CanEnterSleepMode()) {
  48. ticks_ = 0;
  49. return;
  50. }
  51. ticks_++;
  52. if (seconds_to_sleep_ != -1 && ticks_ >= seconds_to_sleep_) {
  53. if (!in_sleep_mode_) {
  54. in_sleep_mode_ = true;
  55. if (on_enter_sleep_mode_) {
  56. on_enter_sleep_mode_();
  57. }
  58. if (cpu_max_freq_ != -1) {
  59. esp_pm_config_t pm_config = {
  60. .max_freq_mhz = cpu_max_freq_,
  61. .min_freq_mhz = 40,
  62. .light_sleep_enable = true,
  63. };
  64. esp_pm_configure(&pm_config);
  65. }
  66. }
  67. }
  68. if (seconds_to_shutdown_ != -1 && ticks_ >= seconds_to_shutdown_ && on_shutdown_request_) {
  69. on_shutdown_request_();
  70. }
  71. }
  72. void PowerSaveTimer::WakeUp() {
  73. ticks_ = 0;
  74. if (in_sleep_mode_) {
  75. in_sleep_mode_ = false;
  76. if (cpu_max_freq_ != -1) {
  77. esp_pm_config_t pm_config = {
  78. .max_freq_mhz = cpu_max_freq_,
  79. .min_freq_mhz = cpu_max_freq_,
  80. .light_sleep_enable = false,
  81. };
  82. esp_pm_configure(&pm_config);
  83. }
  84. if (on_exit_sleep_mode_) {
  85. on_exit_sleep_mode_();
  86. }
  87. }
  88. }