rad 6.2.0
Loading...
Searching...
No Matches
smAdapter.hpp
Go to the documentation of this file.
1
10#ifndef RAD_SM_ADAPTER_HPP
11#define RAD_SM_ADAPTER_HPP
12
13#include <rad/anyEvent.hpp>
14#include <rad/logger.hpp>
15#include <rad/msgHandler.hpp>
16#include <rad/topicHandler.hpp>
17#include <rad/smEvent.hpp>
18
19#include <scxml4cpp/Action.h>
20#include <scxml4cpp/Activity.h>
21#include <scxml4cpp/Context.h>
25#include <scxml4cpp/Executor.h>
28
29#include <boost/asio.hpp>
30
31#include <list>
32#include <memory>
33#include <vector>
34
35namespace rad {
36
44template <typename T>
45void DefaultRequestRejectHandler(const rad::AnyEvent& event, const std::string& state) {
47 auto req = rad::GetPayloadNothrow<T>(event);
48 if (req == nullptr) {
49 LOG4CPLUS_ERROR(GetLogger(), event.GetId() << " has no associated request!");
50 return;
51 }
52 req->SetReplyValue("Request rejected in state " + state);
53}
54
61 public:
69 SMAdapter(boost::asio::io_context& ios, scxml4cpp::Context* context,
70 scxml4cpp::EventQueue& external_events);
71
76 virtual ~SMAdapter();
77
90 void Load(const std::string& filename,
91 std::list<scxml4cpp::Action*>* action_list,
92 std::list<scxml4cpp::Activity*>* activity_list,
93 const scxml4cpp::ReplaceRules& replace_rules = scxml4cpp::ReplaceRules());
94
108 void LoadFromString(const std::string& name, const std::string& model,
109 std::list<scxml4cpp::Action*>* action_list,
110 std::list<scxml4cpp::Activity*>* activity_list,
111 const scxml4cpp::ReplaceRules& replace_rules = scxml4cpp::ReplaceRules());
112
125 void Append(const std::string& filename,
126 std::list<scxml4cpp::Action*>* action_list,
127 std::list<scxml4cpp::Activity*>* activity_list,
128 const scxml4cpp::ReplaceRules& replace_rules = scxml4cpp::ReplaceRules());
129
143 void AppendFromString(const std::string& name,
144 const std::string& model,
145 std::list<scxml4cpp::Action*>* action_list,
146 std::list<scxml4cpp::Activity*>* activity_list,
147 const scxml4cpp::ReplaceRules& replace_rules =
149
155 void Save(const std::string& filename);
156
160 std::string GetStateMachineAsString();
161
165 void Start();
166
170 void Stop();
171
186 void PostEvent(SharedEvent e);
187
191 void ProcessEvent();
192
200
206 void ProcessEvent(const AnyEvent& e);
207
216 void SetStatusRepresentation(const bool use_fully_qualified_state);
217
224 std::string GetStatus() const;
225
230 std::list<scxml4cpp::State*> GetActiveStates();
231
243
250
258
265
272 void SetStatusPublisher(std::function<void(const std::string&)> publisher);
273
278 void PublishStatus();
279
288 const std::string& id,
289 std::function<void(const rad::AnyEvent&, const std::string& state)> handler);
290
298 template <typename T>
301 LOG4CPLUS_DEBUG(GetLogger(), "Registering reject handler for event: " << T::ID);
302 // std::cout << "Registering reject handler for event: " << T::ID << std::endl;
303 RegisterRejectHandler(T::ID, DefaultRequestRejectHandler<T>);
304 }
305
306#if 0
312 template <typename T>
315 LOG4CPLUS_DEBUG(GetLogger(), "Registering reject handler for event: " << T::ID);
316 RegisterRejectHandler(T::ID, [](const rad::AnyEvent& event, std::string const& state) {
318 auto req = rad::GetPayloadNothrow<T>(event);
319 if (req == nullptr) {
320 LOG4CPLUS_ERROR(GetLogger(), event.GetId() << " has no associated request!");
321 return;
322 }
323 req->SetReplyValue("Request rejected in state " + state);
324 });
325 }
326#endif
327
333 void SetLogLevel(const std::string& level);
334
335 SMAdapter(const SMAdapter& e) = delete;
337
338 private:
339 boost::asio::io_context& m_ios;
340 scxml4cpp::Context* m_context;
341 scxml4cpp::EventQueue& m_external_events;
342 scxml4cpp::Helper m_helper;
343 std::unique_ptr<scxml4cpp::StateMachine> m_model;
344 scxml4cpp::Executor* m_executor;
345 std::string m_model_name;
346 std::string m_status;
347 std::string m_old_status;
348 bool m_use_fully_qualified_state = false;
349 SMEvent m_event;
350 std::function<void(const std::string&)> m_status_publisher = nullptr;
351 std::map<std::string, std::function<void(const rad::AnyEvent&, const std::string& state)>>
352 m_reject_handlers;
353
357 void Cleanup();
358
366 void notifyStatus(std::list<scxml4cpp::State*>& status) override;
367
375 void notifyEvent(scxml4cpp::Event* event) override;
376};
377
381template <typename EventType>
382std::function<void(const std::string&, const std::string&, const void*, size_t)> ReqProcessEvent(
383 SMAdapter& sm) {
384 return [&/*sm*/](const std::string& identity, const std::string& request_name, const void* msg,
385 size_t msg_size) {
386 auto ev = ParseRequestAndCreateEvent<EventType>(identity, request_name, msg, msg_size);
387 sm.ProcessEvent(ev); // Process event
388 };
389}
390
394template <typename EventType>
395std::function<void(const std::string&, const void*, size_t)> TopicProcessEvent(SMAdapter& sm) {
396 return [&/*sm*/](const std::string& topic_name, const void* msg, size_t msg_size) {
397 auto ev = ParseTopicAndCreateEvent<EventType>(topic_name, msg, msg_size);
398 sm.ProcessEvent(ev); // Process event
399 };
400}
401
402} // namespace rad
403
404#endif // RAD_SM_ADAPTER_HPP
Action header.
Activity header.
Context header.
SCXMLReader header.
EventListener header.
EventQueue header.
Executor header.
StateMachine header.
StatusListener header.
AnyEvent class header file.
Definition anyEvent.hpp:52
char const * GetId() const
Definition anyEvent.hpp:60
Definition smAdapter.hpp:60
void AddEventListener(scxml4cpp::EventListener *listener)
Definition smAdapter.cpp:413
void Save(const std::string &filename)
Definition smAdapter.cpp:224
void SetStatusPublisher(std::function< void(const std::string &)> publisher)
Definition smAdapter.cpp:435
void Start()
Definition smAdapter.cpp:240
void PublishStatus()
Definition smAdapter.cpp:440
SMAdapter & operator=(SMAdapter &e)=delete
void PostEvent(SharedEvent e)
Definition smAdapter.cpp:296
void RemoveEventListener(scxml4cpp::EventListener *listener)
Definition smAdapter.cpp:424
void SetLogLevel(const std::string &level)
Definition smAdapter.cpp:459
std::list< scxml4cpp::State * > GetActiveStates()
Definition smAdapter.cpp:356
void RegisterRejectHandler(const std::string &id, std::function< void(const rad::AnyEvent &, const std::string &state)> handler)
Definition smAdapter.cpp:451
SMAdapter(const SMAdapter &e)=delete
void AppendFromString(const std::string &name, const std::string &model, std::list< scxml4cpp::Action * > *action_list, std::list< scxml4cpp::Activity * > *activity_list, const scxml4cpp::ReplaceRules &replace_rules=scxml4cpp::ReplaceRules())
Definition smAdapter.cpp:180
void RegisterDefaultRequestRejectHandler()
Definition smAdapter.hpp:299
virtual ~SMAdapter()
Definition smAdapter.cpp:38
void Stop()
Definition smAdapter.cpp:269
void LoadFromString(const std::string &name, const std::string &model, std::list< scxml4cpp::Action * > *action_list, std::list< scxml4cpp::Activity * > *activity_list, const scxml4cpp::ReplaceRules &replace_rules=scxml4cpp::ReplaceRules())
Definition smAdapter.cpp:96
SMAdapter(boost::asio::io_context &ios, scxml4cpp::Context *context, scxml4cpp::EventQueue &external_events)
Definition smAdapter.cpp:26
void SetStatusRepresentation(const bool use_fully_qualified_state)
Definition smAdapter.cpp:346
void AddStatusListener(scxml4cpp::StatusListener *listener)
Definition smAdapter.cpp:391
std::string GetStatus() const
Definition smAdapter.cpp:351
void RemoveStatusListener(scxml4cpp::StatusListener *listener)
Definition smAdapter.cpp:402
void ProcessEvent()
Definition smAdapter.cpp:313
void Load(const std::string &filename, std::list< scxml4cpp::Action * > *action_list, std::list< scxml4cpp::Activity * > *activity_list, const scxml4cpp::ReplaceRules &replace_rules=scxml4cpp::ReplaceRules())
Definition smAdapter.cpp:56
std::string GetStateMachineAsString()
Definition smAdapter.cpp:233
void Append(const std::string &filename, std::list< scxml4cpp::Action * > *action_list, std::list< scxml4cpp::Activity * > *activity_list, const scxml4cpp::ReplaceRules &replace_rules=scxml4cpp::ReplaceRules())
Definition smAdapter.cpp:131
Definition smEvent.hpp:25
Definition Context.h:58
Definition EventListener.h:57
Definition EventQueue.h:55
Definition Event.h:66
Definition Executor.h:73
Definition Helper.h:57
Definition ReplaceRules.h:53
Definition StatusListener.h:60
Logger class.
#define RAD_TRACE(logger)
Definition logger.hpp:21
public header file.
Definition actionsApp.cpp:23
std::function< void(const std::string &, const void *, size_t) TopicProcessEvent)(SMAdapter &sm)
Definition smAdapter.hpp:395
log4cplus::Logger & GetLogger()
Definition logger.cpp:72
std::shared_ptr< const AnyEvent > SharedEvent
Definition anyEvent.hpp:44
std::function< void(const std::string &, const std::string &, const void *, size_t) ReqProcessEvent)(SMAdapter &sm)
Definition smAdapter.hpp:382
void DefaultRequestRejectHandler(const rad::AnyEvent &event, const std::string &state)
Definition smAdapter.hpp:45
SMEvent class header file.
public header file.