sy6970.cc 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include "sy6970.h"
  2. #include "board.h"
  3. #include "display.h"
  4. #include <esp_log.h>
  5. #define TAG "Sy6970"
  6. Sy6970::Sy6970(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c_bus, addr) {
  7. }
  8. int Sy6970::GetChangingStatus() {
  9. return (ReadReg(0x0B) >> 3) & 0x03;
  10. }
  11. bool Sy6970::IsCharging() {
  12. return GetChangingStatus() != 0;
  13. }
  14. bool Sy6970::IsPowerGood() {
  15. return (ReadReg(0x0B) & 0x04) != 0;
  16. }
  17. bool Sy6970::IsChargingDone() {
  18. return GetChangingStatus() == 3;
  19. }
  20. int Sy6970::GetBatteryVoltage() {
  21. uint8_t value = ReadReg(0x0E);
  22. value &= 0x7F;
  23. if (value == 0) {
  24. return 0;
  25. }
  26. return value * 20 + 2304;
  27. }
  28. int Sy6970::GetChargeTargetVoltage() {
  29. uint8_t value = ReadReg(0x06);
  30. value = (value & 0xFC) >> 2;
  31. if (value > 0x30) {
  32. return 4608;
  33. }
  34. return value * 16 + 3840;
  35. }
  36. int Sy6970::GetBatteryLevel() {
  37. int level = 0;
  38. // 电池所能掉电的最低电压
  39. int battery_minimum_voltage = 3200;
  40. int battery_voltage = GetBatteryVoltage();
  41. int charge_voltage_limit = GetChargeTargetVoltage();
  42. // ESP_LOGI(TAG, "battery_voltage: %d, charge_voltage_limit: %d", battery_voltage, charge_voltage_limit);
  43. if (battery_voltage > battery_minimum_voltage && charge_voltage_limit > battery_minimum_voltage) {
  44. level = (((float) battery_voltage - (float) battery_minimum_voltage) / ((float) charge_voltage_limit - (float) battery_minimum_voltage)) * 100.0;
  45. }
  46. // 不连接电池时读取的充电状态不稳定且battery_voltage有时会超过charge_voltage_limit
  47. if (level > 100) {
  48. level = 100;
  49. }
  50. return level;
  51. }
  52. void Sy6970::PowerOff() {
  53. WriteReg(0x09, 0B01100100);
  54. }