mirror of
https://github.com/daveallie/crosspoint-reader.git
synced 2026-02-05 07:07:38 +03:00
switch to uint8 and fix faulty charging readouts being displayed
This commit is contained in:
parent
a3dca29b43
commit
ee75345684
@ -1,18 +1,26 @@
|
|||||||
#include "Battery.h"
|
#include "Battery.h"
|
||||||
|
|
||||||
void BatteryPercentageRingBuffer::init(uint16_t v) {
|
void BatteryPercentageRingBuffer::init(uint8_t v) {
|
||||||
for (size_t i = 0; i < MAX_SAMPLES; i++) {
|
for (size_t i = 0; i < MAX_SAMPLES; i++) {
|
||||||
buf[i] = v;
|
buf[i] = v;
|
||||||
}
|
}
|
||||||
sum = v * MAX_SAMPLES;
|
sum = v * MAX_SAMPLES;
|
||||||
prev_val = v;
|
prev_val = v;
|
||||||
head = 0;
|
head = 0;
|
||||||
|
was_charging = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BatteryPercentageRingBuffer::update(uint16_t v) {
|
void BatteryPercentageRingBuffer::update(uint8_t v) {
|
||||||
// Previous percentage is set > 100 only if buffer was constructed but not initialized yet
|
// Previous percentage is set > 100 only if buffer was constructed but not initialized yet
|
||||||
if (prev_val > 100) {
|
if (prev_val > 100) {
|
||||||
init(v);
|
init(v);
|
||||||
|
was_charging = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Buffer was reintilialized with readout values while charging (can be too high values), reinit with new readout after charging
|
||||||
|
if (was_charging){
|
||||||
|
init(v);
|
||||||
|
was_charging = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recalculate rolling sum
|
// Recalculate rolling sum
|
||||||
@ -25,10 +33,9 @@ void BatteryPercentageRingBuffer::update(uint16_t v) {
|
|||||||
if (head >= MAX_SAMPLES) head = 0;
|
if (head >= MAX_SAMPLES) head = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t BatteryPercentageRingBuffer::evaluate() {
|
uint8_t BatteryPercentageRingBuffer::evaluate() {
|
||||||
// We 'round' (only works for pos numbers but oh well good enough for battery percentages) to an int
|
|
||||||
float avg = (sum / MAX_SAMPLES) + 0.5;
|
uint8_t new_val = (sum + MAX_SAMPLES / 2) / MAX_SAMPLES;
|
||||||
uint16_t new_val = (int)avg;
|
|
||||||
|
|
||||||
// Battery percentage should not increase when not charging so we just cap it to be lower than the last value
|
// Battery percentage should not increase when not charging so we just cap it to be lower than the last value
|
||||||
if (new_val < prev_val) {
|
if (new_val < prev_val) {
|
||||||
|
|||||||
@ -8,14 +8,15 @@
|
|||||||
static BatteryMonitor battery(BAT_GPIO0);
|
static BatteryMonitor battery(BAT_GPIO0);
|
||||||
|
|
||||||
struct BatteryPercentageRingBuffer {
|
struct BatteryPercentageRingBuffer {
|
||||||
static constexpr uint16_t MAX_SAMPLES = 10;
|
static constexpr uint8_t MAX_SAMPLES = 10;
|
||||||
|
|
||||||
uint16_t buf[MAX_SAMPLES];
|
uint8_t buf[MAX_SAMPLES];
|
||||||
uint16_t head = 0;
|
uint8_t head = 0;
|
||||||
uint16_t sum = 0;
|
uint16_t sum = 0;
|
||||||
uint16_t prev_val = 161;
|
uint8_t prev_val = 161;
|
||||||
|
bool was_charging =false;
|
||||||
|
|
||||||
void init(uint16_t value);
|
void init(uint8_t value);
|
||||||
void update(uint16_t value);
|
void update(uint8_t value);
|
||||||
uint16_t evaluate();
|
uint8_t evaluate();
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user