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