Delete values that are older than 1 hour
This commit is contained in:
parent
cc6618e650
commit
a83bac914e
|
@ -2,11 +2,11 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include <vector>
|
#include <deque>
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint64_t tstart, tend, interval;
|
uint64_t tstart, tend, interval;
|
||||||
std::vector<float> data;
|
std::deque<float> data;
|
||||||
const char *unit;
|
const char *unit;
|
||||||
const char *format;
|
const char *format;
|
||||||
} timeseries_t;
|
} timeseries_t;
|
||||||
|
@ -14,3 +14,6 @@ typedef struct {
|
||||||
void timeseries_init(timeseries_t *ts, uint64_t tstart, uint64_t interval, const char *unit, const char *format);
|
void timeseries_init(timeseries_t *ts, uint64_t tstart, uint64_t interval, const char *unit, const char *format);
|
||||||
|
|
||||||
void timeseries_append(timeseries_t *ts, float value);
|
void timeseries_append(timeseries_t *ts, float value);
|
||||||
|
|
||||||
|
// remove oldest values
|
||||||
|
void timeseries_prune(timeseries_t *ts, float duration);
|
||||||
|
|
|
@ -65,7 +65,7 @@ void epaper_draw_and_hibernate(epaper_callback cb, bool full_refresh)
|
||||||
|
|
||||||
// find minimum and maximum values in a vector. NaN is ignored.
|
// find minimum and maximum values in a vector. NaN is ignored.
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void minmax(const std::vector<T> &vec, T *min, T *max)
|
void minmax(const std::deque<T> &vec, T *min, T *max)
|
||||||
{
|
{
|
||||||
bool first = true;
|
bool first = true;
|
||||||
|
|
||||||
|
|
|
@ -157,7 +157,7 @@ static void draw_epaper_initial_callback(GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLAS
|
||||||
display->setCursor(0, y);
|
display->setCursor(0, y);
|
||||||
|
|
||||||
display->setFont(&FreeSans12pt7b);
|
display->setFont(&FreeSans12pt7b);
|
||||||
display->print("Connected to WLAN: ");
|
display->print("WLAN verbunden: ");
|
||||||
|
|
||||||
y += FreeSans12pt7b.yAdvance;
|
y += FreeSans12pt7b.yAdvance;
|
||||||
display->setCursor(0, y);
|
display->setCursor(0, y);
|
||||||
|
@ -181,7 +181,7 @@ static void draw_epaper_initial_callback(GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLAS
|
||||||
display->setCursor(0, y);
|
display->setCursor(0, y);
|
||||||
|
|
||||||
display->setFont(&FreeSans12pt7b);
|
display->setFont(&FreeSans12pt7b);
|
||||||
display->print("Initial time: ");
|
display->print("Synchronisierte Zeit: ");
|
||||||
|
|
||||||
y += FreeSans12pt7b.yAdvance;
|
y += FreeSans12pt7b.yAdvance;
|
||||||
display->setCursor(0, y);
|
display->setCursor(0, y);
|
||||||
|
@ -348,6 +348,8 @@ void loop(void)
|
||||||
if((now - lastEPaperRefresh) >= 60000) {
|
if((now - lastEPaperRefresh) >= 60000) {
|
||||||
lastEPaperRefresh = now;
|
lastEPaperRefresh = now;
|
||||||
epaper_draw_and_hibernate(draw_epaper_callback, false);
|
epaper_draw_and_hibernate(draw_epaper_callback, false);
|
||||||
|
|
||||||
|
timeseries_prune(&ts_scd30_humidity, 3600); // keep the last hour
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -16,3 +16,17 @@ void timeseries_append(timeseries_t *ts, float value)
|
||||||
ts->data.push_back(value);
|
ts->data.push_back(value);
|
||||||
ts->tend += ts->interval;
|
ts->tend += ts->interval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void timeseries_prune(timeseries_t *ts, float duration)
|
||||||
|
{
|
||||||
|
std::deque<float>::size_type to_keep = duration / ts->interval;
|
||||||
|
if(to_keep >= ts->data.size()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::deque<float>::size_type to_delete = ts->data.size() - to_keep;
|
||||||
|
ts->data.erase(ts->data.begin(), ts->data.begin() + to_delete);
|
||||||
|
|
||||||
|
ts->tstart += to_delete * ts->interval;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue