summaryrefslogtreecommitdiffstats
path: root/control/zone.cpp
diff options
context:
space:
mode:
authorMatthew Barth <msbarth@us.ibm.com>2017-10-05 17:03:40 -0500
committerMatthew Barth <msbarth@us.ibm.com>2017-11-17 13:14:11 -0600
commitbfb1a566b781e63dfda6038d9918706423410c26 (patch)
tree92197497cb281cff15d69fd91b331c0bba367718 /control/zone.cpp
parent7b7ceb8deb48d6d5833b02bc33987fca2e647a68 (diff)
downloadphosphor-fan-presence-bfb1a566b781e63dfda6038d9918706423410c26.tar.gz
phosphor-fan-presence-bfb1a566b781e63dfda6038d9918706423410c26.zip
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>
Diffstat (limited to 'control/zone.cpp')
-rw-r--r--control/zone.cpp45
1 files changed, 44 insertions, 1 deletions
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
OpenPOWER on IntegriCloud