Support averaging power values

Support new env variables 'AVERAGE_power* = "true"' in hwmon config file.
When this env variable is set, power value is the calculated average value.
Otherwise, power value is from power*_input by default.
The new average of power is calculated since the last time the sensor's
values were changed and read.

average =
(cur_average*cur_average_interval - pre_average*pre_average_interval) /
(cur_average_interval - pre_average_interval)

hwmon config example:
AVERAGE_power2 = "true"
AVERAGE_power3 = "true"
AVERAGE_power4 = "true"

Tested: Set AVERAGE_power* in p0 OCC hwmon conf but not in p1 OCC hwmon conf,
then get power sensor info with restapi to check the values.
1. The values of p0*power are all average values.
2. The values of p1*power are all input values.

Note:
Delete $(CODE_COVERAGE_CPPFLAGS) in AM_CPPFLAGS in test/Makefile.am.
This option will define NDEBUG during configuration, then assert in
code doesn't work.

Resolves: openbmc/openbmc#3187
Signed-off-by: Carol Wang <wangkair@cn.ibm.com>
Change-Id: I8d97a7b2905c79cd4f2c276b32e7f5590ffc0483
diff --git a/average.cpp b/average.cpp
new file mode 100644
index 0000000..c5864bd
--- /dev/null
+++ b/average.cpp
@@ -0,0 +1,51 @@
+#include "average.hpp"
+
+#include <cassert>
+
+std::optional<Average::averageValue>
+    Average::getAverageValue(const Average::averageKey& sensorKey) const
+{
+    const auto it = _previousAverageMap.find(sensorKey);
+    if (it == _previousAverageMap.end())
+    {
+        return {};
+    }
+
+    return std::optional(it->second);
+}
+
+void Average::setAverageValue(const Average::averageKey& sensorKey,
+                              const Average::averageValue& sensorValue)
+{
+    _previousAverageMap[sensorKey] = sensorValue;
+}
+
+std::optional<int64_t> Average::calcAverage(int64_t preAverage,
+                                            int64_t preInterval,
+                                            int64_t curAverage,
+                                            int64_t curInterval)
+{
+    int64_t value = 0;
+    // Estimate that the interval will overflow about 292471
+    // years after it starts counting, so consider it won't
+    // overflow
+    int64_t delta = curInterval - preInterval;
+
+    assert(delta >= 0);
+    // 0 means the delta interval is too short, the value of
+    // power*_average_interval is not changed yet
+    if (delta == 0)
+    {
+        return {};
+    }
+    // Change formula (a2*i2-a1*i1)/(i2-i1) to be the
+    // following formula, to avoid multiplication overflow.
+    // (a2*i2-a1*i1)/(i2-i1) =
+    // (a2*(i1+delta)-a1*i1)/delta =
+    // (a2-a1)(i1/delta)+a2
+    value =
+        (curAverage - preAverage) * (static_cast<double>(preInterval) / delta) +
+        curAverage;
+
+    return value;
+}