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)
{