1 #pragma once 2 3 #include "fan.hpp" 4 #include "rpolicy.hpp" 5 6 #include <functional> 7 #include <vector> 8 9 namespace phosphor 10 { 11 namespace fan 12 { 13 namespace presence 14 { 15 16 class PresenceSensor; 17 18 /** 19 * @class Fallback 20 * @brief Fallback redundancy policy. 21 * 22 * The fallback redundancy policy falls back to 23 * subsequent presence sensors when the active 24 * sensor indicates not present and a fallback 25 * sensor indicates the fan is present. 26 */ 27 class Fallback : public RedundancyPolicy 28 { 29 public: 30 Fallback() = delete; 31 Fallback(const Fallback&) = default; 32 Fallback& operator=(const Fallback&) = default; 33 Fallback(Fallback&&) = default; 34 Fallback& operator=(Fallback&&) = default; 35 ~Fallback() = default; 36 37 /** 38 * @brief Construct a fallback policy. 39 * 40 * @param[in] fan - The fan associated with the policy. 41 * @param[in] s - The set of sensors associated with the policy. 42 */ 43 Fallback(const Fan& fan, 44 const std::vector<std::reference_wrapper<PresenceSensor>>& s) : 45 RedundancyPolicy(fan), 46 sensors(s) 47 { 48 activeSensor = sensors.begin(); 49 } 50 51 /** 52 * @brief stateChanged 53 * 54 * Update the inventory and execute the fallback 55 * policy. 56 * 57 * @param[in] present - The new presence state according 58 * to the active sensor. 59 * @param[in] sensor - The sensor that changed state. 60 */ 61 void stateChanged(bool present, PresenceSensor& sensor) override; 62 63 /** 64 * @brief monitor 65 * 66 * Start monitoring the fan. 67 */ 68 void monitor() override; 69 70 private: 71 /** @brief All presence sensors in the redundancy set. */ 72 std::vector<std::reference_wrapper<PresenceSensor>> sensors; 73 74 /** @brief The active presence sensor. */ 75 decltype(sensors)::iterator activeSensor; 76 }; 77 78 } // namespace presence 79 } // namespace fan 80 } // namespace phosphor 81