RTObject.py
Go to the documentation of this file.
00001 #!/usr/bin/env python
00002 # -*- coding: euc-jp -*-
00003 
00004 ##
00005 # @file RTObject.py
00006 # @brief RT component base class
00007 # @date $Date: $
00008 # @author Noriaki Ando <n-ando@aist.go.jp> and Shinji Kurihara
00009 #
00010 # Copyright (C) 2006-2008
00011 #     Task-intelligence Research Group,
00012 #     Intelligent Systems Research Institute,
00013 #     National Institute of
00014 #         Advanced Industrial Science and Technology (AIST), Japan
00015 #     All rights reserved.
00016 
00017 
00018 
00019 import string
00020 import sys
00021 import copy
00022 
00023 from omniORB import any
00024 from omniORB import CORBA
00025 
00026 import OpenRTM__POA
00027 import RTC
00028 import SDOPackage
00029 import OpenRTM_aist
00030 
00031 ECOTHER_OFFSET = 1000
00032 
00033 default_conf = [
00034   "implementation_id","",
00035   "type_name",         "",
00036   "description",       "",
00037   "version",           "",
00038   "vendor",            "",
00039   "category",          "",
00040   "activity_type",     "",
00041   "max_instance",      "",
00042   "language",          "",
00043   "lang_type",         "",
00044   "conf",              "",
00045   "" ]
00046 
00047 
00048 
00049 ##
00050 # @if jp
00051 # @brief RTコンポーネントクラス
00052 #
00053 # 各RTコンポーネントのベースとなるクラス。
00054 # Robotic Technology Component 仕様中の lightweightRTComponentの実装クラス。
00055 # コンポーネントの機能を提供する ComponentAction インターフェースと
00056 # コンポーネントのライフサイクル管理を行うための LightweightRTObject の実装を
00057 # 提供する。
00058 # 実際にユーザがコンポーネントを作成する場合には、Execution Semantics に対応
00059 # した各サブクラスを利用する。<BR>
00060 # (現状の実装では Periodic Sampled Data Processing のみサポートしているため、
00061 #  dataFlowComponent を直接継承している)
00062 #
00063 # @since 0.2.0
00064 #
00065 # @else
00066 #
00067 # @endif
00068 class RTObject_impl(OpenRTM__POA.DataFlowComponent):
00069   """
00070   """
00071 
00072   ##
00073   # @if jp
00074   # @brief コンストラクタ
00075   #
00076   # コンストラクタ
00077   #
00078   # @param self
00079   # @param manager マネージャオブジェクト(デフォルト値:None)
00080   # @param orb ORB(デフォルト値:None)
00081   # @param poa POA(デフォルト値:None)
00082   #
00083   # @else
00084   #
00085   # @brief Consructor
00086   #
00087   # @param orb ORB
00088   # @param poa POA
00089   #
00090   # @endif
00091   def __init__(self, manager=None, orb=None, poa=None):
00092     if manager:
00093       self._manager = manager
00094       self._orb = self._manager.getORB()
00095       self._poa = self._manager.getPOA()
00096       self._portAdmin = OpenRTM_aist.PortAdmin(self._manager.getORB(),self._manager.getPOA())
00097     else:
00098       self._manager = None
00099       self._orb = orb
00100       self._poa = poa
00101       self._portAdmin = OpenRTM_aist.PortAdmin(self._orb,self._poa)
00102       
00103     if self._manager:
00104       self._rtcout = self._manager.getLogbuf("rtobject")
00105     else:
00106       self._rtcout = OpenRTM_aist.Manager.instance().getLogbuf("rtobject")
00107 
00108     self._created = True
00109     self._properties = OpenRTM_aist.Properties(defaults_str=default_conf)
00110     self._configsets = OpenRTM_aist.ConfigAdmin(self._properties.getNode("conf"))
00111     self._profile = RTC.ComponentProfile("","","","","","",[],None,[])
00112 
00113     self._sdoservice = OpenRTM_aist.SdoServiceAdmin(self)
00114     self._SdoConfigImpl = OpenRTM_aist.Configuration_impl(self._configsets,self._sdoservice)
00115     self._SdoConfig = self._SdoConfigImpl.getObjRef()
00116     self._execContexts = []
00117     self._objref = self._this()
00118     self._sdoOwnedOrganizations = [] #SDOPackage.OrganizationList()
00119     self._sdoSvcProfiles        = [] #SDOPackage.ServiceProfileList()
00120     self._sdoOrganizations      = [] #SDOPackage.OrganizationList()
00121     self._sdoStatus             = [] #SDOPackage.NVList()
00122     self._ecMine  = []
00123     self._ecOther = []
00124     self._eclist  = []
00125     self._exiting = False
00126     self._readAll = False
00127     self._writeAll = False
00128     self._readAllCompletion = False
00129     self._writeAllCompletion = False
00130     self._inports = []
00131     self._outports = []
00132     self._actionListeners = OpenRTM_aist.ComponentActionListeners()
00133     self._portconnListeners = OpenRTM_aist.PortConnectListeners()
00134     return
00135 
00136 
00137   ##
00138   # @if jp
00139   #
00140   # @brief デストラクタ
00141   #
00142   # @param self
00143   # 
00144   # @else
00145   # 
00146   # @brief destructor
00147   # 
00148   # @endif
00149   def __del__(self):
00150     return
00151 
00152 
00153   #============================================================
00154   # Overridden functions
00155   #============================================================
00156 
00157   ##
00158   # @if jp
00159   #
00160   # @brief 初期化処理用コールバック関数
00161   # 
00162   # ComponentAction::on_initialize が呼ばれた際に実行されるコールバック
00163   # 関数。<BR>
00164   # 本関数は無条件に RTC::RTC_OK を返すようにダミー実装されているので、
00165   # 各コンポーネントの実際の初期化処理は、本関数をオーバーライドして実装する
00166   # 必要がある。
00167   #
00168   # @param self
00169   # 
00170   # @return ReturnCode_t 型のリターンコード
00171   # 
00172   # @else
00173   # 
00174   # @endif
00175   def onInitialize(self):
00176     self._rtcout.RTC_TRACE("onInitialize()")
00177     return RTC.RTC_OK
00178 
00179 
00180   ##
00181   # @if jp
00182   #
00183   # @brief 終了処理用コールバック関数
00184   # 
00185   # ComponentAction::on_finalize が呼ばれた際に実行されるコールバック
00186   # 関数。<BR>
00187   # 本関数は無条件に RTC::RTC_OK を返すようにダミー実装されているので、
00188   # 各コンポーネントの実際の終了処理は、本関数をオーバーライドして実装する
00189   # 必要がある。
00190   #
00191   # @param self
00192   # 
00193   # @return ReturnCode_t 型のリターンコード
00194   # 
00195   # @else
00196   # 
00197   # @endif
00198   def onFinalize(self):
00199     self._rtcout.RTC_TRACE("onFinalize()")
00200     return RTC.RTC_OK
00201 
00202 
00203   ##
00204   # @if jp
00205   #
00206   # @brief 開始処理用コールバック関数
00207   # 
00208   # ComponentAction::on_startup が呼ばれた際に実行されるコールバック
00209   # 関数。<BR>
00210   # 本関数は無条件に RTC::RTC_OK を返すようにダミー実装されているので、
00211   # 各コンポーネントの実際の開始処理は、本関数をオーバーライドして実装する
00212   # 必要がある。
00213   # 
00214   # @param self
00215   # @param ec_id 参加している ExecutionContext の ID
00216   #
00217   # @return ReturnCode_t 型のリターンコード
00218   # 
00219   # @else
00220   # 
00221   # @endif
00222   def onStartup(self, ec_id):
00223     self._rtcout.RTC_TRACE("onStartup(%d)",ec_id)
00224     return RTC.RTC_OK
00225 
00226 
00227   ##
00228   # @if jp
00229   #
00230   # @brief 停止処理用コールバック関数
00231   # 
00232   # ComponentAction::on_shutdown が呼ばれた際に実行されるコールバック
00233   # 関数。<BR>
00234   # 本関数は無条件に RTC::RTC_OK を返すようにダミー実装されているので、
00235   # 各コンポーネントの実際の停止処理は、本関数をオーバーライドして実装する
00236   # 必要がある。
00237   # 
00238   # @param self
00239   # @param ec_id 参加している ExecutionContext の ID
00240   #
00241   # @return ReturnCode_t 型のリターンコード
00242   # 
00243   # @else
00244   # 
00245   # @endif
00246   def onShutdown(self, ec_id):
00247     self._rtcout.RTC_TRACE("onShutdown(%d)",ec_id)
00248     return RTC.RTC_OK
00249 
00250 
00251   ##
00252   # @if jp
00253   #
00254   # @brief 活性化処理用コールバック関数
00255   # 
00256   # ComponentAction::on_activated が呼ばれた際に実行されるコールバック
00257   # 関数。<BR>
00258   # 本関数は無条件に RTC::RTC_OK を返すようにダミー実装されているので、
00259   # 各コンポーネントの実際の活性化処理は、本関数をオーバーライドして実装する
00260   # 必要がある。
00261   # 
00262   # @param self
00263   # @param ec_id 参加している ExecutionContext の ID
00264   #
00265   # @return ReturnCode_t 型のリターンコード
00266   # 
00267   # @else
00268   # 
00269   # @endif
00270   def onActivated(self, ec_id):
00271     self._rtcout.RTC_TRACE("onActivated(%d)",ec_id)
00272     return RTC.RTC_OK
00273 
00274 
00275   ##
00276   # @if jp
00277   #
00278   # @brief 非活性化処理用コールバック関数
00279   # 
00280   # ComponentAction::on_deactivated が呼ばれた際に実行されるコールバック
00281   # 関数。<BR>
00282   # 本関数は無条件に RTC::RTC_OK を返すようにダミー実装されているので、
00283   # 各コンポーネントの実際の非活性化処理は、本関数をオーバーライドして実装する
00284   # 必要がある。
00285   # 
00286   # @param self
00287   # @param ec_id 参加している ExecutionContext の ID
00288   #
00289   # @return ReturnCode_t 型のリターンコード
00290   # 
00291   # @else
00292   # 
00293   # @endif
00294   def onDeactivated(self, ec_id):
00295     self._rtcout.RTC_TRACE("onDeactivated(%d)",ec_id)
00296     return RTC.RTC_OK
00297 
00298 
00299   ##
00300   # @if jp
00301   #
00302   # @brief 周期処理用コールバック関数
00303   # 
00304   # DataFlowComponentAction::on_execute が呼ばれた際に実行される
00305   # コールバック関数。<BR>
00306   # 本関数は無条件に RTC::RTC_OK を返すようにダミー実装されているので、
00307   # 各コンポーネントの実際の周期処理は、本関数をオーバーライドして実装する
00308   # 必要がある。<BR>
00309   # 本関数は Periodic Sampled Data Processing における Two-Pass Executionの
00310   # 1回目の実行パスとして定期的に呼び出される。
00311   # 
00312   # @param self
00313   # @param ec_id 参加している ExecutionContext の ID
00314   #
00315   # @return ReturnCode_t 型のリターンコード
00316   # 
00317   # @else
00318   # 
00319   # @endif
00320   def onExecute(self, ec_id):
00321     self._rtcout.RTC_TRACE("onExecute(%d)",ec_id)
00322     return RTC.RTC_OK
00323 
00324 
00325   ##
00326   # @if jp
00327   #
00328   # @brief 中断処理用コールバック関数
00329   # 
00330   # ComponentAction::on_aborting が呼ばれた際に実行されるコールバック
00331   # 関数。<BR>
00332   # 本関数は無条件に RTC::RTC_OK を返すようにダミー実装されているので、
00333   # 各コンポーネントの実際の中断処理は、本関数をオーバーライドして実装する
00334   # 必要がある。
00335   # 
00336   # @param self
00337   # @param ec_id 参加している ExecutionContext の ID
00338   #
00339   # @return ReturnCode_t 型のリターンコード
00340   # 
00341   # @else
00342   # 
00343   # @endif
00344   def onAborting(self, ec_id):
00345     self._rtcout.RTC_TRACE("onAborting(%d)",ec_id)
00346     return RTC.RTC_OK
00347 
00348 
00349   ##
00350   # @if jp
00351   #
00352   # @brief エラー処理用コールバック関数
00353   # 
00354   # ComponentAction::on_error が呼ばれた際に実行されるコールバック関数。<BR>
00355   # 本関数は無条件に RTC::RTC_OK を返すようにダミー実装されているので、
00356   # 各コンポーネントの実際のエラー処理は、本関数をオーバーライドして実装する
00357   # 必要がある。
00358   # 
00359   # @param self
00360   # @param ec_id 参加している ExecutionContext の ID
00361   #
00362   # @return ReturnCode_t 型のリターンコード
00363   # 
00364   # @else
00365   # 
00366   # @endif
00367   def onError(self, ec_id):
00368     self._rtcout.RTC_TRACE("onError(%d)",ec_id)
00369     return RTC.RTC_OK
00370 
00371 
00372   ##
00373   # @if jp
00374   #
00375   # @brief リセット処理用コールバック関数
00376   # 
00377   # ComponentAction::on_reset が呼ばれた際に実行されるコールバック関数。<BR>
00378   # 本関数は無条件に RTC::RTC_OK を返すようにダミー実装されているので、
00379   # 各コンポーネントの実際のリセット処理は、本関数をオーバーライドして実装する
00380   # 必要がある。
00381   # 
00382   # @param self
00383   # @param ec_id 参加している ExecutionContext の ID
00384   #
00385   # @return ReturnCode_t 型のリターンコード
00386   # 
00387   # @else
00388   # 
00389   # @endif
00390   def onReset(self, ec_id):
00391     self._rtcout.RTC_TRACE("onReset(%d)",ec_id)
00392     return RTC.RTC_OK
00393 
00394 
00395   ##
00396   # @if jp
00397   #
00398   # @brief 状態変更処理用コールバック関数
00399   # 
00400   # DataFlowComponentAction::on_state_update が呼ばれた際に実行される
00401   # コールバック関数。<BR>
00402   # 本関数は無条件に RTC::RTC_OK を返すようにダミー実装されているので、
00403   # 各コンポーネントの実際の状態変更処理は、本関数をオーバーライドして実装する
00404   # 必要がある。<BR>
00405   # 本関数は Periodic Sampled Data Processing における Two-Pass Executionの
00406   # 2回目の実行パスとして定期的に呼び出される。
00407   #
00408   # @param self
00409   # @param ec_id 参加している ExecutionContext の ID
00410   # 
00411   # @return ReturnCode_t 型のリターンコード
00412   # 
00413   # @else
00414   # 
00415   # @endif
00416   def onStateUpdate(self, ec_id):
00417     self._rtcout.RTC_TRACE("onStateupdate(%d)",ec_id)
00418     return RTC.RTC_OK
00419 
00420 
00421   ##
00422   # @if jp
00423   #
00424   # @brief 動作周期変更通知用コールバック関数
00425   # 
00426   # DataFlowComponentAction::on_rate_changed が呼ばれた際に実行される
00427   # コールバック関数。<BR>
00428   # 本関数は無条件に RTC::RTC_OK を返すようにダミー実装されているので、
00429   # 各コンポーネントの実際の状態変更処理は、本関数をオーバーライドして実装する
00430   # 必要がある。<BR>
00431   # 本関数は Periodic Sampled Data Processing において ExecutionContext の
00432   # 実行が更新された際に呼び出される。
00433   #
00434   # @param self
00435   # @param ec_id 参加している ExecutionContext の ID
00436   # 
00437   # @return ReturnCode_t 型のリターンコード
00438   # 
00439   # @else
00440   # 
00441   # @endif
00442   def onRateChanged(self, ec_id):
00443     self._rtcout.RTC_TRACE("onRatechanged(%d)",ec_id)
00444     return RTC.RTC_OK 
00445 
00446 
00447   #============================================================
00448   # RTC::LightweightRTObject
00449   #============================================================
00450 
00451   ##
00452   # @if jp
00453   #
00454   # @brief [CORBA interface] RTCを初期化する
00455   #
00456   # このオペレーション呼び出しの結果として、ComponentAction::on_initialize
00457   # コールバック関数が呼ばれる。
00458   # 
00459   # 制約
00460   # - RTC は Created状態の場合み初期化が行われる。他の状態にいる場合には
00461   #   ReturnCode_t::PRECONDITION_NOT_MET が返され呼び出しは失敗する。
00462   # - このオペレーションは RTC のミドルウエアから呼ばれることを想定しており、
00463   #   アプリケーション開発者は直接このオペレーションを呼ぶことは想定
00464   #   されていない。
00465   #
00466   # @param self
00467   # 
00468   # @return ReturnCode_t 型のリターンコード
00469   # 
00470   # @else
00471   #
00472   # @brief Initialize the RTC that realizes this interface.
00473   #
00474   # The invocation of this operation shall result in the invocation of the
00475   # callback ComponentAction::on_initialize.
00476   #
00477   # Constraints
00478   # - An RTC may be initialized only while it is in the Created state. Any
00479   #   attempt to invoke this operation while in another state shall fail
00480   #   with ReturnCode_t::PRECONDITION_NOT_MET.
00481   # - Application developers are not expected to call this operation
00482   #   directly; it exists for use by the RTC infrastructure.
00483   #
00484   # @return
00485   # 
00486   # @endif
00487   def initialize(self):
00488     self._rtcout.RTC_TRACE("initialize()")
00489 
00490     ec_args = self._properties.getProperty("exec_cxt.periodic.type")
00491     ec_args += "?"
00492     ec_args += "rate="
00493     ec_args += self._properties.getProperty("exec_cxt.periodic.rate")
00494 
00495     ec = OpenRTM_aist.Manager.instance().createContext(ec_args)
00496     if ec is None:
00497       return RTC.RTC_ERROR
00498 
00499     ec.set_rate(float(self._properties.getProperty("exec_cxt.periodic.rate")))
00500     self._eclist.append(ec)
00501     ecv = ec.getObjRef()
00502     if CORBA.is_nil(ecv):
00503       return RTC.RTC_ERROR
00504 
00505     ec.bindComponent(self)
00506 
00507     # at least one EC must be attached
00508     if len(self._ecMine) == 0:
00509       return RTC.PRECONDITION_NOT_MET
00510 
00511     ret = self.on_initialize()
00512     if ret is not RTC.RTC_OK:
00513       return ret
00514     self._created = False
00515 
00516     # -- entering alive state --
00517     for i in range(len(self._ecMine)):
00518       self._rtcout.RTC_DEBUG("EC[%d] starting.", i)
00519       self._ecMine[i].start()
00520 
00521     # ret must be RTC_OK
00522     return ret
00523 
00524 
00525   ##
00526   # @if jp
00527   #
00528   # @brief [CORBA interface] RTC を終了する
00529   #
00530   # このオペレーション呼び出しの結果として ComponentAction::on_finalize()
00531   # を呼び出す。
00532   #
00533   # 制約
00534   # - RTC が ExecutionContext に所属している間は終了されない。この場合は、
00535   #   まず最初に ExecutionContextOperations::remove_component によって参加を
00536   #   解除しなければならない。これ以外の場合は、このオペレーション呼び出しは
00537   #   いかなる場合も ReturnCode_t::PRECONDITION_NOT_ME で失敗する。
00538   # - RTC が Created 状態である場合、終了処理は行われない。
00539   #   この場合、このオペレーション呼び出しはいかなる場合も
00540   #   ReturnCode_t::PRECONDITION_NOT_MET で失敗する。
00541   # - このオペレーションはRTCのミドルウエアから呼ばれることを想定しており、
00542   #   アプリケーション開発者は直接このオペレーションを呼ぶことは想定
00543   #   されていない。
00544   #
00545   # @param self
00546   #
00547   # @return ReturnCode_t 型のリターンコード
00548   # 
00549   # @else
00550   #
00551   # @brief Finalize the RTC for preparing it for destruction
00552   # 
00553   # This invocation of this operation shall result in the invocation of the
00554   # callback ComponentAction::on_finalize.
00555   #
00556   # Constraints
00557   # - An RTC may not be finalized while it is participating in any execution
00558   #   context. It must first be removed with 
00559   #   ExecutionContextOperations::remove_component. Otherwise, this operation
00560   #   shall fail with ReturnCode_t::PRECONDITION_NOT_MET. 
00561   # - An RTC may not be finalized while it is in the Created state. Any 
00562   #   attempt to invoke this operation while in that state shall fail with 
00563   #   ReturnCode_t::PRECONDITION_NOT_MET.
00564   # - Application developers are not expected to call this operation directly;
00565   #  it exists for use by the RTC infrastructure.
00566   #
00567   # @return
00568   # 
00569   # @endif
00570   def finalize(self):
00571     self._rtcout.RTC_TRACE("finalize()")
00572     if self._created or not self._exiting:
00573       return RTC.PRECONDITION_NOT_MET
00574 
00575     # Return RTC::PRECONDITION_NOT_MET,
00576     # When the component is registered in ExecutionContext.
00577     if len(self._ecOther) != 0:
00578       for ec in self._ecOther:
00579         if not CORBA.is_nil(ec):
00580           return RTC.PRECONDITION_NOT_MET
00581       
00582       self._ecOther = []
00583 
00584     ret = self.on_finalize()
00585     self.shutdown()
00586     return ret
00587 
00588 
00589   ##
00590   # @if jp
00591   #
00592   # @brief [CORBA interface] RTC がオーナーである ExecutionContext を
00593   #        停止させ、そのコンテンツと共に終了させる
00594   #
00595   # この RTC がオーナーであるすべての実行コンテキストを停止する。
00596   # この RTC が他の実行コンテキストを所有する RTC に属する実行コンテキスト
00597   # (i.e. 実行コンテキストを所有する RTC はすなわちその実行コンテキストの
00598   # オーナーである。)に参加している場合、当該 RTC はそれらのコンテキスト上
00599   # で非活性化されなければならない。
00600   # RTC が実行中のどの ExecutionContext でも Active 状態ではなくなった後、
00601   # この RTC とこれに含まれる RTC が終了する。
00602   # 
00603   # 制約
00604   # - RTC が初期化されていなければ、終了させることはできない。
00605   #   Created 状態にある RTC に exit() を呼び出した場合、
00606   #   ReturnCode_t::PRECONDITION_NOT_MET で失敗する。
00607   #
00608   # @param self
00609   #
00610   # @return ReturnCode_t 型のリターンコード
00611   # 
00612   # @else
00613   #
00614   # @brief Stop the RTC's execution context(s) and finalize it along with its
00615   #        contents.
00616   # 
00617   # Any execution contexts for which the RTC is the owner shall be stopped. 
00618   # If the RTC participates in any execution contexts belonging to another
00619   # RTC that contains it, directly or indirectly (i.e. the containing RTC
00620   # is the owner of the ExecutionContext), it shall be deactivated in those
00621   # contexts.
00622   # After the RTC is no longer Active in any Running execution context, it
00623   # and any RTCs contained transitively within it shall be finalized.
00624   #
00625   # Constraints
00626   # - An RTC cannot be exited if it has not yet been initialized. Any
00627   #   attempt to exit an RTC that is in the Created state shall fail with
00628   #   ReturnCode_t::PRECONDITION_NOT_MET.
00629   #
00630   # @return
00631   # 
00632   # @endif
00633   def exit(self):
00634     self._rtcout.RTC_TRACE("exit()")
00635     if self._created:
00636       return RTC.PRECONDITION_NOT_MET
00637 
00638     # deactivate myself on owned EC
00639     OpenRTM_aist.CORBA_SeqUtil.for_each(self._ecMine,
00640                                         self.deactivate_comps(self._objref))
00641     # deactivate myself on other EC
00642     OpenRTM_aist.CORBA_SeqUtil.for_each(self._ecOther,
00643                                         self.deactivate_comps(self._objref))
00644 
00645     # stop and detach myself from owned EC
00646     for ec in self._ecMine:
00647       if not CORBA.is_nil(ec) or not ec._non_existent():
00648         # ret = ec.stop()
00649         # ec.remove_component(self._this())
00650         pass
00651 
00652     # detach myself from other EC
00653     for ec in self._ecOther:
00654       if not CORBA.is_nil(ec):
00655         # ec.stop()
00656         ec.remove_component(self._this())
00657 
00658     self._exiting = True
00659     return self.finalize()
00660 
00661 
00662   ##
00663   # @if jp
00664   #
00665   # @brief [CORBA interface] RTC が Alive 状態であるかどうか確認する。
00666   #
00667   # RTC が指定した ExecutionContext に対して Alive状態であるかどうか確認する。
00668   # RTC の状態が Active であるか、Inactive であるか、Error であるかは実行中の
00669   # ExecutionContext に依存する。すなわち、ある ExecutionContext に対しては
00670   # Active  状態であっても、他の ExecutionContext に対しては Inactive 状態と
00671   # なる場合もありえる。従って、このオペレーションは指定された
00672   # ExecutionContext に問い合わせて、この RTC の状態が Active、Inactive、
00673   # Error の場合には Alive 状態として返す。
00674   #
00675   # @param self
00676   #
00677   # @param exec_context 取得対象 ExecutionContext ハンドル
00678   #
00679   # @return Alive 状態確認結果
00680   #
00681   # @else
00682   #
00683   # @brief Confirm whether RTC is an Alive state or NOT.
00684   #
00685   # A component is alive or not regardless of the execution context from
00686   # which it is observed. However, whether or not it is Active, Inactive,
00687   # or in Error is dependent on the execution context(s) in which it is
00688   # running. That is, it may be Active in one context but Inactive in
00689   # another. Therefore, this operation shall report whether this RTC is
00690   # either Active, Inactive or in Error; which of those states a component
00691   # is in with respect to a particular context may be queried from the
00692   # context itself.
00693   #
00694   # @return Result of Alive state confirmation
00695   #
00696   # @endif
00697   # virtual CORBA::Boolean is_alive(ExecutionContext_ptr exec_context)
00698   def is_alive(self, exec_context):
00699     self._rtcout.RTC_TRACE("is_alive()")
00700     for ec in self._ecMine:
00701       if exec_context._is_equivalent(ec):
00702         return True
00703 
00704     for ec in self._ecOther:
00705       if not CORBA.is_nil(ec):
00706         if exec_context._is_equivalent(ec):
00707           return True
00708 
00709     return False
00710 
00711 
00712   ##
00713   # @if jp
00714   # @brief [CORBA interface] ExecutionContextListを取得する
00715   #
00716   # この RTC が所有する ExecutionContext のリストを取得する。
00717   #
00718   # @param self
00719   #
00720   # @return ExecutionContext リスト
00721   #
00722   # @else
00723   # @brief [CORBA interface] Get ExecutionContextList.
00724   #
00725   # This operation returns a list of all execution contexts owned by this RTC.
00726   #
00727   # @return ExecutionContext List
00728   #
00729   # @endif
00730   #def get_contexts(self):
00731   #  execlist = []
00732   #  OpenRTM_aist.CORBA_SeqUtil.for_each(self._execContexts, self.ec_copy(execlist))
00733   #  return execlist
00734 
00735 
00736   ##
00737   # @if jp
00738   # @brief [CORBA interface] ExecutionContextを取得する
00739   #
00740   # 指定したハンドルの ExecutionContext を取得する。
00741   # ハンドルから ExecutionContext へのマッピングは、特定の RTC インスタンスに
00742   # 固有である。ハンドルはこの RTC を attach_context した際に取得できる。
00743   #
00744   # @param self
00745   # @param ec_id 取得対象 ExecutionContext ハンドル
00746   #
00747   # @return ExecutionContext
00748   #
00749   # @else
00750   # @brief [CORBA interface] Get ExecutionContext.
00751   #
00752   # Obtain a reference to the execution context represented by the given 
00753   # handle.
00754   # The mapping from handle to context is specific to a particular RTC 
00755   # instance. The given handle must have been obtained by a previous call to 
00756   # attach_context on this RTC.
00757   #
00758   # @param ec_id ExecutionContext handle
00759   #
00760   # @return ExecutionContext
00761   #
00762   # @endif
00763   # virtual ExecutionContext_ptr get_context(UniqueId exec_handle)
00764   def get_context(self, ec_id):
00765     global ECOTHER_OFFSET
00766 
00767     self._rtcout.RTC_TRACE("get_context(%d)", ec_id)
00768     # owned EC
00769     if ec_id < ECOTHER_OFFSET:
00770       if ec_id < len(self._ecMine):
00771         return self._ecMine[ec_id]
00772       else:
00773         return RTC.ExecutionContext._nil
00774 
00775     # participating EC
00776     index = ec_id - ECOTHER_OFFSET
00777 
00778     if index < len(self._ecOther):
00779       if not CORBA.is_nil(self._ecOther[index]):
00780         return self._ecOther[index]
00781 
00782     return RTC.ExecutionContext._nil
00783 
00784 
00785   ##
00786   # @if jp
00787   # @brief [CORBA interface] 所有する ExecutionContextListを 取得する
00788   #
00789   # この RTC が所有する ExecutionContext のリストを取得する。
00790   #
00791   # @return ExecutionContext リスト
00792   #
00793   # @else
00794   # @brief [CORBA interface] Get ExecutionContextList.
00795   #
00796   # This operation returns a list of all execution contexts owned by this
00797   # RTC.
00798   #
00799   # @return ExecutionContext List
00800   #
00801   # @endif
00802   # virtual ExecutionContextList* get_owned_contexts()
00803   def get_owned_contexts(self):
00804     self._rtcout.RTC_TRACE("get_owned_contexts()")
00805     execlist = []
00806     OpenRTM_aist.CORBA_SeqUtil.for_each(self._ecMine, self.ec_copy(execlist))
00807     return execlist
00808 
00809   ##
00810   # @if jp
00811   # @brief [CORBA interface] 参加している ExecutionContextList を取得する
00812   #
00813   # この RTC が参加している ExecutionContext のリストを取得する。
00814   #
00815   # @return ExecutionContext リスト
00816   #
00817   # @else
00818   # @brief [CORBA interface] Get participating ExecutionContextList.
00819   #
00820   # This operation returns a list of all execution contexts in
00821   # which this RTC participates.
00822   #
00823   # @return ExecutionContext List
00824   #
00825   # @endif
00826   # virtual ExecutionContextList* get_participating_contexts()
00827   def get_participating_contexts(self):
00828     self._rtcout.RTC_TRACE("get_participating_contexts()")
00829     execlist = []
00830     OpenRTM_aist.CORBA_SeqUtil.for_each(self._ecOther, self.ec_copy(execlist))
00831     return execlist
00832 
00833 
00834   #
00835   # @if jp
00836   # @brief [CORBA interface] ExecutionContext のハンドルを返す
00837   #
00838   # @param ExecutionContext 実行コンテキスト
00839   #
00840   # @return ExecutionContextHandle
00841   #
00842   # 与えられた実行コンテキストに関連付けられたハンドルを返す。
00843   #
00844   # @else
00845   # @brief [CORBA interface] Return a handle of a ExecutionContext
00846   #
00847   # @param ExecutionContext
00848   #
00849   # @return ExecutionContextHandle
00850   #
00851   # This operation returns a handle that is associated with the given
00852   # execution context.
00853   #
00854   # @endif
00855   #
00856   # virtual ExecutionContextHandle_t
00857   #   get_context_handle(ExecutionContext_ptr cxt)
00858   def get_context_handle(self, cxt):
00859     self._rtcout.RTC_TRACE("get_context_handle()")
00860 
00861     num = OpenRTM_aist.CORBA_SeqUtil.find(self._ecMine, self.ec_find(cxt))
00862     if num != -1:
00863       return long(num)
00864 
00865     num = OpenRTM_aist.CORBA_SeqUtil.find(self._ecOther, self.ec_find(cxt))
00866     if num != -1:
00867       return long(num)
00868 
00869     return long(-1)
00870 
00871 
00872   #============================================================
00873   # RTC::RTObject
00874   #============================================================
00875 
00876   ##
00877   # @if jp
00878   #
00879   # @brief [RTObject CORBA interface] コンポーネントプロファイルを取得する
00880   #
00881   # 当該コンポーネントのプロファイル情報を返す。 
00882   #
00883   # @param self
00884   #
00885   # @return コンポーネントプロファイル
00886   #
00887   # @else
00888   #
00889   # @brief [RTObject CORBA interface] Get RTC's profile
00890   #
00891   # This operation returns the ComponentProfile of the RTC
00892   #
00893   # @return ComponentProfile
00894   #
00895   # @endif
00896   # virtual ComponentProfile* get_component_profile()
00897   def get_component_profile(self):
00898     self._rtcout.RTC_TRACE("get_component_profile()")
00899     try:
00900       prop_ = RTC.ComponentProfile(self._properties.getProperty("instance_name"),
00901                                    self._properties.getProperty("type_name"),
00902                                    self._properties.getProperty("description"),
00903                                    self._properties.getProperty("version"),
00904                                    self._properties.getProperty("vendor"),
00905                                    self._properties.getProperty("category"),
00906                                    self._portAdmin.getPortProfileList(),
00907                                    self._profile.parent,
00908                                    self._profile.properties) 
00909       OpenRTM_aist.NVUtil.copyFromProperties(self._profile.properties, self._properties)
00910       return prop_
00911       # return RTC.ComponentProfile(self._profile.instance_name,
00912       #               self._profile.type_name,
00913       #               self._profile.description,
00914       #               self._profile.version,
00915       #               self._profile.vendor,
00916       #               self._profile.category,
00917       #               self._portAdmin.getPortProfileList(),
00918       #               self._profile.parent,
00919       #               self._profile.properties)
00920     
00921     except:
00922       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
00923 
00924     assert(False)
00925     return None
00926 
00927 
00928   ##
00929   # @if jp
00930   #
00931   # @brief [RTObject CORBA interface] ポートを取得する
00932   #
00933   # 当該コンポーネントが保有するポートの参照を返す。
00934   #
00935   # @param self
00936   #
00937   # @return ポートリスト
00938   #
00939   # @else
00940   #
00941   # @brief [RTObject CORBA interface] Get Ports
00942   #
00943   # This operation returns a list of the RTCs ports.
00944   #
00945   # @return PortList
00946   #
00947   # @endif
00948   # virtual PortServiceList* get_ports()
00949   def get_ports(self):
00950     self._rtcout.RTC_TRACE("get_ports()")
00951     try:
00952       return self._portAdmin.getPortServiceList()
00953     except:
00954       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
00955 
00956     assert(False)
00957     return []
00958 
00959 
00960 
00961   # RTC::ComponentAction
00962 
00963   ##
00964   # @if jp
00965   # @brief [CORBA interface] ExecutionContextをattachする
00966   #
00967   # 指定した ExecutionContext にこの RTC を所属させる。この RTC と関連する 
00968   # ExecutionContext のハンドルを返す。
00969   # このオペレーションは、ExecutionContextOperations::add_component が呼ばれた
00970   # 際に呼び出される。返されたハンドルは他のクライアントで使用することを想定
00971   # していない。
00972   #
00973   # @param self
00974   # @param exec_context 所属先 ExecutionContext
00975   #
00976   # @return ExecutionContext ハンドル
00977   #
00978   # @else
00979   # @brief [CORBA interface] Attach ExecutionContext.
00980   #
00981   # Inform this RTC that it is participating in the given execution context. 
00982   # Return a handle that represents the association of this RTC with the 
00983   # context.
00984   # This operation is intended to be invoked by 
00985   # ExecutionContextOperations::add_component. It is not intended for use by 
00986   # other clients.
00987   #
00988   # @param exec_context Prticipating ExecutionContext
00989   #
00990   # @return ExecutionContext Handle
00991   #
00992   # @endif
00993   # UniqueId attach_context(ExecutionContext_ptr exec_context)
00994   def attach_context(self, exec_context):
00995     global ECOTHER_OFFSET
00996     self._rtcout.RTC_TRACE("attach_context()")
00997     # ID: 0 - (offset-1) : owned ec
00998     # ID: offset -       : participating ec
00999     # owned       ec index = ID
01000     # participate ec index = ID - offset
01001     ecs = exec_context._narrow(RTC.ExecutionContextService)
01002     if CORBA.is_nil(ecs):
01003       return -1
01004     
01005     # if m_ecOther has nil element, insert attached ec to there.
01006     for i in range(len(self._ecOther)):
01007       if CORBA.is_nil(self._ecOther[i]):
01008         self._ecOther[i] = ecs
01009         ec_id = i + ECOTHER_OFFSET
01010         self.onAttachExecutionContext(ec_id)
01011         return ec_id
01012 
01013     # no space in the list, push back ec to the last.
01014     OpenRTM_aist.CORBA_SeqUtil.push_back(self._ecOther,ecs)
01015     ec_id = long(len(self._ecOther) - 1 + ECOTHER_OFFSET)
01016     self.onAttachExecutionContext(ec_id)
01017     return ec_id
01018 
01019 
01020   # UniqueId bindContext(ExecutionContext_ptr exec_context);
01021   def bindContext(self, exec_context):
01022     global ECOTHER_OFFSET
01023     self._rtcout.RTC_TRACE("bindContext()")
01024     # ID: 0 - (offset-1) : owned ec
01025     # ID: offset -       : participating ec
01026     # owned       ec index = ID
01027     # participate ec index = ID - offset
01028     ecs = exec_context._narrow(RTC.ExecutionContextService)
01029 
01030     if CORBA.is_nil(ecs):
01031       return -1
01032     
01033     # if m_ecMine has nil element, insert attached ec to there.
01034     for i in range(len(self._ecMine)):
01035       if CORBA.is_nil(self._ecMine[i]):
01036         self._ecMine[i] = ecs
01037         self.onAttachExecutionContext(i)
01038         return i
01039         #return i + ECOTHER_OFFSET
01040 
01041     # no space in the list, push back ec to the last.
01042     OpenRTM_aist.CORBA_SeqUtil.push_back(self._ecMine,ecs)
01043     
01044     return long(len(self._ecMine) - 1)
01045     #return long(len(self._ecMine) - 1 + ECOTHER_OFFSET)
01046 
01047 
01048   ##
01049   # @if jp
01050   # @brief [CORBA interface] ExecutionContextをdetachする
01051   #
01052   # 指定した ExecutionContext からこの RTC の所属を解除する。
01053   # このオペレーションは、ExecutionContextOperations::remove_component が呼ば
01054   # れた際に呼び出される。返されたハンドルは他のクライアントで使用することを
01055   # 想定していない。
01056   # 
01057   # 制約
01058   # - 指定された ExecutionContext に RTC がすでに所属していない場合には、
01059   #   ReturnCode_t::PRECONDITION_NOT_MET が返される。
01060   # - 指定された ExecutionContext にたしいて対して RTC がActive 状態である場
01061   #   合には、 ReturnCode_t::PRECONDITION_NOT_MET が返される。
01062   #
01063   # @param self
01064   # @param ec_id 解除対象 ExecutionContextハンドル
01065   #
01066   # @return ReturnCode_t 型のリターンコード
01067   #
01068   # @else
01069   # @brief [CORBA interface] Attach ExecutionContext.
01070   #
01071   # Inform this RTC that it is no longer participating in the given execution 
01072   # context.
01073   # This operation is intended to be invoked by 
01074   # ExecutionContextOperations::remove_component. It is not intended for use 
01075   # by other clients.
01076   # Constraints
01077   # - This operation may not be invoked if this RTC is not already 
01078   #   participating in the execution context. Such a call shall fail with 
01079   #   ReturnCode_t::PRECONDITION_NOT_MET.
01080   # - This operation may not be invoked if this RTC is Active in the indicated
01081   #   execution context. Otherwise, it shall fail with 
01082   #   ReturnCode_t::PRECONDITION_NOT_MET.
01083   #
01084   # @param ec_id Dettaching ExecutionContext Handle
01085   #
01086   # @return
01087   #
01088   # @endif
01089   # ReturnCode_t detach_context(UniqueId exec_handle)
01090   def detach_context(self, ec_id):
01091     global ECOTHER_OFFSET
01092     self._rtcout.RTC_TRACE("detach_context(%d)", ec_id)
01093     len_ = len(self._ecOther)
01094 
01095     # ID: 0 - (offset-1) : owned ec
01096     # ID: offset -       : participating ec
01097     # owned       ec index = ID
01098     # participate ec index = ID - offset
01099     if (long(ec_id) < long(ECOTHER_OFFSET)) or \
01100           (long(ec_id - ECOTHER_OFFSET) > len_):
01101       return RTC.BAD_PARAMETER
01102     
01103     index = long(ec_id - ECOTHER_OFFSET)
01104 
01105     if index < 0 or CORBA.is_nil(self._ecOther[index]):
01106       return RTC.BAD_PARAMETER
01107     
01108     #OpenRTM_aist.CORBA_SeqUtil.erase(self._ecOther, index)
01109     self._ecOther[index] = RTC.ExecutionContextService._nil
01110     self.onDetachExecutionContext(ec_id)
01111     return RTC.RTC_OK
01112 
01113 
01114   ##
01115   # @if jp
01116   #
01117   # @brief [ComponentAction CORBA interface] RTC の初期化
01118   #
01119   # RTC が初期化され、Alive 状態に遷移する。
01120   # RTC 固有の初期化処理はここで実行する。
01121   # このオペレーション呼び出しの結果として onInitialize() コールバック関数が
01122   # 呼び出される。
01123   #
01124   # @param self
01125   #
01126   # @return ReturnCode_t 型のリターンコード
01127   #
01128   # @else
01129   #
01130   # @brief [ComponentAction CORBA interface] Initialize RTC
01131   #
01132   # The RTC has been initialized and entered the Alive state.
01133   # Any RTC-specific initialization logic should be performed here.
01134   #
01135   # @return
01136   #
01137   # @endif
01138   def on_initialize(self):
01139     self._rtcout.RTC_TRACE("on_initialize()")
01140     ret = RTC.RTC_ERROR
01141     try:
01142       self.preOnInitialize(0)
01143       ret = self.onInitialize()
01144     except:
01145       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
01146       ret = RTC.RTC_ERROR
01147 
01148     active_set = self._properties.getProperty("configuration.active_config",
01149                                               "default")
01150 
01151     if self._configsets.haveConfig(active_set):
01152       self._configsets.update(active_set)
01153     else:
01154       self._configsets.update("default")
01155 
01156     self.postOnInitialize(0,ret)
01157     return ret
01158 
01159 
01160   ##
01161   # @if jp
01162   #
01163   # @brief [ComponentAction CORBA interface] RTC の終了
01164   #
01165   # RTC が破棄される。
01166   # RTC 固有の終了処理はここで実行する。
01167   # このオペレーション呼び出しの結果として onFinalize() コールバック関数が
01168   # 呼び出される。
01169   #
01170   # @param self
01171   #
01172   # @return ReturnCode_t 型のリターンコード
01173   #
01174   # @else
01175   #
01176   # @brief [ComponentAction CORBA interface] Finalize RTC
01177   #
01178   # The RTC is being destroyed.
01179   # Any final RTC-specific tear-down logic should be performed here.
01180   #
01181   # @return
01182   #
01183   # @endif
01184   def on_finalize(self):
01185     self._rtcout.RTC_TRACE("on_finalize()")
01186     ret = RTC.RTC_ERROR
01187     try:
01188       self.preOnFinalize(0)
01189       ret = self.onFinalize()
01190     except:
01191       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
01192       ret = RTC.RTC_ERROR
01193     self.postOnFinalize(0, ret)
01194     return ret
01195 
01196 
01197   ##
01198   # @if jp
01199   #
01200   # @brief [ComponentAction CORBA interface] RTC の開始
01201   #
01202   # RTC が所属する ExecutionContext が Stopped 状態から Running 状態へ遷移
01203   # した場合に呼び出される。
01204   # このオペレーション呼び出しの結果として onStartup() コールバック関数が
01205   # 呼び出される。
01206   #
01207   # @param self
01208   # @param ec_id 状態遷移した ExecutionContext の ID
01209   #
01210   # @return ReturnCode_t 型のリターンコード
01211   #
01212   # @else
01213   #
01214   # @brief [ComponentAction CORBA interface] StartUp RTC
01215   #
01216   # The given execution context, in which the RTC is participating, has 
01217   # transitioned from Stopped to Running.
01218   #
01219   # @param ec_id
01220   #
01221   # @return
01222   #
01223   # @endif
01224   def on_startup(self, ec_id):
01225     self._rtcout.RTC_TRACE("on_startup(%d)", ec_id)
01226     ret = RTC.RTC_ERROR
01227     try:
01228       self.preOnStartup(ec_id)
01229       ret = self.onStartup(ec_id)
01230     except:
01231       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
01232       ret = RTC.RTC_ERROR
01233     self.postOnStartup(ec_id, ret)
01234     return ret
01235 
01236 
01237   ##
01238   # @if jp
01239   #
01240   # @brief [ComponentAction CORBA interface] RTC の停止
01241   #
01242   # RTC が所属する ExecutionContext が Running 状態から Stopped 状態へ遷移
01243   # した場合に呼び出される。
01244   # このオペレーション呼び出しの結果として onShutdown() コールバック関数が
01245   # 呼び出される。
01246   #
01247   # @param self
01248   # @param ec_id 状態遷移した ExecutionContext の ID
01249   #
01250   # @return ReturnCode_t 型のリターンコード
01251   #
01252   # @else
01253   #
01254   # @brief [ComponentAction CORBA interface] ShutDown RTC
01255   #
01256   # The given execution context, in which the RTC is participating, has 
01257   # transitioned from Running to Stopped.
01258   #
01259   # @param ec_id
01260   #
01261   # @return
01262   #
01263   # @endif
01264   def on_shutdown(self, ec_id):
01265     self._rtcout.RTC_TRACE("on_shutdown(%d)", ec_id)
01266     ret = RTC.RTC_ERROR
01267     try:
01268       self.preOnShutdown(ec_id)
01269       ret = self.onShutdown(ec_id)
01270     except:
01271       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
01272       ret = RTC.RTC_ERROR
01273     self.postOnShutdown(ec_id, ret)
01274     return ret
01275 
01276 
01277   ##
01278   # @if jp
01279   #
01280   # @brief [ComponentAction CORBA interface] RTC の活性化
01281   #
01282   # 所属する ExecutionContext から RTC が活性化された際に呼び出される。
01283   # このオペレーション呼び出しの結果として onActivated() コールバック関数が
01284   # 呼び出される。
01285   #
01286   # @param self
01287   # @param ec_id 活性化 ExecutionContext の ID
01288   #
01289   # @return ReturnCode_t 型のリターンコード
01290   #
01291   # @else
01292   #
01293   # @brief [ComponentAction CORBA interface] Activate RTC
01294   #
01295   # The RTC has been activated in the given execution context.
01296   #
01297   # @param ec_id
01298   #
01299   # @return
01300   #
01301   # @endif
01302   def on_activated(self, ec_id):
01303     self._rtcout.RTC_TRACE("on_activated(%d)", ec_id)
01304     ret = RTC.RTC_ERROR
01305     try:
01306       self.preOnActivated(ec_id)
01307       self._configsets.update()
01308       ret = self.onActivated(ec_id)
01309       self._portAdmin.activatePorts()
01310     except:
01311       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
01312       ret = RTC.RTC_ERROR
01313     self.postOnActivated(ec_id, ret)
01314     return ret
01315 
01316 
01317   ##
01318   # @if jp
01319   #
01320   # @brief [ComponentAction CORBA interface] RTC の非活性化
01321   #
01322   # 所属する ExecutionContext から RTC が非活性化された際に呼び出される。
01323   # このオペレーション呼び出しの結果として onDeactivated() コールバック関数が
01324   # 呼び出される。
01325   #
01326   # @param self
01327   # @param ec_id 非活性化 ExecutionContext の ID
01328   #
01329   # @return ReturnCode_t 型のリターンコード
01330   #
01331   # @else
01332   #
01333   # @brief [ComponentAction CORBA interface] Deactivate RTC
01334   #
01335   # The RTC has been deactivated in the given execution context.
01336   #
01337   # @param ec_id
01338   #
01339   # @return
01340   #
01341   # @endif
01342   def on_deactivated(self, ec_id):
01343     self._rtcout.RTC_TRACE("on_deactivated(%d)", ec_id)
01344     ret = RTC.RTC_ERROR
01345     try:
01346       self.preOnDeactivated(ec_id)
01347       self._portAdmin.deactivatePorts()
01348       ret = self.onDeactivated(ec_id)
01349     except:
01350       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
01351       ret = RTC.RTC_ERROR
01352     self.postOnDeactivated(ec_id, ret)
01353     return ret
01354 
01355 
01356   ##
01357   # @if jp
01358   #
01359   # @brief [ComponentAction CORBA interface] RTC のエラー状態への遷移
01360   #
01361   # RTC が所属する ExecutionContext が Active 状態から Error 状態へ遷移した
01362   # 場合に呼び出される。
01363   # このオペレーションは RTC が Error 状態に遷移した際に一度だけ呼び出される。
01364   # このオペレーション呼び出しの結果として onAborting() コールバック関数が
01365   # 呼び出される。
01366   #
01367   # @param self
01368   # @param ec_id 状態遷移した ExecutionContext の ID
01369   #
01370   # @return ReturnCode_t 型のリターンコード
01371   #
01372   # @else
01373   #
01374   # @brief [ComponentAction CORBA interface] Transition Error State
01375   #
01376   # The RTC is transitioning from the Active state to the Error state in some
01377   # execution context.
01378   # This callback is invoked only a single time for time that the RTC 
01379   # transitions into the Error state from another state. This behavior is in 
01380   # contrast to that of on_error.
01381   #
01382   # @param ec_id
01383   #
01384   # @return
01385   #
01386   # @endif
01387   def on_aborting(self, ec_id):
01388     self._rtcout.RTC_TRACE("on_aborting(%d)", ec_id)
01389     ret = RTC.RTC_ERROR
01390     try:
01391       self.preOnAborting(ec_id)
01392       ret = self.onAborting(ec_id)
01393     except:
01394       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
01395       ret = RTC.RTC_ERROR
01396     self.postOnAborting(ec_id, ret)
01397     return ret
01398 
01399 
01400   ##
01401   # @if jp
01402   #
01403   # @brief [ComponentAction CORBA interface] RTC のエラー処理
01404   #
01405   # RTC がエラー状態にいる際に呼び出される。
01406   # RTC がエラー状態の場合に、対象となる ExecutionContext のExecutionKind に
01407   # 応じたタイミングで呼び出される。例えば、
01408   # - ExecutionKind が PERIODIC の場合、本オペレーションは
01409   #   DataFlowComponentAction::on_execute と on_state_update の替わりに、
01410   #   設定された順番、設定された周期で呼び出される。
01411   # - ExecutionKind が EVENT_DRIVEN の場合、本オペレーションは
01412   #   FsmParticipantAction::on_action が呼ばれた際に、替わりに呼び出される。
01413   # このオペレーション呼び出しの結果として onError() コールバック関数が呼び出
01414   # される。
01415   #
01416   # @param self
01417   # @param ec_id 対象 ExecutionContext の ID
01418   #
01419   # @return ReturnCode_t 型のリターンコード
01420   #
01421   # @else
01422   #
01423   # @brief [ComponentAction CORBA interface] Error Processing of RTC
01424   #
01425   # The RTC remains in the Error state.
01426   # If the RTC is in the Error state relative to some execution context when
01427   # it would otherwise be invoked from that context (according to the 
01428   # context’s ExecutionKind), this callback shall be invoked instead. 
01429   # For example,
01430   # - If the ExecutionKind is PERIODIC, this operation shall be invoked in 
01431   #   sorted order at the rate of the context instead of 
01432   #   DataFlowComponentAction::on_execute and on_state_update.
01433   # - If the ExecutionKind is EVENT_DRIVEN, this operation shall be invoked 
01434   #   whenever FsmParticipantAction::on_action would otherwise have been 
01435   #   invoked.
01436   #
01437   # @param ec_id
01438   #
01439   # @return
01440   #
01441   # @endif
01442   def on_error(self, ec_id):
01443     self._rtcout.RTC_TRACE("on_error(%d)", ec_id)
01444     ret = RTC.RTC_ERROR
01445     try:
01446       self.preOnError(ec_id)
01447       ret = self.onError(ec_id)
01448     except:
01449       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
01450       ret = RTC.RTC_ERROR
01451     self._configsets.update()
01452     self.postOnError(ec_id, ret)
01453     return ret
01454 
01455 
01456   ##
01457   # @if jp
01458   #
01459   # @brief [ComponentAction CORBA interface] RTC のリセット
01460   #
01461   # Error 状態にある RTC のリカバリ処理を実行し、Inactive 状態に復帰させる
01462   # 場合に呼び出される。
01463   # RTC のリカバリ処理が成功した場合は Inactive 状態に復帰するが、それ以外の
01464   # 場合には Error 状態に留まる。
01465   # このオペレーション呼び出しの結果として onReset() コールバック関数が呼び
01466   # 出される。
01467   #
01468   # @param self
01469   # @param ec_id リセット対象 ExecutionContext の ID
01470   #
01471   # @return ReturnCode_t 型のリターンコード
01472   #
01473   # @else
01474   #
01475   # @brief [ComponentAction CORBA interface] Resetting RTC
01476   #
01477   # The RTC is in the Error state. An attempt is being made to recover it such
01478   # that it can return to the Inactive state.
01479   # If the RTC was successfully recovered and can safely return to the
01480   # Inactive state, this method shall complete with ReturnCode_t::OK. Any
01481   # other result shall indicate that the RTC should remain in the Error state.
01482   #
01483   # @param ec_id
01484   #
01485   # @return
01486   #
01487   # @endif
01488   def on_reset(self, ec_id):
01489     self._rtcout.RTC_TRACE("on_reset(%d)", ec_id)
01490     ret = RTC.RTC_ERROR
01491     try:
01492       self.preOnReset(ec_id)
01493       ret = self.onReset(ec_id)
01494     except:
01495       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
01496       ret = RTC.RTC_ERROR
01497     self.postOnReset(ec_id, ret)
01498     return ret
01499 
01500 
01501   ##
01502   # @if jp
01503   #
01504   # @brief [DataFlowComponentAction CORBA interface] RTC の定常処理(第一周期)
01505   #
01506   # 以下の状態が保持されている場合に、設定された周期で定期的に呼び出される。
01507   # - RTC は Alive 状態である。
01508   # - 指定された ExecutionContext が Running 状態である。
01509   # 本オペレーションは、Two-Pass Execution の第一周期で実行される。
01510   # このオペレーション呼び出しの結果として onExecute() コールバック関数が呼び
01511   # 出される。
01512   #
01513   # 制約
01514   # - 指定された ExecutionContext の ExecutionKind は、 PERIODIC でなければな
01515   #   らない
01516   #
01517   # @param self
01518   # @param ec_id 定常処理対象 ExecutionContext の ID
01519   #
01520   # @return ReturnCode_t 型のリターンコード
01521   #
01522   # @else
01523   #
01524   # @brief [DataFlowComponentAction CORBA interface] Primary Periodic 
01525   #        Operation of RTC
01526   #
01527   # This operation will be invoked periodically at the rate of the given
01528   # execution context as long as the following conditions hold:
01529   # - The RTC is Active.
01530   # - The given execution context is Running
01531   # This callback occurs during the first execution pass.
01532   #
01533   # Constraints
01534   # - The execution context of the given context shall be PERIODIC.
01535   #
01536   # @param ec_id
01537   #
01538   # @return
01539   #
01540   # @endif
01541   def on_execute(self, ec_id):
01542     self._rtcout.RTC_TRACE("on_execute(%d)", ec_id)
01543     ret = RTC.RTC_ERROR
01544     try:
01545       self.preOnExecute(ec_id)
01546       if self._readAll:
01547         self.readAll()
01548       
01549       ret = self.onExecute(ec_id)
01550 
01551       if self._writeAll:
01552         self.writeAll()
01553       
01554     except:
01555       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
01556       ret = RTC.RTC_ERROR
01557     self.postOnExecute(ec_id, ret)
01558     return ret
01559 
01560 
01561   ##
01562   # @if jp
01563   #
01564   # @brief [DataFlowComponentAction CORBA interface] RTC の定常処理(第二周期)
01565   #
01566   # 以下の状態が保持されている場合に、設定された周期で定期的に呼び出される。
01567   # - RTC は Alive 状態である。
01568   # - 指定された ExecutionContext が Running 状態である。
01569   # 本オペレーションは、Two-Pass Execution の第二周期で実行される。
01570   # このオペレーション呼び出しの結果として onStateUpdate() コールバック関数が
01571   # 呼び出される。
01572   #
01573   # 制約
01574   # - 指定された ExecutionContext の ExecutionKind は、 PERIODIC でなければな
01575   #   らない
01576   #
01577   # @param self
01578   # @param ec_id 定常処理対象 ExecutionContext の ID
01579   #
01580   # @return ReturnCode_t 型のリターンコード
01581   #
01582   # @else
01583   #
01584   # @brief [DataFlowComponentAction CORBA interface] Secondary Periodic 
01585   #        Operation of RTC
01586   #
01587   # This operation will be invoked periodically at the rate of the given
01588   # execution context as long as the following conditions hold:
01589   # - The RTC is Active.
01590   # - The given execution context is Running
01591   # This callback occurs during the second execution pass.
01592   #
01593   # Constraints
01594   # - The execution context of the given context shall be PERIODIC.
01595   #
01596   # @param ec_id
01597   #
01598   # @return
01599   #
01600   # @endif
01601   def on_state_update(self, ec_id):
01602     self._rtcout.RTC_TRACE("on_state_update(%d)", ec_id)
01603     ret = RTC.RTC_ERROR
01604     try:
01605       self.preOnStateUpdate(ec_id)
01606       ret = self.onStateUpdate(ec_id)
01607       self._configsets.update()
01608     except:
01609       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
01610       ret = RTC.RTC_ERROR
01611     self.postOnStateUpdate(ec_id, ret)
01612     return ret
01613 
01614 
01615   ##
01616   # @if jp
01617   #
01618   # @brief [DataFlowComponentAction CORBA interface] 実行周期変更通知
01619   #
01620   # 本オペレーションは、ExecutionContext の実行周期が変更されたことを通知する
01621   # 際に呼び出される。
01622   # このオペレーション呼び出しの結果として onRateChanged() コールバック関数が
01623   # 呼び出される。
01624   #
01625   # 制約
01626   # - 指定された ExecutionContext の ExecutionKind は、 PERIODIC でなければな
01627   #   らない
01628   #
01629   # @param self
01630   # @param ec_id 定常処理対象 ExecutionContext の ID
01631   #
01632   # @return ReturnCode_t 型のリターンコード
01633   #
01634   # @else
01635   #
01636   # @brief [DataFlowComponentAction CORBA interface] Notify rate chenged
01637   #
01638   # This operation is a notification that the rate of the indicated execution 
01639   # context has changed.
01640   #
01641   # Constraints
01642   # - The execution context of the given context shall be PERIODIC.
01643   #
01644   # @param ec_id
01645   #
01646   # @return
01647   #
01648   # @endif
01649   def on_rate_changed(self, ec_id):
01650     self._rtcout.RTC_TRACE("on_rate_changed(%d)", ec_id)
01651     ret = RTC.RTC_ERROR
01652     try:
01653       self.preOnRateChanged(ec_id)
01654       ret = self.onRateChanged(ec_id)
01655     except:
01656       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
01657       ret = RTC.RTC_ERROR
01658     self.postOnRateChanged(ec_id, ret)
01659     return ret
01660 
01661 
01662   #============================================================
01663   # SDOPackage::SdoSystemElement
01664   #============================================================
01665 
01666   ##
01667   # @if jp
01668   # 
01669   # @brief [SDO interface] Organization リストの取得 
01670   #
01671   # SDOSystemElement は0個もしくはそれ以上の Organization を所有することが
01672   # 出来る。 SDOSystemElement が1つ以上の Organization を所有している場合
01673   # には、このオペレーションは所有する Organization のリストを返す。
01674   # もしOrganizationを一つも所有していないければ空のリストを返す。
01675   #
01676   # @param self
01677   #
01678   # @return 所有している Organization リスト
01679   #
01680   # @exception SDONotExists ターゲットのSDOが存在しない。(本例外は、CORBA標準
01681   #                         システム例外のOBJECT_NOT_EXISTにマッピングされる)
01682   # @exception NotAvailable SDOは存在するが応答がない。
01683   # @exception InternalError 内部的エラーが発生した。
01684   #
01685   # @else
01686   #
01687   # @brief [SDO interface] Getting Organizations
01688   #
01689   # SDOSystemElement can be the owner of zero or more organizations.
01690   # If the SDOSystemElement owns one or more Organizations, this operation
01691   # returns the list of Organizations that the SDOSystemElement owns.
01692   # If it does not own any Organization, it returns empty list.
01693   #
01694   # @return Owned Organization List
01695   #
01696   # @exception SDONotExists if the target SDO does not exist.(This exception 
01697   #                         is mapped to CORBA standard system exception
01698   #                         OBJECT_NOT_EXIST.)
01699   # @exception NotAvailable if the target SDO is reachable but cannot
01700   #                         respond.
01701   # @exception InternalError if the target SDO cannot execute the operation
01702   #                          completely due to some internal error.
01703   #
01704   # @endif
01705   # virtual SDOPackage::OrganizationList* get_owned_organizations()
01706   def get_owned_organizations(self):
01707     self._rtcout.RTC_TRACE("get_owned_organizations()")
01708     try:
01709       return self._sdoOwnedOrganizations
01710     except:
01711       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
01712       raise SDOPackage.NotAvailable("NotAvailable: get_owned_organizations")
01713 
01714     return []
01715 
01716 
01717   #============================================================
01718   # SDOPackage::SDO
01719   #============================================================
01720 
01721   ##
01722   # @if jp
01723   # 
01724   # @brief [SDO interface] SDO ID の取得
01725   #
01726   # SDO ID を返すオペレーション。
01727   # このオペレーションは以下の型の例外を発生させる。
01728   #
01729   # @param self
01730   # 
01731   # @return    リソースデータモデルで定義されている SDO の ID
01732   # 
01733   # @exception SDONotExists ターゲットのSDOが存在しない。(本例外は、CORBA標準
01734   #                         システム例外のOBJECT_NOT_EXISTにマッピングされる)
01735   # @exception NotAvailable SDOは存在するが応答がない。
01736   # @exception InternalError 内部的エラーが発生した。
01737   #
01738   # @else
01739   #
01740   # @brief [SDO interface] Getting SDO ID
01741   #
01742   # This operation returns id of the SDO.
01743   # This operation throws SDOException with one of the following types.
01744   #
01745   # @return    id of the SDO defined in the resource data model.
01746   #
01747   # @exception SDONotExists if the target SDO does not exist.(This exception 
01748   #                         is mapped to CORBA standard system exception
01749   #                         OBJECT_NOT_EXIST.)
01750   # @exception NotAvailable if the target SDO is reachable but cannot
01751   #                         respond.
01752   # @exception InternalError if the target SDO cannot execute the operation
01753   #                          completely due to some internal error.
01754   #
01755   # @endif
01756   # virtual char* get_sdo_id()
01757   def get_sdo_id(self):
01758     self._rtcout.RTC_TRACE("get_sdo_id()")
01759     try:
01760       return self._profile.instance_name
01761     except:
01762       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
01763       raise SDOPackage.InternalError("get_sdo_id()")
01764 
01765 
01766   ##
01767   # @if jp
01768   # 
01769   # @brief [SDO interface] SDO タイプの取得
01770   # 
01771   # SDO Type を返すオペレーション。
01772   # このオペレーションは以下の型の例外を発生させる。
01773   #
01774   # @param self
01775   #
01776   # @return    リソースデータモデルで定義されている SDO の Type
01777   #
01778   # @exception SDONotExists ターゲットのSDOが存在しない。(本例外は、CORBA標準
01779   #                         システム例外のOBJECT_NOT_EXISTにマッピングされる)
01780   # @exception NotAvailable SDOは存在するが応答がない。
01781   # @exception InternalError 内部的エラーが発生した。
01782   #
01783   # @else
01784   #
01785   # @brief [SDO interface] Getting SDO type
01786   #
01787   # This operation returns sdoType of the SDO.
01788   # This operation throws SDOException with one of the following types.
01789   #
01790   # @return    Type of the SDO defined in the resource data model.
01791   #
01792   # @exception SDONotExists if the target SDO does not exist.(This exception 
01793   #                         is mapped to CORBA standard system exception
01794   #                         OBJECT_NOT_EXIST.)
01795   # @exception NotAvailable if the target SDO is reachable but cannot
01796   #                         respond.
01797   # @exception InternalError if the target SDO cannot execute the operation
01798   #                          completely due to some internal error.
01799   #
01800   # @endif
01801   # virtual char* get_sdo_type()
01802   def get_sdo_type(self):
01803     self._rtcout.RTC_TRACE("get_sdo_type()")
01804     try:
01805       return self._profile.description
01806     except:
01807       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
01808       raise SDOPackage.InternalError("get_sdo_type()")
01809     return ""
01810 
01811 
01812   ##
01813   # @if jp
01814   # 
01815   # @brief [SDO interface] SDO DeviceProfile リストの取得 
01816   #
01817   # SDO の DeviceProfile を返すオペレーション。 SDO がハードウエアデバイス
01818   # に関連付けられていない場合には、空の DeviceProfile が返される。
01819   # このオペレーションは以下の型の例外を発生させる。
01820   #
01821   # @param self
01822   #
01823   # @return    SDO DeviceProfile
01824   #
01825   # @exception SDONotExists ターゲットのSDOが存在しない。(本例外は、CORBA標準
01826   #                         システム例外のOBJECT_NOT_EXISTにマッピングされる)
01827   # @exception NotAvailable SDOは存在するが応答がない。
01828   # @exception InternalError 内部的エラーが発生した。
01829   #
01830   # @else
01831   #
01832   # @brief [SDO interface] Getting SDO DeviceProfile
01833   #
01834   # This operation returns the DeviceProfile of the SDO. If the SDO does not
01835   # represent any hardware device, then a DeviceProfile with empty values
01836   # are returned.
01837   # This operation throws SDOException with one of the following types.
01838   #
01839   # @return    The DeviceProfile of the SDO.
01840   #
01841   # @exception SDONotExists if the target SDO does not exist.(This exception 
01842   #                         is mapped to CORBA standard system exception
01843   #                         OBJECT_NOT_EXIST.)
01844   # @exception NotAvailable if the target SDO is reachable but cannot
01845   #                         respond.
01846   # @exception InternalError if the target SDO cannot execute the operation
01847   #                          completely due to some internal error.
01848   #
01849   # @endif
01850   # virtual SDOPackage::DeviceProfile* get_device_profile()
01851   def get_device_profile(self):
01852     self._rtcout.RTC_TRACE("get_device_profile()")
01853     try:
01854       return self._SdoConfigImpl.getDeviceProfile()
01855     except:
01856       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
01857       raise SDOPackage.InternalError("get_device_profile()")
01858 
01859     return SDOPackage.DeviceProfile("","","","",[])
01860 
01861 
01862   ##
01863   # @if jp
01864   # 
01865   # @brief [SDO interface] SDO ServiceProfile の取得 
01866   #
01867   # SDO が所有している Service の ServiceProfile を返すオペレーション。
01868   # SDO がサービスを一つも所有していない場合には、空のリストを返す。
01869   # このオペレーションは以下の型の例外を発生させる。
01870   #
01871   # @param self
01872   # 
01873   # @return    SDO が提供する全ての Service の ServiceProfile。
01874   # 
01875   # @exception SDONotExists ターゲットのSDOが存在しない。(本例外は、CORBA標準
01876   #                         システム例外のOBJECT_NOT_EXISTにマッピングされる)
01877   # @exception NotAvailable SDOは存在するが応答がない。
01878   # @exception InternalError 内部的エラーが発生した。
01879   #
01880   # @else
01881   #
01882   # @brief [SDO interface] Getting SDO ServiceProfile
01883   # 
01884   # This operation returns a list of ServiceProfiles that the SDO has.
01885   # If the SDO does not provide any service, then an empty list is returned.
01886   # This operation throws SDOException with one of the following types.
01887   # 
01888   # @return    List of ServiceProfiles of all the services the SDO is
01889   #            providing.
01890   # 
01891   # @exception SDONotExists if the target SDO does not exist.(This exception 
01892   #                         is mapped to CORBA standard system exception
01893   #                         OBJECT_NOT_EXIST.)
01894   # @exception NotAvailable if the target SDO is reachable but cannot
01895   #                         respond.
01896   # @exception InternalError if the target SDO cannot execute the operation
01897   #                          completely due to some internal error.
01898   #
01899   # @endif
01900   # virtual SDOPackage::ServiceProfileList* get_service_profiles()
01901   def get_service_profiles(self):
01902     self._rtcout.RTC_TRACE("get_service_profiles()")
01903     self._sdoSvcProfiles = self._SdoConfigImpl.getServiceProfiles()
01904     try:
01905       return self._sdoSvcProfiles
01906     except:
01907       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
01908       raise SDOPackage.InternalError("get_service_profiles()")
01909 
01910     return []
01911 
01912 
01913   ##
01914   # @if jp
01915   # 
01916   # @brief [SDO interface] 特定のServiceProfileの取得 
01917   #
01918   # 引数 "id" で指定された名前のサービスの ServiceProfile を返す。
01919   # 
01920   # @param     self
01921   # @param     _id SDO Service の ServiceProfile に関連付けられた識別子。
01922   # 
01923   # @return    指定された SDO Service の ServiceProfile。
01924   # 
01925   # @exception InvalidParameter "id" で指定した ServiceProfile が存在しない。
01926   #                             "id" が null。
01927   # @exception SDONotExists ターゲットのSDOが存在しない。(本例外は、CORBA標準
01928   #                         システム例外のOBJECT_NOT_EXISTにマッピングされる)
01929   # @exception NotAvailable SDOは存在するが応答がない。
01930   # @exception InternalError 内部的エラーが発生した。
01931   #
01932   # @else
01933   #
01934   # @brief [SDO interface] Getting Organizations
01935   #
01936   # This operation returns the ServiceProfile that is specified by the
01937   # argument "id."
01938   # 
01939   # @param     _id The identifier referring to one of the ServiceProfiles.
01940   # 
01941   # @return    The profile of the specified service.
01942   # 
01943   # @exception InvalidParameter if the ServiceProfile that is specified by 
01944   #                             the argument 'id' does not exist or if 'id'
01945   #                             is 'null.'
01946   # @exception SDONotExists if the target SDO does not exist.(This exception 
01947   #                         is mapped to CORBA standard system exception
01948   #                         OBJECT_NOT_EXIST.)
01949   # @exception NotAvailable If the target SDO is reachable but cannot
01950   #                         respond.
01951   # @exception InternalError If the target SDO cannot execute the operation
01952   #                          completely due to some internal error.
01953   #
01954   # @endif
01955   # virtual SDOPackage::ServiceProfile* get_service_profile(const char* id)
01956   def get_service_profile(self, _id):
01957     self._rtcout.RTC_TRACE("get_service_profile(%s)", _id)
01958     self._sdoSvcProfiles = self._SdoConfigImpl.getServiceProfiles()
01959     if not _id:
01960       raise SDOPackage.InvalidParameter("get_service_profile(): Empty name.")
01961 
01962     try:
01963       index = OpenRTM_aist.CORBA_SeqUtil.find(self._sdoSvcProfiles, self.svc_name(_id))
01964 
01965       if index < 0:
01966         raise SDOPackage.InvalidParameter("get_service_profile(): Not found")
01967 
01968       return self._sdoSvcProfiles[index]
01969     except:
01970       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
01971       raise SDOPackage.InternalError("get_service_profile()")
01972 
01973     return SDOPackage.ServiceProfile("", "", [], None)
01974 
01975 
01976   ##
01977   # @if jp
01978   # 
01979   # @brief [SDO interface] 指定された SDO Service の取得
01980   #
01981   # このオペレーションは引数 "id" で指定された名前によって区別される
01982   # SDO の Service へのオブジェクト参照を返す。 SDO により提供される
01983   # Service はそれぞれ一意の識別子により区別される。
01984   #
01985   # @param self
01986   # @param _id SDO Service に関連付けられた識別子。
01987   #
01988   # @return 要求された SDO Service への参照。
01989   #
01990   # 
01991   # @exception InvalidParameter "id" で指定した ServiceProfile が存在しない。
01992   #                             "id" が null。
01993   # @exception SDONotExists ターゲットのSDOが存在しない。(本例外は、CORBA標準
01994   #                         システム例外のOBJECT_NOT_EXISTにマッピングされる)
01995   # @exception NotAvailable SDOは存在するが応答がない。
01996   # @exception InternalError 内部的エラーが発生した。
01997   #
01998   # @else
01999   #
02000   # @brief [SDO interface] Getting specified SDO Service's reference
02001   #
02002   # This operation returns an object implementing an SDO's service that
02003   # is identified by the identifier specified as an argument. Different
02004   # services provided by an SDO are distinguished with different
02005   # identifiers. See OMG SDO specification Section 2.2.8, "ServiceProfile,"
02006   # on page 2-12 for more details.
02007   #
02008   # @param _id The identifier referring to one of the SDO Service
02009   # @return The object implementing the requested service.
02010   # @exception InvalidParameter if argument “id” is null, or if the 
02011   #                             ServiceProfile that is specified by argument
02012   #                            “id” does not exist.
02013   # @exception SDONotExists if the target SDO does not exist.(This exception 
02014   #                         is mapped to CORBA standard system exception
02015   #                         OBJECT_NOT_EXIST.)
02016   # @exception NotAvailable If the target SDO is reachable but cannot
02017   #                         respond.
02018   # @exception InternalError If the target SDO cannot execute the operation
02019   #                          completely due to some internal error.
02020   #
02021   # @endif
02022   # virtual SDOPackage::SDOService_ptr get_sdo_service(const char* id)
02023   def get_sdo_service(self, _id):
02024     self._rtcout.RTC_TRACE("get_sdo_service(%s)", _id)
02025     self._sdoSvcProfiles = self._SdoConfigImpl.getServiceProfiles()
02026 
02027     if not _id:
02028       raise SDOPackage.InvalidParameter("get_service(): Empty name.")
02029 
02030     index = OpenRTM_aist.CORBA_SeqUtil.find(self._sdoSvcProfiles, self.svc_name(_id))
02031 
02032     if index < 0:
02033       raise SDOPackage.InvalidParameter("get_service(): Not found")
02034 
02035     try:
02036       return self._sdoSvcProfiles[index].service
02037     except:
02038       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
02039       raise SDOPackage.InternalError("get_service()")
02040     return SDOPackage.SDOService._nil
02041 
02042 
02043   ##
02044   # @if jp
02045   # 
02046   # @brief [SDO interface] Configuration オブジェクトの取得 
02047   #
02048   # このオペレーションは Configuration interface への参照を返す。
02049   # Configuration interface は各 SDO を管理するためのインターフェースの
02050   # ひとつである。このインターフェースは DeviceProfile, ServiceProfile,
02051   # Organization で定義された SDO の属性値を設定するために使用される。
02052   # Configuration インターフェースの詳細については、OMG SDO specification
02053   # の 2.3.5節, p.2-24 を参照のこと。
02054   #
02055   # @param self
02056   #
02057   # @return SDO の Configuration インターフェースへの参照
02058   #
02059   # @exception InterfaceNotImplemented SDOはConfigurationインターフェースを
02060   #                                    持たない。
02061   # @exception SDONotExists ターゲットのSDOが存在しない。(本例外は、CORBA標準
02062   #                         システム例外のOBJECT_NOT_EXISTにマッピングされる)
02063   # @exception NotAvailable SDOは存在するが応答がない。
02064   # @exception InternalError 内部的エラーが発生した。
02065   #
02066   # @else
02067   #
02068   # @brief [SDO interface] Getting Configuration object
02069   #
02070   # This operation returns an object implementing the Configuration
02071   # interface. The Configuration interface is one of the interfaces that
02072   # each SDO maintains. The interface is used to configure the attributes
02073   # defined in DeviceProfile, ServiceProfile, and Organization.
02074   # See OMG SDO specification Section 2.3.5, "Configuration Interface,"
02075   # on page 2-24 for more details about the Configuration interface.
02076   #
02077   # @return The Configuration interface of an SDO.
02078   #
02079   # @exception InterfaceNotImplemented The target SDO has no Configuration
02080   #                                    interface.
02081   # @exception SDONotExists if the target SDO does not exist.(This exception 
02082   #                         is mapped to CORBA standard system exception
02083   #                         OBJECT_NOT_EXIST.)
02084   # @exception NotAvailable The target SDO is reachable but cannot respond.
02085   # @exception InternalError The target SDO cannot execute the operation
02086   #                          completely due to some internal error.
02087   # @endif
02088   # virtual SDOPackage::Configuration_ptr get_configuration()
02089   def get_configuration(self):
02090     self._rtcout.RTC_TRACE("get_configuration()")
02091     if self._SdoConfig is None:
02092       raise SODPackage.InterfaceNotImplemented("InterfaceNotImplemented: get_configuration")
02093     try:
02094       return self._SdoConfig
02095     except:
02096       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
02097       raise SDOPackage.InternalError("get_configuration()")
02098     return SDOPackage.Configuration._nil
02099 
02100 
02101   ##
02102   # @if jp
02103   # 
02104   # @brief [SDO interface] Monitoring オブジェクトの取得 
02105   #
02106   # このオペレーションは Monitoring interface への参照を返す。
02107   # Monitoring interface は SDO が管理するインターフェースの一つである。
02108   # このインターフェースは SDO のプロパティをモニタリングするために
02109   # 使用される。
02110   # Monitoring interface の詳細については OMG SDO specification の
02111   # 2.3.7節 "Monitoring Interface" p.2-35 を参照のこと。
02112   #
02113   # @param self
02114   #
02115   # @return SDO の Monitoring interface への参照
02116   #
02117   # @exception InterfaceNotImplemented SDOはConfigurationインターフェースを
02118   #                                    持たない。
02119   # @exception SDONotExists ターゲットのSDOが存在しない。(本例外は、CORBA標準
02120   #                         システム例外のOBJECT_NOT_EXISTにマッピングされる)
02121   # @exception NotAvailable SDOは存在するが応答がない。
02122   # @exception InternalError 内部的エラーが発生した。
02123   #
02124   # @else
02125   #
02126   # @brief [SDO interface] Get Monitoring object
02127   #
02128   # This operation returns an object implementing the Monitoring interface.
02129   # The Monitoring interface is one of the interfaces that each SDO
02130   # maintains. The interface is used to monitor the properties of an SDO.
02131   # See OMG SDO specification Section 2.3.7, "Monitoring Interface," on
02132   # page 2-35 for more details about the Monitoring interface.
02133   #
02134   # @return The Monitoring interface of an SDO.
02135   #
02136   # @exception InterfaceNotImplemented The target SDO has no Configuration
02137   #                                    interface.
02138   # @exception SDONotExists if the target SDO does not exist.(This exception 
02139   #                         is mapped to CORBA standard system exception
02140   #                         OBJECT_NOT_EXIST.)
02141   # @exception NotAvailable The target SDO is reachable but cannot respond.
02142   # @exception InternalError The target SDO cannot execute the operation
02143   #                          completely due to some internal error.
02144   # @endif
02145   # virtual SDOPackage::Monitoring_ptr get_monitoring()
02146   def get_monitoring(self):
02147     self._rtcout.RTC_TRACE("get_monitoring()")
02148     raise SDOPackage.InterfaceNotImplemented("Exception: get_monitoring")
02149     return SDOPackage.Monitoring._nil
02150 
02151 
02152   ##
02153   # @if jp
02154   # 
02155   # @brief [SDO interface] Organization リストの取得 
02156   #
02157   # SDO は0個以上の Organization (組織)に所属することができる。 もし SDO が
02158   # 1個以上の Organization に所属している場合、このオペレーションは所属する
02159   # Organization のリストを返す。SDO が どの Organization にも所属していない
02160   # 場合には、空のリストが返される。
02161   #
02162   # @param self
02163   #
02164   # @return SDO が所属する Organization のリスト。
02165   #
02166   # @exception SDONotExists ターゲットのSDOが存在しない。(本例外は、CORBA標準
02167   #                         システム例外のOBJECT_NOT_EXISTにマッピングされる)
02168   # @exception NotAvailable SDOは存在するが応答がない。
02169   # @exception InternalError 内部的エラーが発生した。
02170   # @else
02171   #
02172   # @brief [SDO interface] Getting Organizations
02173   #
02174   # An SDO belongs to zero or more organizations. If the SDO belongs to one
02175   # or more organizations, this operation returns the list of organizations
02176   # that the SDO belongs to. An empty list is returned if the SDO does not
02177   # belong to any Organizations.
02178   #
02179   # @return The list of Organizations that the SDO belong to.
02180   #
02181   # @exception SDONotExists if the target SDO does not exist.(This exception 
02182   #                         is mapped to CORBA standard system exception
02183   #                         OBJECT_NOT_EXIST.)
02184   # @exception NotAvailable The target SDO is reachable but cannot respond.
02185   # @exception InternalError The target SDO cannot execute the operation
02186   #                          completely due to some internal error.
02187   # @endif
02188   # virtual SDOPackage::OrganizationList* get_organizations()
02189   def get_organizations(self):
02190     self._rtcout.RTC_TRACE("get_organizations()")
02191     self._sdoOrganizations = self._SdoConfigImpl.getOrganizations()
02192     try:
02193       return self._sdoOrganizations
02194     except:
02195       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
02196       raise SDOPackage.InternalError("get_organizations()")
02197     return []
02198 
02199 
02200   ##
02201   # @if jp
02202   # 
02203   # @brief [SDO interface] SDO Status リストの取得 
02204   #
02205   # このオペレーションは SDO のステータスを表す NVList を返す。
02206   #
02207   # @param self
02208   #
02209   # @return SDO のステータス。
02210   #
02211   # @exception SDONotExists ターゲットのSDOが存在しない。(本例外は、CORBA標準
02212   #                         システム例外のOBJECT_NOT_EXISTにマッピングされる)
02213   # @exception NotAvailable SDOは存在するが応答がない。
02214   # @exception InternalError 内部的エラーが発生した。
02215   #
02216   # @else
02217   #
02218   # @brief [SDO interface] Get SDO Status
02219   #
02220   # This operation returns an NVlist describing the status of an SDO.
02221   #
02222   # @return The actual status of an SDO.
02223   #
02224   # @exception SDONotExists if the target SDO does not exist.(This exception 
02225   #                         is mapped to CORBA standard system exception
02226   #                         OBJECT_NOT_EXIST.)
02227   # @exception NotAvailable The target SDO is reachable but cannot respond.
02228   # @exception InternalError The target SDO cannot execute the operation
02229   #                          completely due to some internal error.
02230   #
02231   # @endif
02232   # virtual SDOPackage::NVList* get_status_list()
02233   def get_status_list(self):
02234     self._rtcout.RTC_TRACE("get_status_list()")
02235     try:
02236       return self._sdoStatus
02237     except:
02238       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
02239       raise SDOPackage.InternalError("get_status_list()")
02240     return []
02241 
02242 
02243   ##
02244   # @if jp
02245   # 
02246   # @brief [SDO interface] SDO Status の取得 
02247   #
02248   # This operation returns the value of the specified status parameter.
02249   #
02250   # @param self
02251   # @param name SDO のステータスを定義するパラメータ。
02252   # 
02253   # @return 指定されたパラメータのステータス値。
02254   # 
02255   # @exception SDONotExists ターゲットのSDOが存在しない。(本例外は、CORBA標準
02256   #                         システム例外のOBJECT_NOT_EXISTにマッピングされる)
02257   # @exception NotAvailable SDOは存在するが応答がない。
02258   # @exception InvalidParameter 引数 "name" が null あるいは存在しない。
02259   # @exception InternalError 内部的エラーが発生した。
02260   # @else
02261   #
02262   # @brief [SDO interface] Get SDO Status
02263   #
02264   # @param name One of the parameters defining the "status" of an SDO.
02265   #
02266   # @return The value of the specified status parameter.
02267   #
02268   # @exception SDONotExists if the target SDO does not exist.(This exception 
02269   #                         is mapped to CORBA standard system exception
02270   #                         OBJECT_NOT_EXIST.)
02271   # @exception NotAvailable The target SDO is reachable but cannot respond.
02272   # @exception InvalidParameter The parameter defined by "name" is null or
02273   #                             does not exist.
02274   # @exception InternalError The target SDO cannot execute the operation
02275   #                          completely due to some internal error.
02276   #
02277   #
02278   # @endif
02279   # virtual CORBA::Any* get_status(const char* name)
02280   def get_status(self, name):
02281     self._rtcout.RTC_TRACE("get_status(%s)", name)
02282     index = OpenRTM_aist.CORBA_SeqUtil.find(self._sdoStatus, self.nv_name(name))
02283     if index < 0:
02284       raise SDOPackage.InvalidParameter("get_status(): Not found")
02285 
02286     try:
02287       return any.to_any(self._sdoStatus[index].value)
02288     except:
02289       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
02290       raise SDOPackage.InternalError("get_status()")
02291     return any.to_any("")
02292 
02293 
02294   #============================================================
02295   # Local interfaces
02296   #============================================================
02297 
02298   ##
02299   # @if jp
02300   #
02301   # @brief [local interface] インスタンス名の取得
02302   # 
02303   # ComponentProfile に設定されたインスタンス名を返す。
02304   #
02305   # @param self
02306   # 
02307   # @return インスタンス名
02308   # 
02309   # @else
02310   # 
02311   # @endif
02312   # const char* getInstanceName()
02313   def getInstanceName(self):
02314     self._rtcout.RTC_TRACE("getInstanceName()")
02315     return self._profile.instance_name
02316 
02317 
02318   ##
02319   # @if jp
02320   #
02321   # @brief [local interface] インスタンス名の設定
02322   # 
02323   # ComponentProfile に指定されたインスタンス名を設定する。
02324   #
02325   # @param self
02326   # 
02327   # @param instance_name インスタンス名
02328   # 
02329   # @else
02330   # 
02331   # @endif
02332   # void setInstanceName(const char* instance_name);
02333   def setInstanceName(self, instance_name):
02334     self._rtcout.RTC_TRACE("setInstanceName(%s)", instance_name)
02335     self._properties.setProperty("instance_name",instance_name)
02336     self._profile.instance_name = self._properties.getProperty("instance_name")
02337 
02338 
02339   ##
02340   # @if jp
02341   #
02342   # @brief [local interface] 型名の取得
02343   # 
02344   # ComponentProfile に設定された型名を返す。
02345   #
02346   # @param self
02347   # 
02348   # @return 型名
02349   # 
02350   # @else
02351   # 
02352   # @endif
02353   # const char* getTypeName()
02354   def getTypeName(self):
02355     self._rtcout.RTC_TRACE("getTypeName()")
02356     return self._profile.type_name
02357 
02358 
02359   ##
02360   # @if jp
02361   #
02362   # @brief [local interface] Description の取得
02363   # 
02364   # ComponentProfile に設定された Description を返す。
02365   #
02366   # @param self
02367   # 
02368   # @return Description
02369   # 
02370   # @else
02371   # 
02372   # @endif
02373   # const char* getDescription()
02374   def getDescription(self):
02375     self._rtcout.RTC_TRACE("getDescription()")
02376     return self._profile.description
02377 
02378 
02379   ##
02380   # @if jp
02381   #
02382   # @brief [local interface] バージョン情報の取得
02383   # 
02384   # ComponentProfile に設定されたバージョン情報を返す。
02385   #
02386   # @param self
02387   # 
02388   # @return バージョン情報
02389   # 
02390   # @else
02391   # 
02392   # @endif
02393   # const char* getVersion()
02394   def getVersion(self):
02395     self._rtcout.RTC_TRACE("getVersion()")
02396     return self._profile.version
02397 
02398 
02399   ##
02400   # @if jp
02401   #
02402   # @brief [local interface] ベンダー情報の取得
02403   # 
02404   # ComponentProfile に設定されたベンダー情報を返す。
02405   #
02406   # @param self
02407   # 
02408   # @return ベンダー情報
02409   # 
02410   # @else
02411   # 
02412   # @endif
02413   # const char* getVendor()
02414   def getVendor(self):
02415     self._rtcout.RTC_TRACE("getVendor()")
02416     return self._profile.vendor
02417 
02418 
02419   ##
02420   # @if jp
02421   #
02422   # @brief [local interface] カテゴリ情報の取得
02423   # 
02424   # ComponentProfile に設定されたカテゴリ情報を返す。
02425   #
02426   # @param self
02427   # 
02428   # @return カテゴリ情報
02429   # 
02430   # @else
02431   # 
02432   # @endif
02433   # const char* getCategory()
02434   def getCategory(self):
02435     self._rtcout.RTC_TRACE("getCategory()")
02436     return self._profile.category
02437 
02438 
02439   ##
02440   # @if jp
02441   #
02442   # @brief [local interface] Naming Server 情報の取得
02443   # 
02444   # 設定された Naming Server 情報を返す。
02445   #
02446   # @param self
02447   # 
02448   # @return Naming Server リスト
02449   # 
02450   # @else
02451   # 
02452   # @endif
02453   # std::vector<std::string> getNamingNames();
02454   def getNamingNames(self):
02455     self._rtcout.RTC_TRACE("getNamingNames()")
02456     return [s.strip() for s in self._properties.getProperty("naming.names").split(",")]
02457 
02458 
02459   ##
02460   # @if jp
02461   #
02462   # @brief [local interface] オブジェクトリファレンスの設定
02463   # 
02464   # RTC の CORBA オブジェクトリファレンスを設定する。
02465   # 
02466   # @param self
02467   # @param rtobj オブジェクトリファレンス
02468   # 
02469   # @else
02470   # 
02471   # @endif
02472   # void setObjRef(const RTObject_ptr rtobj);
02473   def setObjRef(self, rtobj):
02474     self._rtcout.RTC_TRACE("setObjRef()")
02475     self._objref = rtobj
02476     return
02477 
02478 
02479   ##
02480   # @if jp
02481   #
02482   # @brief [local interface] オブジェクトリファレンスの取得
02483   # 
02484   # 設定された CORBA オブジェクトリファレンスを取得する。
02485   # 
02486   # @param self
02487   # 
02488   # @return オブジェクトリファレンス
02489   # 
02490   # @else
02491   # 
02492   # @endif
02493   # RTObject_ptr getObjRef() const;
02494   def getObjRef(self):
02495     self._rtcout.RTC_TRACE("getObjRef()")
02496     return self._objref
02497 
02498 
02499   ##
02500   # @if jp
02501   # 
02502   # @brief [local interface] RTC のプロパティを設定する
02503   #
02504   # RTC が保持すべきプロパティを設定する。与えられるプロパティは、
02505   # ComponentProfile 等に設定されるべき情報を持たなければならない。
02506   # このオペレーションは通常 RTC が初期化される際に Manager から
02507   # 呼ばれることを意図している。
02508   # 
02509   # @param self
02510   # @param prop RTC のプロパティ
02511   #
02512   # @else
02513   #
02514   # @brief [local interface] Set RTC property
02515   #
02516   # This operation sets the properties to the RTC. The given property
02517   # values should include information for ComponentProfile.
02518   # Generally, this operation is designed to be called from Manager, when
02519   # RTC is initialized
02520   #
02521   # @param prop Property for RTC.
02522   #
02523   # @endif
02524   # void setProperties(const coil::Properties& prop);
02525   def setProperties(self, prop):
02526     self._rtcout.RTC_TRACE("setProperties()")
02527     self._properties.mergeProperties(prop)
02528     self._profile.instance_name = self._properties.getProperty("instance_name")
02529     self._profile.type_name     = self._properties.getProperty("type_name")
02530     self._profile.description   = self._properties.getProperty("description")
02531     self._profile.version       = self._properties.getProperty("version")
02532     self._profile.vendor        = self._properties.getProperty("vendor")
02533     self._profile.category      = self._properties.getProperty("category")
02534 
02535 
02536   ##
02537   # @if jp
02538   # 
02539   # @brief [local interface] RTC のプロパティを取得する
02540   #
02541   # RTC が保持しているプロパティを返す。
02542   # RTCがプロパティを持たない場合は空のプロパティが返される。
02543   # 
02544   # @param self
02545   # 
02546   # @return RTC のプロパティ
02547   #
02548   # @else
02549   #
02550   # @brief [local interface] Get RTC property
02551   #
02552   # This operation returns the properties of the RTC.
02553   # Empty property would be returned, if RTC has no property.
02554   #
02555   # @return Property for RTC.
02556   #
02557   # @endif
02558   # coil::Properties& getProperties();
02559   def getProperties(self):
02560     self._rtcout.RTC_TRACE("getProperties()")
02561     return self._properties
02562 
02563 
02564   ##
02565   # @if jp
02566   #
02567   # @brief コンフィギュレーションパラメータの設定
02568   # 
02569   # コンフィギュレーションパラメータと変数をバインドする
02570   # <VarType>としてコンフィギュレーションパラメータのデータ型を指定する。
02571   #
02572   # @param self
02573   # @param param_name コンフィギュレーションパラメータ名
02574   # @param var コンフィギュレーションパラメータ格納用変数
02575   # @param def_val コンフィギュレーションパラメータデフォルト値
02576   # @param trans 文字列変換用関数(デフォルト値:None)
02577   #
02578   # @return 設定結果(設定成功:true,設定失敗:false)
02579   # 
02580   # @else
02581   #
02582   # @endif
02583   #  template <typename VarType>
02584   #  bool bindParameter(const char* param_name, VarType& var,
02585   #                     const char* def_val,
02586   #                     bool (*trans)(VarType&, const char*) = coil::stringTo)
02587   def bindParameter(self, param_name, var,
02588                     def_val, trans=None):
02589     self._rtcout.RTC_TRACE("bindParameter()")
02590     if trans is None:
02591       trans_ = OpenRTM_aist.stringTo
02592     else:
02593       trans_ = trans
02594     self._configsets.bindParameter(param_name, var, def_val, trans_)
02595     return True
02596 
02597 
02598   ##
02599   # @if jp
02600   #
02601   # @brief コンフィギュレーションパラメータの更新(ID指定)
02602   # 
02603   # 指定したIDのコンフィギュレーションセットに設定した値で、
02604   # コンフィギュレーションパラメータの値を更新する
02605   #
02606   # @param self
02607   # @param config_set 設定対象のコンフィギュレーションセットID
02608   # 
02609   # @else
02610   #
02611   # @endif
02612   # void updateParameters(const char* config_set);
02613   def updateParameters(self, config_set):
02614     self._rtcout.RTC_TRACE("updateParameters(%s)", config_set)
02615     self._configsets.update(config_set)
02616     return
02617 
02618 
02619   ##
02620   # @if jp
02621   # 
02622   # @brief [local interface] Port を登録する
02623   #
02624   # RTC が保持するPortを登録する。
02625   # Port を外部からアクセス可能にするためには、このオペレーションにより
02626   # 登録されていなければならない。登録される Port はこの RTC 内部において
02627   # PortProfile.name により区別される。したがって、Port は RTC 内において、
02628   # ユニークな PortProfile.name を持たなければならない。
02629   # 登録された Port は内部で適切にアクティブ化された後、その参照と
02630   # オブジェクト参照がリスト内に保存される。
02631   # 
02632   # @param self
02633   # @param port RTC に登録する Port
02634   # @param port_type if port is PortBase, port_type is None,
02635   #                  if port is PortService, port_type is True
02636   #
02637   # @else
02638   #
02639   # @brief [local interface] Register Port
02640   #
02641   # This operation registers a Port to be held by this RTC.
02642   # In order to enable access to the Port from outside of RTC, the Port
02643   # must be registered by this operation. The Port that is registered by
02644   # this operation would be identified by PortProfile.name in the inside of
02645   # RTC. Therefore, the Port should have unique PortProfile.name in the RTC.
02646   # The registering Port would be activated properly, and the reference
02647   # and the object reference would be stored in lists in RTC.
02648   #
02649   # @param port Port which is registered in the RTC
02650   #
02651   # @endif
02652   # void registerPort(PortBase& port);
02653   def registerPort(self, port):
02654     self._rtcout.RTC_TRACE("registerPort()")
02655     if not self.addPort(port):
02656       self._rtcout.RTC_ERROR("addPort(PortBase&) failed.")
02657     return
02658 
02659   # void registerPort(PortService_ptr port);
02660   # def registerPortByReference(self, port_ref):
02661   #   self._rtcout.RTC_TRACE("registerPortByReference()")
02662   #   self.addPortByReference(port_ref)
02663   #   return
02664 
02665   # new interface. since 1.0.0-RELEASE
02666   # void addPort(PortBase& port);
02667   def addPort(self, port):
02668     self._rtcout.RTC_TRACE("addPort()")
02669     if isinstance(port, OpenRTM_aist.CorbaPort):
02670       self._rtcout.RTC_TRACE("addPort(CorbaPort)")
02671       propkey = "port.corbaport."
02672       prop = self._properties.getNode(propkey)
02673       if prop:
02674         self._properties.getNode(propkey).mergeProperties(self._properties.getNode("port.corba"))
02675       port.init(self._properties.getNode(propkey))
02676       port.setOwner(self.getObjRef())
02677 
02678     elif isinstance(port, OpenRTM_aist.PortBase):
02679       self._rtcout.RTC_TRACE("addPort(PortBase)")
02680       port.setOwner(self.getObjRef())
02681       port.setPortConnectListenerHolder(self._portconnListeners)
02682       self.onAddPort(port.getPortProfile())
02683 
02684     elif isinstance(port, RTC._objref_PortService):
02685       self._rtcout.RTC_TRACE("addPort(PortService)")
02686     return self._portAdmin.addPort(port)
02687 
02688 
02689   # new interface. since 1.0.0-RELEASE
02690   # void addPort(PortService_ptr port);
02691   # def addPortByReference(self, port_ref):
02692   #   self._rtcout.RTC_TRACE("addPortByReference()")
02693   #   self._portAdmin.registerPortByReference(port_ref)
02694   #   return
02695     
02696 
02697   ##
02698   # @if jp
02699   # 
02700   # @brief [local interface] DataInPort を登録する
02701   #
02702   # RTC が保持する DataInPort を登録する。
02703   # Port のプロパティにデータポートであること("port.dataport")、
02704   # TCPを使用すること("tcp_any")を設定するとともに、 DataInPort の
02705   # インスタンスを生成し、登録する。
02706   # 
02707   # @param self
02708   # @param name port 名称
02709   # @param inport 登録対象 DataInPort
02710   #
02711   # @else
02712   #
02713   # @endif
02714   def registerInPort(self, name, inport):
02715     self._rtcout.RTC_TRACE("registerInPort(%s)", name)
02716     if not self.addInPort(name, inport):
02717       self._rtcout.RTC_ERROR("addInPort(%s) failed.", name)
02718     return
02719 
02720   # new interface. since 1.0.0-RELEASE
02721   def addInPort(self, name, inport):
02722     self._rtcout.RTC_TRACE("addInPort(%s)", name)
02723 
02724     propkey = "port.inport." + name
02725     prop_ = copy.copy(self._properties.getNode(propkey))
02726     prop_.mergeProperties(self._properties.getNode("port.inport.dataport"))
02727 
02728     ret = self.addPort(inport)
02729 
02730     if not ret:
02731       self._rtcout.RTC_ERROR("addInPort() failed.")
02732       return ret
02733       
02734     inport.init(self._properties.getNode(propkey))
02735     self._inports.append(inport)
02736     return ret
02737 
02738 
02739   ##
02740   # @if jp
02741   # 
02742   # @brief [local interface] DataOutPort を登録する
02743   #
02744   # RTC が保持する DataOutPor tを登録する。
02745   # Port のプロパティにデータポートであること("port.dataport")、
02746   # TCPを使用すること("tcp_any")を設定するとともに、 DataOutPort の
02747   # インスタンスを生成し、登録する。
02748   # 
02749   # @param self
02750   # @param name port 名称
02751   # @param outport 登録対象 DataInPort
02752   #
02753   # @else
02754   #
02755   # @endif
02756   # void registerOutPort(const char* name, OutPortBase& outport);
02757   def registerOutPort(self, name, outport):
02758     self._rtcout.RTC_TRACE("registerOutPort(%s)", name)
02759     if not self.addOutPort(name, outport):
02760       self._rtcout.RTC_ERROR("addOutPort(%s) failed.", name)
02761     return
02762 
02763   # new interface. since 1.0.0-RELEASE
02764   # void addOutPort(const char* name, OutPortBase& outport);
02765   def addOutPort(self, name, outport):
02766     self._rtcout.RTC_TRACE("addOutPort(%s)", name)
02767 
02768     propkey = "port.outport." + name
02769     prop_ = copy.copy(self._properties.getNode(propkey))
02770     prop_.mergeProperties(self._properties.getNode("port.outport.dataport"))
02771 
02772     ret = self.addPort(outport)
02773 
02774     if not ret:
02775       self._rtcout.RTC_ERROR("addOutPort() failed.")
02776       return ret
02777 
02778     outport.init(self._properties.getNode(propkey))
02779     self._outports.append(outport)
02780     return ret
02781 
02782 
02783   ##
02784   # @if jp
02785   # 
02786   # @brief [local interface] InPort の登録を削除する
02787   #
02788   # RTC が保持するInPortの登録を削除する。
02789   # 
02790   # @param port 削除対象 Port
02791   # @return 削除結果(削除成功:true,削除失敗:false)
02792   #
02793   # @else
02794   #
02795   # @brief [local interface] Unregister InPort
02796   #
02797   # This operation unregisters a InPort held by this RTC.
02798   #
02799   # @param port Port which is unregistered
02800   # @return Unregister result (Successful:true, Failed:false)
02801   #
02802   # @endif
02803   #
02804   # bool removeInPort(InPortBase& port);
02805   def removeInPort(self, port):
02806     self._rtcout.RTC_TRACE("removeInPort()")
02807     ret = self.removePort(inport)
02808 
02809     if ret:
02810       for inport in self._inports:
02811         if port == inport:
02812           try:
02813             self._inports.remove(port)
02814           except:
02815             self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
02816             
02817           return True
02818 
02819     return False
02820 
02821 
02822   ##
02823   # @if jp
02824   # 
02825   # @brief [local interface] OutPort の登録を削除する
02826   #
02827   # RTC が保持するOutPortの登録を削除する。
02828   # 
02829   # @param port 削除対象 Port
02830   # @return 削除結果(削除成功:true,削除失敗:false)
02831   #
02832   # @else
02833   #
02834   # @brief [local interface] Unregister OutPort
02835   #
02836   # This operation unregisters a OutPort held by this RTC.
02837   #
02838   # @param port Port which is unregistered
02839   # @return Unregister result (Successful:true, Failed:false)
02840   #
02841   # @endif
02842   #
02843   # bool removeOutPort(OutPortBase& port);
02844   def removeOutPort(self, port):
02845     self._rtcout.RTC_TRACE("removeOutPort()")
02846     ret = self.removePort(outport)
02847 
02848     if ret:
02849       for outport in self._outports:
02850         if port == outport:
02851           try:
02852             self._outports.remove(port)
02853           except:
02854             self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
02855             
02856           return True
02857 
02858     return False
02859 
02860 
02861   ##
02862   # @if jp
02863   # 
02864   # @brief [local interface] Port の登録を削除する
02865   #
02866   # RTC が保持するPortの登録を削除する。
02867   # 
02868   # @param self
02869   # @param port 削除対象 Port
02870   #
02871   # @else
02872   #
02873   # @brief [local interface] Unregister Port
02874   #
02875   # This operation unregisters a Port to be held by this RTC.
02876   #
02877   # @param port Port which is unregistered in the RTC
02878   #
02879   # @endif
02880   # void RTObject_impl::deletePort(PortBase& port)
02881   def deletePort(self, port):
02882     self._rtcout.RTC_TRACE("deletePort()")
02883     if not self.removePort(port):
02884       self._rtcout.RTC_ERROR("removePort() failed.")
02885     return
02886 
02887   # new interface. since 1.0.0-RELEASE
02888   def removePort(self, port):
02889     self._rtcout.RTC_TRACE("removePort()")
02890     if isinstance(port, OpenRTM_aist.PortBase) or isinstance(port, OpenRTM_aist.CorbaPort):
02891       self.onRemovePort(port.getPortProfile())
02892     return self._portAdmin.removePort(port)
02893 
02894 
02895   ##
02896   # @if jp
02897   # 
02898   # @brief [local interface] 名前指定により Port の登録を削除する
02899   #
02900   # 名称を指定して RTC が保持するPortの登録を削除する。
02901   # 
02902   # @param self
02903   # @param port_name 削除対象 Port 名
02904   #
02905   # @else
02906   #
02907   # @endif
02908   def deletePortByName(self, port_name):
02909     self._rtcout.RTC_TRACE("deletePortByName(%s)", port_name)
02910     self._portAdmin.deletePortByName(port_name)
02911     return
02912 
02913 
02914   ##
02915   # @if jp
02916   #
02917   # @brief [local interface] 実行コンテキストを取得する
02918   #
02919   # get_context() と同じ機能のローカル版。違いはない。
02920   # この関数は以下の関数内で呼ばれることを前提としている。
02921   #
02922   # - onStartup()
02923   # - onShutdown()
02924   # - onActivated()
02925   # - onDeactivated()
02926   # - onExecute()
02927   # - onAborting()
02928   # - onError()
02929   # - onReset()
02930   # - onStateUpdate()
02931   # - onRateChanged()
02932   # 
02933   # この関数の引数はこれらの関数の引数 UniquieID exec_handle でなけ
02934   # ればならない。
02935   # 
02936   # @param ec_id 上記関数の第1引数 exec_handle を渡す必要がある。
02937   # 
02938   # @else
02939   # 
02940   # @brief [local interface] Getting current execution context
02941   # 
02942   # This function is the local version of get_context(). completely
02943   # same as get_context() function. This function is assumed to be
02944   # called from the following functions.
02945   # 
02946   # - onStartup()
02947   # - onShutdown()
02948   # - onActivated()
02949   # - onDeactivated()
02950   # - onExecute()
02951   # - onAborting()
02952   # - onError()
02953   # - onReset()
02954   # - onStateUpdate()
02955   # - onRateChanged()
02956   # 
02957   # The argument of this function should be the first argument
02958   # (UniqueId ec_id) of the above functions.
02959   # 
02960   # @param ec_id The above functions' first argument "exec_handle."
02961   # 
02962   # @endif
02963   #
02964   # ExecutionContext_ptr getExecutionContext(RTC::UniqueId ec_id);
02965   def getExecutionContext(self, ec_id):
02966     return self.get_context(ec_id)
02967 
02968   ##
02969   # @if jp
02970   # 
02971   # @brief [local interface] 実行コンテキストの実行レートを取得する
02972   #
02973   # 現在実行中の実行コンテキストの実行レートを取得する。実行コンテキ
02974   # ストのKindがPERIODIC以外の場合の動作は未定義である。この関数は以
02975   # 下の関数内で呼ばれることを前提としている。
02976   #
02977   # - onStartup()
02978   # - onShutdown()
02979   # - onActivated()
02980   # - onDeactivated()
02981   # - onExecute()
02982   # - onAborting()
02983   # - onError()
02984   # - onReset()
02985   # - onStateUpdate()
02986   # - onRateChanged()
02987   #
02988   # この関数の引数はこれらの関数の引数 UniquieID exec_handle でなけ
02989   # ればならない。
02990   #
02991   # @param ec_id 上記関数の第1引数 exec_handle を渡す必要がある。
02992   #
02993   # @else
02994   # 
02995   # @brief [local interface] Getting current context' execution rate
02996   #
02997   # This function returns current execution rate in this
02998   # context. If this context's kind is not PERIODC, behavior is not
02999   # defined. This function is assumed to be called from the
03000   # following functions.
03001   #
03002   # - onStartup()
03003   # - onShutdown()
03004   # - onActivated()
03005   # - onDeactivated()
03006   # - onExecute()
03007   # - onAborting()
03008   # - onError()
03009   # - onReset()
03010   # - onStateUpdate()
03011   # - onRateChanged()
03012   #
03013   # The argument of this function should be the first argument
03014   # (UniqueId ec_id) of the above functions.
03015   #
03016   # @param ec_id The above functions' first argument "exec_handle."
03017   #
03018   # @endif
03019   #
03020   # double getExecutionRate(RTC::UniqueId ec_id);
03021   def getExecutionRate(self, ec_id):
03022     ec = self.getExecutionContext(ec_id)
03023     if CORBA.is_nil(ec):
03024       return 0.0
03025 
03026     return ec.get_rate()
03027 
03028 
03029   ##
03030   # @if jp
03031   # 
03032   # @brief [local interface] 実行コンテキストの実行レートを設定する
03033   #
03034   # 現在実行中の実行コンテキストの実行レートを設定する。実行コンテキ
03035   # ストのKindがPERIODIC以外の場合の動作は未定義である。この関数は以
03036   # 下の関数内で呼ばれることを前提としている。
03037   #
03038   # - onStartup()
03039   # - onShutdown()
03040   # - onActivated()
03041   # - onDeactivated()
03042   # - onExecute()
03043   # - onAborting()
03044   # - onError()
03045   # - onReset()
03046   # - onStateUpdate()
03047   # - onRateChanged()
03048   #
03049   # この関数の引数はこれらの関数の引数 UniquieID exec_handle でなけ
03050   # ればならない。
03051   #
03052   # @param ec_id 上記関数の第1引数 exec_handle を渡す必要がある。
03053   # @param rate 実行レートを [Hz] で与える
03054   #
03055   # @else
03056   # 
03057   # @brief [local interface] Setting current context' execution rate
03058   #
03059   # This function sets a execution rate in the context. If this
03060   # context's kind is not PERIODC, behavior is not defined. This
03061   # function is assumed to be called from the following functions.
03062   #
03063   # - onStartup()
03064   # - onShutdown()
03065   # - onActivated()
03066   # - onDeactivated()
03067   # - onExecute()
03068   # - onAborting()
03069   # - onError()
03070   # - onReset()
03071   # - onStateUpdate()
03072   # - onRateChanged()
03073   #
03074   # The argument of this function should be the first argument
03075   # (UniqueId ec_id) of the above functions.
03076   #
03077   # @param ec_id The above functions' first argument "exec_handle."
03078   # @param rate Execution rate in [Hz].
03079   #
03080   # @endif
03081   #
03082   # ReturnCode_t setExecutionRate(RTC::UniqueId ec_id, double rate);
03083   def setExecutionRate(self, ec_id, rate):
03084     ec = self.getExecutionContext(ec_id)
03085     if CORBA.is_nil(ec):
03086       return RTC.RTC_ERROR
03087     ec.set_rate(rate)
03088     return RTC.RTC_OK
03089 
03090 
03091   ##
03092   # @if jp
03093   # 
03094   # @brief [local interface] 実行コンテキストの所有権を調べる
03095   #
03096   # 現在実行中の実行コンテキストの所有権を調べる。この関数は以下の関
03097   # 数内で呼ばれることを前提としている。
03098   #
03099   # - onStartup()
03100   # - onShutdown()
03101   # - onActivated()
03102   # - onDeactivated()
03103   # - onExecute()
03104   # - onAborting()
03105   # - onError()
03106   # - onReset()
03107   # - onStateUpdate()
03108   # - onRateChanged()
03109   #
03110   # この関数の引数はこれらの関数の引数 UniquieID exec_handle でなけ
03111   # ればならない。
03112   #
03113   # @param ec_id 上記関数の第1引数 exec_handle を渡す必要がある。
03114   # @return true: 自身の実行コンテキスト、false: 他の実行コンテキスト
03115   #
03116   # @else
03117   # 
03118   # @brief [local interface] Checking if the current context is own context
03119   #
03120   # This function checks if the current context is own execution
03121   # context. This function is assumed to be called from the
03122   # following functions.
03123   #
03124   # - onStartup()
03125   # - onShutdown()
03126   # - onActivated()
03127   # - onDeactivated()
03128   # - onExecute()
03129   # - onAborting()
03130   # - onError()
03131   # - onReset()
03132   # - onStateUpdate()
03133   # - onRateChanged()
03134   #
03135   # The argument of this function should be the first argument
03136   # (UniqueId ec_id) of the above functions.
03137   #
03138   # @param ec_id The above functions' first argument "exec_handle."
03139   # @return true: Own context, false: other's context
03140   #
03141   # @endif
03142   #
03143   # bool isOwnExecutionContext(RTC::UniqueId ec_id);
03144   def isOwnExecutionContext(self, ec_id):
03145     global ECOTHER_OFFSET
03146     if ec_id < ECOTHER_OFFSET:
03147       return True
03148     return False
03149 
03150 
03151   ##
03152   # @if jp
03153   # 
03154   # @brief [local interface] 状態を Inactive に遷移させる
03155   #
03156   # 状態を Active から Inactive に遷移させる。この関数は以下の関
03157   # 数内で呼ばれることを前提としている。
03158   #
03159   # - onActivated()
03160   # - onExecute()
03161   # - onStateUpdate()
03162   #
03163   # この関数の引数は上記の関数の引数 UniquieID exec_handle でなけ
03164   # ればならない。
03165   #
03166   # @param ec_id 上記関数の第1引数 exec_handle を渡す必要がある。
03167   # @return リターンコード
03168   #
03169   # @else
03170   # 
03171   # @brief [local interface] Make transition to Inactive state
03172   #
03173   # This function makes transition from Active to Inactive
03174   # state. This function is assumed to be called from the following
03175   # functions.
03176   #
03177   # - onActivated()
03178   # - onExecute()
03179   # - onStateUpdate()
03180   #
03181   # The argument of this function should be the first argument
03182   # (UniqueId ec_id) of the above function.
03183   #
03184   # @param ec_id The above functions' first argument "exec_handle."
03185   # @return Return code
03186   #
03187   # @endif
03188   #
03189   # ReturnCode_t deactivate(RTC::UniqueId ec_id);
03190   def deactivate(self, ec_id):
03191     ec = self.getExecutionContext(ec_id)
03192     if CORBA.is_nil(ec):
03193       return RTC.RTC_ERROR
03194     return ec.deactivate_component(self.getObjRef())
03195 
03196 
03197   ##
03198   # @if jp
03199   # 
03200   # @brief [local interface] 状態を Active に遷移させる
03201   #
03202   # 状態を Inactive から Active に遷移させる。この関数は以下の関
03203   # 数内で呼ばれることを前提としている。
03204   #
03205   # - onStartup()
03206   # - onDeactivated()
03207   #
03208   # この関数の引数は上記の関数の引数 UniquieID exec_handle でなけ
03209   # ればならない。
03210   #
03211   # @param ec_id 上記関数の第1引数 exec_handle を渡す必要がある。
03212   # @return リターンコード
03213   #
03214   # @else
03215   # 
03216   # @brief [local interface] Make transition to Active state
03217   #
03218   # This function makes transition from Inactive to Active
03219   # state. This function is assumed to be called from the following
03220   # functions.
03221   #
03222   # - onStartup()
03223   # - onDeactivated()
03224   #
03225   # The argument of this function should be the first argument
03226   # (UniqueId ec_id) of the above function.
03227   #
03228   # @param ec_id The above functions' first argument "exec_handle."
03229   # @return Return code
03230   #
03231   # @endif
03232   #
03233   # ReturnCode_t activate(RTC::UniqueId ec_id);
03234   def activate(self, ec_id):
03235     ec = self.getExecutionContext(ec_id)
03236     if CORBA.is_nil(ec):
03237       return RTC.RTC_ERROR
03238     return ec.activate_component(self.getObjRef())
03239 
03240 
03241   ##
03242   # @if jp
03243   # 
03244   # @brief [local interface] 状態をリセットし Inactive に遷移させる
03245   #
03246   # 状態を Error から Inactive に遷移させる。この関数は以下の関
03247   # 数内で呼ばれることを前提としている。
03248   #
03249   # - onError()
03250   #
03251   # この関数の引数は上記の関数の引数 UniquieID exec_handle でなけ
03252   # ればならない。
03253   #
03254   # @param ec_id 上記関数の第1引数 exec_handle を渡す必要がある。
03255   # @return リターンコード
03256   #
03257   # @else
03258   # 
03259   # @brief [local interface] Resetting and go to Inactive state
03260   #
03261   # This function reset RTC and makes transition from Error to Inactive
03262   # state. This function is assumed to be called from the following
03263   # functions.
03264   #
03265   # - onError()
03266   #
03267   # The argument of this function should be the first argument
03268   # (UniqueId ec_id) of the above function.
03269   #
03270   # @param ec_id The above functions' first argument "exec_handle."
03271   # @return Return code
03272   #
03273   # @endif
03274   #
03275   # ReturnCode_t reset(RTC::UniqueId ec_id);
03276   def reset(self, ec_id):
03277     ec = self.getExecutionContext(ec_id)
03278     if CORBA.is_nil(ec):
03279       return RTC.RTC_ERROR
03280     return ec.reset_component(self.getObjRef())
03281     
03282 
03283   ##
03284   # @if jp
03285   # @brief [local interface] SDO service provider をセットする
03286   # @else
03287   # @brief [local interface] Set a SDO service provider
03288   # @endif
03289   #
03290   # bool addSdoServiceProvider(const SDOPackage::ServiceProfile& prof,
03291   #                            SdoServiceProviderBase* provider);
03292   def addSdoServiceProvider(self, prof, provider):
03293     return self._sdoservice.addSdoServiceProvider(prof, provider)
03294 
03295 
03296   ##
03297   # @if jp
03298   # @brief [local interface] SDO service provider を削除する
03299   # @else
03300   # @brief [local interface] Remove a SDO service provider
03301   # @endif
03302   #
03303   # bool removeSdoServiceProvider(const char* id);
03304   def removeSdoServiceProvider(self, id):
03305     return self._sdoservice.removeSdoServiceProvider(id)
03306 
03307 
03308   ##
03309   # @if jp
03310   # @brief [local interface] SDO service consumer をセットする
03311   # @else
03312   # @brief [local interface] Set a SDO service consumer
03313   # @endif
03314   #
03315   # bool addSdoServiceConsumer(const SDOPackage::ServiceProfile& prof);
03316   def addSdoServiceConsumer(self, prof):
03317     return self._sdoservice.addSdoServiceConsumer(prof)
03318 
03319 
03320   ##
03321   # @if jp
03322   # @brief [local interface] SDO service consumer を削除する
03323   # @else
03324   # @brief [local interface] Remove a SDO service consumer
03325   # @endif
03326   #
03327   # bool removeSdoServiceConsumer(const char* id);
03328   def removeSdoServiceConsumer(self, id):
03329     return self._sdoservice.removeSdoServiceConsumer(id)
03330 
03331 
03332   ##
03333   # @if jp
03334   #
03335   # @brief 全 InPort のデータを読み込む。
03336   #
03337   # RTC が保持する全ての InPort のデータを読み込む。
03338   #
03339   # @return 読み込み結果(全ポートの読み込み成功:true,失敗:false)
03340   #
03341   # @else
03342   #
03343   # @brief Readout the value from All InPorts.
03344   #
03345   # This operation read the value from all InPort
03346   # registered in the RTC.
03347   #
03348   # @return result (Successful:true, Failed:false)
03349   #
03350   # @endif
03351   #
03352   # bool readAll();
03353   def readAll(self):
03354     self._rtcout.RTC_TRACE("readAll()")
03355     ret = True
03356     for inport in self._inports:
03357       if not inport.read():
03358         self._rtcout.RTC_DEBUG("The error occurred in readAll().")
03359         ret = False
03360         if not self._readAllCompletion:
03361           return False
03362 
03363     return ret
03364 
03365 
03366   ##
03367   # @if jp
03368   #
03369   # @brief 全 OutPort のwrite()メソッドをコールする。
03370   #
03371   # RTC が保持する全ての OutPort のwrite()メソッドをコールする。
03372   #
03373   # @return 読み込み結果(全ポートへの書き込み成功:true,失敗:false)
03374   #
03375   # @else
03376   #
03377   # @brief The write() method of all OutPort is called. 
03378   #
03379   # This operation call the write() method of all OutPort
03380   # registered in the RTC.
03381   #
03382   # @return result (Successful:true, Failed:false)
03383   #
03384   # @endif
03385   #
03386   # bool writeAll();
03387   def writeAll(self):
03388     self._rtcout.RTC_TRACE("writeAll()")
03389     ret = True
03390     for outport in self._outports:
03391       if not outport.write():
03392         self._rtcout.RTC_DEBUG("The error occurred in writeAll().")
03393         ret = False
03394         if not self._writeAllCompletion:
03395           return False
03396 
03397     return ret
03398 
03399 
03400   ##
03401   # @if jp
03402   #
03403   # @brief onExecute()実行前でのreadAll()メソッドの呼出を有効または無効にする。
03404   #
03405   # このメソッドをパラメータをtrueとして呼ぶ事により、onExecute()実行前に
03406   # readAll()が呼出されるようになる。
03407   # パラメータがfalseの場合は、readAll()呼出を無効にする。
03408   #
03409   # @param read(default:true) 
03410   #        (readAll()メソッド呼出あり:true, readAll()メソッド呼出なし:false)
03411   #
03412   # @param completion(default:false) 
03413   #    readAll()にて、どれかの一つのInPortのread()が失敗しても全てのInPortのread()を呼び出す:true,
03414   #    readAll()にて、どれかの一つのInPortのread()が失敗した場合、すぐにfalseで抜ける:false
03415   #
03416   # @else
03417   #
03418   # @brief Set whether to execute the readAll() method. 
03419   #
03420   # Set whether to execute the readAll() method. 
03421   #
03422   # @param read(default:true)
03423   #        (readAll() is called:true, readAll() isn't called:false)
03424   #
03425   # @param completion(default:false)
03426   #     All InPort::read() calls are completed.:true,
03427   #     If one InPort::read() is False, return false.:false
03428   #
03429   # @param completion(default:false)
03430   #
03431   # @endif
03432   #
03433   # void setReadAll(bool read=true, bool completion=false);
03434   def setReadAll(self, read=True, completion=False):
03435     self._readAll = read
03436     self._readAllCompletion = completion
03437 
03438 
03439   ##
03440   # @if jp
03441   #
03442   # @brief onExecute()実行後にwriteAll()メソッドの呼出を有効または無効にする。
03443   #
03444   # このメソッドをパラメータをtrueとして呼ぶ事により、onExecute()実行後に
03445   # writeAll()が呼出されるようになる。
03446   # パラメータがfalseの場合は、writeAll()呼出を無効にする。
03447   #
03448   # @param write(default:true) 
03449   #        (writeAll()メソッド呼出あり:true, writeAll()メソッド呼出なし:false)
03450   #
03451   # @param completion(default:false) 
03452   #    writeAll()にて、どれかの一つのOutPortのwrite()が失敗しても全てのOutPortのwrite()を呼び出しを行う:true,
03453   #    writeAll()にて、どれかの一つのOutPortのwrite()が失敗した場合、すぐにfalseで抜ける:false
03454   #
03455   # @else
03456   #
03457   # @brief Set whether to execute the writeAll() method. 
03458   #
03459   # Set whether to execute the writeAll() method. 
03460   #
03461   # @param write(default:true)
03462   #        (writeAll() is called:true, writeAll() isn't called:false)
03463   #
03464   # @param completion(default:false)
03465   #     All OutPort::write() calls are completed.:true,
03466   #     If one OutPort::write() is False, return false.:false
03467   #
03468   # @endif
03469   #
03470   # void setWriteAll(bool write=true, bool completion=false);
03471   def setWriteAll(self, write=True, completion=False):
03472     self._writeAll = write
03473     self._writeAllCompletion = completion
03474 
03475 
03476   ##
03477   # @if jp
03478   #
03479   # @brief 全 Port の登録を削除する
03480   #
03481   # RTC が保持する全ての Port を削除する。
03482   # 
03483   # @param self
03484   #
03485   # @else
03486   #
03487   # @brief Unregister the All Portse
03488   #
03489   # This operation deactivates the all Port and deletes the all Port's
03490   # registrations in the RTC..
03491   #
03492   # @endif
03493   def finalizePorts(self):
03494     self._rtcout.RTC_TRACE("finalizePorts()")
03495     self._portAdmin.finalizePorts()
03496     self._inports = []
03497     self._outports = []
03498     return
03499 
03500 
03501   def finalizeContexts(self):
03502     self._rtcout.RTC_TRACE("finalizeContexts()")
03503     len_ = len(self._eclist)
03504     for i in range(len_):
03505       idx = (len_ - 1) - i
03506       self._eclist[idx].stop()
03507       try:
03508         self._poa.deactivate_object(self._poa.servant_to_id(self._eclist[idx]))
03509       except:
03510         self._rtcout.RTC_TRACE(OpenRTM_aist.Logger.print_exception())
03511       del self._eclist[idx]
03512 
03513     if self._eclist:
03514       self._eclist = []
03515     return
03516 
03517 
03518   ##
03519   # @if jp
03520   # @brief PreComponentActionListener リスナを追加する
03521   #
03522   # ComponentAction 実装関数の呼び出し直前のイベントに関連する各種リ
03523   # スナを設定する。
03524   #
03525   # 設定できるリスナのタイプとコールバックイベントは以下の通り
03526   #
03527   # - PRE_ON_INITIALIZE:    onInitialize 直前
03528   # - PRE_ON_FINALIZE:      onFinalize 直前
03529   # - PRE_ON_STARTUP:       onStartup 直前
03530   # - PRE_ON_SHUTDOWN:      onShutdown 直前
03531   # - PRE_ON_ACTIVATED:     onActivated 直前
03532   # - PRE_ON_DEACTIVATED:   onDeactivated 直前
03533   # - PRE_ON_ABORTING:       onAborted 直前
03534   # - PRE_ON_ERROR:         onError 直前
03535   # - PRE_ON_RESET:         onReset 直前
03536   # - PRE_ON_EXECUTE:       onExecute 直前
03537   # - PRE_ON_STATE_UPDATE:  onStateUpdate 直前
03538   #
03539   # リスナは PreComponentActionListener を継承し、以下のシグニチャを持つ
03540   # operator() を実装している必要がある。
03541   #
03542   # PreComponentActionListener::operator()(UniqueId ec_id)
03543   #
03544   # デフォルトでは、この関数に与えたリスナオブジェクトの所有権は
03545   # RTObjectに移り、RTObject解体時もしくは、
03546   # removePreComponentActionListener() により削除時に自動的に解体される。
03547   # リスナオブジェクトの所有権を呼び出し側で維持したい場合は、第3引
03548   # 数に false を指定し、自動的な解体を抑制することができる。
03549   #
03550   # @param listener_type リスナタイプ
03551   # @param memfunc 関数オブジェクト
03552   # @param autoclean リスナオブジェクトの自動的解体を行うかどうかのフラグ
03553   #
03554   # @else
03555   # @brief Adding PreComponentAction type listener
03556   #
03557   # This operation adds certain listeners related to ComponentActions
03558   # pre events.
03559   # The following listener types are available.
03560   #
03561   # - PRE_ON_INITIALIZE:    before onInitialize
03562   # - PRE_ON_FINALIZE:      before onFinalize
03563   # - PRE_ON_STARTUP:       before onStartup
03564   # - PRE_ON_SHUTDOWN:      before onShutdown
03565   # - PRE_ON_ACTIVATED:     before onActivated
03566   # - PRE_ON_DEACTIVATED:   before onDeactivated
03567   # - PRE_ON_ABORTING:       before onAborted
03568   # - PRE_ON_ERROR:         before onError
03569   # - PRE_ON_RESET:         before onReset
03570   # - PRE_ON_EXECUTE:       before onExecute
03571   # - PRE_ON_STATE_UPDATE:  before onStateUpdate
03572   #
03573   # Listeners should have the following function operator().
03574   #
03575   # PreComponentActionListener::operator()(UniqueId ec_id)
03576   #
03577   # The ownership of the given listener object is transferred to
03578   # this RTObject object in default.  The given listener object will
03579   # be destroied automatically in the RTObject's dtor or if the
03580   # listener is deleted by removePreComponentActionListener() function.
03581   # If you want to keep ownership of the listener object, give
03582   # "false" value to 3rd argument to inhibit automatic destruction.
03583   #
03584   # @param listener_type A listener type
03585   # @param memfunc  member function object
03586   # @param autoclean A flag for automatic listener destruction
03587   #
03588   # @endif
03589   #
03590   # template <class Listener>
03591   # PreComponentActionListener*
03592   # addPreComponentActionListener(PreCompActionListenerType listener_type,
03593   #                               void (Listener::*memfunc)(UniqueId ec_id),
03594   #                               bool autoclean = true)
03595   def addPreComponentActionListener(self, listener_type,
03596                                     memfunc, autoclean = True):
03597     class Noname(OpenRTM_aist.PreComponentActionListener):
03598       def __init__(self, memfunc):
03599         self._memfunc = memfunc
03600 
03601       def __call__(self, ec_id):
03602         self._memfunc(ec_id)
03603         return
03604 
03605     listener = Noname(memfunc)
03606     self._actionListeners.preaction_[listener_type].addListener(listener, autoclean)
03607     return listener
03608 
03609 
03610   ##
03611   # @if jp
03612   # @brief PreComponentActionListener リスナを削除する
03613   #
03614   # 設定した各種リスナを削除する。
03615   # 
03616   # @param listener_type リスナタイプ
03617   # @param listener リスナオブジェクトへのポインタ
03618   #
03619   # @else
03620   # @brief Removing PreComponentAction type listener
03621   #
03622   # This operation removes a specified listener.
03623   #     
03624   # @param listener_type A listener type
03625   # @param listener A pointer to a listener object
03626   #
03627   # @endif
03628   #
03629   # void 
03630   # removePreComponentActionListener(PreComponentActionListenerType listener_type,
03631   #                                  PreComponentActionListener* listener);
03632   def removePreComponentActionListener(self, listener_type, listener):
03633     self._actionListeners.preaction_[listener_type].removeListener(listener)
03634     return
03635 
03636 
03637   ##
03638   # @if jp
03639   # @brief PostComponentActionListener リスナを追加する
03640   #
03641   # ComponentAction 実装関数の呼び出し直後のイベントに関連する各種リ
03642   # スナを設定する。
03643   #
03644   # 設定できるリスナのタイプとコールバックイベントは以下の通り
03645   #
03646   # - POST_ON_INITIALIZE:    onInitialize 直後
03647   # - POST_ON_FINALIZE:      onFinalize 直後
03648   # - POST_ON_STARTUP:       onStartup 直後
03649   # - POST_ON_SHUTDOWN:      onShutdown 直後
03650   # - POST_ON_ACTIVATED:     onActivated 直後
03651   # - POST_ON_DEACTIVATED:   onDeactivated 直後
03652   # - POST_ON_ABORTING:       onAborted 直後
03653   # - POST_ON_ERROR:         onError 直後
03654   # - POST_ON_RESET:         onReset 直後
03655   # - POST_ON_EXECUTE:       onExecute 直後
03656   # - POST_ON_STATE_UPDATE:  onStateUpdate 直後
03657   #
03658   # リスナは PostComponentActionListener を継承し、以下のシグニチャを持つ
03659   # operator() を実装している必要がある。
03660   #
03661   # PostComponentActionListener::operator()(UniqueId ec_id, ReturnCode_t ret)
03662   #
03663   # デフォルトでは、この関数に与えたリスナオブジェクトの所有権は
03664   # RTObjectに移り、RTObject解体時もしくは、
03665   # removePostComponentActionListener() により削除時に自動的に解体される。
03666   # リスナオブジェクトの所有権を呼び出し側で維持したい場合は、第3引
03667   # 数に false を指定し、自動的な解体を抑制することができる。
03668   #
03669   # @param listener_type リスナタイプ
03670   # @param memfunc 関数オブジェクト
03671   # @param autoclean リスナオブジェクトの自動的解体を行うかどうかのフラグ
03672   #
03673   # @else
03674   # @brief Adding PostComponentAction type listener
03675   #
03676   # This operation adds certain listeners related to ComponentActions
03677   # post events.
03678   # The following listener types are available.
03679   #
03680   # - POST_ON_INITIALIZE:    after onInitialize
03681   # - POST_ON_FINALIZE:      after onFinalize
03682   # - POST_ON_STARTUP:       after onStartup
03683   # - POST_ON_SHUTDOWN:      after onShutdown
03684   # - POST_ON_ACTIVATED:     after onActivated
03685   # - POST_ON_DEACTIVATED:   after onDeactivated
03686   # - POST_ON_ABORTING:       after onAborted
03687   # - POST_ON_ERROR:         after onError
03688   # - POST_ON_RESET:         after onReset
03689   # - POST_ON_EXECUTE:       after onExecute
03690   # - POST_ON_STATE_UPDATE:  after onStateUpdate
03691   #
03692   # Listeners should have the following function operator().
03693   #
03694   # PostComponentActionListener::operator()(UniqueId ec_id, ReturnCode_t ret)
03695   #
03696   # The ownership of the given listener object is transferred to
03697   # this RTObject object in default.  The given listener object will
03698   # be destroied automatically in the RTObject's dtor or if the
03699   # listener is deleted by removePostComponentActionListener() function.
03700   # If you want to keep ownership of the listener object, give
03701   # "false" value to 3rd argument to inhibit automatic destruction.
03702   #
03703   # @param listener_type A listener type
03704   # @param memfunc  member function object
03705   # @param autoclean A flag for automatic listener destruction
03706   #
03707   # @endif
03708   #
03709   # template <class Listener>
03710   # PostComponentActionListener*
03711   # addPostComponentActionListener(PostCompActionListenerType listener_type,
03712   #                                void (Listener::*memfunc)(UniqueId ec_id,
03713   #                                                          ReturnCode_t ret),
03714   #                                bool autoclean = true)
03715   def addPostComponentActionListener(self, listener_type,
03716                                      memfunc, autoclean = True):
03717     class Noname(OpenRTM_aist.PostComponentActionListener):
03718       def __init__(self, memfunc):
03719         self._memfunc = memfunc
03720         return
03721       def __call__(self, ec_id, ret):
03722         self._memfunc(ec_id, ret)
03723         return
03724       
03725     listener = Noname(memfunc)
03726     self._actionListeners.postaction_[listener_type].addListener(listener, autoclean)
03727     return listener
03728 
03729 
03730   ##
03731   # @if jp
03732   # @brief PostComponentActionListener リスナを削除する
03733   #
03734   # 設定した各種リスナを削除する。
03735   # 
03736   # @param listener_type リスナタイプ
03737   # @param listener リスナオブジェクトへのポインタ
03738   #
03739   # @else
03740   # @brief Removing PostComponentAction type listener
03741   #
03742   # This operation removes a specified listener.
03743   #     
03744   # @param listener_type A listener type
03745   # @param listener A pointer to a listener object
03746   #
03747   # @endif
03748   ##
03749   # void 
03750   # removePostComponentActionListener(PostComponentActionListenerType listener_type,
03751   #                                   PostComponentActionListener* listener);
03752   def removePostComponentActionListener(self, listener_type, listener):
03753     self._actionListeners.postaction_[listener_type].removeListener(listener)
03754     return
03755 
03756 
03757   ##
03758   # @if jp
03759   # @brief PortActionListener リスナを追加する
03760   #
03761   # Portの追加、削除時にコールバックされる各種リスナを設定する。
03762   #
03763   # 設定できるリスナのタイプとコールバックイベントは以下の通り
03764   #
03765   # - ADD_PORT:    Port追加時
03766   # - REMOVE_PORT: Port削除時
03767   #
03768   # リスナは PortActionListener を継承し、以下のシグニチャを持つ
03769   # operator() を実装している必要がある。
03770   #
03771   # PortActionListener::operator()(PortProfile& pprof)
03772   #
03773   # デフォルトでは、この関数に与えたリスナオブジェクトの所有権は
03774   # RTObjectに移り、RTObject解体時もしくは、
03775   # removePortActionListener() により削除時に自動的に解体される。
03776   # リスナオブジェクトの所有権を呼び出し側で維持したい場合は、第3引
03777   # 数に false を指定し、自動的な解体を抑制することができる。
03778   #
03779   # @param listener_type リスナタイプ
03780   # @param memfunc 関数オブジェクト
03781   # @param autoclean リスナオブジェクトの自動的解体を行うかどうかのフラグ
03782   #
03783   # @else
03784   # @brief Adding PortAction type listener
03785   #
03786   # This operation adds certain listeners related to ComponentActions
03787   # post events.
03788   # The following listener types are available.
03789   #
03790   # - ADD_PORT:    At adding Port
03791   # - REMOVE_PORT: At removing Port
03792   #
03793   # Listeners should have the following function operator().
03794   #
03795   # PortActionListener::operator()(RTC::PortProfile pprof)
03796   #
03797   # The ownership of the given listener object is transferred to
03798   # this RTObject object in default.  The given listener object will
03799   # be destroied automatically in the RTObject's dtor or if the
03800   # listener is deleted by removePortActionListener() function.
03801   # If you want to keep ownership of the listener object, give
03802   # "false" value to 3rd argument to inhibit automatic destruction.
03803   #
03804   # @param listener_type A listener type
03805   # @param memfunc  member function object
03806   # @param autoclean A flag for automatic listener destruction
03807   #
03808   # @endif
03809   #
03810   # template <class Listener>
03811   # PortActionListener*
03812   # addPortActionListener(PortActionListenerType listener_type,
03813   #                       void (Listener::*memfunc)(const RTC::PortProfile&),
03814   #                       bool autoclean=true)
03815   def addPortActionListener(self, listener_type,
03816                             memfunc, autoclean = True):
03817     class Noname(OpenRTM_aist.PortActionListener):
03818       def __init__(self, memfunc):
03819         self._memfunc = memfunc
03820         return
03821 
03822       def __call__(self, pprofile):
03823         self._memfunc(pprofile)
03824         return
03825 
03826     listener = Noname(memfunc)
03827     self._actionListeners.portaction_[listener_type].addListener(listener, autoclean)
03828     return listener
03829 
03830 
03831   ##
03832   # @if jp
03833   # @brief PortActionListener リスナを削除する
03834   #
03835   # 設定した各種リスナを削除する。
03836   # 
03837   # @param listener_type リスナタイプ
03838   # @param listener リスナオブジェクトへのポインタ
03839   #
03840   # @else
03841   # @brief Removing PortAction type listener
03842   #
03843   # This operation removes a specified listener.
03844   #     
03845   # @param listener_type A listener type
03846   # @param listener A pointer to a listener object
03847   #
03848   # @endif
03849   # void 
03850   # removePortActionListener(PortActionListenerType listener_type,
03851   #                          PortActionListener* listener);
03852   def removePortActionListener(self, listener_type, listener):
03853     self._actionListeners.portaction_[listener_type].removeListener(listener)
03854     return
03855 
03856 
03857   ##
03858   # @if jp
03859   # @brief ExecutionContextActionListener リスナを追加する
03860   #
03861   # ExecutionContextの追加、削除時にコールバックされる各種リスナを設定する。
03862   #
03863   # 設定できるリスナのタイプとコールバックイベントは以下の通り
03864   #
03865   # - ATTACH_EC:    ExecutionContext アタッチ時
03866   # - DETACH_EC:    ExecutionContext デタッチ時
03867   #
03868   # リスナは ExecutionContextActionListener を継承し、以下のシグニチャを持つ
03869   # operator() を実装している必要がある。
03870   #
03871   # ExecutionContextActionListener::operator()(UniqueId ec_id)
03872   #
03873   # デフォルトでは、この関数に与えたリスナオブジェクトの所有権は
03874   # RTObjectに移り、RTObject解体時もしくは、
03875   # removeExecutionContextActionListener() により削除時に自動的に解体される。
03876   # リスナオブジェクトの所有権を呼び出し側で維持したい場合は、第3引
03877   # 数に false を指定し、自動的な解体を抑制することができる。
03878   #
03879   # @param listener_type リスナタイプ
03880   # @param memfunc 関数オブジェクト
03881   # @param autoclean リスナオブジェクトの自動的解体を行うかどうかのフラグ
03882   #
03883   # @else
03884   # @brief Adding ExecutionContextAction type listener
03885   #
03886   # This operation adds certain listeners related to ComponentActions
03887   # post events.
03888   # The following listener types are available.
03889   #
03890   # - ADD_PORT:    At adding ExecutionContext
03891   # - REMOVE_PORT: At removing ExecutionContext
03892   #
03893   # Listeners should have the following function operator().
03894   #
03895   # ExecutionContextActionListener::operator()(UniqueId ec_id)
03896   #
03897   # The ownership of the given listener object is transferred to
03898   # this RTObject object in default.  The given listener object will
03899   # be destroied automatically in the RTObject's dtor or if the
03900   # listener is deleted by removeExecutionContextActionListener() function.
03901   # If you want to keep ownership of the listener object, give
03902   # "false" value to 3rd argument to inhibit automatic destruction.
03903   #
03904   # @param listener_type A listener type
03905   # @param memfunc  member function object
03906   # @param autoclean A flag for automatic listener destruction
03907   #
03908   # @endif
03909   #
03910   # template <class Listener>
03911   # ECActionListener*
03912   # addExecutionContextActionListener(ECActionListenerType listener_type,
03913   #                                   void (Listener::*memfunc)(UniqueId),
03914   #                                   bool autoclean = true);
03915   def addExecutionContextActionListener(self, listener_type,
03916                                         memfunc, autoclean = True):
03917     class Noname(OpenRTM_aist.ExecutionContextActionListener):
03918       def __init__(self, memfunc):
03919         self._memfunc = memfunc
03920         return
03921 
03922       def __call__(self, ec_id):
03923         self._memfunc(ec_id)
03924         return
03925 
03926     listener = Noname(memfunc)
03927     self._actionListeners.ecaction_[listener_type].addListener(listener, autoclean)
03928     return listener
03929     
03930 
03931   ##
03932   # @if jp
03933   # @brief ExecutionContextActionListener リスナを削除する
03934   #
03935   # 設定した各種リスナを削除する。
03936   # 
03937   # @param listener_type リスナタイプ
03938   # @param listener リスナオブジェクトへのポインタ
03939   #
03940   # @else
03941   # @brief Removing ExecutionContextAction type listener
03942   #
03943   # This operation removes a specified listener.
03944   #     
03945   # @param listener_type A listener type
03946   # @param listener A pointer to a listener object
03947   #
03948   # @endif
03949   #
03950   # void 
03951   # removeExecutionContextActionListener(ECActionListenerType listener_type,
03952   #                                      ECActionListener* listener);
03953   def removeExecutionContextActionListener(self, listener_type, listener):
03954     self._actionListeners.ecaction_[listener_type].removeListener(listener)
03955     return
03956 
03957 
03958   ##
03959   # @if jp
03960   # @brief PortConnectListener リスナを追加する
03961   #
03962   # Portの接続時や接続解除時に呼び出される各種リスナを設定する。
03963   #
03964   # 設定できるリスナのタイプとコールバックイベントは以下の通り
03965   #
03966   # - ON_NOTIFY_CONNECT: notify_connect() 関数内呼び出し直後
03967   # - ON_NOTIFY_DISCONNECT: notify_disconnect() 呼び出し直後
03968   # - ON_UNSUBSCRIBE_INTERFACES: notify_disconnect() 内のIF購読解除時
03969   #
03970   # リスナは PortConnectListener を継承し、以下のシグニチャを持つ
03971   # operator() を実装している必要がある。
03972   #
03973   # PortConnectListener::operator()(const char*, ConnectorProfile)
03974   #
03975   # デフォルトでは、この関数に与えたリスナオブジェクトの所有権は
03976   # RTObjectに移り、RTObject解体時もしくは、
03977   # removePortConnectListener() により削除時に自動的に解体される。
03978   # リスナオブジェクトの所有権を呼び出し側で維持したい場合は、第3引
03979   # 数に false を指定し、自動的な解体を抑制することができる。
03980   #
03981   # @param listener_type リスナタイプ
03982   # @param memfunc 関数オブジェクト
03983   # @param autoclean リスナオブジェクトの自動的解体を行うかどうかのフラグ
03984   #
03985   # @else
03986   # @brief Adding PortConnect type listener
03987   #
03988   # This operation adds certain listeners related to Port's connect actions.
03989   # The following listener types are available.
03990   #
03991   # - ON_NOTIFY_CONNECT: right after entering into notify_connect()
03992   # - ON_NOTIFY_DISCONNECT: right after entering into notify_disconnect()
03993   # - ON_UNSUBSCRIBE_INTERFACES: unsubscribing IF in notify_disconnect()
03994   #
03995   # Listeners should have the following function operator().
03996   #
03997   # PortConnectListener::operator()(const char*, ConnectorProfile)
03998   #
03999   # The ownership of the given listener object is transferred to
04000   # this RTObject object in default.  The given listener object will
04001   # be destroied automatically in the RTObject's dtor or if the
04002   # listener is deleted by removePortConnectListener() function.
04003   # If you want to keep ownership of the listener object, give
04004   # "false" value to 3rd argument to inhibit automatic destruction.
04005   #
04006   # @param listener_type A listener type
04007   # @param memfunc  member function object
04008   # @param autoclean A flag for automatic listener destruction
04009   #
04010   # @endif
04011   #
04012   # template <class Listener>
04013   # PortConnectListener*
04014   # addPortConnectListener(PortConnectListenerType listener_type,
04015   #                        void (Listener::*memfunc)(const char*,
04016   #                                                  ConnectorProfile&),
04017   #                        bool autoclean = true)
04018   def addPortConnectListener(self, listener_type,
04019                              memfunc, autoclean = True):
04020     class Noname(OpenRTM_aist.PortConnectListener):
04021       def __init__(self, memfunc):
04022         self._memfunc = memfunc
04023         return
04024 
04025       def __call__(self, portname, cprofile):
04026         self._memfunc(portname, cprofile)
04027         return
04028 
04029     listener = Noname(memfunc)
04030     self._portconnListeners.portconnect_[listener_type].addListener(listener, autoclean)
04031     return listener
04032     
04033 
04034   ##
04035   # @if jp
04036   # @brief PortConnectListener リスナを削除する
04037   #
04038   # 設定した各種リスナを削除する。
04039   # 
04040   # @param listener_type リスナタイプ
04041   # @param listener リスナオブジェクトへのポインタ
04042   #
04043   # @else
04044   # @brief Removing PortConnect type listener
04045   #
04046   # This operation removes a specified listener.
04047   #     
04048   # @param listener_type A listener type
04049   # @param listener A pointer to a listener object
04050   #
04051   # @endif
04052   #
04053   # void 
04054   # removePortConnectListener(PortConnectListenerType listener_type,
04055   #                           PortConnectListener* listener);
04056   def removePortConnectListener(self, listener_type, listener):
04057     self._portconnListeners.portconnect_[listener_type].removeListener(listener)
04058     return
04059 
04060 
04061   ##
04062   # @if jp
04063   # @brief PortConnectRetListener リスナを追加する
04064   #
04065   # Portの接続時や接続解除時に呼び出される各種リスナを設定する。
04066   #
04067   # 設定できるリスナのタイプとコールバックイベントは以下の通り
04068   #
04069   # - ON_CONNECT_NEXTPORT: notify_connect() 中のカスケード呼び出し直後
04070   # - ON_SUBSCRIBE_INTERFACES: notify_connect() 中のインターフェース購読直後
04071   # - ON_CONNECTED: nofity_connect() 接続処理完了時に呼び出される
04072   # - ON_DISCONNECT_NEXT: notify_disconnect() 中にカスケード呼び出し直後
04073   # - ON_DISCONNECTED: notify_disconnect() リターン時
04074   #
04075   # リスナは PortConnectRetListener を継承し、以下のシグニチャを持つ
04076   # operator() を実装している必要がある。
04077   #
04078   # PortConnectRetListener::operator()(const char*, ConnectorProfile)
04079   #
04080   # デフォルトでは、この関数に与えたリスナオブジェクトの所有権は
04081   # RTObjectに移り、RTObject解体時もしくは、
04082   # removePortConnectRetListener() により削除時に自動的に解体される。
04083   # リスナオブジェクトの所有権を呼び出し側で維持したい場合は、第3引
04084   # 数に false を指定し、自動的な解体を抑制することができる。
04085   #
04086   # @param listener_type リスナタイプ
04087   # @param memfunc 関数オブジェクト
04088   # @param autoclean リスナオブジェクトの自動的解体を行うかどうかのフラグ
04089   #
04090   # @else
04091   # @brief Adding PortConnectRet type listener
04092   #
04093   # This operation adds certain listeners related to Port's connect actions.
04094   # The following listener types are available.
04095   #
04096   # - ON_CONNECT_NEXTPORT: after cascade-call in notify_connect()
04097   # - ON_SUBSCRIBE_INTERFACES: after IF subscribing in notify_connect()
04098   # - ON_CONNECTED: completed nofity_connect() connection process
04099   # - ON_DISCONNECT_NEXT: after cascade-call in notify_disconnect()
04100   # - ON_DISCONNECTED: completed notify_disconnect() disconnection process
04101   #
04102   # Listeners should have the following function operator().
04103   #
04104   # PortConnectRetListener::operator()(const char*, ConnectorProfile)
04105   #
04106   # The ownership of the given listener object is transferred to
04107   # this RTObject object in default.  The given listener object will
04108   # be destroied automatically in the RTObject's dtor or if the
04109   # listener is deleted by removePortConnectRetListener() function.
04110   # If you want to keep ownership of the listener object, give
04111   # "false" value to 3rd argument to inhibit automatic destruction.
04112   #
04113   # @param listener_type A listener type
04114   # @param memfunc  member function object
04115   # @param autoclean A flag for automatic listener destruction
04116   #
04117   # @endif
04118   #
04119   # template <class Listener>
04120   # PortConnectRetListener*
04121   # addPortConnectRetListener(PortConnectRetListenerType listener_type,
04122   #                           void (Listener::*memfunc)(const char*,
04123   #                                                     ConnectorProfile&,
04124   #                                                     ReturnCode_t))
04125   def addPortConnectRetListener(self, listener_type,
04126                                 memfunc, autoclean = True):
04127     class Noname(OpenRTM_aist.PortConnectRetListener):
04128       def __init__(self, memfunc):
04129         self._memfunc = memfunc
04130         return
04131 
04132       def __call__(self, portname, cprofile, ret):
04133         self._memfunc(portname, cprofile, ret)
04134         return
04135 
04136     listener = Noname(memfunc)
04137     self._portconnListeners.portconnret_[listener_type].addListener(listener, autoclean)
04138     return listener
04139     
04140 
04141   ##
04142   # @if jp
04143   # @brief PortConnectRetListener リスナを削除する
04144   #
04145   # 設定した各種リスナを削除する。
04146   # 
04147   # @param listener_type リスナタイプ
04148   # @param listener リスナオブジェクトへのポインタ
04149   #
04150   # @else
04151   # @brief Removing PortConnectRet type listener
04152   #
04153   # This operation removes a specified listener.
04154   #     
04155   # @param listener_type A listener type
04156   # @param listener A pointer to a listener object
04157   #
04158   # @endif
04159   #
04160   # void 
04161   # removePortConnectRetListener(PortConnectRetListenerType listener_type,
04162   #                              PortConnectRetListener* listener);
04163   def removePortConnectRetListener(self, listener_type, listener):
04164     self._portconnListeners.portconnret_[listener_type].removeListener(listener)
04165     return
04166 
04167 
04168   ##
04169   # @if jp
04170   #
04171   # @brief ConfigurationParamListener を追加する
04172   #
04173   # update(const char* config_set, const char* config_param) が呼ばれた際に
04174   # コールされるリスナ ConfigurationParamListener を追加する。
04175   # type には現在のところ ON_UPDATE_CONFIG_PARAM のみが入る。
04176   #
04177   # @param type ConfigurationParamListenerType型の値。
04178   #             ON_UPDATE_CONFIG_PARAM がある。
04179   #
04180   # @param memfunc 関数オブジェクト
04181   # @param autoclean リスナオブジェクトを自動で削除するかどうかのフラグ
04182   # 
04183   # @else
04184   #
04185   # @brief Adding ConfigurationParamListener 
04186   # 
04187   # This function adds a listener object which is called when
04188   # update(const char* config_set, const char* config_param) is
04189   # called. In the type argument, currently only
04190   # ON_UPDATE_CONFIG_PARAM is allowed.
04191   #
04192   # @param type ConfigurationParamListenerType value
04193   #             ON_UPDATE_CONFIG_PARAM is only allowed.
04194   #
04195   # @param memfunc  member function object
04196   # @param autoclean a flag whether if the listener object autocleaned.
04197   #
04198   # @endif
04199   #
04200   # template <class Listener>
04201   # ConfigurationParamListener*
04202   # addConfigurationParamListener(ConfigurationParamListenerType listener_type,
04203   #                               void (Listener::*memfunc)(const char*,
04204   #                                                         const char*),
04205   #                               bool autoclean = true)
04206   def addConfigurationParamListener(self, type,
04207                                     memfunc, autoclean = True):
04208     class Noname(OpenRTM_aist.ConfigurationParamListener):
04209       def __init__(self, memfunc):
04210         self._memfunc = memfunc
04211         return
04212 
04213       def __call__(self, config_set_name, config_param_name):
04214         self._memfunc(config_set_name, config_param_name)
04215         return
04216 
04217     listener = Noname(memfunc)
04218     self._configsets.addConfigurationParamListener(type, listener, autoclean)
04219     return listener
04220 
04221 
04222   ##
04223   # @if jp
04224   #
04225   # @brief ConfigurationParamListener を削除する
04226   #
04227   # addConfigurationParamListener で追加されたリスナオブジェクトを削除する。
04228   #
04229   # @param type ConfigurationParamListenerType型の値。
04230   #             ON_UPDATE_CONFIG_PARAM がある。
04231   # @param listener 与えたリスナオブジェクトへのポインタ
04232   # 
04233   # @else
04234   #
04235   # @brief Removing ConfigurationParamListener 
04236   # 
04237   # This function removes a listener object which is added by
04238   # addConfigurationParamListener() function.
04239   #
04240   # @param type ConfigurationParamListenerType value
04241   #             ON_UPDATE_CONFIG_PARAM is only allowed.
04242   # @param listener a pointer to ConfigurationParamListener listener object.
04243   #
04244   # @endif
04245   #
04246   # void removeConfigurationParamListener(ConfigurationParamListenerType type,
04247   #                                       ConfigurationParamListener* listener);
04248   def removeConfigurationParamListener(self, type, listener):
04249     self._configsets.removeConfigurationParamListener(type, listener)
04250     return
04251     
04252 
04253   ##
04254   # @if jp
04255   #
04256   # @brief ConfigurationSetListener を追加する
04257   #
04258   # ConfigurationSet が更新されたときなどに呼ばれるリスナ
04259   # ConfigurationSetListener を追加する。設定可能なイベントは以下の
04260   # 2種類がある。
04261   #
04262   # - ON_SET_CONFIG_SET: setConfigurationSetValues() で
04263   #                      ConfigurationSet に値が設定された場合。
04264   # - ON_ADD_CONFIG_SET: addConfigurationSet() で新しい
04265   #                      ConfigurationSet が追加された場合。
04266   #
04267   # @param type ConfigurationSetListenerType型の値。
04268   # @param memfunc 関数オブジェクト
04269   # @param autoclean リスナオブジェクトを自動で削除するかどうかのフラグ
04270   # 
04271   # @else
04272   #
04273   # @brief Adding ConfigurationSetListener 
04274   # 
04275   # This function add a listener object which is called when
04276   # ConfigurationSet is updated. Available events are the followings.
04277   #
04278   # @param type ConfigurationSetListenerType value
04279   # @param memfunc  member function object
04280   # @param autoclean a flag whether if the listener object autocleaned.
04281   #
04282   # @endif
04283   #
04284   # template <class Listener>
04285   # ConfigurationSetListener*
04286   # addConfigurationSetListener(ConfigurationSetListenerType listener_type,
04287   #                             void (Listener::*memfunc)
04288   #                             (const coil::Properties& config_set))
04289   def addConfigurationSetListener(self, listener_type,
04290                                   memfunc, autoclean = True):
04291     class Noname(OpenRTM_aist.ConfigurationSetListener):
04292       def __init__(self, memfunc):
04293         self._memfunc = memfunc
04294         return
04295 
04296       def __call__(self, config_set):
04297         self._memfunc(config_set)
04298         return
04299 
04300     listener = Noname(memfunc)
04301     self._configsets.addConfigurationSetListener(listener_type, listener, autoclean)
04302     return listener
04303 
04304 
04305   ##
04306   # @if jp
04307   #
04308   # @brief ConfigurationSetListener を削除する
04309   #
04310   # addConfigurationSetListener で追加されたリスナオブジェクトを削除する。
04311   #
04312   # @param type ConfigurationSetListenerType型の値。
04313   # @param listener 与えたリスナオブジェクトへのポインタ
04314   # 
04315   # @else
04316   #
04317   # @brief Removing ConfigurationSetListener 
04318   # 
04319   # This function removes a listener object which is added by
04320   # addConfigurationSetListener() function.
04321   #
04322   # @param type ConfigurationSetListenerType value
04323   # @param listener a pointer to ConfigurationSetListener listener object.
04324   #
04325   # @endif
04326   #
04327   # void removeConfigurationSetListener(ConfigurationSetListenerType type,
04328   #                                     ConfigurationSetListener* listener);
04329   def removeConfigurationSetListener(self, type, listener):
04330     self._configsets.removeConfigurationSetListener(type, listener)
04331     return
04332 
04333 
04334   ##
04335   # @if jp
04336   #
04337   # @brief ConfigurationSetNameListener を追加する
04338   #
04339   # ConfigurationSetName が更新されたときなどに呼ばれるリスナ
04340   # ConfigurationSetNameListener を追加する。設定可能なイベントは以下の
04341   # 3種類がある。
04342   #
04343   # - ON_UPDATE_CONFIG_SET: ある ConfigurationSet がアップデートされた
04344   # - ON_REMOVE_CONFIG_SET: ある ConfigurationSet が削除された
04345   # - ON_ACTIVATE_CONFIG_SET: ある ConfigurationSet がアクティブ化された
04346   #
04347   # @param type ConfigurationSetNameListenerType型の値。
04348   # @param memfunc 関数オブジェクト
04349   # @param autoclean リスナオブジェクトを自動で削除するかどうかのフラグ
04350   # 
04351   # @else
04352   #
04353   # @brief Adding ConfigurationSetNameListener 
04354   # 
04355   # This function add a listener object which is called when
04356   # ConfigurationSetName is updated. Available events are the followings.
04357   #
04358   # - ON_UPDATE_CONFIG_SET: A ConfigurationSet has been updated.
04359   # - ON_REMOVE_CONFIG_SET: A ConfigurationSet has been deleted.
04360   # - ON_ACTIVATE_CONFIG_SET: A ConfigurationSet has been activated.
04361   #
04362   # @param type ConfigurationSetNameListenerType value
04363   # @param memfunc  member function object
04364   # @param autoclean a flag whether if the listener object autocleaned.
04365   #
04366   # @endif
04367   #
04368   # template <class Listener>
04369   # ConfigurationSetNameListener*
04370   # addConfigurationSetNameListener(ConfigurationSetNameListenerType type,
04371   #                                 void (Listener::*memfunc)(const char*))
04372   def addConfigurationSetNameListener(self, type, memfunc, autoclean = True):
04373     class Noname(OpenRTM_aist.ConfigurationSetNameListener):
04374       def __init__(self, memfunc):
04375         self._memfunc = memfunc
04376         return
04377 
04378       def __call__(self, config_set_name):
04379         self._memfunc(config_set_name)
04380         return
04381 
04382     listener = Noname(memfunc)
04383     self._configsets.addConfigurationSetNameListener(type, listener, autoclean)
04384     return listener
04385 
04386 
04387   ##
04388   # @if jp
04389   #
04390   # @brief ConfigurationSetNameListener を削除する
04391   #
04392   # addConfigurationSetNameListener で追加されたリスナオブジェクトを
04393   # 削除する。
04394   #
04395   # @param type ConfigurationSetNameListenerType型の値。
04396   #             ON_UPDATE_CONFIG_PARAM がある。
04397   # @param listener 与えたリスナオブジェクトへのポインタ
04398   # 
04399   # @else
04400   #
04401   # @brief Removing ConfigurationSetNameListener 
04402   # 
04403   # This function removes a listener object which is added by
04404   # addConfigurationSetNameListener() function.
04405   #
04406   # @param type ConfigurationSetNameListenerType value
04407   #             ON_UPDATE_CONFIG_PARAM is only allowed.
04408   # @param listener a pointer to ConfigurationSetNameListener
04409   #             listener object.
04410   #
04411   # @endif
04412   # void
04413   # removeConfigurationSetNameListener(ConfigurationSetNameListenerType type,
04414   #                                    ConfigurationSetNameListener* listener);
04415   def removeConfigurationSetNameListener(self, type, listener):
04416     self._configsets.removeConfigurationSetNameListener(type, listener)
04417     return
04418 
04419 
04420   ##
04421   # @if jp
04422   #
04423   # @brief RTC を終了する
04424   #
04425   # RTC の終了処理を実行する。
04426   # 保持している全 Port の登録を解除するとともに、該当する CORBA オブジェクト
04427   # を非活性化し、RTC を終了する。
04428   # 
04429   # @param self
04430   #
04431   # @else
04432   #
04433   # @endif
04434   def shutdown(self):
04435     self._rtcout.RTC_TRACE("shutdown()")
04436     try:
04437       self.finalizePorts()
04438       self.finalizeContexts()
04439       self._poa.deactivate_object(self._poa.servant_to_id(self._SdoConfigImpl))
04440       self._poa.deactivate_object(self._poa.servant_to_id(self))
04441     except:
04442       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
04443 
04444     if self._manager:
04445       self._rtcout.RTC_DEBUG("Cleanup on Manager")
04446       self._manager.notifyFinalized(self)
04447 
04448     return
04449 
04450   # inline void preOnInitialize(UniqueId ec_id)
04451   def preOnInitialize(self, ec_id):
04452     self._actionListeners.preaction_[OpenRTM_aist.PreComponentActionListenerType.PRE_ON_INITIALIZE].notify(ec_id)
04453     return
04454 
04455   # inline void preOnFinalize(UniqueId ec_id)
04456   def preOnFinalize(self, ec_id):
04457     self._actionListeners.preaction_[OpenRTM_aist.PreComponentActionListenerType.PRE_ON_FINALIZE].notify(ec_id)
04458     return
04459 
04460   # inline void preOnStartup(UniqueId ec_id)
04461   def preOnStartup(self, ec_id):
04462     self._actionListeners.preaction_[OpenRTM_aist.PreComponentActionListenerType.PRE_ON_STARTUP].notify(ec_id)
04463     return
04464 
04465   # inline void preOnShutdown(UniqueId ec_id)
04466   def preOnShutdown(self, ec_id):
04467     self._actionListeners.preaction_[OpenRTM_aist.PreComponentActionListenerType.PRE_ON_SHUTDOWN].notify(ec_id)
04468     return
04469 
04470   # inline void preOnActivated(UniqueId ec_id)
04471   def preOnActivated(self, ec_id):
04472     self._actionListeners.preaction_[OpenRTM_aist.PreComponentActionListenerType.PRE_ON_ACTIVATED].notify(ec_id)
04473     return
04474 
04475   # inline void preOnDeactivated(UniqueId ec_id)
04476   def preOnDeactivated(self, ec_id):
04477     self._actionListeners.preaction_[OpenRTM_aist.PreComponentActionListenerType.PRE_ON_DEACTIVATED].notify(ec_id)
04478     return
04479 
04480   # inline void preOnAborting(UniqueId ec_id)
04481   def preOnAborting(self, ec_id):
04482     self._actionListeners.preaction_[OpenRTM_aist.PreComponentActionListenerType.PRE_ON_ABORTING].notify(ec_id)
04483     return
04484 
04485   # inline void preOnError(UniqueId ec_id)
04486   def preOnError(self, ec_id):
04487     self._actionListeners.preaction_[OpenRTM_aist.PreComponentActionListenerType.PRE_ON_ERROR].notify(ec_id)
04488     return
04489 
04490   # inline void preOnReset(UniqueId ec_id)
04491   def preOnReset(self, ec_id):
04492     self._actionListeners.preaction_[OpenRTM_aist.PreComponentActionListenerType.PRE_ON_RESET].notify(ec_id)
04493     return
04494 
04495   # inline void preOnExecute(UniqueId ec_id)
04496   def preOnExecute(self, ec_id):
04497     self._actionListeners.preaction_[OpenRTM_aist.PreComponentActionListenerType.PRE_ON_EXECUTE].notify(ec_id)
04498     return
04499 
04500   # inline void preOnStateUpdate(UniqueId ec_id)
04501   def preOnStateUpdate(self, ec_id):
04502     self._actionListeners.preaction_[OpenRTM_aist.PreComponentActionListenerType.PRE_ON_STATE_UPDATE].notify(ec_id)
04503     return
04504     
04505 
04506   # inline void preOnRateChanged(UniqueId ec_id)
04507   def preOnRateChanged(self, ec_id):
04508     self._actionListeners.preaction_[OpenRTM_aist.PreComponentActionListenerType.PRE_ON_RATE_CHANGED].notify(ec_id)
04509     return
04510     
04511 
04512   # inline void postOnInitialize(UniqueId ec_id, ReturnCode_t ret)
04513   def postOnInitialize(self, ec_id, ret):
04514     self._actionListeners.postaction_[OpenRTM_aist.PostComponentActionListenerType.POST_ON_INITIALIZE].notify(ec_id, ret)
04515     return
04516     
04517 
04518   # inline void postOnFinalize(UniqueId ec_id, ReturnCode_t ret)
04519   def postOnFinalize(self, ec_id, ret):
04520     self._actionListeners.postaction_[OpenRTM_aist.PostComponentActionListenerType.POST_ON_FINALIZE].notify(ec_id, ret)
04521     return
04522     
04523 
04524   # inline void postOnStartup(UniqueId ec_id, ReturnCode_t ret)
04525   def postOnStartup(self, ec_id, ret):
04526     self._actionListeners.postaction_[OpenRTM_aist.PostComponentActionListenerType.POST_ON_STARTUP].notify(ec_id, ret)
04527     return
04528     
04529 
04530   # inline void postOnShutdown(UniqueId ec_id, ReturnCode_t ret)
04531   def postOnShutdown(self, ec_id, ret):
04532     self._actionListeners.postaction_[OpenRTM_aist.PostComponentActionListenerType.POST_ON_SHUTDOWN].notify(ec_id, ret)
04533     return
04534     
04535 
04536   # inline void postOnActivated(UniqueId ec_id, ReturnCode_t ret)
04537   def postOnActivated(self, ec_id, ret):
04538     self._actionListeners.postaction_[OpenRTM_aist.PostComponentActionListenerType.POST_ON_ACTIVATED].notify(ec_id, ret)
04539     return
04540     
04541 
04542   # inline void postOnDeactivated(UniqueId ec_id, ReturnCode_t ret)
04543   def postOnDeactivated(self, ec_id, ret):
04544     self._actionListeners.postaction_[OpenRTM_aist.PostComponentActionListenerType.POST_ON_DEACTIVATED].notify(ec_id, ret)
04545     return
04546     
04547 
04548   # inline void postOnAborting(UniqueId ec_id, ReturnCode_t ret)
04549   def postOnAborting(self, ec_id, ret):
04550     self._actionListeners.postaction_[OpenRTM_aist.PostComponentActionListenerType.POST_ON_ABORTING].notify(ec_id, ret)
04551     return
04552     
04553 
04554   # inline void postOnError(UniqueId ec_id, ReturnCode_t ret)
04555   def postOnError(self, ec_id, ret):
04556     self._actionListeners.postaction_[OpenRTM_aist.PostComponentActionListenerType.POST_ON_ERROR].notify(ec_id, ret)
04557     return
04558     
04559 
04560   # inline void postOnReset(UniqueId ec_id, ReturnCode_t ret)
04561   def postOnReset(self, ec_id, ret):
04562     self._actionListeners.postaction_[OpenRTM_aist.PostComponentActionListenerType.POST_ON_RESET].notify(ec_id, ret)
04563     return
04564     
04565 
04566   # inline void postOnExecute(UniqueId ec_id, ReturnCode_t ret)
04567   def postOnExecute(self, ec_id, ret):
04568     self._actionListeners.postaction_[OpenRTM_aist.PostComponentActionListenerType.POST_ON_EXECUTE].notify(ec_id, ret)
04569     return
04570     
04571 
04572   # inline void postOnStateUpdate(UniqueId ec_id, ReturnCode_t ret)
04573   def postOnStateUpdate(self, ec_id, ret):
04574     self._actionListeners.postaction_[OpenRTM_aist.PostComponentActionListenerType.POST_ON_STATE_UPDATE].notify(ec_id, ret)
04575     return
04576     
04577 
04578   # inline void postOnRateChanged(UniqueId ec_id, ReturnCode_t ret)
04579   def postOnRateChanged(self, ec_id, ret):
04580     self._actionListeners.postaction_[OpenRTM_aist.PostComponentActionListenerType.POST_ON_RATE_CHANGED].notify(ec_id, ret)
04581     return
04582     
04583 
04584   # inline void onAddPort(const PortProfile& pprof)
04585   def onAddPort(self, pprof):
04586     self._actionListeners.portaction_[OpenRTM_aist.PortActionListenerType.ADD_PORT].notify(pprof)
04587     return
04588     
04589     
04590   # inline void onRemovePort(const PortProfile& pprof)
04591   def onRemovePort(self, pprof):
04592     self._actionListeners.portaction_[OpenRTM_aist.PortActionListenerType.REMOVE_PORT].notify(pprof)
04593     return
04594     
04595     
04596   # inline void onAttachExecutionContext(UniqueId ec_id)
04597   def onAttachExecutionContext(self, ec_id):
04598     self._actionListeners.ecaction_[OpenRTM_aist.ExecutionContextActionListenerType.EC_ATTACHED].notify(ec_id)
04599     return
04600     
04601     
04602   # inline void onDetachExecutionContext(UniqueId ec_id)
04603   def onDetachExecutionContext(self, ec_id):
04604     self._actionListeners.ecaction_[OpenRTM_aist.ExecutionContextActionListenerType.EC_DETACHED].notify(ec_id)
04605     return
04606 
04607     
04608   ##
04609   # @if jp
04610   # @class svc_name
04611   # @brief SDOService のプロファイルリストからidでサーチするための
04612   # ファンクタクラス
04613   # @else
04614   #
04615   # @endif
04616   class svc_name:
04617     def __init__(self, _id):
04618       self._id= _id
04619 
04620     def __call__(self, prof):
04621       return self._id == prof.id
04622 
04623 
04624   #------------------------------------------------------------
04625   # Functor
04626   #------------------------------------------------------------
04627 
04628   ##
04629   # @if jp
04630   # @class nv_name
04631   # @brief NVList 検索用ファンクタ
04632   # @else
04633   #
04634   # @endif
04635   class nv_name:
04636     def __init__(self, _name):
04637       self._name = _name
04638 
04639     def __call__(self, nv):
04640       return self._name == nv.name
04641 
04642 
04643   ##
04644   # @if jp
04645   # @class ec_find
04646   # @brief ExecutionContext 検索用ファンクタ
04647   # @else
04648   #
04649   # @endif
04650   class ec_find:
04651     def __init__(self, _ec):
04652       self._ec = _ec
04653 
04654     def __call__(self, ecs):
04655       try:
04656         if not CORBA.is_nil(ecs):
04657           ec = ecs._narrow(RTC.ExecutionContext)
04658           return self._ec._is_equivalent(ec)
04659       except:
04660         print OpenRTM_aist.Logger.print_exception()
04661         return False
04662 
04663       return False
04664 
04665 
04666   ##
04667   # @if jp
04668   # @class ec_copy
04669   # @brief ExecutionContext Copy用ファンクタ
04670   # @else
04671   #
04672   # @endif
04673   class ec_copy:
04674     def __init__(self, eclist):
04675       self._eclist = eclist
04676 
04677     def __call__(self, ecs):
04678       if not CORBA.is_nil(ecs):
04679         self._eclist.append(ecs)
04680 
04681 
04682   ##
04683   # @if jp
04684   # @class deactivate_comps
04685   # @brief RTC 非活性化用ファンクタ
04686   # @else
04687   #
04688   # @endif
04689   class deactivate_comps:
04690     def __init__(self, comp):
04691       self._comp = comp
04692 
04693     def __call__(self, ec):
04694       try:
04695         if not CORBA.is_nil(ec) and not ec._non_existent():
04696           ec.deactivate_component(self._comp)
04697           ec.stop()
04698       except:
04699         print OpenRTM_aist.Logger.print_exception()
04700 
04701 
04702 # RtcBase = RTObject_impl


openrtm_aist_python
Author(s): Shinji Kurihara
autogenerated on Thu Aug 27 2015 14:17:28