OpenRTM  1.0.0
PeriodicExecutionContext.h
[詳解]
1 // -*- C++ -*-
20 #ifndef RTC_PERIODICEXECUTIONCONTEXT_H
21 #define RTC_PERIODICEXECUTIONCONTEXT_H
22 
23 #include <coil/Task.h>
24 #include <coil/Mutex.h>
25 #include <coil/Condition.h>
26 #include <vector>
27 #include <iostream>
28 
29 #include <rtm/RTC.h>
30 #include <rtm/idl/RTCSkel.h>
31 #include <rtm/idl/OpenRTMSkel.h>
32 #include <rtm/Manager.h>
33 #include <rtm/StateMachine.h>
35 
36 #define NUM_OF_LIFECYCLESTATE 4
37 
38 #ifdef WIN32
39 #pragma warning( disable : 4290 )
40 #endif
41 
42 namespace RTC
43 {
65  : public virtual ExecutionContextBase,
66  public coil::Task
67  {
69  public:
90 
112  PeriodicExecutionContext(OpenRTM::DataFlowComponent_ptr owner,
113  double rate = 1000.0);
114 
128  virtual ~PeriodicExecutionContext(void);
129 
149  virtual ExecutionContextService_ptr getObjRef(void) {return m_ref;}
150 
175  virtual int open(void *args);
176 
196  virtual int svc(void);
197 
225  virtual int close(unsigned long flags);
226 
227  //============================================================
228  // ExecutionContext
229  //============================================================
254  virtual CORBA::Boolean is_running(void)
255  throw (CORBA::SystemException);
256 
284  virtual ReturnCode_t start(void)
285  throw (CORBA::SystemException);
286 
313  virtual ReturnCode_t stop(void)
314  throw (CORBA::SystemException);
315 
336  virtual CORBA::Double get_rate(void)
337  throw (CORBA::SystemException);
338 
368  virtual ReturnCode_t set_rate(CORBA::Double rate)
369  throw (CORBA::SystemException);
370 
404  virtual ReturnCode_t activate_component(LightweightRTObject_ptr comp)
405  throw (CORBA::SystemException);
406 
439  virtual ReturnCode_t deactivate_component(LightweightRTObject_ptr comp)
440  throw (CORBA::SystemException);
441 
473  virtual ReturnCode_t reset_component(LightweightRTObject_ptr comp)
474  throw (CORBA::SystemException);
475 
502  virtual LifeCycleState get_component_state(LightweightRTObject_ptr comp)
503  throw (CORBA::SystemException);
504 
524  virtual ExecutionKind get_kind(void)
525  throw (CORBA::SystemException);
526 
558  virtual ReturnCode_t add_component(LightweightRTObject_ptr comp)
559  throw (CORBA::SystemException);
560 
578  virtual RTC::ReturnCode_t bindComponent(RTObject_impl* rtc);
579 
610  virtual ReturnCode_t remove_component(LightweightRTObject_ptr comp)
611  throw (CORBA::SystemException);
612 
632  virtual ExecutionContextProfile* get_profile(void)
633  throw (CORBA::SystemException);
634 
635  protected:
636  //============================================================
637  // DFPBase
638  //============================================================
639  typedef LifeCycleState ExecContextState;
640  /*
641  enum ExecContextState
642  {
643  INACTIVE_STATE,
644  ACTIVE_STATE,
645  ERROR_STATE,
646  };
647  */
649 
670  class DFPBase
671  {
672  public:
673 
691  DFPBase(RTC::ExecutionContextHandle_t id)
693  {
694  m_sm.setListener(this);
695  m_sm.setEntryAction (ACTIVE_STATE, &DFPBase::on_activated);
696  m_sm.setDoAction (ACTIVE_STATE, &DFPBase::on_execute);
697  m_sm.setPostDoAction(ACTIVE_STATE, &DFPBase::on_state_update);
698  m_sm.setExitAction (ACTIVE_STATE, &DFPBase::on_deactivated);
699  m_sm.setEntryAction (ERROR_STATE, &DFPBase::on_aborting);
700  m_sm.setDoAction (ERROR_STATE, &DFPBase::on_error);
701  m_sm.setExitAction (ERROR_STATE, &DFPBase::on_reset);
702 
703  ECStates st;
704  st.prev = INACTIVE_STATE;
705  st.curr = INACTIVE_STATE;
706  st.next = INACTIVE_STATE;
707  m_sm.setStartState(st);
708  m_sm.goTo(INACTIVE_STATE);
709  }
710 
724  virtual ~DFPBase(void){}
725 
742  virtual void on_startup(void) = 0;
743 
760  virtual void on_shutdown(void) = 0;
761 
783  virtual void on_activated(const ECStates& st) = 0;
784 
806  virtual void on_deactivated(const ECStates& st) = 0;
807 
829  virtual void on_aborting(const ECStates& st) = 0;
830 
856  virtual void on_error(const ECStates& st) = 0;
857 
883  virtual void on_reset(const ECStates& st) = 0;
884 
911  virtual void on_execute(const ECStates& st) = 0;
912 
939  virtual void on_state_update(const ECStates& st) = 0;
940 
958  virtual void on_rate_changed(void) = 0;
959 
978  virtual void worker(void) {return m_sm.worker();}
979 
997  virtual ExecContextState get_state(void){ return m_sm.getState();}
998 
1006  ExecutionContextHandle_t ec_id;
1007 
1016  };
1017 
1018  //============================================================
1019  // DFP
1020  //============================================================
1046  template <class Object>
1047  class DFP
1048  : public DFPBase
1049  {
1050  public:
1070  DFP(Object obj, ExecutionContextHandle_t id)
1071  : DFPBase(id), m_obj(obj), m_active(true)
1072  {
1073  }
1074 
1090  void on_startup(void)
1091  {
1092  m_obj->on_startup(ec_id);
1093  }
1094 
1110  void on_shutdown(void)
1111  {
1112  m_obj->on_shutdown(ec_id);
1113  }
1114 
1137  void on_activated(const ECStates& st)
1138  {
1139  if (m_obj->on_activated(ec_id) != RTC::RTC_OK)
1140  {
1141  m_sm.goTo(ERROR_STATE);
1142  return;
1143  }
1144  return;
1145  }
1146 
1167  void on_deactivated(const ECStates& st)
1168  {
1169  m_obj->on_deactivated(ec_id);
1170  }
1171 
1191  void on_aborting(const ECStates& st)
1192  {
1193  m_obj->on_aborting(ec_id);
1194  }
1195 
1215  void on_error(const ECStates& st)
1216  {
1217  m_obj->on_error(ec_id);
1218  }
1219 
1239  void on_reset(const ECStates& st)
1240  {
1241  if (m_obj->on_reset(ec_id) != RTC::RTC_OK)
1242  {
1243  m_sm.goTo(ERROR_STATE);
1244  return;
1245  }
1246  return;
1247  }
1248 
1274  void on_execute(const ECStates& st)
1275  {
1276  if (m_obj->on_execute(ec_id) != RTC::RTC_OK)
1277  {
1278  m_sm.goTo(ERROR_STATE);
1279  return;
1280  }
1281  return;
1282  }
1283 
1309  void on_state_update(const ECStates& st)
1310  {
1311  if (m_obj->on_state_update(ec_id) != RTC::RTC_OK)
1312  {
1313  m_sm.goTo(ERROR_STATE);
1314  return;
1315  }
1316  return;
1317  }
1318 
1336  void on_rate_changed(void)
1337  {
1338  m_obj->on_rate_changed(ec_id);
1339  }
1340 
1348  Object m_obj;
1349 
1357  bool m_active;
1358  };
1359 
1367  struct Comp
1368  {
1369  Comp(LightweightRTObject_ptr ref, OpenRTM::DataFlowComponent_ptr dfp,
1370  ExecutionContextHandle_t id)
1371  : _ref(LightweightRTObject::_duplicate(ref)),
1372  _sm(OpenRTM::DataFlowComponent::_duplicate(dfp), id)
1373  {
1374  }
1375  ~Comp(void)
1376  {
1377  }
1378  Comp(const Comp& comp)
1379  : _ref(comp._ref), _sm(comp._sm.m_obj, comp._sm.ec_id)
1380  {
1381  }
1382  Comp& operator=(const Comp& comp)
1383  {
1384  _ref = comp._ref;
1385  _sm.m_obj = comp._sm.m_obj;
1386  _sm.ec_id = comp._sm.ec_id;
1387  return *this;
1388  }
1389  LightweightRTObject_var _ref;
1391  };
1392 
1400  struct find_comp
1401  {
1402  LightweightRTObject_var m_comp;
1403  find_comp(LightweightRTObject_ptr comp)
1404  : m_comp(LightweightRTObject::_duplicate(comp)) {}
1405  bool operator()(Comp& comp)
1406  {
1407  return comp._ref->_is_equivalent(m_comp);
1408  }
1409  };
1410 
1419  {
1420  void operator()(Comp& comp)
1421  {
1422  comp._sm.on_startup();
1423  }
1424  };
1425 
1434  {
1435  void operator()(Comp& comp)
1436  {
1437  comp._sm.on_shutdown();
1438  }
1439  };
1440 
1449  {
1450  void operator()(Comp& comp)
1451  {
1452  comp._sm.on_rate_changed();
1453  }
1454  };
1455 
1464  {
1465  void operator()(Comp& comp)
1466  {
1467  comp._sm.worker();
1468  }
1469  };
1470 
1478  std::vector<Comp> m_comps;
1479  typedef std::vector<Comp>::iterator CompItr;
1480 
1489 
1500 
1508  bool m_svc;
1509 
1517  struct Worker
1518  {
1519  Worker() : cond_(mutex_), running_(false) {};
1520  coil::Mutex mutex_;
1522  bool running_;
1523  };
1524 
1533 
1541  ExecutionContextProfile m_profile;
1543 
1552 
1560  ExecutionContextService_var m_ref;
1561 
1570  bool m_nowait;
1571 
1573  {
1574  RTObject_var m_comp;
1575  public:
1576  find_participant(RTObject_ptr comp)
1577  : m_comp(RTObject::_duplicate(comp)) {}
1578  bool operator()(RTObject_ptr comp)
1579  {
1580  return m_comp->_is_equivalent(comp);
1581  }
1582  };
1583  }; // class PeriodicExecutionContext
1584 }; // namespace RTC
1585 
1586 #ifdef WIN32
1587 #pragma warning( default : 4290 )
1588 #endif
1589 
1590 
1591 extern "C"
1592 {
1601 };
1602 
1603 #endif // RTC_PERIODICEXECUTIONCONTEXT_H
virtual void on_shutdown(void)=0
ExecutionContext 停止時に呼ばれる純粋仮想関数
bool m_active
管理対象コンポーネントの動作状態フラグ
Definition: PeriodicExecutionContext.h:1357
virtual ReturnCode_t stop(void)
ExecutionContext の実行を停止
worker 用状態変数クラス
Definition: PeriodicExecutionContext.h:1517
DFP クラス
Definition: PeriodicExecutionContext.h:1047
RTコンポーネント
LightweightRTObject_var m_comp
Definition: PeriodicExecutionContext.h:1402
virtual ExecutionContextService_ptr getObjRef(void)
CORBA オブジェクト参照の取得
Definition: PeriodicExecutionContext.h:149
virtual ReturnCode_t set_rate(CORBA::Double rate)
ExecutionContext の実行周期(Hz)を設定する
void operator()(Comp &comp)
Definition: PeriodicExecutionContext.h:1465
virtual ReturnCode_t deactivate_component(LightweightRTObject_ptr comp)
RTコンポーネントを非アクティブ化する
std::vector< Comp > m_comps
コンポーネントの参加者リスト
Definition: PeriodicExecutionContext.h:1478
virtual void on_reset(const ECStates &st)=0
RTコンポーネントをリセットする時に呼ばれる純粋仮想関数
Mutex クラス
Definition: Mutex.h:40
virtual void on_activated(const ECStates &st)=0
RTコンポーネントがアクティブ化された時に呼ばれる純粋仮想関数 ...
Definition: PeriodicExecutionContext.h:1572
ExecutionContext用基底クラス
Definition: ExecutionContextBase.h:51
コンポーネント管理用構造体
Definition: PeriodicExecutionContext.h:1367
virtual void on_state_update(const ECStates &st)=0
RTコンポーネント実行時に定期的に呼ばれる純粋仮想関数
~Comp(void)
Definition: PeriodicExecutionContext.h:1375
void operator()(Comp &comp)
Definition: PeriodicExecutionContext.h:1450
bool m_svc
ExecutionContext のスレッド実行フラグ
Definition: PeriodicExecutionContext.h:1508
RTコンポーネントクラス
Definition: RTObject.h:89
DFP< OpenRTM::DataFlowComponent_var > _sm
Definition: PeriodicExecutionContext.h:1390
Comp(LightweightRTObject_ptr ref, OpenRTM::DataFlowComponent_ptr dfp, ExecutionContextHandle_t id)
Definition: PeriodicExecutionContext.h:1369
void on_error(const ECStates &st)
RTコンポーネントがエラー状態の時に呼ばれる関数
Definition: PeriodicExecutionContext.h:1215
Manager クラス
Definition: Manager.h:80
virtual ReturnCode_t add_component(LightweightRTObject_ptr comp)
RTコンポーネントを追加する
void on_rate_changed(void)
ExecutionContext の実行周期変更時に呼ばれる関数
Definition: PeriodicExecutionContext.h:1336
#define NUM_OF_LIFECYCLESTATE
Definition: PeriodicExecutionContext.h:36
virtual ExecutionKind get_kind(void)
ExecutionKind を取得する
virtual ReturnCode_t start(void)
ExecutionContext の実行を開始
ExecutionContext base class.
void on_deactivated(const ECStates &st)
RTコンポーネントが非アクティブ化された時に呼ばれる関数
Definition: PeriodicExecutionContext.h:1167
virtual ~PeriodicExecutionContext(void)
デストラクタ
virtual int close(unsigned long flags)
ExecutionContext 用のスレッド実行関数
virtual ReturnCode_t activate_component(LightweightRTObject_ptr comp)
RTコンポーネントをアクティブ化する
ワーカー実行用ファンクタ
Definition: PeriodicExecutionContext.h:1463
virtual void on_aborting(const ECStates &st)=0
RTコンポーネントでエラーが発生した時に呼ばれる純粋仮想関数 ...
void on_aborting(const ECStates &st)
RTコンポーネントでエラーが発生した時に呼ばれる関数
Definition: PeriodicExecutionContext.h:1191
PeriodicExecutionContext()
デフォルトコンストラクタ
void on_activated(const ECStates &st)
RTコンポーネントがアクティブ化された時に呼ばれる関数
Definition: PeriodicExecutionContext.h:1137
RTC_Utils::StateHolder< ExecContextState > ECStates
Definition: PeriodicExecutionContext.h:648
Object m_obj
管理対象コンポーネント
Definition: PeriodicExecutionContext.h:1348
TimeValue クラス
Definition: TimeValue.h:40
RTComponent manager class.
Worker m_worker
svn用の状態変数
Definition: PeriodicExecutionContext.h:1532
bool operator()(RTObject_ptr comp)
Definition: PeriodicExecutionContext.h:1578
virtual CORBA::Boolean is_running(void)
ExecutionContext 実行状態確認関数
Comp(const Comp &comp)
Definition: PeriodicExecutionContext.h:1378
virtual void on_execute(const ECStates &st)=0
RTコンポーネント実行時に定期的に呼ばれる純粋仮想関数
LifeCycleState ExecContextState
Definition: PeriodicExecutionContext.h:639
virtual int svc(void)
ExecutionContext 用のスレッド実行関数
virtual void on_startup(void)=0
ExecutionContext 実行開始時に呼ばれる純粋仮想関数
DFP(Object obj, ExecutionContextHandle_t id)
デフォルトコンストラクタ
Definition: PeriodicExecutionContext.h:1070
状態マシンクラス
Definition: StateMachine.h:263
bool m_nowait
ExecutionContext 即時実行(wait無し実行)フラグ
Definition: PeriodicExecutionContext.h:1570
void on_state_update(const ECStates &st)
RTコンポーネント実行時に定期的に呼ばれる関数
Definition: PeriodicExecutionContext.h:1309
bool operator()(Comp &comp)
Definition: PeriodicExecutionContext.h:1405
Worker()
Definition: PeriodicExecutionContext.h:1519
virtual ~DFPBase(void)
デストラクタ
Definition: PeriodicExecutionContext.h:724
on_rate_changed 起動用ファンクタ
Definition: PeriodicExecutionContext.h:1448
virtual void worker(void)
状態遷移を実行するワーカーを取得する
Definition: PeriodicExecutionContext.h:978
coil::Mutex m_profileMutex
Definition: PeriodicExecutionContext.h:1542
bool running_
Definition: PeriodicExecutionContext.h:1522
State prev
Definition: StateMachine.h:58
on_startup 起動用ファンクタ
Definition: PeriodicExecutionContext.h:1418
virtual ExecContextState get_state(void)
現在の状態を取得する
Definition: PeriodicExecutionContext.h:997
Comp & operator=(const Comp &comp)
Definition: PeriodicExecutionContext.h:1382
Logger クラス
Definition: SystemLogger.h:99
DFPBase クラス
Definition: PeriodicExecutionContext.h:670
coil::Condition< coil::Mutex > cond_
Definition: PeriodicExecutionContext.h:1521
virtual ReturnCode_t remove_component(LightweightRTObject_ptr comp)
RTコンポーネントを参加者リストから削除する
void PeriodicExecutionContextInit(RTC::Manager *manager)
ECFactoryへの登録のための初期化関数
virtual ReturnCode_t reset_component(LightweightRTObject_ptr comp)
RTコンポーネントをリセットする
virtual ExecutionContextProfile * get_profile(void)
ExecutionContextProfile を取得する
virtual int open(void *args)
ExecutionContext用アクティビティスレッドを生成する
virtual CORBA::Double get_rate(void)
ExecutionContext の実行周期(Hz)を取得する
Logger rtclog
ロガーストリーム
Definition: PeriodicExecutionContext.h:1488
State curr
Definition: StateMachine.h:57
virtual void on_rate_changed(void)=0
ExecutionContext の実行周期変更時に呼ばれる純粋仮想関数
ExecutionContextProfile m_profile
ExecutionContextProfile.
Definition: PeriodicExecutionContext.h:1541
void on_startup(void)
ExecutionContext 実行開始時に呼ばれる関数
Definition: PeriodicExecutionContext.h:1090
Task クラス
Definition: Task.h:39
void operator()(Comp &comp)
Definition: PeriodicExecutionContext.h:1435
std::vector< Comp >::iterator CompItr
Definition: PeriodicExecutionContext.h:1479
find_comp(LightweightRTObject_ptr comp)
Definition: PeriodicExecutionContext.h:1403
virtual LifeCycleState get_component_state(LightweightRTObject_ptr comp)
RTコンポーネントの状態を取得する
RTComponent header.
DFPBase(RTC::ExecutionContextHandle_t id)
コンストラクタ
Definition: PeriodicExecutionContext.h:691
ExecutionContextService_var m_ref
ExecutionContextService オブジェクトへの参照
Definition: PeriodicExecutionContext.h:1560
void on_shutdown(void)
ExecutionContext 停止時に呼ばれる関数
Definition: PeriodicExecutionContext.h:1110
PeriodicExecutionContext クラス
Definition: PeriodicExecutionContext.h:64
State machine template class.
virtual void on_error(const ECStates &st)=0
RTコンポーネントがエラー状態の時に呼ばれる純粋仮想関数
ExecutionContextHandle_t ec_id
参加している ExecutionContext の ID
Definition: PeriodicExecutionContext.h:1006
bool m_running
ExecutionContext の実行状態 true: running, false: stopped.
Definition: PeriodicExecutionContext.h:1499
State next
Definition: StateMachine.h:59
LightweightRTObject_var _ref
Definition: PeriodicExecutionContext.h:1389
RTC_Utils::StateMachine< ExecContextState, DFPBase > m_sm
管理対象RTコンポーネントのステートマシン
Definition: PeriodicExecutionContext.h:1015
virtual void on_deactivated(const ECStates &st)=0
RTコンポーネントが非アクティブ化された時に呼ばれる純粋仮想関数 ...
void on_reset(const ECStates &st)
RTコンポーネントをリセットする時に呼ばれる関数
Definition: PeriodicExecutionContext.h:1239
virtual RTC::ReturnCode_t bindComponent(RTObject_impl *rtc)
コンポーネントをバインドする。
on_shutdown 起動用ファンクタ
Definition: PeriodicExecutionContext.h:1433
coil::TimeValue m_period
ExecutionContext の実行周期
Definition: PeriodicExecutionContext.h:1551
コンポーネント検索用ファンクタ
Definition: PeriodicExecutionContext.h:1400
void on_execute(const ECStates &st)
RTコンポーネント実行時に定期的に呼ばれる関数
Definition: PeriodicExecutionContext.h:1274
find_participant(RTObject_ptr comp)
Definition: PeriodicExecutionContext.h:1576
void operator()(Comp &comp)
Definition: PeriodicExecutionContext.h:1420