19bbe6026SCarol Wang #include "average.hpp"
29bbe6026SCarol Wang
39bbe6026SCarol Wang #include <cassert>
49bbe6026SCarol Wang
getAverageValue(const Average::averageKey & sensorKey) const5*94539af6SPatrick Williams std::optional<Average::averageValue> Average::getAverageValue(
6*94539af6SPatrick Williams const Average::averageKey& sensorKey) const
79bbe6026SCarol Wang {
89bbe6026SCarol Wang const auto it = _previousAverageMap.find(sensorKey);
99bbe6026SCarol Wang if (it == _previousAverageMap.end())
109bbe6026SCarol Wang {
119bbe6026SCarol Wang return {};
129bbe6026SCarol Wang }
139bbe6026SCarol Wang
149bbe6026SCarol Wang return std::optional(it->second);
159bbe6026SCarol Wang }
169bbe6026SCarol Wang
setAverageValue(const Average::averageKey & sensorKey,const Average::averageValue & sensorValue)179bbe6026SCarol Wang void Average::setAverageValue(const Average::averageKey& sensorKey,
189bbe6026SCarol Wang const Average::averageValue& sensorValue)
199bbe6026SCarol Wang {
209bbe6026SCarol Wang _previousAverageMap[sensorKey] = sensorValue;
219bbe6026SCarol Wang }
229bbe6026SCarol Wang
calcAverage(int64_t preAverage,int64_t preInterval,int64_t curAverage,int64_t curInterval)23*94539af6SPatrick Williams std::optional<int64_t> Average::calcAverage(
24*94539af6SPatrick Williams int64_t preAverage, int64_t preInterval, int64_t curAverage,
25*94539af6SPatrick Williams int64_t curInterval)
269bbe6026SCarol Wang {
279bbe6026SCarol Wang int64_t value = 0;
289bbe6026SCarol Wang // Estimate that the interval will overflow about 292471
299bbe6026SCarol Wang // years after it starts counting, so consider it won't
309bbe6026SCarol Wang // overflow
319bbe6026SCarol Wang int64_t delta = curInterval - preInterval;
329bbe6026SCarol Wang
339bbe6026SCarol Wang assert(delta >= 0);
349bbe6026SCarol Wang // 0 means the delta interval is too short, the value of
359bbe6026SCarol Wang // power*_average_interval is not changed yet
369bbe6026SCarol Wang if (delta == 0)
379bbe6026SCarol Wang {
389bbe6026SCarol Wang return {};
399bbe6026SCarol Wang }
409bbe6026SCarol Wang // Change formula (a2*i2-a1*i1)/(i2-i1) to be the
419bbe6026SCarol Wang // following formula, to avoid multiplication overflow.
429bbe6026SCarol Wang // (a2*i2-a1*i1)/(i2-i1) =
439bbe6026SCarol Wang // (a2*(i1+delta)-a1*i1)/delta =
449bbe6026SCarol Wang // (a2-a1)(i1/delta)+a2
4502e598abSPatrick Williams value =
4602e598abSPatrick Williams (curAverage - preAverage) * (static_cast<double>(preInterval) / delta) +
479bbe6026SCarol Wang curAverage;
489bbe6026SCarol Wang
499bbe6026SCarol Wang return value;
509bbe6026SCarol Wang }
51