rad  5.1.0
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>
24 #include <scxml4cpp/EventQueue.h>
25 #include <scxml4cpp/Executor.h>
26 #include <scxml4cpp/StateMachine.h>
28 
29 #include <boost/asio.hpp>
30 
31 #include <list>
32 #include <memory>
33 #include <vector>
34 
35 namespace rad {
36 
44 template <typename T>
45 void 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>
300  RAD_TRACE(GetLogger());
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>
314  RAD_TRACE(GetLogger());
315  LOG4CPLUS_DEBUG(GetLogger(), "Registering reject handler for event: " << T::ID);
316  RegisterRejectHandler(T::ID, [](const rad::AnyEvent& event, std::string const& state) {
317  RAD_TRACE(GetLogger());
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 
381 template <typename EventType>
382 std::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 
394 template <typename EventType>
395 std::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:412
void Save(const std::string &filename)
Definition: smAdapter.cpp:223
void SetStatusPublisher(std::function< void(const std::string &)> publisher)
Definition: smAdapter.cpp:434
void Start()
Definition: smAdapter.cpp:239
void PublishStatus()
Definition: smAdapter.cpp:439
void PostEvent(SharedEvent e)
Definition: smAdapter.cpp:295
void RemoveEventListener(scxml4cpp::EventListener *listener)
Definition: smAdapter.cpp:423
void SetLogLevel(const std::string &level)
Definition: smAdapter.cpp:458
std::list< scxml4cpp::State * > GetActiveStates()
Definition: smAdapter.cpp:355
void RegisterRejectHandler(const std::string &id, std::function< void(const rad::AnyEvent &, const std::string &state)> handler)
Definition: smAdapter.cpp:450
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:179
void RegisterDefaultRequestRejectHandler()
Definition: smAdapter.hpp:299
virtual ~SMAdapter()
Definition: smAdapter.cpp:38
void Stop()
Definition: smAdapter.cpp:268
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:95
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:345
void AddStatusListener(scxml4cpp::StatusListener *listener)
Definition: smAdapter.cpp:390
std::string GetStatus() const
Definition: smAdapter.cpp:350
void RemoveStatusListener(scxml4cpp::StatusListener *listener)
Definition: smAdapter.cpp:401
void ProcessEvent()
Definition: smAdapter.cpp:312
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:232
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:130
SMAdapter & operator=(SMAdapter &e)=delete
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:24
public header file.
level
Definition: hellorad.py:30
Definition: actionsApp.cpp:20
std::function< void(const std::string &, const std::string &, const void *, size_t)> ReqProcessEvent(SMAdapter &sm)
Definition: smAdapter.hpp:382
std::function< void(const std::string &, const void *, size_t)> TopicProcessEvent(SMAdapter &sm)
Definition: smAdapter.hpp:395
log4cplus::Logger & GetLogger()
Definition: logger.cpp:70
std::shared_ptr< const AnyEvent > SharedEvent
Definition: anyEvent.hpp:44
void DefaultRequestRejectHandler(const rad::AnyEvent &event, const std::string &state)
Definition: smAdapter.hpp:45
def handler(event)
Definition: test_dispatcher.py:11
name
Definition: wscript:8
SMEvent class header file.
public header file.