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