ifw-sup  1.0.0
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 <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 
161 
180  void Setup(const std::any& payload);
181 
186  virtual void Stop();
187 
192  virtual void Reset();
193 
194 
222  template<typename EVENT_TYPE, typename OBJECT>
223  void SubsysCommand(scxml4cpp::Context* c, OBJECT& obj);
224 
229  void UpdateConfiguration();
230 
239  void UpdateHandler();
240 
268  virtual void EstimateState(std::vector<State::StateEnum>& states,
269  std::vector<State::SubstateEnum>& substates);
270 
276  void SetSubsystemConnectionState(std::string name,
277  SubsysData::ConnectionEnum connection);
278 
284  void SetSubsystemState(std::string name, std::string state);
285 
291  void SetSubsystemSubstate(std::string name, std::string substate);
292 
301  void GetSubsystemStatus(const std::string& payload, std::string& buffer);
302 
303 
310  void AddSubsys(std::unique_ptr<Subsys> subsys);
311 
315  void ClearSubsys();
316 
317 
322  const int GetNumSubsys();
323 
328  std::string GetSubsysNames();
329 
330  private:
331 
332  SubsysFacade(const SubsysFacade&) = delete;
333  SubsysFacade& operator= (const SubsysFacade&) = delete;
334 
335 
346  template <typename Iterator, typename EVENT_DONE, typename EVENT_ERR, typename EVENT_TOUT>
347  void ManageReply(Iterator& vec, rad::ThreadActivity* activity,
348  int wait_time_msecs, bool reply_on_success = true);
349 
350 
351  bool CheckSubsysName(const std::string& subsys) const;
352 
353  std::vector<std::unique_ptr<Subsys> > m_subsyss;
354  std::vector<std::string> m_subsys_names;
355  boost::asio::io_service m_ios;
356  rad::SMAdapter& m_sm;
357  DataContext& m_data_ctx;
358 
359  public:
364  };
365 
366 
367  }
368  }
369 } // namespace devmgr::Common
370 
371 #include "subsysFacade.ipp"
372 
373 #endif // SUP_SYSSUP_COMMON_SUBSYS_FACADE_HPP_
sup::syssup::common::SubsysFacade::GetNumSubsys
const int GetNumSubsys()
Get the number of subsystems.
Definition: subsysFacade.cpp:357
sup::syssup::common::SingleReplier::InsertRequest
void InsertRequest(RequestPair pair)
sup::syssup::common::SubsysFacade::SetSubsystemSubstate
void SetSubsystemSubstate(std::string name, std::string substate)
Get subsystem substate.
Definition: subsysFacade.cpp:409
sup::syssup::common::DataContext
Definition: dataContext.hpp:34
sup::syssup::common::SingleReplier< Events::SubsysReset >::Request
std::optional< typename EVENT_TYPE::payload_t > Request
Definition: subsysFacade.hpp:47
sup::syssup::common::SubsysFacade::m_reset_replier
SingleReplier< Events::SubsysReset > m_reset_replier
Definition: subsysFacade.hpp:363
sup::syssup::common::SubsysFacade::ClearSubsys
void ClearSubsys()
Empty internal subsys map.
Definition: subsysFacade.cpp:350
subsys.hpp
Subsys class header file.
sup::syssup::common::SubsysFacade::m_enable_replier
SingleReplier< Events::SubsysEnable > m_enable_replier
Definition: subsysFacade.hpp:361
sup::syssup::common::SubsysFacade::Connect
void Connect()
Connect.
Definition: subsysFacade.cpp:61
sup::syssup::common::IConfig
Definition: iConfig.hpp:32
sup::syssup::common::SubsysFacade::Reset
virtual void Reset()
Reset subsystems.
Definition: subsysFacade.cpp:321
sup::syssup::common::SingleReplier< Events::SubsysReset >::RequestPair
std::pair< std::string, Request > RequestPair
Definition: subsysFacade.hpp:49
sup::syssup::common::SubsysFacade
Definition: subsysFacade.hpp:69
sup::syssup::common::SingleReplier::ReplyError
void ReplyError(std::string req_id, std::string msg)
sup::syssup::common::SubsysFacade::Stop
virtual void Stop()
Abort all subsystems managed by the devmgr.
Definition: subsysFacade.cpp:299
sup::syssup::common::ISubsys
Definition: iSubsys.hpp:32
sup::syssup::common::SubsysFacade::SubsysCommand
void SubsysCommand(scxml4cpp::Context *c, OBJECT &obj)
Forward request to an specific subsystem.
sup::syssup::common::SingleReplier< Events::SubsysReset >::RequestMap
std::map< std::string, Request > RequestMap
Definition: subsysFacade.hpp:48
sup::syssup::common::SingleReplier
Definition: subsysFacade.hpp:45
sup::syssup::common::SubsysFacade::SetSubsystemConnectionState
void SetSubsystemConnectionState(std::string name, SubsysData::ConnectionEnum connection)
Get subsystem connection state.
Definition: subsysFacade.cpp:392
sup::syssup::common::SubsysFacade::GetSubsystemStatus
void GetSubsystemStatus(const std::string &payload, std::string &buffer)
Get subsystem status.
Definition: subsysFacade.cpp:417
sup::syssup::common::SubsysFacade::AddSubsys
void AddSubsys(std::unique_ptr< Subsys > subsys)
Add a subsystems instance to be managed by the facade.
Definition: subsysFacade.cpp:344
sup
Definition: actionMgr.cpp:32
sup::syssup::common::SubsysFacade::Disable
void Disable(rad::SMAdapter &sm, rad::ThreadActivity *activity)
Disable all subsystems managed by the Supervisor.
Definition: subsysFacade.cpp:266
sup::syssup::common::SubsysFacade::m_disable_replier
SingleReplier< Events::SubsysDisable > m_disable_replier
Definition: subsysFacade.hpp:362
sup::syssup::common::SubsysFacade::~SubsysFacade
virtual ~SubsysFacade()
~SubsysFacade
Definition: subsysFacade.cpp:57
sup::syssup::common::SubsysData::ConnectionEnum
ConnectionEnum
Definition: subsys.hpp:42
sup::syssup::common::SubsysFacade::SubsysFacade
SubsysFacade(rad::SMAdapter &sm, DataContext &data_ctx)
Definition: subsysFacade.cpp:49
sup::syssup::common::SubsysFacade::Recover
void Recover(rad::SMAdapter &sm, rad::ThreadActivity *activity)
Recover all subsystems managed by the Supervisor.
Definition: subsysFacade.cpp:256
sup::syssup::common::SubsysFacade::Enable
void Enable(rad::SMAdapter &sm, rad::ThreadActivity *activity)
Enable all subsystems managed by the Supervisor.
Definition: subsysFacade.cpp:182
sup::syssup::common::SubsysFacade::EstimateState
virtual void EstimateState(std::vector< State::StateEnum > &states, std::vector< State::SubstateEnum > &substates)
EstimateState.
Definition: subsysFacade.cpp:473
sup::syssup::common::operator<<
std::ostream & operator<<(typename std::enable_if< std::is_enum< T >::value, std::ostream >::type &stream, const T &e)
Definition: subsysFacade.hpp:34
sup::syssup::common::SubsysFacade::GetSubsysNames
std::string GetSubsysNames()
Get list of subsystems managed by the Supervisor.
Definition: subsysFacade.cpp:378
sup::syssup::common::SubsysFacade::StartMonitoring
void StartMonitoring()
StartMonitoring.
Definition: subsysFacade.cpp:135
sup::syssup::common::SubsysFacade::m_init_replier
SingleReplier< Events::SubsysInit > m_init_replier
Definition: subsysFacade.hpp:360
sup::syssup::common::SubsysFacade::Init
void Init(rad::SMAdapter &sm, rad::ThreadActivity *activity)
Init all subsystems managed by the Supervisor.
Definition: subsysFacade.cpp:144
sup::syssup::common::SingleReplier::ReplyOk
void ReplyOk(std::string req_id, std::string msg)
sup::syssup::common::SubsysFacade::Setup
void Setup(const std::any &payload)
Executes a setup message.
Definition: subsysFacade.cpp:569
sup::syssup::common::SubsysFacade::SetSubsystemState
void SetSubsystemState(std::string name, std::string state)
Get subsystem state.
Definition: subsysFacade.cpp:401
sup::syssup::common::SubsysFacade::UpdateHandler
void UpdateHandler()
Triggers the update of the estimated state/substate.
Definition: subsysFacade.cpp:450
sup::syssup::common::SingleReplier::m_req_map
RequestMap m_req_map
Definition: subsysFacade.hpp:56
sup::syssup::common::SubsysFacade::UpdateConfiguration
void UpdateConfiguration()
Triggers the update of the subsystem configuration.
Definition: subsysFacade.cpp:432