1 #pragma once
2 
3 #include <gpiod.h>
4 
5 #include <attn/attn_config.hpp>
6 #include <boost/asio/io_context.hpp>
7 #include <boost/asio/posix/stream_descriptor.hpp>
8 
9 namespace attn
10 {
11 
12 /**
13  *  @brief Responsible for monitoring attention GPIO state change
14  */
15 class AttnMonitor
16 {
17   public:
18     AttnMonitor() = delete;
19     ~AttnMonitor() = default;
20 
21     /** @brief Constructs AttnMonitor object.
22      *
23      * The AttnMonitor constructor will create a new object and start
24      * the objects associated GPIO listener.
25      *
26      * @param line         GPIO line handle
27      * @param config       configuration of line
28      * @param io           io service
29      * @param i_attnConfig poiner to attention handler configuration object
30      */
AttnMonitor(gpiod_line * line,gpiod_line_request_config & config,boost::asio::io_context & io,Config * i_attnConfig)31     AttnMonitor(gpiod_line* line, gpiod_line_request_config& config,
32                 boost::asio::io_context& io, Config* i_attnConfig) :
33         iv_gpioLine(line), iv_gpioConfig(config), iv_gpioEventDescriptor(io),
34         iv_config(i_attnConfig)
35     {
36         requestGPIOEvent(); // registers the event handler
37     }
38 
39     // delete copy constructor
40     AttnMonitor(const AttnMonitor&) = delete;
41 
42     // delete assignment operator
43     AttnMonitor& operator=(const AttnMonitor&) = delete;
44 
45     // delere move copy consructor
46     AttnMonitor(AttnMonitor&&) = delete;
47 
48     // delete move assignment operator
49     AttnMonitor& operator=(AttnMonitor&&) = delete;
50 
51   private: // instance variables
52     /** @brief gpiod handle to gpio line */
53     gpiod_line* iv_gpioLine;
54 
55     /** @brief gpiod line config data */
56     gpiod_line_request_config iv_gpioConfig;
57 
58     /** @brief GPIO event descriptor */
59     boost::asio::posix::stream_descriptor iv_gpioEventDescriptor;
60 
61     /** @brief attention handler configuration object pointer */
62     Config* iv_config;
63 
64   private: // class methods
65     /** @brief schedule a gpio event handler */
66     void scheduleGPIOEvent();
67 
68     /** @brief handle the GPIO event */
69     void handleGPIOEvent();
70 
71     /** @brief register for a gpio event */
72     void requestGPIOEvent();
73 };
74 
75 } // namespace attn
76