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.hpp b/gpioMon.hpp
index 51772ab..5750d39 100644
--- a/gpioMon.hpp
+++ b/gpioMon.hpp
@@ -4,6 +4,8 @@
#include <boost/asio/io_context.hpp>
#include <boost/asio/posix/stream_descriptor.hpp>
+#include <map>
+#include <vector>
namespace phosphor
{
@@ -31,15 +33,18 @@
* @param[in] io - io service
* @param[in] target - systemd unit to be started on GPIO
* value change
+ * @param[in] targets - systemd units to be started on GPIO
+ * value change
* @param[in] lineMsg - GPIO line message to be used for log
* @param[in] continueRun - Whether to continue after event occur
*/
GpioMonitor(gpiod_line* line, gpiod_line_request_config& config,
boost::asio::io_context& io, const std::string& target,
+ const std::map<std::string, std::vector<std::string>>& targets,
const std::string& lineMsg, bool continueRun) :
gpioLine(line),
gpioConfig(config), gpioEventDescriptor(io), target(target),
- gpioLineMsg(lineMsg), continueAfterEvent(continueRun)
+ targets(targets), gpioLineMsg(lineMsg), continueAfterEvent(continueRun)
{
requestGPIOEvents();
};
@@ -57,6 +62,9 @@
/** @brief Systemd unit to be started when the condition is met */
const std::string target;
+ /** @brief Multi systemd units to be started when the condition is met */
+ std::map<std::string, std::vector<std::string>> targets;
+
/** @brief GPIO line name message */
std::string gpioLineMsg;