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