1 #pragma once
2 
3 #include "evdevpp/evdev.hpp"
4 #include "psensor.hpp"
5 #include "utility.hpp"
6 
7 #include <sdeventplus/source/io.hpp>
8 
9 #include <optional>
10 
11 namespace phosphor
12 {
13 namespace fan
14 {
15 namespace presence
16 {
17 class 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  */
25 class Gpio : public PresenceSensor
26 {
27   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;
40 
41     /**
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);
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