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 * @param[in] e - EEPROM device instance 43 */ 44 Fallback(const Fan& fan, 45 const std::vector<std::reference_wrapper<PresenceSensor>>& s, 46 std::unique_ptr<EEPROMDevice> e) : 47 RedundancyPolicy(fan, std::move(e)), 48 sensors(s) 49 { 50 activeSensor = sensors.begin(); 51 } 52 53 /** 54 * @brief Construct a fallback policy. 55 * 56 * @param[in] fan - The fan associated with the policy. 57 * @param[in] s - The set of sensors associated with the policy. 58 */ 59 Fallback(const Fan& fan, 60 const std::vector<std::reference_wrapper<PresenceSensor>>& s) : 61 Fallback(fan, s, nullptr) 62 {} 63 64 /** 65 * @brief stateChanged 66 * 67 * Update the inventory and execute the fallback 68 * policy. 69 * 70 * @param[in] present - The new presence state according 71 * to the active sensor. 72 * @param[in] sensor - The sensor that changed state. 73 */ 74 void stateChanged(bool present, PresenceSensor& /*sensor*/) override; 75 76 /** 77 * @brief monitor 78 * 79 * Start monitoring the fan. 80 */ 81 void monitor() override; 82 83 private: 84 /** @brief All presence sensors in the redundancy set. */ 85 std::vector<std::reference_wrapper<PresenceSensor>> sensors; 86 87 /** @brief The active presence sensor. */ 88 decltype(sensors)::iterator activeSensor; 89 }; 90 91 } // namespace presence 92 } // namespace fan 93 } // namespace phosphor 94