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 stateChanged 55 * 56 * Update the inventory and execute the fallback 57 * policy. 58 * 59 * @param[in] present - The new presence state according 60 * to the active sensor. 61 * @param[in] sensor - The sensor that changed state. 62 */ 63 void stateChanged(bool present, PresenceSensor& /*sensor*/) override; 64 65 /** 66 * @brief monitor 67 * 68 * Start monitoring the fan. 69 */ 70 void monitor() override; 71 72 private: 73 /** @brief All presence sensors in the redundancy set. */ 74 std::vector<std::reference_wrapper<PresenceSensor>> sensors; 75 76 /** @brief The active presence sensor. */ 77 decltype(sensors)::iterator activeSensor; 78 }; 79 80 } // namespace presence 81 } // namespace fan 82 } // namespace phosphor 83