Add power management for ESP32S3-Korvo2-V3 board (#1591)

Introduces PowerManager and integrates it into the ESP32S3-Korvo2-V3 board class to monitor battery level, charging status, and manage power save mode. Adds power_manager.h with battery ADC reading, calibration, and event callbacks. Updates board initialization to support power management and power save timer functionality.
This commit is contained in:
Kevincoooool
2025-12-22 20:33:02 +08:00
committed by GitHub
parent f501a5f440
commit 5113a5f4bb
2 changed files with 291 additions and 1 deletions

View File

@@ -14,6 +14,8 @@
#include <driver/i2c_master.h>
#include <driver/spi_common.h>
#include "esp32_camera.h"
#include "power_manager.h"
#include "power_save_timer.h"
#define TAG "esp32s3_korvo2_v3"
/* ADC Buttons */
@@ -59,6 +61,24 @@ private:
LcdDisplay* display_;
esp_io_expander_handle_t io_expander_ = NULL;
Esp32Camera* camera_;
PowerSaveTimer* power_save_timer_;
PowerManager* power_manager_;
void InitializePowerManager() {
// PowerManager需要复用按钮的ADC句柄所以在InitializeButtons之后调用
// 传入按钮的ADC句柄指针让PowerManager复用
power_manager_ = new PowerManager(GPIO_NUM_NC, &bsp_adc_handle);
}
void InitializePowerSaveTimer() {
power_save_timer_ = new PowerSaveTimer(-1, 60);
power_save_timer_->OnEnterSleepMode([this]() {
GetDisplay()->SetPowerSaveMode(true);
});
power_save_timer_->OnExitSleepMode([this]() {
GetDisplay()->SetPowerSaveMode(false);
});
power_save_timer_->SetEnabled(true);
}
void InitializeI2c() {
// Initialize I2C peripheral
@@ -375,12 +395,14 @@ private:
public:
Esp32S3Korvo2V3Board() : boot_button_(BOOT_BUTTON_GPIO) {
ESP_LOGI(TAG, "Initializing esp32s3_korvo2_v3 Board");
InitializePowerSaveTimer();
InitializeI2c();
I2cDetect();
InitializeTca9554();
InitializeCamera();
InitializeSpi();
InitializeButtons();
InitializeButtons(); // 先初始化按钮创建ADC1句柄
InitializePowerManager(); // 后初始化PowerManager复用ADC1句柄
#ifdef LCD_TYPE_ILI9341_SERIAL
InitializeIli9341Display();
#else
@@ -411,6 +433,24 @@ public:
virtual Camera* GetCamera() override {
return camera_;
}
virtual bool GetBatteryLevel(int& level, bool& charging, bool& discharging) override {
static bool last_discharging = false;
charging = power_manager_->IsCharging();
discharging = power_manager_->IsDischarging();
if (discharging != last_discharging) {
power_save_timer_->SetEnabled(discharging);
last_discharging = discharging;
}
level = power_manager_->GetBatteryLevel();
return true;
}
virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
if (level != PowerSaveLevel::LOW_POWER) {
power_save_timer_->WakeUp();
}
WifiBoard::SetPowerSaveLevel(level);
}
};
DECLARE_BOARD(Esp32S3Korvo2V3Board);