blob: 317e264839ce8b23879945099297ebd18cf20ab1 [file] [log] [blame]
Brad Bishop5c589482017-06-14 22:32:20 -04001#pragma once
2
Brad Bishop5c589482017-06-14 22:32:20 -04003#include "evdevpp/evdev.hpp"
Brad Bishop5c589482017-06-14 22:32:20 -04004#include "psensor.hpp"
5#include "utility.hpp"
6
Matthew Barth2d2caa32020-05-26 11:07:24 -05007#include <sdeventplus/source/io.hpp>
8
9#include <optional>
10
Brad Bishop5c589482017-06-14 22:32:20 -040011namespace phosphor
12{
13namespace fan
14{
15namespace presence
16{
17class RedundancyPolicy;
18
19/**
20 * @class Gpio
21 * @brief Gpio presence sensor implementation.
22 *
23 * The Gpio class uses a gpio wire to determine presence state.
24 */
25class Gpio : public PresenceSensor
26{
Matthew Barth2d2caa32020-05-26 11:07:24 -050027 public:
28 /**
29 * @brief
30 *
31 * Cannot move or copy due to this ptr as context
32 * for sdevent callbacks.
33 */
34 Gpio() = delete;
35 Gpio(const Gpio&) = delete;
36 Gpio& operator=(const Gpio&) = delete;
37 Gpio(Gpio&&) = delete;
38 Gpio& operator=(Gpio&&) = delete;
39 ~Gpio() = default;
Brad Bishop5c589482017-06-14 22:32:20 -040040
Matthew Barth2d2caa32020-05-26 11:07:24 -050041 /**
42 * @brief Construct a gpio sensor.
43 *
44 * @param[in] physDevice - The physical gpio device path.
45 * @param[in] device - The gpio-keys input device.
46 * @param[in] physPin - The physical gpio pin number.
47 */
48 Gpio(const std::string& physDevice, const std::string& device,
49 unsigned int physPin);
Brad Bishop5c589482017-06-14 22:32:20 -040050
Matthew Barth2d2caa32020-05-26 11:07:24 -050051 /**
52 * @brief start
53 *
54 * Register for an sdevent io callback on the gpio.
55 * Query the initial state of the gpio.
56 *
57 * @return The current sensor state.
58 */
59 bool start() override;
Brad Bishop5c589482017-06-14 22:32:20 -040060
Matthew Barth2d2caa32020-05-26 11:07:24 -050061 /**
62 * @brief stop
63 *
64 * De-register sdevent io callback.
65 */
66 void stop() override;
Brad Bishop5c589482017-06-14 22:32:20 -040067
Matthew Barth2d2caa32020-05-26 11:07:24 -050068 /**
69 * @brief fail
70 *
71 * Call the gpio out.
72 */
73 void fail() override;
Brad Bishop5c589482017-06-14 22:32:20 -040074
Matthew Barth2d2caa32020-05-26 11:07:24 -050075 /**
76 * @brief Check the sensor.
77 *
78 * Query the gpio.
79 */
80 bool present() override;
Brad Bishop5c589482017-06-14 22:32:20 -040081
Matt Spinlerc65d91d2021-04-21 13:09:49 -050082 /**
83 * @brief Called when this presence sensor doesn't agree with other ones.
84 *
85 * @param[in] fanInventoryPath - The fan inventory D-Bus object path.
86 */
87 void logConflict(const std::string& fanInventoryPath) const override;
88
Matthew Barth2d2caa32020-05-26 11:07:24 -050089 private:
90 /** @brief Get the policy associated with this sensor. */
91 virtual RedundancyPolicy& getPolicy() = 0;
Brad Bishop5c589482017-06-14 22:32:20 -040092
Matthew Barth2d2caa32020-05-26 11:07:24 -050093 /** @brief sdevent io callback. */
94 void ioCallback();
Brad Bishop5c589482017-06-14 22:32:20 -040095
Matthew Barth2d2caa32020-05-26 11:07:24 -050096 /** The current state of the sensor. */
97 bool currentState;
Brad Bishop5c589482017-06-14 22:32:20 -040098
Matthew Barth2d2caa32020-05-26 11:07:24 -050099 /** Gpio event device file descriptor. */
100 util::FileDescriptor evdevfd;
Brad Bishop5c589482017-06-14 22:32:20 -0400101
Matthew Barth2d2caa32020-05-26 11:07:24 -0500102 /** Gpio event device. */
103 evdevpp::evdev::EvDev evdev;
Brad Bishop5c589482017-06-14 22:32:20 -0400104
Matthew Barth2d2caa32020-05-26 11:07:24 -0500105 /** Physical gpio device. */
106 std::string phys;
Brad Bishop5c589482017-06-14 22:32:20 -0400107
Matthew Barth2d2caa32020-05-26 11:07:24 -0500108 /** Gpio pin number. */
109 unsigned int pin;
Brad Bishop5c589482017-06-14 22:32:20 -0400110
Matthew Barth2d2caa32020-05-26 11:07:24 -0500111 /** sdevent io handle. */
112 std::optional<sdeventplus::source::IO> source;
Brad Bishop5c589482017-06-14 22:32:20 -0400113};
114
Mike Cappsa35a8902021-06-10 10:20:14 -0400115/**
116 * @class NullGpio
117 * @brief a phony presence sensor implementation that always
118 * reports not-present. Used to keep fan-presence service
119 * running when hardware is offline.
120 *
121 */
122class NullGpio : public PresenceSensor
123{
124 public:
125 NullGpio() = default;
126
127 /**
128 * @brief start
129 *
130 * Required to conform to interface
131 *
132 * @return false [dummy implementation]
133 */
134 bool start() override
135 {
136 return false;
137 }
138
139 /**
140 * @brief stop
141 *
142 * Required to conform to interface
143 */
144 void stop() override
145 {}
146
147 /**
148 * @brief Check the sensor.
149 *
150 * @return false [dummy implementation]
151 */
152 bool present() override
153 {
154 return false;
155 }
156
157 /**
158 * @brief Called when this presence sensor doesn't agree with other ones.
159 *
160 * @param[in] fanInventoryPath - The fan inventory D-Bus object path.
161 */
162 void logConflict(const std::string& fanInventoryPath) const override
163 {}
164
165 private:
166 /**
167 * @brief Required to conform to interface
168 *
169 */
170 virtual RedundancyPolicy& getPolicy() = 0;
171};
172
Brad Bishop5c589482017-06-14 22:32:20 -0400173} // namespace presence
174} // namespace fan
175} // namespace phosphor