1 #pragma once
2 
3 #include <sdeventplus/source/io.hpp>
4 #include <optional>
5 #include "evdevpp/evdev.hpp"
6 #include "psensor.hpp"
7 #include "utility.hpp"
8 
9 namespace phosphor
10 {
11 namespace fan
12 {
13 namespace presence
14 {
15 class RedundancyPolicy;
16 
17 /**
18  * @class Gpio
19  * @brief Gpio presence sensor implementation.
20  *
21  * The Gpio class uses a gpio wire to determine presence state.
22  */
23 class Gpio : public PresenceSensor
24 {
25     public:
26         /**
27          * @brief
28          *
29          * Cannot move or copy due to this ptr as context
30          * for sdevent callbacks.
31          */
32         Gpio() = delete;
33         Gpio(const Gpio&) = delete;
34         Gpio& operator=(const Gpio&) = delete;
35         Gpio(Gpio&&) = delete;
36         Gpio& operator=(Gpio&&) = delete;
37         ~Gpio() = default;
38 
39         /**
40          * @brief Construct a gpio sensor.
41          *
42          * @param[in] physDevice - The physical gpio device path.
43          * @param[in] device - The gpio-keys input device.
44          * @param[in] physPin - The physical gpio pin number.
45          */
46         Gpio(
47                 const std::string& physDevice,
48                 const std::string& device,
49                 unsigned int physPin);
50 
51         /**
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;
60 
61         /**
62          * @brief stop
63          *
64          * De-register sdevent io callback.
65          */
66         void stop() override;
67 
68         /**
69          * @brief fail
70          *
71          * Call the gpio out.
72          */
73         void fail() override;
74 
75         /**
76          * @brief Check the sensor.
77          *
78          * Query the gpio.
79          */
80         bool present() override;
81 
82     private :
83          /** @brief Get the policy associated with this sensor. */
84         virtual RedundancyPolicy& getPolicy() = 0;
85 
86          /** @brief sdevent io callback. */
87         void ioCallback();
88 
89         /** The current state of the sensor. */
90         bool currentState;
91 
92         /** Gpio event device file descriptor. */
93         util::FileDescriptor evdevfd;
94 
95         /** Gpio event device. */
96         evdevpp::evdev::EvDev evdev;
97 
98         /** Physical gpio device. */
99         std::string phys;
100 
101         /** Gpio pin number. */
102         unsigned int pin;
103 
104         /** sdevent io handle. */
105         std::optional<sdeventplus::source::IO> source;
106 };
107 
108 } // namespace presence
109 } // namespace fan
110 } // namespace phosphor
111