blob: a1a5b299916489dc98d91c214852e6e1be8edd02 [file] [log] [blame]
Brad Bishopbfb81602017-06-14 21:14:32 -04001#pragma once
2
3#include <functional>
4#include <vector>
5#include "fan.hpp"
6#include "rpolicy.hpp"
7
8namespace phosphor
9{
10namespace fan
11{
12namespace presence
13{
14
15class PresenceSensor;
16
17/**
18 * @class Fallback
19 * @brief Fallback redundancy policy.
20 *
21 * The fallback redundancy policy falls back to
22 * subsequent presence sensors when the active
23 * sensor indicates not present and a fallback
24 * sensor indicates the fan is present.
25 */
26class Fallback : public RedundancyPolicy
27{
28 public:
29 Fallback() = delete;
30 Fallback(const Fallback&) = default;
31 Fallback& operator=(const Fallback&) = default;
32 Fallback(Fallback&&) = default;
33 Fallback& operator=(Fallback&&) = default;
34 ~Fallback() = default;
35
36 /**
37 * @brief Construct a fallback policy.
38 *
39 * @param[in] fan - The fan associated with the policy.
40 * @param[in] s - The set of sensors associated with the policy.
41 */
42 Fallback(
43 const Fan& fan,
44 const std::vector<std::reference_wrapper<PresenceSensor>>& s) :
45 RedundancyPolicy(fan), sensors(s)
46 {
47 activeSensor = sensors.begin();
48 }
49
50 /**
51 * @brief stateChanged
52 *
53 * Update the inventory and execute the fallback
54 * policy.
55 *
56 * @param[in] present - The new presence state according
57 * to the active sensor.
58 */
59 void stateChanged(bool present) override;
60
61 /**
62 * @brief monitor
63 *
64 * Start monitoring the fan.
65 */
66 void monitor() override;
67
68 private:
69
70 /** @brief All presence sensors in the redundancy set. */
71 std::vector<std::reference_wrapper<PresenceSensor>> sensors;
72
73 /** @brief The active presence sensor. */
74 decltype(sensors)::iterator activeSensor;
75};
76
77} // namespace presence
78} // namespace fan
79} // namespace phosphor