18#ifndef IFWSLM_ACTIONS_LOOP_CLOSE_HPP
19#define IFWSLM_ACTIONS_LOOP_CLOSE_HPP
26#include <rad/application.hpp>
27#include <rad/smAdapter.hpp>
28#include <rad/timer.hpp>
29#include <rad/smEvent.hpp>
31#include <boost/asio.hpp>
37template<
int LOOP_INDEX>
38void CreateCloseLoopTimer(boost::asio::io_context& ios, rad::SMAdapter& sm, std::unique_ptr<rad::Timer>& timer,
int period_sec);
43 case 1:
return rad::UniqueEvent(
new Events::Trigger1());
44 case 2:
return rad::UniqueEvent(
new Events::Trigger2());
45 case 3:
return rad::UniqueEvent(
new Events::Trigger3());
46 case 4:
return rad::UniqueEvent(
new Events::Trigger4());
47 case 5:
return rad::UniqueEvent(
new Events::Trigger5());
48 case 6:
return rad::UniqueEvent(
new Events::Trigger6());
49 case 7:
return rad::UniqueEvent(
new Events::Trigger7());
50 case 8:
return rad::UniqueEvent(
new Events::Trigger8());
51 case 9:
return rad::UniqueEvent(
new Events::Trigger9());
52 default:
throw std::out_of_range(
"Invalid loop index: " + std::to_string(loop_index));
62template<
int LOOP_INDEX>
76 rad::Application& appl,
77 rad::ConfigurableActionMgr& action_mgr,
80 std::shared_ptr<LoopCompletionHandler> completion_handler)
81 :
base_type(name, appl, action_mgr, data, loop_index, completion_handler),
82 m_ios(appl.GetEventLoop()),
86 ReadTimerPeriodFromConfig();
88 "Creating ActionsLoop" << LOOP_INDEX <<
"CloseLoop with timer period " << m_timer_period_sec <<
" s");
91 "Created timer for loop " << LOOP_INDEX <<
": " << (m_timer ?
"success" :
"null"));
99 void Configure(
const std::vector<std::string>& keys)
override {
102 ReadTimerPeriodFromConfig();
105 void Execute(scxml4cpp::Context* c)
override {
109 "Loop " << LOOP_INDEX <<
" entering CloseLoop, installing timer (period=" << m_timer_period_sec <<
"s)");
114 "Loop " << LOOP_INDEX <<
" reset consecutive failure counter");
121 m_timer->Install(m_timer_period_sec * 1000);
133 m_timer->Install(m_timer_period_sec * 1000);
137 void Abort(scxml4cpp::Context* c)
override {
141 "Loop " << LOOP_INDEX <<
" exiting CloseLoop, cancelling timer");
156 "Loop " << LOOP_INDEX <<
" CycleError - GenCmd" << LOOP_INDEX <<
"_Err: timer reinstalled for retry");
161 max_errors =
m_data.GetConfig().GetParam<
int>(
163 }
catch (
const std::exception& e) {
165 "Loop " << LOOP_INDEX <<
" max_errors not configured, using default: " << max_errors);
174 "Loop " << LOOP_INDEX <<
" reinstalling timer for retry (period=" << m_timer_period_sec <<
"s)");
177 m_timer->Install(m_timer_period_sec * 1000);
186 "Loop " << LOOP_INDEX <<
" reinstalling timer for next cycle (period=" << m_timer_period_sec <<
"s)");
193 m_timer->Install(m_timer_period_sec * 1000);
201 boost::asio::io_context& m_ios;
202 rad::SMAdapter& m_sm;
203 std::unique_ptr<rad::Timer> m_timer;
204 int m_timer_period_sec;
206 void ReadTimerPeriodFromConfig() {
208 auto& config =
m_data.GetConfig();
210 int new_period = config.GetParam<
int>(config_key);
211 if (new_period != m_timer_period_sec) {
212 m_timer_period_sec = new_period;
214 "Loop " <<
m_loop_index <<
" timer period updated to " << m_timer_period_sec <<
" s (key=" << config_key <<
")");
216 }
catch (
const std::exception& e) {
219 << m_timer_period_sec <<
" s");
225template<
int LOOP_INDEX>
226inline void CreateCloseLoopTimer(boost::asio::io_context& ios, rad::SMAdapter& sm, std::unique_ptr<rad::Timer>& timer,
int ) {
228 timer = std::make_unique<rad::Timer>(ios, sm,
MakeTriggerEvent(LOOP_INDEX));
Base action classes for loop control actions.
Definition actionsLoopClose.hpp:63
void Abort(scxml4cpp::Context *c) override
Definition actionsLoopClose.hpp:137
~ActionsLoopClose() override
Definition actionsLoopClose.hpp:94
BaseLoopCloseActions base_type
Definition actionsLoopClose.hpp:65
void Execute(scxml4cpp::Context *c) override
Definition actionsLoopClose.hpp:105
void Configure(const std::vector< std::string > &keys) override
Definition actionsLoopClose.hpp:99
ActionsLoopClose(const std::string &name, rad::Application &appl, rad::ConfigurableActionMgr &action_mgr, DataContext &data, int loop_index, std::shared_ptr< LoopCompletionHandler > completion_handler)
Definition actionsLoopClose.hpp:75
ActionsLoopClose & operator=(const ActionsLoopClose &)=delete
void InstallTimer(scxml4cpp::Context *c) override
Definition actionsLoopClose.hpp:182
ActionsLoopClose(const ActionsLoopClose &)=delete
void CycleError(scxml4cpp::Context *c) override
Definition actionsLoopClose.hpp:152
void Complete(scxml4cpp::Context *c) override
Definition actionsLoopClose.hpp:125
BaseLoopCloseActions(const std::string &name, rad::Application &appl, rad::ConfigurableActionMgr &action_mgr, DataContext &data, int loop_index, std::shared_ptr< LoopCompletionHandler > completion_handler=nullptr)
Definition baseLoopActions.cpp:185
virtual void CycleError(scxml4cpp::Context *c)
Definition baseLoopActions.cpp:265
int m_loop_index
Definition baseLoopActions.hpp:339
virtual void Complete(scxml4cpp::Context *c)
Definition baseLoopActions.cpp:215
virtual void Abort(scxml4cpp::Context *c)
Definition baseLoopActions.cpp:222
void Configure(const std::vector< std::string > &keys) override
Definition baseLoopActions.cpp:205
LoopStateData m_loop_state
Definition baseLoopActions.hpp:341
DataContext & m_data
Definition baseLoopActions.hpp:338
virtual void Execute(scxml4cpp::Context *c)
Definition baseLoopActions.cpp:209
Definition dataContext.hpp:29
DataContext class header file.
Definition actionMgr.cpp:29
ActionsLoopClose< 3 > ActionsLoop3CloseLoop
Definition actionsLoopClose.hpp:237
ActionsLoopClose< 8 > ActionsLoop8CloseLoop
Definition actionsLoopClose.hpp:242
ActionsLoopClose< 5 > ActionsLoop5CloseLoop
Definition actionsLoopClose.hpp:239
ActionsLoopClose< 4 > ActionsLoop4CloseLoop
Definition actionsLoopClose.hpp:238
ActionsLoopClose< 7 > ActionsLoop7CloseLoop
Definition actionsLoopClose.hpp:241
ActionsLoopClose< 2 > ActionsLoop2CloseLoop
Definition actionsLoopClose.hpp:236
rad::UniqueEvent MakeTriggerEvent(int loop_index)
Definition actionsLoopClose.hpp:41
void CreateCloseLoopTimer(boost::asio::io_context &ios, rad::SMAdapter &sm, std::unique_ptr< rad::Timer > &timer, int period_sec)
Definition actionsLoopClose.hpp:226
log4cplus::Logger & GetLogger()
Definition logger.cpp:14
std::string GetLoopConfigKey(int loop_index, const std::string ¶m_name)
Definition slConfig.cpp:26
ActionsLoopClose< 1 > ActionsLoop1CloseLoop
Definition actionsLoopClose.hpp:235
ActionsLoopClose< 9 > ActionsLoop9CloseLoop
Definition actionsLoopClose.hpp:243
const int CONFIG_DEFAULT_LOOP_PERIOD_SEC
Definition config.hpp:34
ActionsLoopClose< 6 > ActionsLoop6CloseLoop
Definition actionsLoopClose.hpp:240