summaryrefslogtreecommitdiffstats
path: root/monitor.hpp
diff options
context:
space:
mode:
authorVishwanatha Subbanna <vishwa@linux.vnet.ibm.com>2017-04-04 14:07:25 +0530
committerVishwanatha Subbanna <vishwa@linux.vnet.ibm.com>2017-04-27 14:42:05 +0530
commit0b95603eb48a72234b8fc618dcc4db13b6f4d079 (patch)
tree627c1ce7766aa3ace52aa6782bbf96fb4cdc9028 /monitor.hpp
parent4902a10c9fabcdf5e1f2868f28cba2d571d55f03 (diff)
downloadphosphor-gpio-monitor-0b95603eb48a72234b8fc618dcc4db13b6f4d079.tar.gz
phosphor-gpio-monitor-0b95603eb48a72234b8fc618dcc4db13b6f4d079.zip
Add sd_event loop and callback handler
Change-Id: I032d1156be2b8082fdf347a60ec883a9bc0038ae Signed-off-by: Vishwanatha Subbanna <vishwa@linux.vnet.ibm.com>
Diffstat (limited to 'monitor.hpp')
-rw-r--r--monitor.hpp62
1 files changed, 59 insertions, 3 deletions
diff --git a/monitor.hpp b/monitor.hpp
index 9e3992d..1027714 100644
--- a/monitor.hpp
+++ b/monitor.hpp
@@ -3,11 +3,33 @@
#include <unistd.h>
#include <string>
#include <linux/input.h>
+#include <systemd/sd-event.h>
#include "file.hpp"
namespace phosphor
{
namespace gpio
{
+
+/* Need a custom deleter for freeing up sd_event */
+struct EventDeleter
+{
+ void operator()(sd_event* event) const
+ {
+ event = sd_event_unref(event);
+ }
+};
+using EventPtr = std::unique_ptr<sd_event, EventDeleter>;
+
+/* Need a custom deleter for freeing up sd_event_source */
+struct EventSourceDeleter
+{
+ void operator()(sd_event_source* eventSource) const
+ {
+ eventSource = sd_event_source_unref(eventSource);
+ }
+};
+using EventSourcePtr = std::unique_ptr<sd_event_source, EventSourceDeleter>;
+
/** @class Monitor
* @brief Responsible for catching GPIO state change
* condition and taking actions
@@ -16,6 +38,7 @@ class Monitor
{
public:
Monitor() = delete;
+ ~Monitor() = default;
Monitor(const Monitor&) = delete;
Monitor& operator=(const Monitor&) = delete;
Monitor(Monitor&&) = delete;
@@ -28,20 +51,41 @@ class Monitor
* @param[in] polarity - GPIO assertion polarity to look for
* @param[in] target - systemd unit to be started on GPIO
* value change
+ * @param[in] event - sd_event handler
+ * @param[in] handler - IO callback handler. Defaults to one in this
+ * class
*/
Monitor(const std::string& path,
decltype(input_event::code) key,
decltype(input_event::value) polarity,
- const std::string& target)
+ const std::string& target,
+ EventPtr& event,
+ sd_event_io_handler_t handler = Monitor::processEvents)
: path(path),
key(key),
polarity(polarity),
target(target),
+ event(event),
+ callbackHandler(handler),
fd(openDevice())
{
- // Nothing
+ // And register callback handler when FD has some data
+ registerCallback();
}
+ /** @brief Callback handler when the FD has some activity on it
+ *
+ * @param[in] es - Populated event source
+ * @param[in] fd - Associated File descriptor
+ * @param[in] revents - Type of event
+ * @param[in] userData - User data that was passed during registration
+ *
+ * @return - 0 or positive number on success and negative
+ * errno otherwise
+ */
+ static int processEvents(sd_event_source* es, int fd,
+ uint32_t revents, void* userData);
+
private:
/** @brief Absolute path of GPIO input device */
const std::string& path;
@@ -55,11 +99,23 @@ class Monitor
/** @brief Systemd unit to be started when the condition is met */
const std::string& target;
- /** @brief Manages File descriptor */
+ /** @brief Monitor to sd_event */
+ EventPtr& event;
+
+ /** @brief event source */
+ EventSourcePtr eventSource;
+
+ /** @brief Callback handler when the FD has some data */
+ sd_event_io_handler_t callbackHandler;
+
+ /** @brief File descriptor manager */
FileDescriptor fd;
/** @brief Opens the device and populates the descriptor */
int openDevice();
+
+ /** @brief attaches FD to events and sets up callback handler */
+ void registerCallback();
};
} // namespace gpio
OpenPOWER on IntegriCloud