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