diff --git a/main/boards/common/adc_battery_monitor.cc b/main/boards/common/adc_battery_monitor.cc index 9edf11cb..3164d13a 100644 --- a/main/boards/common/adc_battery_monitor.cc +++ b/main/boards/common/adc_battery_monitor.cc @@ -3,21 +3,23 @@ AdcBatteryMonitor::AdcBatteryMonitor(adc_unit_t adc_unit, adc_channel_t adc_channel, float upper_resistor, float lower_resistor, gpio_num_t charging_pin) : charging_pin_(charging_pin) { - // Initialize charging pin - gpio_config_t gpio_cfg = { - .pin_bit_mask = 1ULL << charging_pin, - .mode = GPIO_MODE_INPUT, - .pull_up_en = GPIO_PULLUP_DISABLE, - .pull_down_en = GPIO_PULLDOWN_DISABLE, - .intr_type = GPIO_INTR_DISABLE, - }; - ESP_ERROR_CHECK(gpio_config(&gpio_cfg)); + // Initialize charging pin (only if it's not NC) + if (charging_pin_ != GPIO_NUM_NC) { + gpio_config_t gpio_cfg = { + .pin_bit_mask = 1ULL << charging_pin, + .mode = GPIO_MODE_INPUT, + .pull_up_en = GPIO_PULLUP_DISABLE, + .pull_down_en = GPIO_PULLDOWN_DISABLE, + .intr_type = GPIO_INTR_DISABLE, + }; + ESP_ERROR_CHECK(gpio_config(&gpio_cfg)); + } // Initialize ADC battery estimation adc_battery_estimation_t adc_cfg = { .internal = { .adc_unit = adc_unit, - .adc_bitwidth = ADC_BITWIDTH_12, + .adc_bitwidth = ADC_BITWIDTH_DEFAULT, .adc_atten = ADC_ATTEN_DB_12, }, .adc_channel = adc_channel, @@ -26,7 +28,10 @@ AdcBatteryMonitor::AdcBatteryMonitor(adc_unit_t adc_unit, adc_channel_t adc_chan }; adc_cfg.charging_detect_cb = [](void *user_data) -> bool { AdcBatteryMonitor *self = (AdcBatteryMonitor *)user_data; - return gpio_get_level(self->charging_pin_) == 1; + if(self->charging_pin_ == GPIO_NUM_NC) + return false; + else + return gpio_get_level(self->charging_pin_) == 1; }; adc_cfg.charging_detect_user_data = this; adc_battery_estimation_handle_ = adc_battery_estimation_create(&adc_cfg); @@ -48,11 +53,31 @@ AdcBatteryMonitor::~AdcBatteryMonitor() { if (adc_battery_estimation_handle_) { ESP_ERROR_CHECK(adc_battery_estimation_destroy(adc_battery_estimation_handle_)); } + + if (timer_handle_) { + esp_timer_stop(timer_handle_); + esp_timer_delete(timer_handle_); + } } bool AdcBatteryMonitor::IsCharging() { + // 如果没有充电检测引脚,直接返回false + if (charging_pin_ == GPIO_NUM_NC) { + return false; + } + + // 如果句柄无效,回退到直接读取GPIO + if (adc_battery_estimation_handle_ == nullptr) { + return gpio_get_level(charging_pin_) == 1; + } + + // 尝试通过adc_battery_estimation获取状态 bool is_charging = false; - ESP_ERROR_CHECK(adc_battery_estimation_get_charging_state(adc_battery_estimation_handle_, &is_charging)); + esp_err_t err = adc_battery_estimation_get_charging_state(adc_battery_estimation_handle_, &is_charging); + if (err != ESP_OK) { + // 如果调用失败,回退到直接读取GPIO引脚状态 + return gpio_get_level(charging_pin_) == 1; + } return is_charging; } @@ -61,9 +86,17 @@ bool AdcBatteryMonitor::IsDischarging() { } uint8_t AdcBatteryMonitor::GetBatteryLevel() { + // 如果句柄无效,返回默认值 + if (adc_battery_estimation_handle_ == nullptr) { + return 100; + } + float capacity = 0; - ESP_ERROR_CHECK(adc_battery_estimation_get_capacity(adc_battery_estimation_handle_, &capacity)); - return capacity; + esp_err_t err = adc_battery_estimation_get_capacity(adc_battery_estimation_handle_, &capacity); + if (err != ESP_OK) { + return 100; // 出错时返回默认值 + } + return (uint8_t)capacity; } void AdcBatteryMonitor::OnChargingStatusChanged(std::function callback) { @@ -71,6 +104,11 @@ void AdcBatteryMonitor::OnChargingStatusChanged(std::function callba } void AdcBatteryMonitor::CheckBatteryStatus() { + // 避免在GPIO_NUM_NC情况下进行检查 + if (charging_pin_ == GPIO_NUM_NC) { + return; + } + bool new_charging_status = IsCharging(); if (new_charging_status != is_charging_) { is_charging_ = new_charging_status;