blob: 54805cf96f263fa41505aaefcb8004a898e7440b [file] [log] [blame]
Chris Cain83929002024-03-06 14:20:09 -06001#pragma once
2
3#include "sensor.hpp"
4
5#include <gpiod.hpp>
6#include <phosphor-logging/lg2.hpp>
7
8class PresenceGpio
9{
10 public:
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
17 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
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
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
49class 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};