TimeSeriesData.cpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #include "TimeSeriesData.h"
  2. void TimeSeriesData::recordData(mesh::RTCClock* clock, float value) {
  3. uint32_t now = clock->getCurrentTime();
  4. if (now >= last_timestamp + interval_secs) {
  5. last_timestamp = now;
  6. data[next] = value; // append to cycle table
  7. next = (next + 1) % num_slots;
  8. }
  9. }
  10. 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 {
  11. int i = next, n = num_slots;
  12. uint32_t ago = clock->getCurrentTime() - last_timestamp;
  13. int num_values = 0;
  14. float total = 0.0f;
  15. dest->_channel = channel;
  16. dest->_lpp_type = lpp_type;
  17. // start at most recet recording, back-track through to oldest
  18. while (n > 0) {
  19. n--;
  20. i = (i + num_slots - 1) % num_slots; // go back by one
  21. if (ago >= end_secs_ago && ago < start_secs_ago) { // filter by the desired time range
  22. float v = data[i];
  23. num_values++;
  24. total += v;
  25. if (num_values == 1) {
  26. dest->_max = dest->_min = v;
  27. } else {
  28. if (v < dest->_min) dest->_min = v;
  29. if (v > dest->_max) dest->_max = v;
  30. }
  31. }
  32. ago += interval_secs;
  33. }
  34. // calc average
  35. if (num_values > 0) {
  36. dest->_avg = total / num_values;
  37. } else {
  38. dest->_max = dest->_min = dest->_avg = NAN;
  39. }
  40. }