From 94fe1a0c83ba2d0dadc549b1d8afedf6478d2dcf Mon Sep 17 00:00:00 2001 From: "William A. Kennington III" Date: Tue, 30 Oct 2018 19:00:27 -0700 Subject: control/zone: Refactor addTimer Anything adding a timer uses roughly the same process of building the event data and timer from the event group, actions, and timer config. We can adjust the method to do this for all callers. Tested: Builds and passes unit tests. Change-Id: I4013ff2f7bff65095a6e1db7075bc013da374f51 Signed-off-by: William A. Kennington III --- control/actions.cpp | 25 +------------------------ control/zone.cpp | 49 ++++++++++++++++++++++++++----------------------- control/zone.hpp | 14 ++++++-------- 3 files changed, 33 insertions(+), 55 deletions(-) diff --git a/control/actions.cpp b/control/actions.cpp index 923b1cc..0267c10 100644 --- a/control/actions.cpp +++ b/control/actions.cpp @@ -33,30 +33,7 @@ Action call_actions_based_on_timer(TimerConf&& tConf, zone.findTimer(group, actions) == std::end(zone.getTimerEvents())) { - // Associate event data with timer - std::unique_ptr eventData = - std::make_unique( - group, - "", - nullptr, - actions - ); - // Create/start timer and associate event data with it - std::unique_ptr timer = - std::make_unique( - zone.getEventLoop(), - [&zone, - actions = &actions, - group = &group]() - { - zone.timerExpired(*group, *actions); - }); - if (!timer->running()) - { - timer->start(std::get(tConf), - std::get(tConf)); - } - zone.addTimer(std::move(eventData), std::move(timer)); + zone.addTimer(group, actions, tConf); } else { diff --git a/control/zone.cpp b/control/zone.cpp index 5f0c15d..ec0f944 100644 --- a/control/zone.cpp +++ b/control/zone.cpp @@ -335,29 +335,9 @@ void Zone::initEvent(const SetSpeedEvent& event) auto timerConf = std::get(event); if (std::get(timerConf) != seconds(0)) { - // Associate event data with timer - std::unique_ptr eventData = - std::make_unique( - std::get(event), - "", - nullptr, - std::get(event) - ); - std::unique_ptr timer = - std::make_unique( - _eventLoop, - [this, - action = &(std::get(event)), - group = &(std::get(event))]() - { - this->timerExpired(*group, *action); - }); - if (!timer->running()) - { - timer->start(std::get(timerConf), - std::get(timerConf)); - } - addTimer(std::move(eventData), std::move(timer)); + addTimer(std::get(event), + std::get(event), + timerConf); } // Run action functions for initial event state std::for_each( @@ -448,6 +428,29 @@ std::vector::iterator Zone::findTimer( return _timerEvents.end(); } +void Zone::addTimer(const Group& group, + const std::vector& actions, + const TimerConf& tConf) +{ + // Associate event data with timer + auto data = std::make_unique( + group, + "", + nullptr, + actions + ); + auto timer = std::make_unique( + _eventLoop, + std::bind(&Zone::timerExpired, this, group, actions) + ); + if (!timer->running()) + { + timer->start(std::get(tConf), + std::get(tConf)); + } + _timerEvents.emplace_back(std::move(data), std::move(timer)); +} + void Zone::timerExpired(Group eventGroup, std::vector eventActions) { // Perform the actions diff --git a/control/zone.hpp b/control/zone.hpp index e035a64..4f4dfb6 100644 --- a/control/zone.hpp +++ b/control/zone.hpp @@ -367,15 +367,13 @@ class Zone /** * @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 + * @param[in] group - Group associated with a timer + * @param[in] actions - List of actions associated with a timer + * @param[in] tConf - Configuration for the new timer */ - inline void addTimer( - std::unique_ptr&& data, - std::unique_ptr&& timer) - { - _timerEvents.emplace_back(std::move(data), std::move(timer)); - }; + void addTimer(const Group& group, + const std::vector& actions, + const TimerConf& tConf); /** * @brief Remove the given timer event -- cgit v1.2.1