ref: 0.13.0
src/components/battery/BatteryController.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
#pragma once #include <cstdint> #include <drivers/include/nrfx_saadc.h> #include <array> #include <numeric> namespace Pinetime { namespace Controllers { /** A simple circular buffer that can be used to average out the sensor values. The total capacity of the CircBuffer is given as the template parameter N. */ template <int N> class CircBuffer { public: CircBuffer() : arr{}, sz{}, cap{N}, head{} {} /** insert member function overwrites the next data to the current HEAD and moves the HEAD to the newly inserted value. */ void insert(const int num) { head %= cap; arr[head++] = num; if (sz != cap) { sz++; } } int GetAverage() const { int sum = std::accumulate(arr.begin(), arr.end(), 0); return (sum / sz); } private: std::array<int, N> arr; /**< internal array used to store the values*/ uint8_t sz; /**< The current size of the array.*/ uint8_t cap; /**< Total capacity of the CircBuffer.*/ uint8_t head; /**< The current head of the CircBuffer*/ }; class Battery { public: void Init(); void Update(); int PercentRemaining() const { return percentRemainingBuffer.GetAverage(); } float Voltage() const { return voltage; } bool IsCharging() const { return isCharging; } bool IsPowerPresent() const { return isPowerPresent; } private: static constexpr uint32_t chargingPin = 12; static constexpr uint32_t powerPresentPin = 19; static constexpr nrf_saadc_input_t batteryVoltageAdcInput = NRF_SAADC_INPUT_AIN7; static constexpr uint8_t percentRemainingSamples = 10; static void SaadcEventHandler(nrfx_saadc_evt_t const * p_event); CircBuffer<percentRemainingSamples> percentRemainingBuffer {}; float voltage = 0.0f; bool isCharging = false; bool isPowerPresent = false; }; } } |