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