PortAdmin.py
Go to the documentation of this file.
00001 #!/usr/bin/env python
00002 # -*- coding: euc-jp -*-
00003 
00004 ##
00005 # @file PortAdmin.py
00006 # @brief RTC's Port administration class
00007 # @date $Date: 2007/09/03 $
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 import traceback
00018 import sys
00019 from omniORB import CORBA
00020 
00021 import RTC
00022 import OpenRTM_aist
00023 
00024 
00025 
00026 ##
00027 # @if jp
00028 # @class PortAdmin
00029 # @brief PortAdmin クラス
00030 #
00031 # 各種 Port の管理を行うクラス。
00032 # Port の登録/登録解除など各種管理操作を実行するとともに、登録されている
00033 # Port の管理を行うクラス。
00034 #
00035 # @since 0.4.0
00036 #
00037 # @else
00038 # @class PortAdmin
00039 # @brief PortAdmin class
00040 # @endif
00041 class PortAdmin:
00042   """
00043   """
00044 
00045 
00046 
00047   ##
00048   # @if jp
00049   # @class comp_op
00050   # @brief Port 管理用内部クラス
00051   # @else
00052   #
00053   # @endif
00054   class comp_op:
00055     def __init__(self, name=None, factory=None):
00056       if name:
00057         self._name = name
00058       if factory:
00059         self._name = factory.getProfile().name
00060 
00061     def __call__(self, obj):
00062       name_ = obj.getProfile().name
00063       return self._name == name_
00064 
00065 
00066   ##
00067   # @if jp
00068   # @class find_port_name
00069   # @brief Port 検索用ファンクタ
00070   # @else
00071   # @endif
00072   class find_port_name:
00073     def __init__(self, name):
00074       self._name = name
00075 
00076     def __call__(self, p):
00077       prof = p.get_port_profile()
00078       name_ = prof.name 
00079       return self._name == name_
00080 
00081 
00082   ##
00083   # @if jp
00084   # @brief Port削除用ファンクタ
00085   # @else
00086   # @brief Functor to delete the Port
00087   # @endif
00088   class del_port:
00089     def __init__(self, pa):
00090       self._pa = pa
00091       return
00092 
00093     def __call__(self, p):
00094       self._pa.deletePort(p)
00095 
00096 
00097   class find_port:
00098     # find_port(const PortService_ptr& p) : m_port(p) {};
00099     def __init__(self, p):
00100       self._port = p
00101 
00102     # bool operator()(const PortService_ptr& p)
00103     def __call__(self, p):
00104       return self._port._is_equivalent(p)
00105 
00106 
00107   ##
00108   # @if jp
00109   # @brief コンストラクタ
00110   #
00111   # コンストラクタ
00112   #
00113   # @param self
00114   # @param orb ORB
00115   # @param poa POA
00116   #
00117   # @else
00118   # @brief Constructor
00119   # @endif
00120   def __init__(self, orb, poa):
00121     # ORB オブジェクト
00122     self._orb = orb
00123 
00124     # POA オブジェクト
00125     self._poa = poa
00126 
00127     # Portのオブジェクトリファレンスのリスト. PortServiceList
00128     self._portRefs = []
00129 
00130     # サーバントを直接格納するオブジェクトマネージャ
00131     self._portServants = OpenRTM_aist.ObjectManager(self.comp_op)
00132 
00133     self._rtcout = OpenRTM_aist.Manager.instance().getLogbuf("PortAdmin")
00134 
00135   ##
00136   # @if jp
00137   #
00138   # @brief Port リストの取得
00139   #
00140   # registerPort() により登録された Port の リストを取得する。
00141   #
00142   # @param self
00143   #
00144   # @return Port リスト
00145   #
00146   # @else
00147   #
00148   # @brief Get PortServiceList
00149   #
00150   # This operation returns the pointer to the PortServiceList of Ports regsitered
00151   # by registerPort().
00152   #
00153   # @return PortServiceList+ The pointer points PortServiceList
00154   #
00155   # @endif
00156   def getPortServiceList(self):
00157     return self._portRefs
00158 
00159 
00160   ##
00161   # @if jp
00162   #
00163   # @brief PorProfile リストの取得
00164   #
00165   # addPort() により登録された Port の Profile リストを取得する。
00166   #
00167   # @return PortProfile リスト
00168   #
00169   # @else
00170   #
00171   # @brief Get PorProfileList
00172   #
00173   # This operation gets the Profile list of Ports registered by 
00174   # addPort().
00175   #
00176   # @return The pointer points PortProfile list
00177   #
00178   # @endif
00179   #
00180   def getPortProfileList(self):
00181     ret = []
00182     for p in self._portRefs:
00183       ret.append(p.get_port_profile())
00184 
00185     return ret
00186 
00187 
00188   ##
00189   # @if jp
00190   #
00191   # @brief Port のオブジェクト参照の取得
00192   #
00193   # port_name で指定した Port のオブジェクト参照を返す。
00194   # port_name で指定する Port はあらかじめ registerPort() で登録されてい
00195   # なければならない。
00196   #
00197   # @param self
00198   # @param port_name 参照を返すPortの名前
00199   #
00200   # @return Port_ptr Portのオブジェクト参照
00201   #
00202   # @else
00203   #
00204   # @brief Get PortServiceList
00205   #
00206   # This operation returns the pointer to the PortServiceList of Ports regsitered
00207   # by registerPort().
00208   #
00209   # @param port_name The name of Port to be returned the reference.
00210   #
00211   # @return Port_ptr Port's object reference.
00212   #
00213   # @endif
00214   def getPortRef(self, port_name):
00215     index = OpenRTM_aist.CORBA_SeqUtil.find(self._portRefs, self.find_port_name(port_name))
00216     if index >= 0:
00217       return self._portRefs[index]
00218     return None
00219 
00220 
00221   ##
00222   # @if jp
00223   #
00224   # @brief Port のサーバントのポインタの取得
00225   #
00226   # port_name で指定した Port のサーバントのポインタを返す。
00227   # port_name で指定する Port はあらかじめ registerPort() で登録されてい
00228   # なければならない。
00229   #
00230   # @param self
00231   # @param port_name 参照を返すPortの名前
00232   #
00233   # @return PortBase* Portサーバント基底クラスのポインタ
00234   #
00235   # @else
00236   #
00237   # @brief Getpointer to the Port's servant
00238   #
00239   # This operation returns the pointer to the PortBase servant regsitered
00240   # by registerPort().
00241   #
00242   # @param port_name The name of Port to be returned the servant pointer.
00243   #
00244   # @return PortBase* Port's servant's pointer.
00245   #
00246   # @endif
00247   def getPort(self, port_name):
00248     return self._portServants.find(port_name)
00249 
00250 
00251   ##
00252   # @if jp
00253   #
00254   # @brief Port を登録する
00255   #
00256   # 引数 port で指定された Port のサーバントを登録する。
00257   # 登録された Port のサーバントはコンストラクタで与えられたPOA 上で
00258   # activate され、そのオブジェクト参照はPortのProfileにセットされる。
00259   #
00260   # @param self
00261   # @param port Port サーバント
00262   #
00263   # @else
00264   #
00265   # @brief Regsiter Port
00266   #
00267   # This operation registers the Port's servant given by argument.
00268   # The given Port's servant will be activated on the POA that is given
00269   # to the constructor, and the created object reference is set
00270   # to the Port's profile.
00271   #
00272   # @param port The Port's servant.
00273   #
00274   # @endif
00275   # void registerPort(PortBase& port);
00276   def registerPort(self, port):
00277     if not self.addPort(port):
00278       self._rtcout.RTC_ERROR("registerPort() failed.")
00279     return
00280 
00281   # void registerPort(PortService_ptr port);
00282   # def registerPortByReference(self, port_ref):
00283   #   self.addPortByReference(port_ref)
00284   #   return
00285 
00286   # new interface. since 1.0.0-RELEASE
00287   # void addPort(PortBase& port);
00288   def addPort(self, port):
00289     if isinstance(port, RTC._objref_PortService):
00290       index = OpenRTM_aist.CORBA_SeqUtil.find(self._portRefs,
00291                                               self.find_port_name(port.get_port_profile().name))
00292       if index >= 0:
00293         return False
00294       self._portRefs.append(port)
00295       return True
00296     else:
00297       index = OpenRTM_aist.CORBA_SeqUtil.find(self._portRefs,
00298                                               self.find_port_name(port.getName()))
00299       if index >= 0:
00300         return False
00301       self._portRefs.append(port.getPortRef())
00302       return self._portServants.registerObject(port)
00303     return False
00304 
00305   # new interface. since 1.0.0-RELEASE
00306   # void addPort(PortService_ptr port);
00307   # def addPortByReference(self, port_ref):
00308   #   self._portRefs.append(port_ref)
00309   #   return
00310 
00311   ##
00312   # @if jp
00313   #
00314   # @brief Port の登録を解除する
00315   #
00316   # 引数 port で指定された Port の登録を解除する。
00317   # 削除時に Port は deactivate され、PortのProfileのリファレンスには、
00318   # nil値が代入される。
00319   #
00320   # @param self
00321   # @param port Port サーバント
00322   #
00323   # @else
00324   #
00325   # @brief Delete the Port's registration
00326   #
00327   # This operation unregisters the Port's registration.
00328   # When the Port is unregistered, Port is deactivated, and the object
00329   # reference in the Port's profile is set to nil.
00330   #
00331   # @param port The Port's servant.
00332   #
00333   # @endif
00334   def deletePort(self, port):
00335     if not self.removePort(port):
00336       self._rtcout.RTC_ERROR("deletePort(PortBase&) failed.")
00337     return
00338 
00339   # new interface. since 1.0.0-RELEASE
00340   def removePort(self, port):
00341     try:
00342       if isinstance(port,RTC._objref_PortService):
00343         OpenRTM_aist.CORBA_SeqUtil.erase_if(self._portRefs, self.find_port(port))
00344         return True
00345 
00346       port.disconnect_all()
00347       tmp = port.getProfile().name
00348       OpenRTM_aist.CORBA_SeqUtil.erase_if(self._portRefs, self.find_port_name(tmp))
00349 
00350       self._poa.deactivate_object(self._poa.servant_to_id(port))
00351       port.setPortRef(RTC.PortService._nil)
00352 
00353       if not self._portServants.unregisterObject(tmp):
00354         return False
00355       return True
00356     except:
00357       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
00358       return False
00359 
00360 
00361   ##
00362   # @if jp
00363   #
00364   # @brief 名称指定によりPort の登録を解除する
00365   #
00366   # 引数で指定された名前を持つ Port の登録を削除する。
00367   # 削除時に Port は deactivate され、PortのProfileのリファレンスには、
00368   # nil値が代入される。
00369   #
00370   # @param self
00371   # @param port_name Port の名前
00372   #
00373   # @else
00374   #
00375   # @brief Delete the Port' registration
00376   #
00377   # This operation delete the Port's registration specified by port_ name.
00378   # When the Port is unregistered, Port is deactivated, and the object
00379   # reference in the Port's profile is set to nil.
00380   #
00381   # @param port_name The Port's name.
00382   #
00383   # @endif
00384   def deletePortByName(self, port_name):
00385     if not port_name:
00386       return
00387 
00388     p = self._portServants.find(port_name)
00389     self.removePort(p)
00390     return
00391 
00392 
00393   ##
00394   # @if jp
00395   # @brief 全ての Port のインターフェースを activates する
00396   # @else
00397   # @brief Activate all Port interfaces
00398   # @endif
00399   # void PortAdmin::activatePorts()
00400   def activatePorts(self):
00401     ports = self._portServants.getObjects()
00402     for port in ports:
00403       port.activateInterfaces()
00404       
00405     return
00406 
00407 
00408   ##
00409   # @if jp
00410   # @brief 全ての Port のインターフェースを deactivates する
00411   # @else
00412   # @brief Deactivate all Port interfaces
00413   # @endif
00414   # void PortAdmin::deactivatePorts()
00415   def deactivatePorts(self):
00416     ports = self._portServants.getObjects()
00417     for port in ports:
00418       port.deactivateInterfaces()
00419 
00420     return
00421 
00422 
00423   ##
00424   # @if jp
00425   #
00426   # @brief 全ての Port をdeactivateし登録を削除する
00427   #
00428   # 登録されている全てのPortに対して、サーバントのdeactivateを行い、
00429   # 登録リストから削除する。
00430   #
00431   # @param self
00432   #
00433   # @else
00434   #
00435   # @brief Unregister the Port
00436   #
00437   # This operation deactivates the all Port and deletes the all Port's
00438   # registrations from the list.
00439   #
00440   # @endif
00441   def finalizePorts(self):
00442     self.deactivatePorts()
00443     ports = []
00444     ports = self._portServants.getObjects()
00445     len_ = len(ports)
00446     for i in range(len_):
00447       idx = (len_ - 1) - i
00448       self.removePort(ports[idx])


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