rad  3.0.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>
22 #include <scxml4cpp/DOMSCXMLReader.h>
23 #include <scxml4cpp/EventListener.h>
24 #include <scxml4cpp/EventQueue.h>
25 #include <scxml4cpp/Executor.h>
26 #include <scxml4cpp/StateMachine.h>
27 #include <scxml4cpp/StatusListener.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:
62  SMAdapter(boost::asio::io_service& ios, scxml4cpp::Context* context,
63  scxml4cpp::EventQueue& external_events);
64  virtual ~SMAdapter();
65 
66  void Load(const std::string& filename, std::list<scxml4cpp::Action*>* action_list,
67  std::list<scxml4cpp::Activity*>* activity_list);
68  void Append(const std::string& filename, std::list<scxml4cpp::Action*>* action_list,
69  std::list<scxml4cpp::Activity*>* activity_list);
70 
71  void Start();
72  void Stop();
73 
74  void PostEvent(SharedEvent e);
75 
76  void ProcessEvent();
78  void ProcessEvent(const AnyEvent& e);
79 
80  void SetStatusRepresentation(const bool use_fully_qualified_state);
81  std::string GetStatus() const;
82  std::set<scxml4cpp::State*> GetActiveStates();
83 
88 
89  void SetStatusPublisher(std::function<void(const std::string&)> publisher);
90  void PublishStatus();
91 
99  const std::string& id,
100  std::function<void(const rad::AnyEvent&, const std::string& state)> handler);
101 
109  template <typename T>
111  RAD_TRACE(GetLogger());
112  LOG4CPLUS_DEBUG(GetLogger(), "Registering reject handler for event: " << T::ID);
113  // std::cout << "Registering reject handler for event: " << T::ID << std::endl;
114  RegisterRejectHandler(T::ID, DefaultRequestRejectHandler<T>);
115  }
116 
117 #if 0
118 
123  template <typename T>
125  RAD_TRACE(GetLogger());
126  LOG4CPLUS_DEBUG(GetLogger(), "Registering reject handler for event: " << T::ID);
127  RegisterRejectHandler(T::ID, [](const rad::AnyEvent& event, std::string const& state) {
128  RAD_TRACE(GetLogger());
129  auto req = rad::GetPayloadNothrow<T>(event);
130  if (req == nullptr) {
131  LOG4CPLUS_ERROR(GetLogger(), event.GetId() << " has no associated request!");
132  return;
133  }
134  req->SetReplyValue("Request rejected in state " + state);
135  });
136  }
137 #endif
138 
139  void SetLogLevel(const std::string& level);
140 
141  SMAdapter(const SMAdapter& e) = delete;
143 
144  private:
145  boost::asio::io_service& m_ios;
146  scxml4cpp::Context* m_context;
147  scxml4cpp::EventQueue& m_external_events;
148  scxml4cpp::Helper m_helper;
149  scxml4cpp::Executor* m_executor;
150  scxml4cpp::StateMachine m_model;
151  std::string m_model_name;
152  std::string m_status;
153  std::string m_old_status;
154  bool m_use_fully_qualified_state = false;
155  SMEvent m_event;
156  std::function<void(const std::string&)> m_status_publisher = nullptr;
157  std::map<std::string, std::function<void(const rad::AnyEvent&, const std::string& state)>>
158  m_reject_handlers;
159 
160  void Cleanup();
161  void notifyStatus(std::set<scxml4cpp::State*>& status) override;
162  void notifyEvent(scxml4cpp::Event* event) override;
163 };
164 
168 template <typename EventType>
169 std::function<void(const std::string&, const std::string&, const void*, size_t)> ReqProcessEvent(
170  SMAdapter& sm) {
171  return [&/*sm*/](const std::string& identity, const std::string& request_name, const void* msg,
172  size_t msg_size) {
173  auto ev = ParseRequestAndCreateEvent<EventType>(identity, request_name, msg, msg_size);
174  sm.ProcessEvent(ev); // Process event
175  };
176 }
177 
181 template <typename EventType>
182 std::function<void(const std::string&, const void*, size_t)> TopicProcessEvent(SMAdapter& sm) {
183  return [&/*sm*/](const std::string& topic_name, const void* msg, size_t msg_size) {
184  auto ev = ParseTopicAndCreateEvent<EventType>(topic_name, msg, msg_size);
185  sm.ProcessEvent(ev); // Process event
186  };
187 }
188 
189 } // namespace rad
190 
191 #endif // RAD_SM_ADAPTER_HPP
rad::SMAdapter::Stop
void Stop()
Definition: smAdapter.cpp:184
hellorad.level
level
Definition: hellorad.py:30
rad::SMAdapter::Start
void Start()
Definition: smAdapter.cpp:156
rad::SMAdapter
Definition: smAdapter.hpp:60
rad::SMAdapter::RemoveStatusListener
void RemoveStatusListener(scxml4cpp::StatusListener *listener)
Definition: smAdapter.cpp:312
rad::SMAdapter::SMAdapter
SMAdapter(const SMAdapter &e)=delete
rad::SMAdapter::GetStatus
std::string GetStatus() const
Definition: smAdapter.cpp:262
rad::SMAdapter::GetActiveStates
std::set< scxml4cpp::State * > GetActiveStates()
Definition: smAdapter.cpp:271
scxml4cpp::Executor
Definition: Executor.h:61
rad::SMAdapter::ProcessEvent
void ProcessEvent()
Definition: smAdapter.cpp:227
rad::SMEvent
Definition: smEvent.hpp:25
scxml4cpp::StateMachine
Definition: StateMachine.h:45
rad::SMAdapter::SetStatusPublisher
void SetStatusPublisher(std::function< void(const std::string &)> publisher)
Definition: smAdapter.cpp:346
test_dispatcher.handler
def handler(event)
Definition: test_dispatcher.py:11
rad::SMAdapter::SetLogLevel
void SetLogLevel(const std::string &level)
Definition: smAdapter.cpp:381
rad::SharedEvent
std::shared_ptr< const AnyEvent > SharedEvent
Definition: anyEvent.hpp:44
scxml4cpp::Helper
Definition: Helper.h:48
rad::DefaultRequestRejectHandler
void DefaultRequestRejectHandler(const rad::AnyEvent &event, const std::string &state)
Definition: smAdapter.hpp:45
rad
Definition: actionCallback.hpp:21
rad::GetLogger
log4cplus::Logger & GetLogger()
Definition: logger.cpp:44
rad::AnyEvent
Definition: anyEvent.hpp:52
rad::AnyEvent::GetId
char const * GetId() const
Definition: anyEvent.hpp:60
rad::SMAdapter::RegisterRejectHandler
void RegisterRejectHandler(const std::string &id, std::function< void(const rad::AnyEvent &, const std::string &state)> handler)
Definition: smAdapter.cpp:368
rad::SMAdapter::AddEventListener
void AddEventListener(scxml4cpp::EventListener *listener)
Definition: smAdapter.cpp:324
rad::SMAdapter::PublishStatus
void PublishStatus()
Definition: smAdapter.cpp:354
scxml4cpp::EventListener
Definition: EventListener.h:40
rad::SMAdapter::SMAdapter
SMAdapter(boost::asio::io_service &ios, scxml4cpp::Context *context, scxml4cpp::EventQueue &external_events)
Definition: smAdapter.cpp:31
rad::SMAdapter::RegisterDefaultRequestRejectHandler
void RegisterDefaultRequestRejectHandler()
Definition: smAdapter.hpp:110
scxml4cpp::StatusListener
Definition: StatusListener.h:41
rad::SMAdapter::SetStatusRepresentation
void SetStatusRepresentation(const bool use_fully_qualified_state)
Definition: smAdapter.cpp:252
rad::SMAdapter::PostEvent
void PostEvent(SharedEvent e)
Definition: smAdapter.cpp:214
rad::SMAdapter::Load
void Load(const std::string &filename, std::list< scxml4cpp::Action * > *action_list, std::list< scxml4cpp::Activity * > *activity_list)
Definition: smAdapter.cpp:74
rad::SMAdapter::AddStatusListener
void AddStatusListener(scxml4cpp::StatusListener *listener)
Definition: smAdapter.cpp:300
rad::ReqProcessEvent
std::function< void(const std::string &, const std::string &, const void *, size_t)> ReqProcessEvent(SMAdapter &sm)
Definition: smAdapter.hpp:169
rad::SMAdapter::operator=
SMAdapter & operator=(SMAdapter &e)=delete
rad::SMAdapter::~SMAdapter
virtual ~SMAdapter()
Definition: smAdapter.cpp:41
scxml4cpp::Event
Definition: Event.h:39
RAD_TRACE
#define RAD_TRACE(logger)
Definition: logger.hpp:24
rad::TopicProcessEvent
std::function< void(const std::string &, const void *, size_t)> TopicProcessEvent(SMAdapter &sm)
Definition: smAdapter.hpp:182
rad::SMAdapter::RemoveEventListener
void RemoveEventListener(scxml4cpp::EventListener *listener)
Definition: smAdapter.cpp:336
rad::SMAdapter::Append
void Append(const std::string &filename, std::list< scxml4cpp::Action * > *action_list, std::list< scxml4cpp::Activity * > *activity_list)
Definition: smAdapter.cpp:109
scxml4cpp::Context
Definition: Context.h:44
scxml4cpp::EventQueue
Definition: EventQueue.h:44