mirror of
https://github.com/meshcore-dev/MeshCore.git
synced 2026-04-20 22:13:47 +00:00
Remove the "clock cannot go backwards" restriction from all set-time paths (CLI `time`, `clock sync`, companion radio CMD_SET_DEVICE_TIME, and simple_secure_chat). The ESP32-S3 RTC drifts 5-10% during deep sleep, making backwards correction necessary after even a few days. Add safeElapsedSecs() helper in ArduinoHelpers.h that clamps elapsed time to 0 when a stored timestamp appears to be in the future after a clock correction. Applied to: - Neighbor "heard X ago" displays in simple_repeater - UI time displays in companion_radio - TimeSeriesData calculations in simple_sensor Switch BaseChatMesh connection expiry from RTC timestamps to monotonic millis(), making it immune to RTC adjustments from GPS, NTP, or manual sync. Rename last_activity to last_activity_ms to reflect the change.
46 lines
1.4 KiB
C++
46 lines
1.4 KiB
C++
#include "TimeSeriesData.h"
|
|
#include <helpers/ArduinoHelpers.h>
|
|
|
|
void TimeSeriesData::recordData(mesh::RTCClock* clock, float value) {
|
|
uint32_t now = clock->getCurrentTime();
|
|
if (now >= last_timestamp + interval_secs) {
|
|
last_timestamp = now;
|
|
|
|
data[next] = value; // append to cycle table
|
|
next = (next + 1) % num_slots;
|
|
}
|
|
}
|
|
|
|
void TimeSeriesData::calcMinMaxAvg(mesh::RTCClock* clock, uint32_t start_secs_ago, uint32_t end_secs_ago, MinMaxAvg* dest, uint8_t channel, uint8_t lpp_type) const {
|
|
int i = next, n = num_slots;
|
|
uint32_t ago = safeElapsedSecs(clock->getCurrentTime(), last_timestamp);
|
|
int num_values = 0;
|
|
float total = 0.0f;
|
|
|
|
dest->_channel = channel;
|
|
dest->_lpp_type = lpp_type;
|
|
|
|
// start at most recet recording, back-track through to oldest
|
|
while (n > 0) {
|
|
n--;
|
|
i = (i + num_slots - 1) % num_slots; // go back by one
|
|
if (ago >= end_secs_ago && ago < start_secs_ago) { // filter by the desired time range
|
|
float v = data[i];
|
|
num_values++;
|
|
total += v;
|
|
if (num_values == 1) {
|
|
dest->_max = dest->_min = v;
|
|
} else {
|
|
if (v < dest->_min) dest->_min = v;
|
|
if (v > dest->_max) dest->_max = v;
|
|
}
|
|
}
|
|
ago += interval_secs;
|
|
}
|
|
// calc average
|
|
if (num_values > 0) {
|
|
dest->_avg = total / num_values;
|
|
} else {
|
|
dest->_max = dest->_min = dest->_avg = NAN;
|
|
}
|
|
}
|