adc_battery_monitor.cc 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include "adc_battery_monitor.h"
  2. AdcBatteryMonitor::AdcBatteryMonitor(adc_unit_t adc_unit, adc_channel_t adc_channel, float upper_resistor, float lower_resistor, gpio_num_t charging_pin)
  3. : charging_pin_(charging_pin) {
  4. // Initialize charging pin
  5. gpio_config_t gpio_cfg = {
  6. .pin_bit_mask = 1ULL << charging_pin,
  7. .mode = GPIO_MODE_INPUT,
  8. .pull_up_en = GPIO_PULLUP_DISABLE,
  9. .pull_down_en = GPIO_PULLDOWN_DISABLE,
  10. .intr_type = GPIO_INTR_DISABLE,
  11. };
  12. ESP_ERROR_CHECK(gpio_config(&gpio_cfg));
  13. // Initialize ADC battery estimation
  14. adc_battery_estimation_t adc_cfg = {
  15. .internal = {
  16. .adc_unit = adc_unit,
  17. .adc_bitwidth = ADC_BITWIDTH_12,
  18. .adc_atten = ADC_ATTEN_DB_12,
  19. },
  20. .adc_channel = adc_channel,
  21. .upper_resistor = upper_resistor,
  22. .lower_resistor = lower_resistor
  23. };
  24. adc_cfg.charging_detect_cb = [](void *user_data) -> bool {
  25. AdcBatteryMonitor *self = (AdcBatteryMonitor *)user_data;
  26. return gpio_get_level(self->charging_pin_) == 1;
  27. };
  28. adc_cfg.charging_detect_user_data = this;
  29. adc_battery_estimation_handle_ = adc_battery_estimation_create(&adc_cfg);
  30. // Initialize timer
  31. esp_timer_create_args_t timer_cfg = {
  32. .callback = [](void *arg) {
  33. AdcBatteryMonitor *self = (AdcBatteryMonitor *)arg;
  34. self->CheckBatteryStatus();
  35. },
  36. .arg = this,
  37. .name = "adc_battery_monitor",
  38. };
  39. ESP_ERROR_CHECK(esp_timer_create(&timer_cfg, &timer_handle_));
  40. ESP_ERROR_CHECK(esp_timer_start_periodic(timer_handle_, 1000000));
  41. }
  42. AdcBatteryMonitor::~AdcBatteryMonitor() {
  43. if (adc_battery_estimation_handle_) {
  44. ESP_ERROR_CHECK(adc_battery_estimation_destroy(adc_battery_estimation_handle_));
  45. }
  46. }
  47. bool AdcBatteryMonitor::IsCharging() {
  48. bool is_charging = false;
  49. ESP_ERROR_CHECK(adc_battery_estimation_get_charging_state(adc_battery_estimation_handle_, &is_charging));
  50. return is_charging;
  51. }
  52. bool AdcBatteryMonitor::IsDischarging() {
  53. return !IsCharging();
  54. }
  55. uint8_t AdcBatteryMonitor::GetBatteryLevel() {
  56. float capacity = 0;
  57. ESP_ERROR_CHECK(adc_battery_estimation_get_capacity(adc_battery_estimation_handle_, &capacity));
  58. return capacity;
  59. }
  60. void AdcBatteryMonitor::OnChargingStatusChanged(std::function<void(bool)> callback) {
  61. on_charging_status_changed_ = callback;
  62. }
  63. void AdcBatteryMonitor::CheckBatteryStatus() {
  64. bool new_charging_status = IsCharging();
  65. if (new_charging_status != is_charging_) {
  66. is_charging_ = new_charging_status;
  67. if (on_charging_status_changed_) {
  68. on_charging_status_changed_(is_charging_);
  69. }
  70. }
  71. }