1 #pragma once 2 3 #include "sensor.hpp" 4 5 #include <gpiod.hpp> 6 #include <phosphor-logging/lg2.hpp> 7 8 class PresenceGpio 9 { 10 public: PresenceGpio(const std::string & type,const std::string & name)11 PresenceGpio(const std::string& type, const std::string& name) : 12 deviceType(type), deviceName(name) {}; 13 PresenceGpio(const PresenceGpio&) = delete; 14 PresenceGpio& operator=(const PresenceGpio&) = delete; 15 virtual ~PresenceGpio() = 0; 16 isPresent() const17 bool isPresent() const 18 { 19 return status; 20 } 21 22 protected: 23 gpiod::line gpioLine; 24 bool status = false; 25 std::string deviceType; 26 std::string deviceName; 27 28 virtual void monitorPresence() = 0; 29 logPresent(const std::string & device)30 void logPresent(const std::string& device) 31 { 32 std::string summary = deviceType + " " + deviceName + " Inserted"; 33 std::string msg = "OpenBMC.0.1." + deviceType + "Inserted"; 34 lg2::info(summary.c_str(), "REDFISH_MESSAGE_ID", msg.c_str(), 35 "REDFISH_MESSAGE_ARGS", device); 36 } 37 logRemoved(const std::string & device)38 void logRemoved(const std::string& device) 39 { 40 std::string summary = deviceType + " " + deviceName + " Removed"; 41 std::string msg = "OpenBMC.0.1." + deviceType + "Removed"; 42 lg2::error(summary.c_str(), "REDFISH_MESSAGE_ID", msg.c_str(), 43 "REDFISH_MESSAGE_ARGS", device); 44 } 45 46 void updateAndTracePresence(); 47 }; 48 49 class EventPresenceGpio : 50 public PresenceGpio, 51 public std::enable_shared_from_this<EventPresenceGpio> 52 { 53 public: 54 EventPresenceGpio(const std::string& iDeviceType, 55 const std::string& iDeviceName, 56 const std::string& gpioName, bool inverted, 57 boost::asio::io_context& io); 58 59 private: 60 boost::asio::posix::stream_descriptor gpioFd; 61 62 void monitorPresence() override; 63 void read(); 64 }; 65