Carol Wang | 9bbe602 | 2019-08-01 17:31:30 +0800 | [diff] [blame] | 1 | #pragma once |
| 2 | |
| 3 | #include "sensorset.hpp" |
| 4 | |
| 5 | #include <optional> |
| 6 | #include <string> |
| 7 | #include <vector> |
| 8 | |
| 9 | /** @class AverageHandling |
| 10 | * @brief Handle avergae value when AVERAGE_* is set in env |
| 11 | */ |
| 12 | class Average |
| 13 | { |
| 14 | public: |
| 15 | /** @brief The key type of average_set */ |
| 16 | using averageKey = SensorSet::key_type; |
| 17 | |
| 18 | /** @brief <average, average_interval> |
| 19 | * average is the value of power*_average. |
| 20 | * average_interval is the value of power*_average_interval. |
| 21 | */ |
| 22 | using averageValue = std::pair<int64_t, int64_t>; |
| 23 | |
| 24 | /** @brief Store sensors' <averageKey, averageValue> map */ |
| 25 | using averageMap = std::map<averageKey, averageValue>; |
| 26 | |
| 27 | /** @brief Get averageValue in averageMap based on averageKey. |
| 28 | * This function will be called only when the env AVERAGE_xxx is set to |
| 29 | * true. |
| 30 | * |
| 31 | * @param[in] sensorKey - Sensor details |
| 32 | * |
| 33 | * @return - Optional |
| 34 | * return {}, if sensorKey can not be found in averageMap |
| 35 | * return averageValue, if sensorKey can be found in averageMap |
| 36 | */ |
| 37 | std::optional<averageValue> |
| 38 | getAverageValue(const averageKey& sensorKey) const; |
| 39 | |
| 40 | /** @brief Set average value in averageMap based on sensor key. |
| 41 | * This function will be called only when the env AVERAGE_xxx is set to |
| 42 | * true. |
| 43 | * |
| 44 | * @param[in] sensorKey - Sensor details |
| 45 | * @param[in] sensorValue - The related average values of this sensor |
| 46 | */ |
| 47 | void setAverageValue(const averageKey& sensorKey, |
| 48 | const averageValue& sensorValue); |
| 49 | |
| 50 | /** @brief Calculate the average value. |
| 51 | * |
| 52 | * @param[in] preAverage - The previous average value from *_average file |
| 53 | * @param[in] preInterval - The previous interval value from |
| 54 | * *_average_interval file |
| 55 | * @param[in] curAverage - The current average value from *_average file |
| 56 | * @param[in] curInterval - The current interval value from |
| 57 | * *_average_interval file |
| 58 | * |
| 59 | * @return value - Optional |
| 60 | * return {}, if curInterval-preInterval=0 |
| 61 | * return new calculated average value, if curInterval-preInterval>0 |
| 62 | */ |
Patrick Williams | 02e598a | 2024-08-16 15:21:23 -0400 | [diff] [blame] | 63 | static std::optional<int64_t> |
| 64 | calcAverage(int64_t preAverage, int64_t preInterval, int64_t curAverage, |
| 65 | int64_t curInterval); |
Carol Wang | 9bbe602 | 2019-08-01 17:31:30 +0800 | [diff] [blame] | 66 | |
| 67 | private: |
| 68 | /** @brief Store the previous average sensor map */ |
| 69 | averageMap _previousAverageMap; |
Patrick Williams | e8771fd | 2023-05-10 07:51:06 -0500 | [diff] [blame] | 70 | }; |