13#ifndef RTCTK_COMPONENTFRAMEWORK_STATEMACHINEENGINE_HPP
14#define RTCTK_COMPONENTFRAMEWORK_STATEMACHINEENGINE_HPP
19#include <rad/signal.hpp>
20#include <rad/smAdapter.hpp>
29using RejectMethod = std::function<
void(
const rad::AnyEvent&,
const std::string& state)>;
58 void RegisterModel(
const std::string& name,
const std::string& model);
70 void AppendModel(
const std::string& name,
const std::string& model);
92 template <
class Event>
98 rad::SMEvent&
ev =
static_cast<rad::SMEvent&
>(*
ctx->getLastEvent());
125 template <
class Event>
131 assert(
ctx->getLastEvent()->getId() == Event::ID);
132 rad::SMEvent&
ev =
static_cast<rad::SMEvent&
>(*
ctx->getLastEvent());
176 template <
typename T,
typename Ex>
179 if (
auto req = rad::GetPayloadNothrow<T>(
event); req) {
180 req->SetException(
Ex{T::ID, state});
222 class MyEventListener :
public scxml4cpp::EventListener {
224 MyEventListener(rad::SMAdapter&
engine);
225 void notifyEvent(scxml4cpp::Event*
ptr)
override;
229 rad::SMAdapter& m_fsm_engine;
231 std::string m_prev_state;
234 log4cplus::Logger& m_logger;
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;
250 std::list<Model> m_models_to_append;
251 std::list<scxml4cpp::Action*> m_action_list;
252 std::list<scxml4cpp::Activity*> m_activity_list;
255template <
typename EVENT>
257 rad::SMEvent*
ev =
dynamic_cast<rad::SMEvent*
>(
c->getLastEvent());
262 auto req = rad::GetPayloadNothrow<EVENT>(
ev->GetEv());
263 if (req ==
nullptr) {
267 return std::make_shared<typename EVENT::payload_t>(*req);
Definition stateMachineEngine.hpp:35
void RegisterGuardStatic(const std::string &id, std::function< bool(const Event &)> guard)
Register guard for statically known event type.
Definition stateMachineEngine.hpp:126
void RegisterExitEvent(rad::UniqueEvent exit_event)
Register an exit event.
Definition stateMachineEngine.cpp:69
void RegisterAction(const std::string &id, ActionMethod action)
Register action.
Definition stateMachineEngine.cpp:86
void RegisterRejectHandler()
Register default reject handler.
Definition stateMachineEngine.hpp:177
void RegisterStateChangeHandler(StateMethod on_statechange)
Register state changed handler.
Definition stateMachineEngine.cpp:144
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
~StateMachineEngine()
Definition stateMachineEngine.cpp:59
std::string GetState()
Queries the current state.
Definition stateMachineEngine.cpp:153
void RegisterGuard(const std::string &id, GuardMethod guard)
Register guard.
Definition stateMachineEngine.cpp:110
void Stop()
Stops execution of the state machine event loop.
Definition stateMachineEngine.cpp:191
void RegisterActivity(const std::string &id, ActivityMethod activity, SuccessMethod on_success, FailureMethod on_failure)
Register activity.
Definition stateMachineEngine.cpp:123
void RegisterActionStatic(const std::string &id, std::function< void(const Event &)> action)
Register action for statically known event type.
Definition stateMachineEngine.hpp:93
void PostEvent(rad::SharedEvent s)
Injects a new event into the state machine engine.
Definition stateMachineEngine.cpp:148
nlohmann::json Event
Definition eventHandling.hpp:28
Provides macros and utilities for exception handling.
Definition commandReplier.cpp:22
std::function< void(const std::string &)> StateMethod
Definition stateMachineEngine.hpp:30
std::function< void(scxml4cpp::Context *c)> ActionMethod
Definition stateMachineEngine.hpp:24
rad::StopToken StopToken
Definition stopToken.hpp:20
std::function< bool(scxml4cpp::Context *c)> GuardMethod
Definition stateMachineEngine.hpp:25
std::shared_ptr< typename EVENT::payload_t > GetPayloadNothrow(scxml4cpp::Context *c)
Definition stateMachineEngine.hpp:256
std::function< void(std::exception_ptr)> FailureMethod
Definition stateMachineEngine.hpp:28
std::function< void()> SuccessMethod
Definition stateMachineEngine.hpp:27
elt::mal::future< std::string > InjectReqRepEvent(StateMachineEngine &engine)
Definition malEventInjector.hpp:23
std::function< void(const rad::AnyEvent &, const std::string &state)> RejectMethod
Definition stateMachineEngine.hpp:29
std::function< void(StopToken f)> ActivityMethod
Definition stateMachineEngine.hpp:26