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