blob: 8f7db3eee9fbe4e7aa7409f00e4fa618ad59510e [file] [log] [blame]
Brad Bishop221b36b2017-06-14 16:52:42 -04001#pragma once
2
3#include "fan.hpp"
4
5namespace phosphor
6{
7namespace fan
8{
9namespace presence
10{
11
Brad Bishop11083ec2017-07-25 19:08:53 -040012class PresenceSensor;
13
Brad Bishop221b36b2017-06-14 16:52:42 -040014/**
15 * @class RedundancyPolicy
16 * @brief Redundancy policy interface.
17 *
18 * Provide concrete implementations of RedundancyPolicy to realize
19 * new redundancy logic.
20 *
21 * A fan can have multiple ways to detect whether or not it is present.
22 * The redundancy policy encapsulates the logic to aggregate those
23 * inputs into a single yes or no the fan is present.
24 */
25class RedundancyPolicy
26{
27 public:
28 RedundancyPolicy(const RedundancyPolicy&) = default;
29 RedundancyPolicy& operator=(const RedundancyPolicy&) = default;
30 RedundancyPolicy(RedundancyPolicy&&) = default;
31 RedundancyPolicy& operator=(RedundancyPolicy&&) = default;
32 virtual ~RedundancyPolicy() = default;
33
34 /**
35 * @brief Construct a new Redundancy Policy.
36 *
37 * @param[in] fan - The fan associated with this policy.
38 */
39 explicit RedundancyPolicy(const Fan& f) : fan(f) {}
40
41 /**
42 * @brief stateChanged
43 *
44 * Typically invoked by presence sensors to signify
45 * a change of presence. Implementations should update
46 * the inventory and execute their policy logic.
47 *
48 * @param[in] present - The new state of the sensor.
Brad Bishop11083ec2017-07-25 19:08:53 -040049 * @param[in] sensor - The sensor that changed state.
Brad Bishop221b36b2017-06-14 16:52:42 -040050 */
Brad Bishop11083ec2017-07-25 19:08:53 -040051 virtual void stateChanged(bool present, PresenceSensor& sensor) = 0;
Brad Bishop221b36b2017-06-14 16:52:42 -040052
53 /**
54 * @brief monitor
55 *
56 * Implementations should start monitoring the sensors
57 * associated with the fan.
58 */
59 virtual void monitor() = 0;
60
61 protected:
62 /** @brief Fan name and inventory path. */
63 const Fan& fan;
64};
65
66/**
67 * @class PolicyAccess
68 * @brief Policy association.
69 *
70 * PolicyAccess can be used to associate a redundancy policy
71 * with something else.
72 *
73 * Wrap the type to be associated with a policy with PolicyAccess.
74 *
75 * @tparam T - The type to associate with a redundancy policy.
76 * @tparam Policy - An array type where the policy is stored.
77 */
78template <typename T, typename Policy>
79class PolicyAccess : public T
80{
81 public:
82 PolicyAccess() = default;
83 PolicyAccess(const PolicyAccess&) = default;
84 PolicyAccess& operator=(const PolicyAccess&) = default;
85 PolicyAccess(PolicyAccess&&) = default;
86 PolicyAccess& operator=(PolicyAccess&&) = default;
87 ~PolicyAccess() = default;
88
89 /**
90 * @brief Construct a new PolicyAccess wrapped object.
91 *
92 * @param[in] index - The array index in Policy.
93 * @tparam Args - Forwarded to wrapped type constructor.
94 */
95 template <typename...Args>
96 PolicyAccess(size_t index, Args&&...args) :
97 T(std::forward<Args>(args)...), policy(index) {}
98
99 private:
100 /**
101 * @brief Get the associated policy.
102 */
103 RedundancyPolicy& getPolicy() override
104 {
105 return *Policy::get()[policy];
106 }
107
108 /** The associated policy index. */
109 size_t policy;
110};
111} // namespace presence
112} // namespace fan
113} // namespace phosphor