Skip to content

Commit 1ccd510

Browse files
konglingboyYuv Zhao
andauthored
Optimize AdcBatteryMonitor to work without charge detection pin. (#1276)
Co-authored-by: Yuv Zhao <[email protected]>
1 parent 1d1f9ff commit 1ccd510

File tree

1 file changed

+52
-14
lines changed

1 file changed

+52
-14
lines changed

main/boards/common/adc_battery_monitor.cc

Lines changed: 52 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,23 @@
33
AdcBatteryMonitor::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

5363
bool 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

6388
uint8_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

69102
void AdcBatteryMonitor::OnChargingStatusChanged(std::function<void(bool)> callback) {
70103
on_charging_status_changed_ = callback;
71104
}
72105

73106
void 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

Comments
 (0)