control: Add power on/off triggers
Add two new classes of triggers: powerOn and powerOff. They are only
called during the power on and power off state changes, respectively.
They behave the same as the existing init trigger.
Signed-off-by: Matt Spinler <spinler@us.ibm.com>
Change-Id: I9d39210843192b9c343c7838c604fcce7c8d3f3d
diff --git a/control/json/event.cpp b/control/json/event.cpp
index 082d0bf..a1392e5 100644
--- a/control/json/event.cpp
+++ b/control/json/event.cpp
@@ -59,9 +59,35 @@
void Event::enable()
{
- for (const auto& trigger : _triggers)
+ for (const auto& [type, trigger] : _triggers)
{
- trigger(getName(), _manager, _groups, _actions);
+ // Don't call the powerOn or powerOff triggers
+ if (type.find("power") == std::string::npos)
+ {
+ trigger(getName(), _manager, _groups, _actions);
+ }
+ }
+}
+
+void Event::powerOn()
+{
+ for (const auto& [type, trigger] : _triggers)
+ {
+ if (type == "poweron")
+ {
+ trigger(getName(), _manager, _groups, _actions);
+ }
+ }
+}
+
+void Event::powerOff()
+{
+ for (const auto& [type, trigger] : _triggers)
+ {
+ if (type == "poweroff")
+ {
+ trigger(getName(), _manager, _groups, _actions);
+ }
}
}
@@ -266,6 +292,7 @@
if (trigFunc != trigger::triggers.end())
{
_triggers.emplace_back(
+ trigFunc->first,
trigFunc->second(jsonTrig, getName(), _actions));
}
else
diff --git a/control/json/event.hpp b/control/json/event.hpp
index 78bc633..e4e01ea 100644
--- a/control/json/event.hpp
+++ b/control/json/event.hpp
@@ -79,6 +79,16 @@
void enable();
/**
+ * @brief Call any power on triggers
+ */
+ void powerOn();
+
+ /**
+ * @brief Call any power off triggers
+ */
+ void powerOff();
+
+ /**
* @brief Clear all groups available for events
*/
static void clearAllGroups()
@@ -147,8 +157,8 @@
/* List of actions for this event */
std::vector<std::unique_ptr<ActionBase>> _actions;
- /* List of trigger enablement functions for this event */
- std::vector<trigger::enableTrigger> _triggers;
+ /* List of trigger type and enablement functions for this event */
+ std::vector<std::tuple<std::string, trigger::enableTrigger>> _triggers;
/* All groups available to be configred on events */
static std::map<configKey, std::unique_ptr<Group>> allGroups;
diff --git a/control/json/manager.cpp b/control/json/manager.cpp
index 61924ea..20f13e9 100644
--- a/control/json/manager.cpp
+++ b/control/json/manager.cpp
@@ -233,6 +233,16 @@
std::for_each(_zones.begin(), _zones.end(), [](const auto& entry) {
entry.second->setTarget(entry.second->getPoweronTarget());
});
+
+ // Tell events to run their power on triggers
+ std::for_each(_events.begin(), _events.end(),
+ [](const auto& entry) { entry.second->powerOn(); });
+ }
+ else
+ {
+ // Tell events to run their power off triggers
+ std::for_each(_events.begin(), _events.end(),
+ [](const auto& entry) { entry.second->powerOff(); });
}
}
diff --git a/control/json/triggers/trigger.hpp b/control/json/triggers/trigger.hpp
index ced50d7..c8847c4 100644
--- a/control/json/triggers/trigger.hpp
+++ b/control/json/triggers/trigger.hpp
@@ -29,6 +29,8 @@
static const std::map<std::string, createTrigger> triggers = {
{"timer", timer::triggerTimer},
{"signal", signal::triggerSignal},
- {"init", init::triggerInit}};
+ {"init", init::triggerInit},
+ {"poweron", init::triggerInit},
+ {"poweroff", init::triggerInit}};
} // namespace phosphor::fan::control::json::trigger