xref: /openbmc/phosphor-pid-control/failsafeloggers/failsafe_logger.hpp (revision 6df8bb5086b29c43217596b194dda7fbc4e3ec4a)
1 #pragma once
2 
3 #include <deque>
4 #include <memory>
5 #include <string>
6 #include <unordered_map>
7 #include <unordered_set>
8 
9 namespace pid_control
10 {
11 
12 /**
13  * Log the reason for a zone to enter and leave the failsafe mode.
14  *
15  * Particularly, for entering the failsafe mode:
16  *   1. A sensor is specified in thermal config as an input but missed in DBus
17  *   2. A sensor has null readings in DBus
18  *   3. A sensor is abnormal in DBus (not functional, not enabled, etc)
19  *   4. A sensor's reading is above upper critical (UC) limit
20  *
21  * Among the above reasons:
22  *   1 excludes 2, 3, 4.
23  *   2 excludes 1, 4.
24  *   3 excludes 1.
25  *   4 excludes 1, 2.
26  *
27  * Note that this log is at the zone level, not the sensor level.
28  */
29 class FailsafeLogger
30 {
31   public:
FailsafeLogger(size_t logMaxCountPerSecond=20,bool currentFailsafeState=false)32     FailsafeLogger(size_t logMaxCountPerSecond = 20,
33                    bool currentFailsafeState = false) :
34         _logMaxCountPerSecond(logMaxCountPerSecond),
35         _currentFailsafeState(currentFailsafeState)
36     {}
37     ~FailsafeLogger() = default;
38 
39     /** Attempt to output an entering/leaving-failsafe-mode log.
40      */
41     void outputFailsafeLog(int64_t zoneId, bool newFailsafeState,
42                            const std::string location,
43                            const std::string reason);
44 
45   private:
46     // The maximum number of log entries to be output within 1 second.
47     size_t _logMaxCountPerSecond;
48     // Whether the zone is currently in the failsafe mode.
49     bool _currentFailsafeState;
50     // The timestamps of the log entries.
51     std::deque<size_t> _logTimestamps;
52     // The logs already encountered in the current state.
53     std::unordered_set<std::string> _logsInCurrentState;
54 };
55 
56 } // namespace pid_control
57