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