RTC Toolkit 4.0.1
Loading...
Searching...
No Matches
loopaware.hpp
Go to the documentation of this file.
1
13#ifndef RTCTK_COMPONENTFRAMEWORK_LOOPAWARE_HPP
14#define RTCTK_COMPONENTFRAMEWORK_LOOPAWARE_HPP
15
19
21
22template <typename Super>
23struct Runnable;
24
31template <typename Super>
32struct Loopaware : 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'");
35
39 class BizLogicIf : public Super::BizLogicIf {
40 public:
41 virtual void ActivityGoingRunning(StopToken st){};
42 virtual void ActivityGoingIdle(StopToken st){};
43 virtual void ActivityRecovering(StopToken st){};
44 virtual void ActivityOpening(StopToken st){};
45 virtual void ActivityClosing(StopToken st){};
46 virtual void ActivityOpened(StopToken st){};
47 virtual void ActivityClosed(StopToken st){};
48 };
49
53 class InputStage : public Super::InputStage {
54 public:
55 using Super::InputStage::InputStage;
56
57 void Start() override {
58 Super::InputStage::Start();
59
60 FuncCmdsImpl::Register(this->m_replier, this->m_engine);
61 LoopCmdsImpl::Register(this->m_replier, this->m_engine);
62 }
63 };
64
68 class OutputStage : public Super::OutputStage {
69 public:
70 OutputStage(StateMachineEngine& engine, BizLogicIf& bl) : Super::OutputStage(engine, bl) {
71 // Handlers ###########################################################################
72
73 engine.RegisterRejectHandler<events::Run, RequestRejected>();
74 engine.RegisterRejectHandler<events::Idle, RequestRejected>();
75 engine.RegisterRejectHandler<events::Open, RequestRejected>();
76 engine.RegisterRejectHandler<events::Close, RequestRejected>();
77 engine.RegisterRejectHandler<events::Recover, RequestRejected>();
78
79 // No Disable in states ###############################################################
80
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");
89
90 // No Update in states ################################################################
91
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");
98
99 // Actions ############################################################################
100
101 engine.RegisterAction("ActionGoingRunningEntry", [this](auto c) {
102 this->m_tmp_request = GetPayloadNothrow<events::Run>(c);
103 });
104
105 engine.RegisterAction("ActionGoingRunningDone", [this](auto c) {
106 if (this->m_tmp_request) {
107 this->m_tmp_request->SetReplyValue(STD_OK_REPLY);
108 this->m_tmp_request = nullptr;
109 }
110 });
111
112 engine.RegisterAction("ActionGoingIdleEntry", [this](auto c) {
113 this->m_tmp_request = GetPayloadNothrow<events::Idle>(c);
114 });
115
116 engine.RegisterAction("ActionGoingIdleDone", [this](auto c) {
117 if (this->m_tmp_request) {
118 this->m_tmp_request->SetReplyValue(STD_OK_REPLY);
119 this->m_tmp_request = nullptr;
120 }
121 });
122
123 engine.RegisterAction("ActionOpeningEntry", [this](auto c) {
124 this->m_tmp_request = GetPayloadNothrow<events::Open>(c);
125 });
126
127 engine.RegisterAction("ActionOpeningDone", [this](auto c) {
128 if (this->m_tmp_request) {
129 this->m_tmp_request->SetReplyValue(STD_OK_REPLY);
130 this->m_tmp_request = nullptr;
131 }
132 });
133
134 engine.RegisterAction("ActionClosingEntry", [this](auto c) {
135 this->m_tmp_request = GetPayloadNothrow<events::Close>(c);
136 });
137
138 engine.RegisterAction("ActionClosingDone", [this](auto c) {
139 if (this->m_tmp_request) {
140 this->m_tmp_request->SetReplyValue(STD_OK_REPLY);
141 this->m_tmp_request = nullptr;
142 }
143 });
144
145 engine.RegisterAction("ActionErrorEntry", [this](auto c) {
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;
151 }
152 }
153 });
154
155 engine.RegisterAction("ActionRecoveringEntry", [this](auto c) {
156 this->m_tmp_request = GetPayloadNothrow<events::Recover>(c);
157 });
158
159 engine.RegisterAction("ActionRecoveringDone", [this](auto c) {
160 if (this->m_tmp_request) {
161 this->m_tmp_request->SetReplyValue(STD_OK_REPLY);
162 this->m_tmp_request = nullptr;
163 }
164 });
165
166 // Activities #########################################################################
167
168 engine.RegisterActivity(
169 "ActivityGoingRunning",
170 [this](StopToken stop_token) {
171 static_cast<BizLogicIf&>(this->m_logic).ActivityGoingRunning(stop_token);
172 },
173 this->m_success_handler,
174 this->m_error_handler);
175
176 engine.RegisterActivity(
177 "ActivityGoingIdle",
178 [this](StopToken stop_token) {
179 static_cast<BizLogicIf&>(this->m_logic).ActivityGoingIdle(stop_token);
180 },
181 this->m_success_handler,
182 this->m_error_handler);
183
184 engine.RegisterActivity(
185 "ActivityOpening",
186 [this](StopToken stop_token) {
187 static_cast<BizLogicIf&>(this->m_logic).ActivityOpening(stop_token);
188 },
189 this->m_success_handler,
190 this->m_error_handler);
191
192 engine.RegisterActivity(
193 "ActivityClosing",
194 [this](StopToken stop_token) {
195 static_cast<BizLogicIf&>(this->m_logic).ActivityClosing(stop_token);
196 },
197 this->m_success_handler,
198 this->m_error_handler);
199
200 engine.RegisterActivity(
201 "ActivityOpened",
202 [this](StopToken stop_token) {
203 static_cast<BizLogicIf&>(this->m_logic).ActivityOpened(stop_token);
204 },
205 {},
206 this->m_error_handler);
207
208 engine.RegisterActivity(
209 "ActivityClosed",
210 [this](StopToken stop_token) {
211 static_cast<BizLogicIf&>(this->m_logic).ActivityClosed(stop_token);
212 },
213 {},
214 this->m_error_handler);
215
216 engine.RegisterActivity(
217 "ActivityRecovering",
218 [this](StopToken stop_token) {
219 static_cast<BizLogicIf&>(this->m_logic).ActivityRecovering(stop_token);
220 },
221 this->m_success_handler,
222 this->m_error_handler);
223 }
224 };
225
229 class ModelBuilder : public Super::ModelBuilder {
230 public:
231 explicit ModelBuilder(StateMachineEngine& engine) : Super::ModelBuilder(engine) {
232 // clang-format off
233 this->mm.ModStateType("On::Operational", Parallel);
234
235 const std::string parent_region = "On::Operational:";
236
237 this->mm.AddState(Composite, parent_region, "On::Operational");
238
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");
249
250 this->mm.AddTrans("On::Operational::Initial" , "On::Operational::Idle" );
251 this->mm.AddTrans(parent_region , "On::Operational::Error" , "events.Error");
252
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");
255
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");
258
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");
261
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");
266 // clang-format on
267 }
268 };
269};
270
271} // namespace rtctk::componentFramework
272
273#endif
static void Register(CommandReplier &replier, StateMachineEngine &engine)
Definition: rtcCmdsImpl.hpp:37
static void Register(CommandReplier &replier, StateMachineEngine &engine)
Definition: loopCmdsImpl.hpp:37
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
void Start() override
Definition: loopaware.hpp:57
ModelBuilder(StateMachineEngine &engine)
Definition: loopaware.hpp:231
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'.
A simple Stop Token.
Life cycle extension to make RtcComponent Loopaware.
Definition: loopaware.hpp:32