13#ifndef RTCTK_COMPONENTFRAMEWORK_LOOPAWARE_HPP
14#define RTCTK_COMPONENTFRAMEWORK_LOOPAWARE_HPP
22template <
typename Super>
31template <
typename Super>
33 static_assert(std::is_base_of_v<RtcComponent, Super>,
"'Loopaware' requires 'RtcComponent'");
34 static_assert(not is_base_of_template_v<Runnable, Super>,
"'Loopaware' excludes 'Runnable'");
55 using Super::InputStage::InputStage;
58 Super::InputStage::Start();
81 this->m_no_disable_in_states.push_back(
"On::Operational::Error");
82 this->m_no_disable_in_states.push_back(
"On::Operational::Recovering");
83 this->m_no_disable_in_states.push_back(
"On::Operational::GoingRunning");
84 this->m_no_disable_in_states.push_back(
"On::Operational::GoingIdle");
85 this->m_no_disable_in_states.push_back(
"On::Operational::Opened");
86 this->m_no_disable_in_states.push_back(
"On::Operational::Closed");
87 this->m_no_disable_in_states.push_back(
"On::Operational::Opening");
88 this->m_no_disable_in_states.push_back(
"On::Operational::Closing");
92 this->m_no_update_in_states.push_back(
"On::Operational::Error");
93 this->m_no_update_in_states.push_back(
"On::Operational::Recovering");
94 this->m_no_update_in_states.push_back(
"On::Operational::GoingRunning");
95 this->m_no_update_in_states.push_back(
"On::Operational::GoingIdle");
96 this->m_no_update_in_states.push_back(
"On::Operational::Opening");
97 this->m_no_update_in_states.push_back(
"On::Operational::Closing");
102 this->m_tmp_request = GetPayloadNothrow<events::Run>(c);
106 if (this->m_tmp_request) {
108 this->m_tmp_request =
nullptr;
113 this->m_tmp_request = GetPayloadNothrow<events::Idle>(c);
117 if (this->m_tmp_request) {
119 this->m_tmp_request =
nullptr;
124 this->m_tmp_request = GetPayloadNothrow<events::Open>(c);
128 if (this->m_tmp_request) {
130 this->m_tmp_request =
nullptr;
135 this->m_tmp_request = GetPayloadNothrow<events::Close>(c);
139 if (this->m_tmp_request) {
141 this->m_tmp_request =
nullptr;
146 if (
auto eptr = GetPayloadNothrow<events::Error>(c); eptr) {
147 if (this->m_tmp_request) {
148 this->m_tmp_request->SetException(
150 this->m_tmp_request =
nullptr;
156 this->m_tmp_request = GetPayloadNothrow<events::Recover>(c);
160 if (this->m_tmp_request) {
162 this->m_tmp_request =
nullptr;
169 "ActivityGoingRunning",
171 static_cast<BizLogicIf&
>(this->m_logic).ActivityGoingRunning(stop_token);
173 this->m_success_handler,
174 this->m_error_handler);
179 static_cast<BizLogicIf&
>(this->m_logic).ActivityGoingIdle(stop_token);
181 this->m_success_handler,
182 this->m_error_handler);
187 static_cast<BizLogicIf&
>(this->m_logic).ActivityOpening(stop_token);
189 this->m_success_handler,
190 this->m_error_handler);
195 static_cast<BizLogicIf&
>(this->m_logic).ActivityClosing(stop_token);
197 this->m_success_handler,
198 this->m_error_handler);
203 static_cast<BizLogicIf&
>(this->m_logic).ActivityOpened(stop_token);
206 this->m_error_handler);
211 static_cast<BizLogicIf&
>(this->m_logic).ActivityClosed(stop_token);
214 this->m_error_handler);
217 "ActivityRecovering",
219 static_cast<BizLogicIf&
>(this->m_logic).ActivityRecovering(stop_token);
221 this->m_success_handler,
222 this->m_error_handler);
233 this->mm.ModStateType(
"On::Operational",
Parallel);
235 const std::string parent_region =
"On::Operational:";
237 this->mm.AddState(
Composite, parent_region,
"On::Operational");
239 this->mm.AddState(
Initial,
"On::Operational::Initial", parent_region);
240 this->mm.AddState(
Simple,
"On::Operational::Idle", parent_region);
241 this->mm.AddState(
Simple,
"On::Operational::Error", parent_region,
"" ,
"ActionErrorEntry");
242 this->mm.AddState(
Simple,
"On::Operational::Recovering", parent_region,
"ActivityRecovering" ,
"ActionRecoveringEntry");
243 this->mm.AddState(
Simple,
"On::Operational::GoingRunning", parent_region,
"ActivityGoingRunning" ,
"ActionGoingRunningEntry");
244 this->mm.AddState(
Simple,
"On::Operational::GoingIdle", parent_region,
"ActivityGoingIdle" ,
"ActionGoingIdleEntry");
245 this->mm.AddState(
Simple,
"On::Operational::Opened", parent_region,
"ActivityOpened");
246 this->mm.AddState(
Simple,
"On::Operational::Closed", parent_region,
"ActivityClosed");
247 this->mm.AddState(
Simple,
"On::Operational::Opening", parent_region,
"ActivityOpening" ,
"ActionOpeningEntry");
248 this->mm.AddState(
Simple,
"On::Operational::Closing", parent_region,
"ActivityClosing" ,
"ActionClosingEntry");
250 this->mm.AddTrans(
"On::Operational::Initial" ,
"On::Operational::Idle" );
251 this->mm.AddTrans(parent_region ,
"On::Operational::Error" ,
"events.Error");
253 this->mm.AddTrans(
"On::Operational::Error" ,
"On::Operational::Recovering" ,
"events.Recover");
254 this->mm.AddTrans(
"On::Operational::Recovering" ,
"On::Operational::Idle" ,
"events.Done",
"" ,
"ActionRecoveringDone");
256 this->mm.AddTrans(
"On::Operational::Idle" ,
"On::Operational::GoingRunning",
"events.Run");
257 this->mm.AddTrans(
"On::Operational::GoingRunning" ,
"On::Operational::Opened" ,
"events.Done",
"" ,
"ActionGoingRunningDone");
259 this->mm.AddTrans(
"On::Operational::Opened" ,
"On::Operational::GoingIdle" ,
"events.Idle");
260 this->mm.AddTrans(
"On::Operational::GoingIdle" ,
"On::Operational::Idle" ,
"events.Done",
"" ,
"ActionGoingIdleDone");
262 this->mm.AddTrans(
"On::Operational::Opened" ,
"On::Operational::Closing" ,
"events.Close");
263 this->mm.AddTrans(
"On::Operational::Closing" ,
"On::Operational::Closed" ,
"events.Done",
"" ,
"ActionClosingDone");
264 this->mm.AddTrans(
"On::Operational::Closed" ,
"On::Operational::Opening" ,
"events.Open");
265 this->mm.AddTrans(
"On::Operational::Opening" ,
"On::Operational::Opened" ,
"events.Done",
"" ,
"ActionOpeningDone");
static void Register(CommandReplier &replier, StateMachineEngine &engine)
Definition: rtcCmdsImpl.hpp:37
static void Register(CommandReplier &replier, StateMachineEngine &engine)
Definition: loopCmdsImpl.hpp:37
Definition: loopaware.hpp:39
virtual void ActivityOpened(StopToken st)
Definition: loopaware.hpp:46
virtual void ActivityGoingIdle(StopToken st)
Definition: loopaware.hpp:42
virtual void ActivityOpening(StopToken st)
Definition: loopaware.hpp:44
virtual void ActivityClosed(StopToken st)
Definition: loopaware.hpp:47
virtual void ActivityGoingRunning(StopToken st)
Definition: loopaware.hpp:41
virtual void ActivityRecovering(StopToken st)
Definition: loopaware.hpp:43
virtual void ActivityClosing(StopToken st)
Definition: loopaware.hpp:45
Definition: loopaware.hpp:229
ModelBuilder(StateMachineEngine &engine)
Definition: loopaware.hpp:231
Definition: loopaware.hpp:68
OutputStage(StateMachineEngine &engine, BizLogicIf &bl)
Definition: loopaware.hpp:70
Adapter object intended to be used in contexts without direct access to the output-stream object.
Definition: exceptions.hpp:185
std::string Str() const
Convenience function for constructing a std::string from the exception.
Definition: exceptions.hpp:203
Thrown if the command was accepted but the task to run failed.
Definition: rtcComponent.hpp:53
Thrown if a command is not allowed in current state or guard.
Definition: rtcComponent.hpp:40
Definition: stateMachineEngine.hpp:35
void RegisterRejectHandler(std::string const &id, RejectMethod reject)
Register reject handler.
Definition: stateMachineEngine.cpp:131
void RegisterActivity(std::string const &id, ActivityMethod activity, SuccessMethod on_success, FailureMethod on_failure)
Register activity.
Definition: stateMachineEngine.cpp:123
void RegisterAction(std::string const &id, ActionMethod action)
Register action.
Definition: stateMachineEngine.cpp:86
Implementation of MAL commands for layer 'Loopaware'.
Definition: commandReplier.cpp:22
const std::string STD_OK_REPLY
Definition: stdComponent.hpp:86
rad::StopToken StopToken
Definition: stopToken.hpp:20
@ Simple
Definition: model.hpp:22
@ Composite
Definition: model.hpp:22
@ Parallel
Definition: model.hpp:22
@ Initial
Definition: model.hpp:22
Lifecycle of a basic 'RtcComponent'.
Life cycle extension to make RtcComponent Loopaware.
Definition: loopaware.hpp:32