blob: e6a1685eb7e6ede1a453d50f613a119de2c29f30 [file] [log] [blame]
Brad Bishopbfb81602017-06-14 21:14:32 -04001#pragma once
2
Brad Bishopbfb81602017-06-14 21:14:32 -04003#include "fan.hpp"
4#include "rpolicy.hpp"
5
Matthew Barth2d2caa32020-05-26 11:07:24 -05006#include <functional>
7#include <vector>
8
Brad Bishopbfb81602017-06-14 21:14:32 -04009namespace phosphor
10{
11namespace fan
12{
13namespace presence
14{
15
16class 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 */
27class Fallback : public RedundancyPolicy
28{
Matthew Barth2d2caa32020-05-26 11:07:24 -050029 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;
Brad Bishopbfb81602017-06-14 21:14:32 -040036
Matthew Barth2d2caa32020-05-26 11:07:24 -050037 /**
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.
Matt Spinlerbc4179e2022-10-04 15:15:06 -050042 * @param[in] e - EEPROM device instance
Matthew Barth2d2caa32020-05-26 11:07:24 -050043 */
44 Fallback(const Fan& fan,
Matt Spinlerbc4179e2022-10-04 15:15:06 -050045 const std::vector<std::reference_wrapper<PresenceSensor>>& s,
46 std::unique_ptr<EEPROMDevice> e) :
47 RedundancyPolicy(fan, std::move(e)),
Matthew Barth2d2caa32020-05-26 11:07:24 -050048 sensors(s)
49 {
50 activeSensor = sensors.begin();
51 }
Brad Bishopbfb81602017-06-14 21:14:32 -040052
Matthew Barth2d2caa32020-05-26 11:07:24 -050053 /**
Matt Spinler08bc72f2022-10-12 09:36:42 -050054 * @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 /**
Matthew Barth2d2caa32020-05-26 11:07:24 -050065 * @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 */
Mike Capps808d7fe2022-06-13 10:12:16 -040074 void stateChanged(bool present, PresenceSensor& /*sensor*/) override;
Brad Bishopbfb81602017-06-14 21:14:32 -040075
Matthew Barth2d2caa32020-05-26 11:07:24 -050076 /**
77 * @brief monitor
78 *
79 * Start monitoring the fan.
80 */
81 void monitor() override;
Brad Bishopbfb81602017-06-14 21:14:32 -040082
Matthew Barth2d2caa32020-05-26 11:07:24 -050083 private:
84 /** @brief All presence sensors in the redundancy set. */
85 std::vector<std::reference_wrapper<PresenceSensor>> sensors;
Brad Bishopbfb81602017-06-14 21:14:32 -040086
Matthew Barth2d2caa32020-05-26 11:07:24 -050087 /** @brief The active presence sensor. */
88 decltype(sensors)::iterator activeSensor;
Brad Bishopbfb81602017-06-14 21:14:32 -040089};
90
91} // namespace presence
92} // namespace fan
93} // namespace phosphor