diff options
| author | Jean-François Milants <jf@codingfield.com> | 2021-11-11 09:08:20 (GMT) |
|---|---|---|
| committer | Jean-François Milants <jf@codingfield.com> | 2021-11-11 09:08:20 (GMT) |
| commit | f6d0ec49e6f2669c64729b081eb3342f02151f4a (patch) | |
| tree | 7e21c83726bd3e0d18ec4ebe871274b1dbe2eb38 /src/components/battery | |
| parent | f41aaad6836ae348d1b5b084b4533b636f516b93 (diff) | |
| parent | a57fda6ba4a29866083a1254ffdf92939d00e182 (diff) | |
Merge branch 'develop'
# Conflicts:
# doc/buildAndProgram.md
Diffstat (limited to 'src/components/battery')
| -rw-r--r-- | src/components/battery/BatteryController.cpp | 29 | ||||
| -rw-r--r-- | src/components/battery/BatteryController.h | 9 |
2 files changed, 29 insertions, 9 deletions
diff --git a/src/components/battery/BatteryController.cpp b/src/components/battery/BatteryController.cpp index 4ef20a2..e807f03 100644 --- a/src/components/battery/BatteryController.cpp +++ b/src/components/battery/BatteryController.cpp @@ -13,10 +13,20 @@ Battery::Battery() { nrf_gpio_cfg_input(PinMap::Charging, static_cast<nrf_gpio_pin_pull_t> GPIO_PIN_CNF_PULL_Disabled); } -void Battery::Update() { +void Battery::ReadPowerState() { isCharging = !nrf_gpio_pin_read(PinMap::Charging); isPowerPresent = !nrf_gpio_pin_read(PinMap::PowerPresent); + if (isPowerPresent && !isCharging) { + isFull = true; + } else if (!isPowerPresent) { + isFull = false; + } +} + +void Battery::MeasureVoltage() { + ReadPowerState(); + if (isReading) { return; } @@ -63,18 +73,23 @@ void Battery::SaadcEventHandler(nrfx_saadc_evt_t const* p_event) { // p_event->data.done.p_buffer[0] = (adc_voltage / reference_voltage) * 1024 voltage = p_event->data.done.p_buffer[0] * (8 * 600) / 1024; - if (voltage > battery_max) { - percentRemaining = 100; + uint8_t newPercent; + if (isFull) { + newPercent = 100; } else if (voltage < battery_min) { - percentRemaining = 0; + newPercent = 0; } else { - percentRemaining = (voltage - battery_min) * 100 / (battery_max - battery_min); + newPercent = std::min((voltage - battery_min) * 100 / (battery_max - battery_min), isCharging ? 99 : 100); + } + + if ((isPowerPresent && newPercent > percentRemaining) || (!isPowerPresent && newPercent < percentRemaining) || firstMeasurement) { + firstMeasurement = false; + percentRemaining = newPercent; + systemTask->PushMessage(System::Messages::BatteryPercentageUpdated); } nrfx_saadc_uninit(); isReading = false; - - systemTask->PushMessage(System::Messages::BatteryMeasurementDone); } } diff --git a/src/components/battery/BatteryController.h b/src/components/battery/BatteryController.h index 8af27ea..5a7394c 100644 --- a/src/components/battery/BatteryController.h +++ b/src/components/battery/BatteryController.h @@ -10,7 +10,8 @@ namespace Pinetime { public: Battery(); - void Update(); + void ReadPowerState(); + void MeasureVoltage(); void Register(System::SystemTask* systemTask); uint8_t PercentRemaining() const { @@ -22,7 +23,9 @@ namespace Pinetime { } bool IsCharging() const { - return isCharging; + // isCharging will go up and down when fully charged + // isFull makes sure this returns false while fully charged. + return isCharging && !isFull; } bool IsPowerPresent() const { @@ -37,8 +40,10 @@ namespace Pinetime { uint16_t voltage = 0; uint8_t percentRemaining = 0; + bool isFull = false; bool isCharging = false; bool isPowerPresent = false; + bool firstMeasurement = true; void SaadcInit(); |
