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