xref: /openbmc/phosphor-hwmon/average.cpp (revision 94539af60991235bc921c848ab1aba47485265b3)
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