ifw-sup  3.0.0-pre3
subsysFacade.hpp
Go to the documentation of this file.
1 
9 #ifndef SUP_SYSSUP_COMMON_SUBSYS_FACADE_HPP_
10 #define SUP_SYSSUP_COMMON_SUBSYS_FACADE_HPP_
11 
12 // System headers
13 #include <iostream>
14 #include <list>
15 #include <atomic>
16 #include <type_traits>
17 
18 // Local headers
19 #include <rad/smAdapter.hpp>
20 #include <rad/topicPub.hpp>
21 #include <rad/anyEvent.hpp>
22 #include <rad/activity.hpp>
23 #include <rad/mal/utils.hpp>
24 
25 
27 #include <ifw/sup/syssup/common/events.rad.hpp>
28 
29 namespace sup {
30  namespace syssup {
31  namespace common {
32 
33  template<typename T>
34  std::ostream& operator<<(typename std::enable_if<std::is_enum<T>::value, std::ostream>::type& stream, const T& e)
35  {
36  return stream << static_cast<typename std::underlying_type<T>::type>(e);
37  }
38 
44  template<typename EVENT_TYPE>
45  class SingleReplier {
46  public:
47  using Request = std::optional<typename EVENT_TYPE::payload_t>;
48  using RequestMap = std::map<std::string, Request>;
49  using RequestPair = std::pair<std::string, Request>;
50 
51  public:
53  void ReplyOk(std::string req_id, std::string msg);
54  void ReplyError(std::string req_id, std::string msg);
55 
57  };
58 
59  class IConfig;
60  class ISubsys;
61 
69  class SubsysFacade {
70  public:
77  SubsysFacade(rad::SMAdapter& sm,
78  DataContext& data_ctx);
79 
83  virtual ~SubsysFacade();
84 
102  void Connect();
103 
112  void StartMonitoring();
113 
124  void Init(rad::SMAdapter& sm, rad::ThreadActivity* activity);
125 
133  void Enable(rad::SMAdapter& sm, rad::ThreadActivity* activity);
134 
146  void Disable(rad::SMAdapter& sm, rad::ThreadActivity* activity);
147 
159  void Recover(rad::SMAdapter& sm, rad::ThreadActivity* activity);
160 
164  void DisableAccess();
165 
184  void Setup(const std::any& payload);
185 
190  virtual void Stop();
191 
196  virtual void Reset();
197 
198 
226  template<typename EVENT_TYPE, typename OBJECT>
227  void SubsysCommand(scxml4cpp::Context* c, OBJECT& obj);
228 
233  void UpdateConfiguration();
234 
243  void UpdateHandler();
244 
272  virtual void EstimateState(std::vector<State::StateEnum>& states,
273  std::vector<State::SubstateEnum>& substates);
274 
280  void SetSubsystemConnectionState(std::string name,
281  SubsysData::ConnectionEnum connection);
282 
288  void SetSubsystemState(std::string name, std::string state);
289 
296  void SetSubsystemStates(std::string name,
297  std::string state,
298  std::string substate);
299 
305  void SetSubsystemSubstate(std::string name, std::string substate);
306 
315  void GetSubsystemStatus(const std::string& payload, std::string& buffer);
316 
317 
324  void AddSubsys(std::unique_ptr<Subsys> subsys);
325 
329  void ClearSubsys();
330 
331 
336  const int GetNumSubsys();
337 
342  std::string GetSubsysNames();
343 
344  private:
345 
346  SubsysFacade(const SubsysFacade&) = delete;
347  SubsysFacade& operator= (const SubsysFacade&) = delete;
348 
349 
360  template <typename Iterator, typename EVENT_DONE, typename EVENT_ERR, typename EVENT_TOUT>
361  void ManageReply(Iterator& vec, rad::ThreadActivity* activity,
362  int wait_time_msecs, bool reply_on_success = true);
363 
364 
365  bool CheckSubsysName(const std::string& subsys) const;
366 
367  std::vector<std::unique_ptr<Subsys> > m_subsyss;
368  std::vector<std::string> m_subsys_names;
369  boost::asio::io_service m_ios;
370  rad::SMAdapter& m_sm;
371  DataContext& m_data_ctx;
372  log4cplus::Logger m_logger;
373 
374  public:
379  };
380 
381 
382  }
383  }
384 } // namespace devmgr::Common
385 
386 #include "subsysFacade.ipp"
387 
388 #endif // SUP_SYSSUP_COMMON_SUBSYS_FACADE_HPP_
Definition: dataContext.hpp:68
Definition: iSubsys.hpp:32
Definition: subsysFacade.hpp:45
std::map< std::string, Request > RequestMap
Definition: subsysFacade.hpp:48
RequestMap m_req_map
Definition: subsysFacade.hpp:56
std::pair< std::string, Request > RequestPair
Definition: subsysFacade.hpp:49
std::optional< typename EVENT_TYPE::payload_t > Request
Definition: subsysFacade.hpp:47
void ReplyError(std::string req_id, std::string msg)
void InsertRequest(RequestPair pair)
void ReplyOk(std::string req_id, std::string msg)
Definition: subsysFacade.hpp:69
void GetSubsystemStatus(const std::string &payload, std::string &buffer)
Get subsystem status.
Definition: subsysFacade.cpp:423
void Disable(rad::SMAdapter &sm, rad::ThreadActivity *activity)
Disable all subsystems managed by the Supervisor.
Definition: subsysFacade.cpp:265
void Enable(rad::SMAdapter &sm, rad::ThreadActivity *activity)
Enable all subsystems managed by the Supervisor.
Definition: subsysFacade.cpp:181
void SubsysCommand(scxml4cpp::Context *c, OBJECT &obj)
Forward request to an specific subsystem.
void SetSubsystemSubstate(std::string name, std::string substate)
Set the subsystem substate.
Definition: subsysFacade.cpp:415
SingleReplier< Events::SubsysReset > m_reset_replier
Definition: subsysFacade.hpp:378
void SetSubsystemConnectionState(std::string name, SubsysData::ConnectionEnum connection)
Get subsystem connection state.
Definition: subsysFacade.cpp:386
virtual void EstimateState(std::vector< State::StateEnum > &states, std::vector< State::SubstateEnum > &substates)
EstimateState.
Definition: subsysFacade.cpp:484
void ClearSubsys()
Empty internal subsys map.
Definition: subsysFacade.cpp:345
SingleReplier< Events::SubsysDisable > m_disable_replier
Definition: subsysFacade.hpp:377
void Init(rad::SMAdapter &sm, rad::ThreadActivity *activity)
Init all subsystems managed by the Supervisor.
Definition: subsysFacade.cpp:145
void AddSubsys(std::unique_ptr< Subsys > subsys)
Add a subsystems instance to be managed by the facade.
Definition: subsysFacade.cpp:339
std::string GetSubsysNames()
Get list of subsystems managed by the Supervisor.
Definition: subsysFacade.cpp:372
virtual void Stop()
Abort all subsystems managed by the devmgr.
Definition: subsysFacade.cpp:294
void StartMonitoring()
StartMonitoring.
Definition: subsysFacade.cpp:136
void Setup(const std::any &payload)
Executes a setup message.
Definition: subsysFacade.cpp:597
SingleReplier< Events::SubsysInit > m_init_replier
Definition: subsysFacade.hpp:375
void UpdateHandler()
Triggers the update of the estimated state/substate.
Definition: subsysFacade.cpp:461
void Connect()
Connect.
Definition: subsysFacade.cpp:59
const int GetNumSubsys()
Get the number of subsystems.
Definition: subsysFacade.cpp:351
SingleReplier< Events::SubsysEnable > m_enable_replier
Definition: subsysFacade.hpp:376
void SetSubsystemState(std::string name, std::string state)
Set the subsystem state.
Definition: subsysFacade.cpp:395
void UpdateConfiguration()
Triggers the update of the subsystem configuration.
Definition: subsysFacade.cpp:438
void SetSubsystemStates(std::string name, std::string state, std::string substate)
Set the subsystem states: state and substate.
Definition: subsysFacade.cpp:403
void Recover(rad::SMAdapter &sm, rad::ThreadActivity *activity)
Recover all subsystems managed by the Supervisor.
Definition: subsysFacade.cpp:255
void DisableAccess()
Disable Access for all subsystems.
Definition: subsysFacade.cpp:588
SubsysFacade(rad::SMAdapter &sm, DataContext &data_ctx)
Definition: subsysFacade.cpp:46
virtual void Reset()
Reset subsystems.
Definition: subsysFacade.cpp:316
virtual ~SubsysFacade()
~SubsysFacade
Definition: subsysFacade.cpp:55
std::ostream & operator<<(typename std::enable_if< std::is_enum< T >::value, std::ostream >::type &stream, const T &e)
Definition: subsysFacade.hpp:34
Definition: actionMgr.cpp:32
ConnectionEnum
Definition: subsys.hpp:44
Subsys class header file.