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 /** 83 * @brief Called when this presence sensor doesn't agree with other ones. 84 * 85 * @param[in] fanInventoryPath - The fan inventory D-Bus object path. 86 */ 87 void logConflict(const std::string& fanInventoryPath) const override; 88 89 private: 90 /** @brief Get the policy associated with this sensor. */ 91 virtual RedundancyPolicy& getPolicy() = 0; 92 93 /** @brief sdevent io callback. */ 94 void ioCallback(); 95 96 /** The current state of the sensor. */ 97 bool currentState; 98 99 /** Gpio event device file descriptor. */ 100 util::FileDescriptor evdevfd; 101 102 /** Gpio event device. */ 103 evdevpp::evdev::EvDev evdev; 104 105 /** Physical gpio device. */ 106 std::string phys; 107 108 /** Gpio pin number. */ 109 unsigned int pin; 110 111 /** sdevent io handle. */ 112 std::optional<sdeventplus::source::IO> source; 113 }; 114 115 /** 116 * @class NullGpio 117 * @brief a phony presence sensor implementation that always 118 * reports not-present. Used to keep fan-presence service 119 * running when hardware is offline. 120 * 121 */ 122 class NullGpio : public PresenceSensor 123 { 124 public: 125 NullGpio() = default; 126 127 /** 128 * @brief start 129 * 130 * Required to conform to interface 131 * 132 * @return false [dummy implementation] 133 */ 134 bool start() override 135 { 136 return false; 137 } 138 139 /** 140 * @brief stop 141 * 142 * Required to conform to interface 143 */ 144 void stop() override 145 {} 146 147 /** 148 * @brief Check the sensor. 149 * 150 * @return false [dummy implementation] 151 */ 152 bool present() override 153 { 154 return false; 155 } 156 157 /** 158 * @brief Called when this presence sensor doesn't agree with other ones. 159 * 160 * @param[in] fanInventoryPath - The fan inventory D-Bus object path. 161 */ 162 void logConflict(const std::string& fanInventoryPath) const override 163 {} 164 165 private: 166 /** 167 * @brief Required to conform to interface 168 * 169 */ 170 virtual RedundancyPolicy& getPolicy() = 0; 171 }; 172 173 } // namespace presence 174 } // namespace fan 175 } // namespace phosphor 176