RTC Toolkit 5.0.0
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:
42 virtual void ActivityGoingIdle(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 RecoverCmdsImpl::Register(this->m_replier, this->m_engine);
62 LoopCmdsImpl::Register(this->m_replier, this->m_engine);
63 }
64 };
65
69 class OutputStage : public Super::OutputStage {
70 public:
72 // Handlers ###########################################################################
73
74 engine.RegisterRejectHandler<events::Run, RequestRejected>();
75 engine.RegisterRejectHandler<events::Idle, RequestRejected>();
76 engine.RegisterRejectHandler<events::Open, RequestRejected>();
77 engine.RegisterRejectHandler<events::Close, RequestRejected>();
78 engine.RegisterRejectHandler<events::Recover, RequestRejected>();
79
80 // No Disable in states ###############################################################
81
82 this->m_no_disable_in_states.push_back("On::Operational::Error");
83 this->m_no_disable_in_states.push_back("On::Operational::Recovering");
84 this->m_no_disable_in_states.push_back("On::Operational::GoingRunning");
85 this->m_no_disable_in_states.push_back("On::Operational::GoingIdle");
86 this->m_no_disable_in_states.push_back("On::Operational::Opened");
87 this->m_no_disable_in_states.push_back("On::Operational::Closed");
88 this->m_no_disable_in_states.push_back("On::Operational::Opening");
89 this->m_no_disable_in_states.push_back("On::Operational::Closing");
90
91 // No Update in states ################################################################
92
93 this->m_no_update_in_states.push_back("On::Operational::Error");
94 this->m_no_update_in_states.push_back("On::Operational::Recovering");
95 this->m_no_update_in_states.push_back("On::Operational::GoingRunning");
96 this->m_no_update_in_states.push_back("On::Operational::GoingIdle");
97 this->m_no_update_in_states.push_back("On::Operational::Opening");
98 this->m_no_update_in_states.push_back("On::Operational::Closing");
99
100 // Actions ############################################################################
101
102 engine.RegisterAction("ActionGoingRunningEntry", [this](auto c) {
103 this->m_tmp_request = GetPayloadNothrow<events::Run>(c);
104 });
105
106 engine.RegisterAction("ActionGoingRunningDone", [this](auto c) {
107 if (this->m_tmp_request) {
108 this->m_tmp_request->SetReplyValue(STD_OK_REPLY);
109 this->m_tmp_request = nullptr;
110 }
111 });
112
113 engine.RegisterAction("ActionGoingIdleEntry", [this](auto c) {
114 this->m_tmp_request = GetPayloadNothrow<events::Idle>(c);
115 });
116
117 engine.RegisterAction("ActionGoingIdleDone", [this](auto c) {
118 if (this->m_tmp_request) {
119 this->m_tmp_request->SetReplyValue(STD_OK_REPLY);
120 this->m_tmp_request = nullptr;
121 }
122 });
123
124 engine.RegisterAction("ActionOpeningEntry", [this](auto c) {
125 this->m_tmp_request = GetPayloadNothrow<events::Open>(c);
126 });
127
128 engine.RegisterAction("ActionOpeningDone", [this](auto c) {
129 if (this->m_tmp_request) {
130 this->m_tmp_request->SetReplyValue(STD_OK_REPLY);
131 this->m_tmp_request = nullptr;
132 }
133 });
134
135 engine.RegisterAction("ActionClosingEntry", [this](auto c) {
136 this->m_tmp_request = GetPayloadNothrow<events::Close>(c);
137 });
138
139 engine.RegisterAction("ActionClosingDone", [this](auto c) {
140 if (this->m_tmp_request) {
141 this->m_tmp_request->SetReplyValue(STD_OK_REPLY);
142 this->m_tmp_request = nullptr;
143 }
144 });
145
146 engine.RegisterAction("ActionErrorEntry", [this](auto c) {
148 if (this->m_tmp_request) {
149 this->m_tmp_request->SetException(
151 this->m_tmp_request = nullptr;
152 }
153 }
154 });
155
156 engine.RegisterAction("ActionRecoveringEntry", [this](auto c) {
157 this->m_tmp_request = GetPayloadNothrow<events::Recover>(c);
158 });
159
160 engine.RegisterAction("ActionRecoveringDone", [this](auto c) {
161 if (this->m_tmp_request) {
162 this->m_tmp_request->SetReplyValue(STD_OK_REPLY);
163 this->m_tmp_request = nullptr;
164 }
165 });
166
167 // Activities #########################################################################
168
169 engine.RegisterActivity(
170 "ActivityGoingRunning",
171 [this](StopToken stop_token) {
172 static_cast<BizLogicIf&>(this->m_logic).ActivityGoingRunning(stop_token);
173 },
174 this->m_success_handler,
175 this->m_error_handler);
176
177 engine.RegisterActivity(
178 "ActivityGoingIdle",
179 [this](StopToken stop_token) {
180 static_cast<BizLogicIf&>(this->m_logic).ActivityGoingIdle(stop_token);
181 },
182 this->m_success_handler,
183 this->m_error_handler);
184
185 engine.RegisterActivity(
186 "ActivityOpening",
187 [this](StopToken stop_token) {
188 static_cast<BizLogicIf&>(this->m_logic).ActivityOpening(stop_token);
189 },
190 this->m_success_handler,
191 this->m_error_handler);
192
193 engine.RegisterActivity(
194 "ActivityClosing",
195 [this](StopToken stop_token) {
196 static_cast<BizLogicIf&>(this->m_logic).ActivityClosing(stop_token);
197 },
198 this->m_success_handler,
199 this->m_error_handler);
200
201 engine.RegisterActivity(
202 "ActivityOpened",
203 [this](StopToken stop_token) {
204 static_cast<BizLogicIf&>(this->m_logic).ActivityOpened(stop_token);
205 },
206 {},
207 this->m_error_handler);
208
209 engine.RegisterActivity(
210 "ActivityClosed",
211 [this](StopToken stop_token) {
212 static_cast<BizLogicIf&>(this->m_logic).ActivityClosed(stop_token);
213 },
214 {},
215 this->m_error_handler);
216
217 engine.RegisterActivity(
218 "ActivityRecovering",
219 [this](StopToken stop_token) {
220 static_cast<BizLogicIf&>(this->m_logic).ActivityRecovering(stop_token);
221 },
222 this->m_success_handler,
223 this->m_error_handler);
224 }
225 };
226
230 class ModelBuilder : public Super::ModelBuilder {
231 public:
233 // clang-format off
234 this->mm.ModStateType("On::Operational", Parallel);
235
236 const std::string parent_region = "On::Operational:";
237
238 this->mm.AddState(Composite, parent_region, "On::Operational");
239
240 this->mm.AddState(Initial,"On::Operational::Initial", parent_region);
241 this->mm.AddState(Simple, "On::Operational::Idle", parent_region);
242 this->mm.AddState(Simple, "On::Operational::Error", parent_region, "" , "ActionErrorEntry");
243 this->mm.AddState(Simple, "On::Operational::Recovering", parent_region, "ActivityRecovering" , "ActionRecoveringEntry");
244 this->mm.AddState(Simple, "On::Operational::GoingRunning", parent_region, "ActivityGoingRunning" , "ActionGoingRunningEntry");
245 this->mm.AddState(Simple, "On::Operational::GoingIdle", parent_region, "ActivityGoingIdle" , "ActionGoingIdleEntry");
246 this->mm.AddState(Simple, "On::Operational::Opened", parent_region, "ActivityOpened");
247 this->mm.AddState(Simple, "On::Operational::Closed", parent_region, "ActivityClosed");
248 this->mm.AddState(Simple, "On::Operational::Opening", parent_region, "ActivityOpening" , "ActionOpeningEntry");
249 this->mm.AddState(Simple, "On::Operational::Closing", parent_region, "ActivityClosing" , "ActionClosingEntry");
250
251 this->mm.AddTrans("On::Operational::Initial" , "On::Operational::Idle" );
252 this->mm.AddTrans(parent_region , "On::Operational::Error" , "events.Error");
253
254 this->mm.AddTrans("On::Operational::Error" , "On::Operational::Recovering" , "events.Recover");
255 this->mm.AddTrans("On::Operational::Recovering" , "On::Operational::Idle" , "events.Done", "" , "ActionRecoveringDone");
256
257 this->mm.AddTrans("On::Operational::Idle" , "On::Operational::GoingRunning", "events.Run");
258 this->mm.AddTrans("On::Operational::GoingRunning" , "On::Operational::Opened" , "events.Done", "" , "ActionGoingRunningDone");
259
260 this->mm.AddTrans("On::Operational::Opened" , "On::Operational::GoingIdle" , "events.Idle");
261 this->mm.AddTrans("On::Operational::GoingIdle" , "On::Operational::Idle" , "events.Done", "" , "ActionGoingIdleDone");
262
263 this->mm.AddTrans("On::Operational::Opened" , "On::Operational::Closing" , "events.Close");
264 this->mm.AddTrans("On::Operational::Closing" , "On::Operational::Closed" , "events.Done", "" , "ActionClosingDone");
265 this->mm.AddTrans("On::Operational::Closed" , "On::Operational::Opening" , "events.Open");
266 this->mm.AddTrans("On::Operational::Opening" , "On::Operational::Opened" , "events.Done", "" , "ActionOpeningDone");
267 // clang-format on
268 }
269 };
270};
271
272} // namespace rtctk::componentFramework
273
274#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:232
OutputStage(StateMachineEngine &engine, BizLogicIf &bl)
Definition loopaware.hpp:71
Adapter object intended to be used in contexts without direct access to the output-stream object.
Definition exceptions.hpp:159
std::string Str() const
Convenience function for constructing a std::string from the exception.
Definition exceptions.hpp:177
static void Register(CommandReplier &replier, StateMachineEngine &engine)
Definition rtcCmdsImpl.hpp:68
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
Implementation of MAL commands for layer 'Loopaware'.
Definition commandReplier.cpp:22
@ Simple
Definition model.hpp:23
@ Composite
Definition model.hpp:23
@ Parallel
Definition model.hpp:23
@ Initial
Definition model.hpp:23
rad::StopToken StopToken
Definition stopToken.hpp:20
const std::string STD_OK_REPLY
Definition stdComponent.hpp:86
elt::mal::future< std::string > InjectReqRepEvent(StateMachineEngine &engine)
Definition malEventInjector.hpp:23
Lifecycle of a basic 'RtcComponent'.
A simple Stop Token.
Life cycle extension to make RtcComponent Loopaware.
Definition loopaware.hpp:32