RTC Toolkit 6.0.0
Loading...
Searching...
No Matches
stateMachineEngine.hpp
Go to the documentation of this file.
1
11
12#ifndef RTCTK_COMPONENTFRAMEWORK_STATEMACHINEENGINE_HPP
13#define RTCTK_COMPONENTFRAMEWORK_STATEMACHINEENGINE_HPP
14
17
18#include <rad/signal.hpp>
19#include <rad/smAdapter.hpp>
20
22
23using ActionMethod = std::function<void(scxml4cpp::Context* c)>;
24using GuardMethod = std::function<bool(scxml4cpp::Context* c)>;
25using ActivityMethod = std::function<void(StopToken f)>;
26using SuccessMethod = std::function<void()>;
27using FailureMethod = std::function<void(std::exception_ptr)>;
28using RejectMethod = std::function<void(const rad::AnyEvent&, const std::string& state)>;
29using StateMethod = std::function<void(const std::string&)>;
30
35public:
38
47 void RegisterExitEvent(rad::UniqueEvent exit_event);
48
57 void RegisterModel(const std::string& name, const std::string& model);
58
69 void AppendModel(const std::string& name, const std::string& model);
70
80 void RegisterAction(const std::string& id, ActionMethod action);
81
91 template <class Event>
92 void RegisterActionStatic(const std::string& id, std::function<void(const Event&)> action) {
93 assert(action);
94 RegisterAction(id, [action = std::move(action)](scxml4cpp::Context* ctx) {
95 assert(ctx);
96 assert(ctx->getLastEvent());
97 rad::SMEvent& ev = static_cast<rad::SMEvent&>(*ctx->getLastEvent());
98 action(static_cast<const Event&>(ev.GetEv()));
99 });
100 }
101
113 void RegisterGuard(const std::string& id, GuardMethod guard);
114
124 template <class Event>
125 void RegisterGuardStatic(const std::string& id, std::function<bool(const Event&)> guard) {
126 assert(guard);
127 RegisterGuard(id, [guard = std::move(guard)](scxml4cpp::Context* ctx) -> bool {
128 assert(ctx);
129 assert(ctx->getLastEvent());
130 assert(ctx->getLastEvent()->getId() == Event::ID);
131 rad::SMEvent& ev = static_cast<rad::SMEvent&>(*ctx->getLastEvent());
132 return guard(static_cast<const Event&>(ev.GetEv()));
133 });
134 }
135
151 void RegisterActivity(const std::string& id,
152 ActivityMethod activity,
153 SuccessMethod on_success,
154 FailureMethod on_failure);
155
166 void RegisterRejectHandler(const std::string& id, RejectMethod reject);
167
175 template <typename T, typename Ex>
177 RegisterRejectHandler(T::ID, [](const rad::AnyEvent& event, const std::string& state) {
178 if (auto req = rad::GetPayloadNothrow<T>(event); req) {
179 req->SetException(Ex{T::ID, state});
180 }
181 });
182 }
183
192 void RegisterStateChangeHandler(StateMethod on_statechange);
193
199 void PostEvent(rad::SharedEvent s);
200
206 std::string GetState();
207
213 void Work();
214
218 void Stop();
219
220private:
221 class MyEventListener : public scxml4cpp::EventListener {
222 public:
223 explicit MyEventListener(rad::SMAdapter& engine);
224 void notifyEvent(scxml4cpp::Event* ptr) override;
225 void RegisterCallback(StateMethod cb);
226
227 private:
228 rad::SMAdapter& m_fsm_engine;
229 StateMethod m_cb;
230 std::string m_prev_state;
231 };
232
233 log4cplus::Logger& m_logger;
234
235 boost::asio::io_service m_io_service;
236 scxml4cpp::Context m_fsm_ctx;
237 scxml4cpp::EventQueue m_event_queue;
238 rad::SMAdapter m_fsm_engine;
239 std::unique_ptr<rad::Signal> m_signal;
240 std::unique_ptr<MyEventListener> m_event_listener;
241 rad::UniqueEvent m_exit_event;
242
243 struct Model {
244 std::string name;
245 std::string model;
246 };
247
248 Model m_core_model;
249 std::list<Model> m_models_to_append;
250 std::list<scxml4cpp::Action*> m_action_list;
251 std::list<scxml4cpp::Activity*> m_activity_list;
252};
253
254template <typename EVENT>
255std::shared_ptr<typename EVENT::payload_t> GetPayloadNothrow(scxml4cpp::Context* c) {
256 rad::SMEvent* ev = dynamic_cast<rad::SMEvent*>(c->getLastEvent());
257 if (ev == nullptr) {
258 return nullptr;
259 } // Action has no event
260
261 auto req = rad::GetPayloadNothrow<EVENT>(ev->GetEv());
262 if (req == nullptr) {
263 return nullptr;
264 } // Event has no associated request
265
266 return std::make_shared<typename EVENT::payload_t>(*req);
267}
268
269} // namespace rtctk::componentFramework
270
271#endif // RTCTK_COMPONENTFRAMEWORK_STATEMACHINEENGINE_HPP
void RegisterGuardStatic(const std::string &id, std::function< bool(const Event &)> guard)
Register guard for statically known event type.
Definition stateMachineEngine.hpp:125
void RegisterExitEvent(rad::UniqueEvent exit_event)
Register an exit event.
Definition stateMachineEngine.cpp:68
void RegisterAction(const std::string &id, ActionMethod action)
Register action.
Definition stateMachineEngine.cpp:85
void RegisterRejectHandler()
Register default reject handler.
Definition stateMachineEngine.hpp:176
void RegisterStateChangeHandler(StateMethod on_statechange)
Register state changed handler.
Definition stateMachineEngine.cpp:141
StateMachineEngine()
Definition stateMachineEngine.cpp:52
void RegisterModel(const std::string &name, const std::string &model)
Register a new state machine model.
Definition stateMachineEngine.cpp:72
void Work()
Runs the event loop of the state machine.
Definition stateMachineEngine.cpp:154
void AppendModel(const std::string &name, const std::string &model)
Append state machine model fragment.
Definition stateMachineEngine.cpp:77
~StateMachineEngine()
Definition stateMachineEngine.cpp:58
std::string GetState()
Queries the current state.
Definition stateMachineEngine.cpp:150
void RegisterGuard(const std::string &id, GuardMethod guard)
Register guard.
Definition stateMachineEngine.cpp:107
void Stop()
Stops execution of the state machine event loop.
Definition stateMachineEngine.cpp:188
void RegisterActivity(const std::string &id, ActivityMethod activity, SuccessMethod on_success, FailureMethod on_failure)
Register activity.
Definition stateMachineEngine.cpp:120
void RegisterActionStatic(const std::string &id, std::function< void(const Event &)> action)
Register action for statically known event type.
Definition stateMachineEngine.hpp:92
void PostEvent(rad::SharedEvent s)
Injects a new event into the state machine engine.
Definition stateMachineEngine.cpp:145
nlohmann::json Event
Definition eventHandling.hpp:27
Provides macros and utilities for exception handling.
Definition commandReplier.cpp:21
std::function< void(const std::string &)> StateMethod
Definition stateMachineEngine.hpp:29
std::function< void(scxml4cpp::Context *c)> ActionMethod
Definition stateMachineEngine.hpp:23
rad::StopToken StopToken
Definition stopToken.hpp:19
std::function< bool(scxml4cpp::Context *c)> GuardMethod
Definition stateMachineEngine.hpp:24
std::shared_ptr< typename EVENT::payload_t > GetPayloadNothrow(scxml4cpp::Context *c)
Definition stateMachineEngine.hpp:255
std::function< void(std::exception_ptr)> FailureMethod
Definition stateMachineEngine.hpp:27
std::function< void()> SuccessMethod
Definition stateMachineEngine.hpp:26
std::function< void(const rad::AnyEvent &, const std::string &state)> RejectMethod
Definition stateMachineEngine.hpp:28
std::function< void(StopToken f)> ActivityMethod
Definition stateMachineEngine.hpp:25
A simple Stop Token.