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