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