blob: c34ed759dee550af9192d443ad4876406726483b [file] [log] [blame]
Patrick Rudolph46a9a5b2023-08-10 18:32:05 +02001#pragma once
2
3#include <gpiod.h>
4
5#include <boost/asio/io_context.hpp>
6#include <boost/asio/posix/stream_descriptor.hpp>
7#include <sdbusplus/bus.hpp>
8#include <sdbusplus/message.hpp>
9
10#include <cstdlib>
11#include <filesystem>
12#include <map>
13#include <string>
14#include <vector>
15
16static constexpr auto deviceField = 0;
17static constexpr auto pathField = 1;
18using Device = std::string;
19using Path = std::filesystem::path;
20using Driver = std::tuple<Device, Path>;
21using Interface = std::string;
22
23namespace phosphor
24{
25namespace gpio
26{
27
28/** @class GpioPresence
29 * @brief Responsible for catching GPIO state change
30 * condition and updating the inventory presence.
31 */
32class GpioPresence
33{
34 using Property = std::string;
35 using Value = std::variant<bool, std::string>;
36 // Association between property and its value
37 using PropertyMap = std::map<Property, Value>;
38 using Interface = std::string;
39 // Association between interface and the D-Bus property
40 using InterfaceMap = std::map<Interface, PropertyMap>;
41 using Object = sdbusplus::message::object_path;
42 // Association between object and the interface
43 using ObjectMap = std::map<Object, InterfaceMap>;
44
45 public:
46 GpioPresence() = delete;
47 ~GpioPresence() = default;
48 GpioPresence(const GpioPresence&) = delete;
49 GpioPresence& operator=(const GpioPresence&) = delete;
50
51 /** @brief Constructs GpioPresence object.
52 *
53 * @param[in] line - GPIO line from libgpiod
54 * @param[in] config - configuration of line with event
55 * @param[in] io - io service
56 * @param[in] inventory - Object path under inventory that
57 will be created
58 * @param[in] extraInterfaces - List of interfaces to associate to
59 inventory item
60 * @param[in] name - PrettyName of inventory object
61 * @param[in] lineMsg - GPIO line message to be used for log
62 */
63 GpioPresence(gpiod_line* line, gpiod_line_request_config& config,
64 boost::asio::io_context& io, const std::string& inventory,
65 const std::vector<std::string>& extraInterfaces,
66 const std::string& name, const std::string& lineMsg) :
Patrick Williams8377d592024-08-16 15:21:08 -040067 gpioLine(line), gpioConfig(config), gpioEventDescriptor(io),
68 inventory(inventory), interfaces(extraInterfaces), name(name),
69 gpioLineMsg(lineMsg)
Patrick Rudolph46a9a5b2023-08-10 18:32:05 +020070 {
71 requestGPIOEvents();
72 };
73
74 GpioPresence(GpioPresence&& old) noexcept :
75 gpioLine(old.gpioLine), gpioConfig(old.gpioConfig),
76 gpioEventDescriptor(old.gpioEventDescriptor.get_executor()),
77 inventory(std::move(old.inventory)),
78 interfaces(std::move(old.interfaces)), name(std::move(old.name)),
79 gpioLineMsg(std::move(old.gpioLineMsg))
80 {
81 old.cancelEventHandler();
82
83 gpioEventDescriptor = std::move(old.gpioEventDescriptor);
84
85 scheduleEventHandler();
86 };
87
88 private:
89 /** @brief GPIO line */
90 gpiod_line* gpioLine;
91
92 /** @brief GPIO line configuration */
93 gpiod_line_request_config gpioConfig;
94
95 /** @brief GPIO event descriptor */
96 boost::asio::posix::stream_descriptor gpioEventDescriptor;
97
98 /** @brief Object path under inventory that will be created */
99 const std::string inventory;
100
101 /** @brief List of interfaces to associate to inventory item */
102 const std::vector<std::string> interfaces;
103
104 /** @brief PrettyName of inventory object */
105 const std::string name;
106
107 /** @brief GPIO line name message */
108 const std::string gpioLineMsg;
109
110 /** @brief register handler for gpio event
111 *
112 * @return - 0 on success and -1 otherwise
113 */
114 int requestGPIOEvents();
115
116 /** @brief Schedule an event handler for GPIO event to trigger */
117 void scheduleEventHandler();
118
119 /** @brief Stop the event handler for GPIO events */
120 void cancelEventHandler();
121
122 /** @brief Handle the GPIO event and starts configured target */
123 void gpioEventHandler();
124
125 /** @brief Returns the object map for the inventory object */
126 ObjectMap getObjectMap(bool present);
127
128 /** @brief Updates the inventory */
129 void updateInventory(bool present);
130};
131
132} // namespace gpio
133} // namespace phosphor