restore battery buffer

This commit is contained in:
Joaquim 2021-04-08 16:15:57 +01:00
parent 365e68e6cc
commit 3cf4df905a
3 changed files with 41 additions and 12 deletions

View File

@ -66,6 +66,8 @@ void Battery::SaadcEventHandler(nrfx_saadc_evt_t const * p_event) {
percentRemaining = std::max(percentRemaining, 0); percentRemaining = std::max(percentRemaining, 0);
percentRemaining = std::min(percentRemaining, 100); percentRemaining = std::min(percentRemaining, 100);
percentRemainingBuffer.insert(percentRemaining);
nrfx_saadc_uninit(); nrfx_saadc_uninit();
} }
} }
@ -73,11 +75,3 @@ void Battery::SaadcEventHandler(nrfx_saadc_evt_t const * p_event) {
void Battery::adcCallbackStatic(nrfx_saadc_evt_t const *event) { void Battery::adcCallbackStatic(nrfx_saadc_evt_t const *event) {
instance->SaadcEventHandler(event); instance->SaadcEventHandler(event);
} }
int Battery::PercentRemaining() {
return percentRemaining;
}
float Battery::Voltage() {
return voltage;
}

View File

@ -7,6 +7,38 @@
namespace Pinetime { namespace Pinetime {
namespace Controllers { 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 { class Battery {
public: public:
@ -15,8 +47,9 @@ namespace Pinetime {
void Init(); void Init();
void Update(); void Update();
int PercentRemaining(); int PercentRemaining() const { return percentRemainingBuffer.GetAverage(); }
float Voltage();
float Voltage() const { return voltage; }
bool IsCharging() const { return isCharging; } bool IsCharging() const { return isCharging; }
bool IsPowerPresent() const { return isPowerPresent; } bool IsPowerPresent() const { return isPowerPresent; }
@ -25,6 +58,9 @@ namespace Pinetime {
static Battery *instance; static Battery *instance;
nrf_saadc_value_t saadc_value; nrf_saadc_value_t saadc_value;
static constexpr uint8_t percentRemainingSamples = 10;
CircBuffer<percentRemainingSamples> percentRemainingBuffer {};
static constexpr uint32_t chargingPin = 12; static constexpr uint32_t chargingPin = 12;
static constexpr uint32_t powerPresentPin = 19; static constexpr uint32_t powerPresentPin = 19;
static constexpr nrf_saadc_input_t batteryVoltageAdcInput = NRF_SAADC_INPUT_AIN7; static constexpr nrf_saadc_input_t batteryVoltageAdcInput = NRF_SAADC_INPUT_AIN7;

View File

@ -153,8 +153,7 @@ bool Twos::tryMove(Tile grid[][4], int newRow, int newCol, int oldRow, int oldCo
} }
bool Twos::OnTouchEvent(Pinetime::Applications::TouchEvents event) { bool Twos::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
bool validMove; bool validMove = false;
validMove = false;
for(int row = 0; row < 4; row++) { for(int row = 0; row < 4; row++) {
for(int col = 0; col < 4; col++) { for(int col = 0; col < 4; col++) {
grid[row][col].merged = false; // reinitialize merge state grid[row][col].merged = false; // reinitialize merge state