xref: /openbmc/phosphor-gpio-monitor/gpioMon.hpp (revision 939a6431661931b3d31c46ec0310c553e22308d1)
1 #pragma once
2 
3 #include <gpiod.h>
4 
5 #include <boost/asio/io_service.hpp>
6 #include <boost/asio/posix/stream_descriptor.hpp>
7 
8 namespace phosphor
9 {
10 namespace gpio
11 {
12 
13 /** @class GpioMonitor
14  *  @brief Responsible for catching GPIO state change
15  *  condition and starting systemd targets.
16  */
17 class GpioMonitor
18 {
19   public:
20     GpioMonitor() = delete;
21     ~GpioMonitor() = default;
22     GpioMonitor(const GpioMonitor&) = delete;
23     GpioMonitor& operator=(const GpioMonitor&) = delete;
24     GpioMonitor(GpioMonitor&&) = delete;
25     GpioMonitor& operator=(GpioMonitor&&) = delete;
26 
27     /** @brief Constructs GpioMonitor object.
28      *
29      *  @param[in] line        - GPIO line from libgpiod
30      *  @param[in] config      - configuration of line with event
31      *  @param[in] io          - io service
32      *  @param[in] target      - systemd unit to be started on GPIO
33      *                           value change
34      *  @param[in] lineMsg     - GPIO line message to be used for log
35      *  @param[in] continueRun - Whether to continue after event occur
36      */
37     GpioMonitor(gpiod_line* line, gpiod_line_request_config& config,
38                 boost::asio::io_service& io, const std::string& target,
39                 const std::string& lineMsg, bool continueRun) :
40         gpioLine(line),
41         gpioConfig(config), gpioEventDescriptor(io), target(target),
42         gpioLineMsg(lineMsg), continueAfterEvent(continueRun)
43     {
44         requestGPIOEvents();
45     };
46 
47   private:
48     /** @brief GPIO line */
49     gpiod_line* gpioLine;
50 
51     /** @brief GPIO line configuration */
52     gpiod_line_request_config gpioConfig;
53 
54     /** @brief GPIO event descriptor */
55     boost::asio::posix::stream_descriptor gpioEventDescriptor;
56 
57     /** @brief Systemd unit to be started when the condition is met */
58     const std::string target;
59 
60     /** @brief GPIO line name message */
61     std::string gpioLineMsg;
62 
63     /** @brief If the monitor should continue after event */
64     bool continueAfterEvent;
65 
66     /** @brief register handler for gpio event
67      *
68      *  @return  - 0 on success and -1 otherwise
69      */
70     int requestGPIOEvents();
71 
72     /** @brief Schedule an event handler for GPIO event to trigger */
73     void scheduleEventHandler();
74 
75     /** @brief Handle the GPIO event and starts configured target */
76     void gpioEventHandler();
77 };
78 
79 } // namespace gpio
80 } // namespace phosphor
81