Populate the file descriptor for the device

On a GPIO chip, there could be many gpio lines and for each line,
there would be a corresponding input device event file.
To know the assertion state of a GPIO line, a descriptor is needed.
This descriptor will later be plugged into sd_event so that the
GPIO state changes can be caught and handled.

Change-Id: Idc8c2b429688fea2a5124b96677085b1be48128b
Signed-off-by: Vishwanatha Subbanna <vishwa@linux.vnet.ibm.com>
diff --git a/monitor.hpp b/monitor.hpp
new file mode 100644
index 0000000..9e3992d
--- /dev/null
+++ b/monitor.hpp
@@ -0,0 +1,66 @@
+#pragma once
+
+#include <unistd.h>
+#include <string>
+#include <linux/input.h>
+#include "file.hpp"
+namespace phosphor
+{
+namespace gpio
+{
+/** @class Monitor
+ *  @brief Responsible for catching GPIO state change
+ *  condition and taking actions
+ */
+class Monitor
+{
+    public:
+        Monitor() = delete;
+        Monitor(const Monitor&) = delete;
+        Monitor& operator=(const Monitor&) = delete;
+        Monitor(Monitor&&) = delete;
+        Monitor& operator=(Monitor&&) = delete;
+
+        /** @brief Constructs Monitor object.
+         *
+         *  @param[in] path     - Path to gpio input device
+         *  @param[in] key      - GPIO key to monitor
+         *  @param[in] polarity - GPIO assertion polarity to look for
+         *  @param[in] target   - systemd unit to be started on GPIO
+         *                        value change
+         */
+        Monitor(const std::string& path,
+                decltype(input_event::code) key,
+                decltype(input_event::value) polarity,
+                const std::string& target)
+            : path(path),
+              key(key),
+              polarity(polarity),
+              target(target),
+              fd(openDevice())
+        {
+            // Nothing
+        }
+
+    private:
+        /** @brief Absolute path of GPIO input device */
+        const std::string& path;
+
+        /** @brief GPIO key code that is of interest */
+        decltype(input_event::code) key;
+
+        /** @brief GPIO key value that is of interest */
+        decltype(input_event::value) polarity;
+
+        /** @brief Systemd unit to be started when the condition is met */
+        const std::string& target;
+
+        /** @brief Manages File descriptor */
+        FileDescriptor fd;
+
+        /** @brief Opens the device and populates the descriptor */
+        int openDevice();
+};
+
+} // namespace gpio
+} // namespace phosphor