Add timer event management

Events defined to have timers require the ability to find a timer, add a
timer to the event, and removing a timer event entirely. These event
timers are intended to allow actions based on the event to be delayed or
recurring based on the timer defined.

Change-Id: Ieaf26f031c5e5aac9472e92354bfb76392642cb4
Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
diff --git a/control/zone.hpp b/control/zone.hpp
index 9c08032..1fdeaf2 100644
--- a/control/zone.hpp
+++ b/control/zone.hpp
@@ -1,6 +1,7 @@
 #pragma once
 #include <chrono>
 #include <vector>
+#include <cassert>
 #include <algorithm>
 #include <sdbusplus/bus.hpp>
 #include "fan.hpp"
@@ -139,6 +140,18 @@
                              const bool hasOwner);
 
         /**
+         * @brief Get the group's list of service names
+         *
+         * @param[in] group - Group to get service names for
+         *
+         * @return - The list of service names
+         */
+        inline auto getGroupServices(const Group* group)
+        {
+            return _services.at(*group);
+        }
+
+        /**
          * @brief Initialize a set speed event properties and actions
          *
          * @param[in] event - Set speed event
@@ -264,6 +277,64 @@
         void decTimerExpired();
 
         /**
+         * @brief Get the event pointer used with this zone's timers
+         *
+         * @return - The Dbus event pointer for timers
+         */
+        inline auto& getEventPtr()
+        {
+            return _sdEvents;
+        }
+
+        /**
+         * @brief Get the list of timer events
+         *
+         * @return - List of timer events
+         */
+        inline auto& getTimerEvents()
+        {
+            return _timerEvents;
+        }
+
+        /**
+         * @brief Find the first instance of a timer event
+         *
+         * @param[in] eventGroup - Group associated with a timer
+         * @param[in] eventActions - List of actions associated with a timer
+         *
+         * @return - Iterator to the timer event
+         */
+        std::vector<TimerEvent>::iterator findTimer(
+                const Group& eventGroup,
+                const std::vector<Action>& eventActions);
+
+        /**
+         * @brief Add a timer to the list of timer based events
+         *
+         * @param[in] data - Event data for timer
+         * @param[in] timer - Timer to be added
+         */
+        inline void addTimer(
+                std::unique_ptr<EventData>&& data,
+                std::unique_ptr<phosphor::fan::util::Timer>&& timer)
+        {
+            _timerEvents.emplace_back(std::move(data), std::move(timer));
+        };
+
+        /**
+         * @brief Remove the given timer event
+         *
+         * @param[in] teIter - Iterator pointing to the timer event to remove
+         */
+        inline void removeTimer(std::vector<TimerEvent>::iterator& teIter)
+        {
+            assert(teIter != std::end(_timerEvents));
+            std::get<timerEventDataPos>(*teIter).reset();
+            std::get<timerTimerPos>(*teIter).reset();
+            _timerEvents.erase(teIter);
+        }
+
+        /**
          * @brief Callback function for event timers that processes the given
          * actions for a group
          *
@@ -395,7 +466,7 @@
         /**
          * @brief List of timers for events
          */
-        std::vector<std::unique_ptr<phosphor::fan::util::Timer>> _timerEvents;
+        std::vector<TimerEvent> _timerEvents;
 
         /**
          * @brief Get the request speed base if defined, otherwise the