33AdcBatteryMonitor::AdcBatteryMonitor (adc_unit_t adc_unit, adc_channel_t adc_channel, float upper_resistor, float lower_resistor, gpio_num_t charging_pin)
44 : charging_pin_(charging_pin) {
55
6- // Initialize charging pin
7- gpio_config_t gpio_cfg = {
8- .pin_bit_mask = 1ULL << charging_pin,
9- .mode = GPIO_MODE_INPUT,
10- .pull_up_en = GPIO_PULLUP_DISABLE,
11- .pull_down_en = GPIO_PULLDOWN_DISABLE,
12- .intr_type = GPIO_INTR_DISABLE,
13- };
14- ESP_ERROR_CHECK (gpio_config (&gpio_cfg));
6+ // Initialize charging pin (only if it's not NC)
7+ if (charging_pin_ != GPIO_NUM_NC) {
8+ gpio_config_t gpio_cfg = {
9+ .pin_bit_mask = 1ULL << charging_pin,
10+ .mode = GPIO_MODE_INPUT,
11+ .pull_up_en = GPIO_PULLUP_DISABLE,
12+ .pull_down_en = GPIO_PULLDOWN_DISABLE,
13+ .intr_type = GPIO_INTR_DISABLE,
14+ };
15+ ESP_ERROR_CHECK (gpio_config (&gpio_cfg));
16+ }
1517
1618 // Initialize ADC battery estimation
1719 adc_battery_estimation_t adc_cfg = {
1820 .internal = {
1921 .adc_unit = adc_unit,
20- .adc_bitwidth = ADC_BITWIDTH_12 ,
22+ .adc_bitwidth = ADC_BITWIDTH_DEFAULT ,
2123 .adc_atten = ADC_ATTEN_DB_12,
2224 },
2325 .adc_channel = adc_channel,
@@ -26,7 +28,10 @@ AdcBatteryMonitor::AdcBatteryMonitor(adc_unit_t adc_unit, adc_channel_t adc_chan
2628 };
2729 adc_cfg.charging_detect_cb = [](void *user_data) -> bool {
2830 AdcBatteryMonitor *self = (AdcBatteryMonitor *)user_data;
29- return gpio_get_level (self->charging_pin_ ) == 1 ;
31+ if (self->charging_pin_ == GPIO_NUM_NC)
32+ return false ;
33+ else
34+ return gpio_get_level (self->charging_pin_ ) == 1 ;
3035 };
3136 adc_cfg.charging_detect_user_data = this ;
3237 adc_battery_estimation_handle_ = adc_battery_estimation_create (&adc_cfg);
@@ -48,11 +53,31 @@ AdcBatteryMonitor::~AdcBatteryMonitor() {
4853 if (adc_battery_estimation_handle_) {
4954 ESP_ERROR_CHECK (adc_battery_estimation_destroy (adc_battery_estimation_handle_));
5055 }
56+
57+ if (timer_handle_) {
58+ esp_timer_stop (timer_handle_);
59+ esp_timer_delete (timer_handle_);
60+ }
5161}
5262
5363bool AdcBatteryMonitor::IsCharging () {
64+ // 如果没有充电检测引脚,直接返回false
65+ if (charging_pin_ == GPIO_NUM_NC) {
66+ return false ;
67+ }
68+
69+ // 如果句柄无效,回退到直接读取GPIO
70+ if (adc_battery_estimation_handle_ == nullptr ) {
71+ return gpio_get_level (charging_pin_) == 1 ;
72+ }
73+
74+ // 尝试通过adc_battery_estimation获取状态
5475 bool is_charging = false ;
55- ESP_ERROR_CHECK (adc_battery_estimation_get_charging_state (adc_battery_estimation_handle_, &is_charging));
76+ esp_err_t err = adc_battery_estimation_get_charging_state (adc_battery_estimation_handle_, &is_charging);
77+ if (err != ESP_OK) {
78+ // 如果调用失败,回退到直接读取GPIO引脚状态
79+ return gpio_get_level (charging_pin_) == 1 ;
80+ }
5681 return is_charging;
5782}
5883
@@ -61,16 +86,29 @@ bool AdcBatteryMonitor::IsDischarging() {
6186}
6287
6388uint8_t AdcBatteryMonitor::GetBatteryLevel () {
89+ // 如果句柄无效,返回默认值
90+ if (adc_battery_estimation_handle_ == nullptr ) {
91+ return 100 ;
92+ }
93+
6494 float capacity = 0 ;
65- ESP_ERROR_CHECK (adc_battery_estimation_get_capacity (adc_battery_estimation_handle_, &capacity));
66- return capacity;
95+ esp_err_t err = adc_battery_estimation_get_capacity (adc_battery_estimation_handle_, &capacity);
96+ if (err != ESP_OK) {
97+ return 100 ; // 出错时返回默认值
98+ }
99+ return (uint8_t )capacity;
67100}
68101
69102void AdcBatteryMonitor::OnChargingStatusChanged (std::function<void (bool )> callback) {
70103 on_charging_status_changed_ = callback;
71104}
72105
73106void AdcBatteryMonitor::CheckBatteryStatus () {
107+ // 避免在GPIO_NUM_NC情况下进行检查
108+ if (charging_pin_ == GPIO_NUM_NC) {
109+ return ;
110+ }
111+
74112 bool new_charging_status = IsCharging ();
75113 if (new_charging_status != is_charging_) {
76114 is_charging_ = new_charging_status;
0 commit comments