summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--control/types.hpp7
-rw-r--r--control/zone.cpp45
-rw-r--r--control/zone.hpp73
3 files changed, 121 insertions, 4 deletions
diff --git a/control/types.hpp b/control/types.hpp
index 0d7610c..b0b84f3 100644
--- a/control/types.hpp
+++ b/control/types.hpp
@@ -81,8 +81,11 @@ constexpr auto eventHandlerPos = 2;
constexpr auto eventActionsPos = 3;
using EventData = std::tuple<Group, std::string, Handler, std::vector<Action>>;
-constexpr auto timerTimerPos = 0;
-using TimerEvent = std::tuple<phosphor::fan::util::Timer>;
+constexpr auto timerEventDataPos = 0;
+constexpr auto timerTimerPos = 1;
+using TimerEvent =
+ std::tuple<std::unique_ptr<EventData>,
+ std::unique_ptr<phosphor::fan::util::Timer>>;
constexpr auto signalEventDataPos = 0;
constexpr auto signalMatchPos = 1;
diff --git a/control/zone.cpp b/control/zone.cpp
index b698c12..018f594 100644
--- a/control/zone.cpp
+++ b/control/zone.cpp
@@ -259,6 +259,17 @@ void Zone::initEvent(const SetSpeedEvent& event)
auto eventTimer = std::get<timerPos>(event);
if (std::get<intervalPos>(eventTimer) != seconds(0))
{
+ // Associate event data with timer
+ std::unique_ptr<EventData> eventData =
+ std::make_unique<EventData>(
+ EventData
+ {
+ std::get<groupPos>(event),
+ "",
+ nullptr,
+ std::get<actionsPos>(event)
+ }
+ );
std::unique_ptr<util::Timer> timer =
std::make_unique<util::Timer>(
_sdEvents,
@@ -273,7 +284,7 @@ void Zone::initEvent(const SetSpeedEvent& event)
timer->start(std::get<intervalPos>(eventTimer),
std::get<typePos>(eventTimer));
}
- _timerEvents.emplace_back(std::move(timer));
+ addTimer(std::move(eventData), std::move(timer));
}
// Run action functions for initial event state
std::for_each(
@@ -332,6 +343,38 @@ void Zone::removeEvent(const SetSpeedEvent& event)
}
}
+std::vector<TimerEvent>::iterator Zone::findTimer(
+ const Group& eventGroup,
+ const std::vector<Action>& eventActions)
+{
+ for (auto it = _timerEvents.begin(); it != _timerEvents.end(); ++it)
+ {
+ auto teEventData = *std::get<timerEventDataPos>(*it);
+ if (std::get<eventActionsPos>(teEventData).size() ==
+ eventActions.size())
+ {
+ // TODO openbmc/openbmc#2328 - Use the action function target
+ // for comparison
+ auto actsEqual = [](auto const& a1,
+ auto const& a2)
+ {
+ return a1.target_type().name() ==
+ a2.target_type().name();
+ };
+ if (std::get<eventGroupPos>(teEventData) == eventGroup &&
+ std::equal(eventActions.begin(),
+ eventActions.end(),
+ std::get<eventActionsPos>(teEventData).begin(),
+ actsEqual))
+ {
+ return it;
+ }
+ }
+ }
+
+ return _timerEvents.end();
+}
+
void Zone::timerExpired(Group eventGroup, std::vector<Action> eventActions)
{
// Perform the actions
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 @@ class Zone
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 @@ class Zone
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 @@ class Zone
/**
* @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
OpenPOWER on IntegriCloud