RTC Toolkit 4.0.1
Loading...
Searching...
No Matches
rtcComponent.hpp
Go to the documentation of this file.
1
13#ifndef RTCTK_COMPONENTFRAMEWORK_RTCCOMPONENT_HPP
14#define RTCTK_COMPONENTFRAMEWORK_RTCCOMPONENT_HPP
15
20
22
23// High level exception types returned via MAL
24
29class RequestAborted : public rtctkif::ExceptionErr {
30public:
31 static constexpr int32_t ERROR_CODE = 11;
32 RequestAborted() : rtctkif::ExceptionErr("Request aborted.", ERROR_CODE) {
33 }
34};
35
40class RequestRejected : public rtctkif::ExceptionErr {
41public:
42 static constexpr int32_t ERROR_CODE = 10;
43 RequestRejected(std::string const& request_id, std::string const& state_id)
44 : rtctkif::ExceptionErr("Request " + request_id + " rejected in state " + state_id,
45 ERROR_CODE) {
46 }
47};
48
53class RequestFailed : public rtctkif::ExceptionErr {
54public:
58 static constexpr int32_t ERROR_CODE = 501;
59 explicit RequestFailed(std::string const& message)
60 : rtctkif::ExceptionErr(message, ERROR_CODE) {
61 }
62};
63
65
67
76
81 public:
82 // NOLINTNEXTLINE(performance-unnecessary-value-param)
83 virtual void ActivityUpdating(StopToken st, JsonPayload const& args) {
84 }
85 // NOLINTNEXTLINE(performance-unnecessary-value-param)
86 virtual bool GuardUpdatingAllowed(JsonPayload const& args) {
87 return true;
88 }
89 };
90
95 public:
97
98 void Start() override {
99 Super::InputStage::Start();
100
102 }
103 };
104
109 public:
111 // Handlers ###################################################################
112
113 engine.RegisterRejectHandler<events::Update, RequestRejected>();
114
115 m_update_success_handler = [this] {
116 this->m_engine.PostEvent(std::make_unique<events::UpdateDone>());
117 };
118
119 m_update_error_handler = [this](std::exception_ptr eptr) {
120 this->m_engine.PostEvent(std::make_unique<events::UpdateError>(std::move(eptr)));
121 };
122
123 // No Disable in states ###############################################################
124
125 m_no_disable_in_states.push_back("On:Update:Busy");
126
127 // No Update in states ################################################################
128
129 this->m_no_update_in_states.push_back("On::NotOperational::Starting");
130 this->m_no_update_in_states.push_back("On::NotOperational::NotReady");
131 this->m_no_update_in_states.push_back("On::NotOperational::Initialising");
132 this->m_no_update_in_states.push_back("On::NotOperational::Enabling");
133 this->m_no_update_in_states.push_back("On::NotOperational::Disabling");
134
135 // Actions ############################################################################
136
137 engine.RegisterAction("ActionUpdatingEntry", [this](auto c) {
138 m_tmp_update_request = GetPayloadNothrow<events::Update>(c);
139 });
140
141 engine.RegisterAction("ActionUpdatingDone", [this](auto c) {
143 m_tmp_update_request->SetReplyValue(STD_OK_REPLY);
144 m_tmp_update_request = nullptr;
145 }
146 });
147
148 engine.RegisterAction("ActionUpdatingFailed", [this](auto c) {
149 if (auto eptr = GetPayloadNothrow<events::UpdateError>(c); eptr) {
151 m_tmp_update_request->SetException(
153 m_tmp_update_request = nullptr;
154 }
155 }
156 });
157
158 // Guards ############################################################################
159
160 engine.RegisterGuard("GuardUpdatingAllowed", [this](auto c) {
161 auto req = GetPayloadNothrow<events::Update>(c);
162 if (req == nullptr) {
163 // no event or request
164 return false;
165 }
166
167 auto act_state = this->m_engine.GetState();
168 for (auto& s : m_no_update_in_states) {
169 if (act_state.find(s) != std::string::npos) {
170 return false;
171 }
172 }
173
174 std::string string_arg = req->GetRequestPayload();
175 JsonPayload json_arg = JsonPayload::parse(string_arg);
176 return static_cast<BizLogicIf&>(this->m_logic).GuardUpdatingAllowed(json_arg);
177 });
178
179 engine.RegisterGuard("GuardDisablingAllowed", [this](auto c) {
180 auto act_state = this->m_engine.GetState();
181 for (auto& s : m_no_disable_in_states) {
182 if (act_state.find(s) != std::string::npos) {
183 return false;
184 }
185 }
186 return true;
187 });
188
189 // Activities #####################################################################
190
191 engine.RegisterActivity(
192 "ActivityUpdating",
193 [this](StopToken stop_token) {
194 std::string string_arg = m_tmp_update_request->GetRequestPayload();
195 JsonPayload json_arg = JsonPayload::parse(string_arg);
196 static_cast<BizLogicIf&>(this->m_logic).ActivityUpdating(stop_token, json_arg);
197 },
200 }
201
202 protected:
203 std::shared_ptr<rad::cii::Request<std::string, std::string>> m_tmp_update_request;
204 std::function<void()> m_update_success_handler;
205 std::function<void(std::exception_ptr)> m_update_error_handler;
206 std::list<std::string> m_no_update_in_states;
207 std::list<std::string> m_no_disable_in_states;
208 };
209
214 public:
216 // clang-format off
217 const std::string update_region = "On:Update";
218 this->mm.AddState(Composite, update_region, "On");
219 this->mm.AddState(Initial, "On:Update:Initial", update_region);
220 this->mm.AddState(Simple, "On:Update:Idle", update_region);
221 this->mm.AddState(Simple, "On:Update:Busy", update_region , "ActivityUpdating" ,"ActionUpdatingEntry");
222
223 this->mm.AddTrans("On:Update:Initial" , "On:Update:Idle" );
224 this->mm.AddTrans("On:Update:Idle" , "On:Update:Busy" , "events.Update", "GuardUpdatingAllowed");
225 this->mm.AddTrans("On:Update:Busy" , "On:Update:Idle" , "events.UpdateDone", "" ,"ActionUpdatingDone" );
226 this->mm.AddTrans("On:Update:Busy" , "On:Update:Idle" , "events.UpdateError", "" ,"ActionUpdatingFailed" );
227
228 this->mm.ModTransGuard("On::Operational", "On::NotOperational::Disabling", "events.Disable", "", "GuardDisablingAllowed");
229 // clang-format on
230 }
231 };
232};
233
234} // namespace rtctk::componentFramework
235
236#endif // RTCTK_COMPONENTFRAMEWORK_RTCCOMPONENT_HPP
ModelManipulator mm
Definition: modelBuilderBase.hpp:79
void ModTransGuard(std::string const &source_id, std::string const &target_id, std::string const &event_id, std::string const &guard_id, std::string const &new_guard_id)
Modifies the guard of a transition.
Definition: modelManipulator.cpp:297
void AddTrans(std::string const &source_id, std::string const &target_id, std::string const &event_id="", std::string const &guard_id="", std::string const &action_id="")
Adds a new transition.
Definition: modelManipulator.cpp:229
void AddState(StateType type, std::string const &id, std::string const &parent_id="", std::string const &activity_id="", std::string const &entry_action_id="", std::string const &exit_action_id="")
Adds a new state.
Definition: modelManipulator.cpp:30
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 somebody sent a stop or abort command.
Definition: rtcComponent.hpp:29
RequestAborted()
Definition: rtcComponent.hpp:32
static constexpr int32_t ERROR_CODE
Definition: rtcComponent.hpp:31
Thrown if the command was accepted but the task to run failed.
Definition: rtcComponent.hpp:53
RequestFailed(std::string const &message)
Definition: rtcComponent.hpp:59
static constexpr int32_t ERROR_CODE
Definition: rtcComponent.hpp:58
Thrown if a command is not allowed in current state or guard.
Definition: rtcComponent.hpp:40
RequestRejected(std::string const &request_id, std::string const &state_id)
Definition: rtcComponent.hpp:43
static constexpr int32_t ERROR_CODE
Definition: rtcComponent.hpp:42
virtual void ActivityUpdating(StopToken st, JsonPayload const &args)
Definition: rtcComponent.hpp:83
virtual bool GuardUpdatingAllowed(JsonPayload const &args)
Definition: rtcComponent.hpp:86
void Start() override
Definition: rtcComponent.hpp:98
ModelBuilder(StateMachineEngine &engine)
Definition: rtcComponent.hpp:215
std::function< void(std::exception_ptr)> m_update_error_handler
Definition: rtcComponent.hpp:205
std::list< std::string > m_no_disable_in_states
Definition: rtcComponent.hpp:207
std::list< std::string > m_no_update_in_states
Definition: rtcComponent.hpp:206
OutputStage(StateMachineEngine &engine, BizLogicIf &bl)
Definition: rtcComponent.hpp:110
std::function< void()> m_update_success_handler
Definition: rtcComponent.hpp:204
std::shared_ptr< rad::cii::Request< std::string, std::string > > m_tmp_update_request
Definition: rtcComponent.hpp:203
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 RegisterGuard(std::string const &id, GuardMethod guard)
Register guard.
Definition: stateMachineEngine.cpp:110
std::string GetState()
Queries the current state.
Definition: stateMachineEngine.cpp:153
void RegisterAction(std::string const &id, ActionMethod action)
Register action.
Definition: stateMachineEngine.cpp:86
void PostEvent(rad::SharedEvent s)
Injects a new event into the state machine engine.
Definition: stateMachineEngine.cpp:148
CommandReplier & m_replier
Definition: stdComponent.hpp:176
StateMachineEngine & m_engine
Definition: stdComponent.hpp:177
StateMachineEngine & m_engine
Definition: stdComponent.hpp:410
BizLogicIf & m_logic
Definition: stdComponent.hpp:411
static void Register(CommandReplier &replier, StateMachineEngine &engine)
Definition: rtcCmdsImpl.hpp:73
Defines the JSON payload type JsonPayload.
Definition: commandReplier.cpp:22
const std::string STD_OK_REPLY
Definition: stdComponent.hpp:86
nlohmann::json JsonPayload
Type requirements:
Definition: jsonPayload.hpp:25
rad::StopToken StopToken
Definition: stopToken.hpp:20
@ Simple
Definition: model.hpp:22
@ Composite
Definition: model.hpp:22
@ Initial
Definition: model.hpp:22
StdComponent RtcComponentSuper
Definition: rtcComponent.hpp:66
Implementation of MAL commands for layer 'RtcComponent'.
Lifecycle of the 'Standard Component'.
A simple Stop Token.
Basic life cycle for RtcComponent.
Definition: rtcComponent.hpp:74
Basic life cycle for StdComponent.
Definition: stdComponent.hpp:144