Support event multi targets

Description:
- Support event multi targets.

Design:
- The origin multi-gpio-monitor doesn't detect the comming events are
  rising or falling and it can only start one service after events
  triggered.

- We need to do corresponding actions when gpio pin rising or falling.
  So we modify multi-gpio-monitor config json and read the rising
  actions and falling actions in it.

- When service monitored one gpio status is changed,
  service will detect that it is a rising or falling event and then
  call systemd startUnit to start services that set in config json.

- For example with config json below:
  When PowerGood is falling, "PowerGoodFalling.service"
  and "PowerOff.service" will start.
[
  {
	"Name": "PowerGood",
	"ChipId": "0",
	"GpioNum": 14,
	"EventMon": "BOTH",
	"Targets": {
	  "FALLING": ["PowerGoodFalling.service", "PowerOff.service"],
	  "RISING": ["PowerGoodRising.service", "PowerOn.service"]
	},
	"Continue": true
  }
]

Test Case:
Check that corresponding targets start or not - pass

Signed-off-by: Delphine CC Chiu <Delphine_CC_Chiu@wiwynn.com>
Change-Id: I043d4385b91a04d360a4d50048320db15e63ac74
diff --git a/gpioMon.cpp b/gpioMon.cpp
index 2ab079a..fcdf8f5 100644
--- a/gpioMon.cpp
+++ b/gpioMon.cpp
@@ -29,6 +29,9 @@
 constexpr auto SYSTEMD_ROOT = "/org/freedesktop/systemd1";
 constexpr auto SYSTEMD_INTERFACE = "org.freedesktop.systemd1.Manager";
 
+constexpr auto falling = "FALLING";
+constexpr auto rising = "RISING";
+
 using namespace phosphor::logging;
 
 void GpioMonitor::scheduleEventHandler()
@@ -79,6 +82,37 @@
         bus.call_noreply(method);
     }
 
+    std::vector<std::string> targetsToStart;
+    if (gpioLineEvent.event_type == GPIOD_LINE_EVENT_RISING_EDGE)
+    {
+        auto risingFind = targets.find(rising);
+        if (risingFind != targets.end())
+        {
+            targetsToStart = risingFind->second;
+        }
+    }
+    else
+    {
+        auto fallingFind = targets.find(falling);
+        if (fallingFind != targets.end())
+        {
+            targetsToStart = fallingFind->second;
+        }
+    }
+
+    /* Execute the multi targets if it is defined. */
+    if (!targetsToStart.empty())
+    {
+        auto bus = sdbusplus::bus::new_default();
+        for (auto& tar : targetsToStart)
+        {
+            auto method = bus.new_method_call(SYSTEMD_SERVICE, SYSTEMD_ROOT,
+                                              SYSTEMD_INTERFACE, "StartUnit");
+            method.append(tar, "replace");
+            bus.call_noreply(method);
+        }
+    }
+
     /* if not required to continue monitoring then return */
     if (!continueAfterEvent)
     {