diff options
author | Matthew Barth <msbarth@us.ibm.com> | 2017-10-05 17:03:40 -0500 |
---|---|---|
committer | Matthew Barth <msbarth@us.ibm.com> | 2017-11-17 13:14:11 -0600 |
commit | bfb1a566b781e63dfda6038d9918706423410c26 (patch) | |
tree | 92197497cb281cff15d69fd91b331c0bba367718 /control/zone.cpp | |
parent | 7b7ceb8deb48d6d5833b02bc33987fca2e647a68 (diff) | |
download | phosphor-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.cpp | 45 |
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 |