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 */ 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