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),
34         iv_gpioConfig(config), iv_gpioEventDescriptor(io),
35         iv_config(i_attnConfig)
36     {
37         requestGPIOEvent(); // registers the event handler
38     }
39 
40     // delete copy constructor
41     AttnMonitor(const AttnMonitor&) = delete;
42 
43     // delete assignment operator
44     AttnMonitor& operator=(const AttnMonitor&) = delete;
45 
46     // delere move copy consructor
47     AttnMonitor(AttnMonitor&&) = delete;
48 
49     // delete move assignment operator
50     AttnMonitor& operator=(AttnMonitor&&) = delete;
51 
52   private: // instance variables
53     /** @brief gpiod handle to gpio line */
54     gpiod_line* iv_gpioLine;
55 
56     /** @brief gpiod line config data */
57     gpiod_line_request_config iv_gpioConfig;
58 
59     /** @brief GPIO event descriptor */
60     boost::asio::posix::stream_descriptor iv_gpioEventDescriptor;
61 
62     /** @brief attention handler configuration object pointer */
63     Config* iv_config;
64 
65   private: // class methods
66     /** @brief schedule a gpio event handler */
67     void scheduleGPIOEvent();
68 
69     /** @brief handle the GPIO event */
70     void handleGPIOEvent();
71 
72     /** @brief register for a gpio event */
73     void requestGPIOEvent();
74 };
75 
76 } // namespace attn
77