2018-12-12 04:04:00 +00:00
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
/* Copyright (c) 2018 FIRST. All Rights Reserved. */
|
|
|
|
/* Open Source Software - may be modified and shared by FRC teams. The code */
|
|
|
|
/* must be accompanied by the FIRST BSD license file in the root directory of */
|
|
|
|
/* the project. */
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
|
2018-12-15 00:36:56 +00:00
|
|
|
#ifndef RPICONFIGSERVER_DATAHISTORY_H_
|
|
|
|
#define RPICONFIGSERVER_DATAHISTORY_H_
|
2018-12-12 04:04:00 +00:00
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
#include <numeric>
|
|
|
|
|
|
|
|
template <typename T, size_t Size>
|
|
|
|
class DataHistory {
|
|
|
|
public:
|
|
|
|
void Add(T val) {
|
|
|
|
if (m_qty >= Size) {
|
|
|
|
std::copy(&m_data[1], &m_data[Size], &m_data[0]);
|
|
|
|
m_data[Size - 1] = val;
|
|
|
|
} else {
|
|
|
|
m_data[m_qty++] = val;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* first is "least recent", last is "most recent" */
|
|
|
|
bool GetFirstLast(T* first, T* last, size_t* qty) const {
|
|
|
|
if (m_qty == 0) return false;
|
|
|
|
if (first) *first = m_data[0];
|
|
|
|
if (last) *last = m_data[m_qty - 1];
|
|
|
|
if (qty) *qty = m_qty;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* only look at most recent "count" samples */
|
|
|
|
bool GetFirstLast(T* first, T* last, size_t* qty, size_t count) const {
|
|
|
|
if (count == 0 || m_qty < count) return false;
|
|
|
|
if (first) *first = m_data[m_qty - count];
|
|
|
|
if (last) *last = m_data[m_qty - 1];
|
|
|
|
if (qty) *qty = m_qty;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
T GetTotal(size_t* qty = nullptr) const {
|
|
|
|
if (qty) *qty = m_qty;
|
|
|
|
return std::accumulate(&m_data[0], &m_data[m_qty], 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
T m_data[Size];
|
|
|
|
size_t m_qty = 0;
|
|
|
|
};
|
|
|
|
|
2018-12-15 00:36:56 +00:00
|
|
|
#endif // RPICONFIGSERVER_DATAHISTORY_H_
|