ManagerServant.py
Go to the documentation of this file.
00001 #!/usr/bin/env python
00002 # -*- coding: euc-jp -*-
00003 
00004 ##
00005 # @file ManagerServant.py
00006 # @brief RTComponent manager servant implementation class
00007 # @date $Date: 2007-12-31 03:08:04 $
00008 # @author Noriaki Ando <n-ando@aist.go.jp>
00009 #
00010 # Copyright (C) 2008
00011 #     Noriaki Ando
00012 #     Task-intelligence Research Group,
00013 #     Intelligent Systems Research Institute,
00014 #     National Institute of
00015 #         Advanced Industrial Science and Technology (AIST), Japan
00016 #     All rights reserved.
00017 
00018 import copy
00019 import sys
00020 import threading
00021 import time
00022 from omniORB import CORBA
00023 import OpenRTM_aist
00024 import RTC,RTM,RTM__POA
00025 import SDOPackage
00026 
00027 
00028 class ManagerServant(RTM__POA.Manager):
00029   """
00030   """
00031 
00032   ##
00033   # @if jp
00034   # @brief コンストラクタ
00035   #
00036   # コンストラクタ
00037   #
00038   # @else
00039   # @brief Constructor
00040   #
00041   # Constructor
00042   #
00043   # @endif
00044   #
00045   def __init__(self):
00046     self._mgr    = OpenRTM_aist.Manager.instance()
00047     self._owner  = None
00048     self._rtcout = self._mgr.getLogbuf("ManagerServant")
00049     self._isMaster = False
00050     self._masters = []
00051     self._slaves = []
00052     self._masterMutex = threading.RLock()
00053     self._slaveMutex = threading.RLock()
00054     self._objref = None
00055 
00056     config = copy.deepcopy(self._mgr.getConfig())
00057 
00058     if OpenRTM_aist.toBool(config.getProperty("manager.is_master"), "YES", "NO", True):
00059       # this is master manager
00060       self._rtcout.RTC_TRACE("This manager is master.")
00061 
00062       if (not self.createINSManager()):
00063         self._rtcout.RTC_WARN("Manager CORBA servant creation failed.")
00064         return
00065         
00066       self._isMaster = True
00067       self._rtcout.RTC_TRACE("Manager CORBA servant was successfully created.")
00068       return
00069     else:
00070       # this is slave manager
00071       self._rtcout.RTC_TRACE("This manager is slave.")
00072       try:
00073         owner = self.findManager(config.getProperty("corba.master_manager"))
00074         if not owner:
00075           self._rtcout.RTC_INFO("Master manager not found")
00076           return
00077 
00078         if not self.createINSManager():
00079           self._rtcout.RTC_WARN("Manager CORBA servant creation failed.")
00080           return
00081 
00082         self.add_master_manager(owner)
00083         owner.add_slave_manager(self._objref)
00084         return
00085       except:
00086         self._rtcout.RTC_ERROR("Unknown exception cought.")
00087         self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
00088         
00089         
00090     return
00091 
00092 
00093   ##
00094   # @if jp
00095   #
00096   # @brief 仮想デストラクタ
00097   # 
00098   # @else
00099   # 
00100   # @brief Virtual destructor
00101   # 
00102   # @endif
00103   def __del__(self):
00104     guard_master = OpenRTM_aist.ScopedLock(self._masterMutex)
00105     for i in range(len(self._masters)):
00106       try:
00107         if CORBA.is_nil(self._masters[i]):
00108           continue
00109         self._masters[i].remove_slave_manager(self._objref)
00110       except:
00111         self._masters[i] = RTM.Manager._nil
00112     self._masters = []
00113 
00114     guard_slave = OpenRTM_aist.ScopedLock(self._slaveMutex)
00115     for i in range(len(self._slaves)):
00116       try:
00117         if CORBA.is_nil(self._slaves[i]):
00118           continue
00119         self._slaves[i].remove_master_manager(self._objref)
00120       except:
00121         self._slaves[i] = RTM.Manager._nil
00122     self._slaves = []
00123 
00124     del guard_slave
00125     del guard_master
00126     return
00127 
00128 
00129   ##
00130   # @if jp
00131   # @brief モジュールをロードする
00132   #
00133   # 当該マネージャに指定されたモジュールをロードし、指定された初期化
00134   # 関数で初期化を行う。
00135   #
00136   # @param pathname モジュールへのパス
00137   # @param initfunc モジュールの初期化関数
00138   # @return リターンコード
00139   #
00140   # @else
00141   # @brief Loading a module
00142   #
00143   # This operation loads a specified loadable module、and perform
00144   # initialization with the specified function.
00145   #
00146   # @param pathname A path to a loading module.
00147   # @param initfunc Module initialization function.
00148   # @return The return code.
00149   #
00150   # @endif
00151   #
00152   # ReturnCode_t load_module(const char* pathname, const char* initfunc)
00153   def load_module(self, pathname, initfunc):
00154     self._rtcout.RTC_TRACE("ManagerServant::load_module(%s, %s)", (pathname, initfunc))
00155     self._mgr.load(pathname, initfunc)
00156     return RTC.RTC_OK
00157 
00158 
00159   ##
00160   # @if jp
00161   # @brief モジュールをアンロードする
00162   #
00163   # 当該マネージャに指定されたモジュールをアンロードする。
00164   #
00165   # @param pathname モジュールへのパス
00166   # @return リターンコード
00167   #
00168   # @else
00169   # @brief Unloading a module
00170   #
00171   # This operation unloads a specified loadable module.
00172   #
00173   # @param pathname A path to a loading module.
00174   # @return The return code.
00175   #
00176   # @endif
00177   #
00178   # ReturnCode_t unload_module(const char* pathname)
00179   def unload_module(self, pathname):
00180     self._rtcout.RTC_TRACE("ManagerServant::unload_module(%s)", pathname)
00181     self._mgr.unload(pathname)
00182     return RTC.RTC_OK
00183   
00184 
00185   ##
00186   # @if jp
00187   # @brief ロード可能なモジュールのプロファイルを取得する
00188   #
00189   # ロード可能なモジュールのプロファイルを取得する。
00190   #
00191   # @return モジュールプロファイル
00192   #
00193   # @else
00194   # @brief Getting loadable module profiles
00195   #
00196   # This operation returns loadable module profiles.
00197   #
00198   # @return A module profile list.
00199   #
00200   # @endif
00201   #
00202   # ModuleProfileList* get_loadable_modules()
00203   def get_loadable_modules(self):
00204     self._rtcout.RTC_TRACE("get_loadable_modules()")
00205 
00206     # copy local module profiles
00207     prof = self._mgr.getLoadableModules()
00208     cprof = [ RTM.ModuleProfile([]) for i in prof ]
00209 
00210     for i in range(len(prof)):
00211       OpenRTM_aist.NVUtil.copyFromProperties(cprof[i].properties, prof[i])
00212 
00213     return cprof
00214 
00215 
00216   ##
00217   # @if jp
00218   # @brief ロード済みのモジュールのプロファイルを取得する
00219   #
00220   # ロード済みのモジュールのプロファイルを取得する。
00221   #
00222   # @return モジュールプロファイル
00223   #
00224   # @else
00225   # @brief Getting loaded module profiles
00226   #
00227   # This operation returns loaded module profiles.
00228   #
00229   # @return A module profile list.
00230   #
00231   # @endif
00232   #
00233   # ModuleProfileList* get_loaded_modules()
00234   def get_loaded_modules(self):
00235     self._rtcout.RTC_TRACE("get_loaded_modules()")
00236     prof = self._mgr.getLoadedModules()
00237     cprof = [RTM.ModuleProfile([]) for i in prof]
00238     
00239     for i in range(len(prof)):
00240       OpenRTM_aist.NVUtil.copyFromProperties(cprof[i].properties, prof[i])
00241 
00242     return cprof
00243 
00244 
00245   ##
00246   # @if jp
00247   # @brief コンポーネントファクトリのプロファイルを取得する
00248   #
00249   # ロード済みのモジュールのうち、RTコンポーネントのモジュールが持つ
00250   # ファクトリのプロファイルのリストを取得する。
00251   #
00252   # @return コンポーネントファクトリのプロファイルリスト
00253   #
00254   # @else
00255   # @brief Getting component factory profiles
00256   #
00257   # This operation returns component factory profiles from loaded
00258   # RT-Component module factory profiles.
00259   #
00260   # @return An RT-Component factory profile list.
00261   #
00262   # @endif
00263   #
00264   # ModuleProfileList* get_factory_profiles()
00265   def get_factory_profiles(self):
00266     self._rtcout.RTC_TRACE("get_factory_profiles()")
00267     prof = self._mgr.getFactoryProfiles()
00268     cprof = [RTM.ModuleProfile([]) for i in prof]
00269     
00270     for i in range(len(prof)):
00271       OpenRTM_aist.NVUtil.copyFromProperties(cprof[i].properties, prof[i])
00272 
00273     return cprof
00274 
00275 
00276   ##
00277   # @if jp
00278   # @brief コンポーネントを生成する
00279   #
00280   # 引数に指定されたコンポーネントを生成する。
00281   #
00282   # @return 生成されたRTコンポーネント
00283   #
00284   # @else
00285   # @brief Creating an RT-Component
00286   #
00287   # This operation creates RT-Component according to the string
00288   # argument.
00289   #
00290   # @return A created RT-Component
00291   #
00292   # @endif
00293   #
00294   # RTObject_ptr create_component(const char* module_name)
00295   def create_component(self, module_name):
00296     self._rtcout.RTC_TRACE("create_component(%s)", module_name)
00297 
00298     arg = module_name
00299     pos0 = arg.find("&manager=")
00300     pos1 = arg.find("?manager=")
00301 
00302     if pos0 == -1 and pos1 == -1:
00303       # create on this manager
00304       rtc = self._mgr.createComponent(module_name)
00305       if not rtc:
00306         return RTC.RTObject._nil
00307       return rtc.getObjRef()
00308 
00309     # create other manager
00310 
00311     # extract manager's location
00312     # since Python2.5 
00313     # pos = (lambda x: pos0 if x == -1 else pos1)(pos0)
00314     if pos0 == -1:
00315       pos = pos1
00316     else:
00317       pos = pos0
00318     
00319     endpos = arg.find('&', pos + 1)
00320     if endpos == -1:
00321       mgrstr = arg[(pos + 1):]
00322     else:
00323       mgrstr = arg[(pos + 1): endpos]
00324     self._rtcout.RTC_VERBOSE("Manager arg: %s", mgrstr)
00325     mgrvstr = mgrstr.split(":")
00326     if len(mgrvstr) != 2:
00327       self._rtcout.RTC_WARN("Invalid manager name: %s", mgrstr)
00328       return RTC.RTObject._nil
00329 
00330     eqpos = mgrstr.find("=")
00331     if eqpos == -1:
00332       self._rtcout.RTC_WARN("Invalid argument: %s", module_name)
00333       return RTC.RTObject._nil
00334 
00335     mgrstr = mgrstr[eqpos + 1:]
00336     self._rtcout.RTC_DEBUG("Manager is %s", mgrstr)
00337 
00338     # find manager
00339     mgrobj = self.findManager(mgrstr)
00340     if CORBA.is_nil(mgrobj):
00341       cmd = "rtcd_python -p "
00342       cmd += mgrvstr[1] # port number
00343 
00344       self._rtcout.RTC_DEBUG("Invoking command: %s.", cmd)
00345       ret = OpenRTM_aist.launch_shell(cmd)
00346       if ret == -1:
00347         self._rtcout.RTC_DEBUG("%s: failed", cmd)
00348         return RTC.RTObject._nil
00349 
00350       # find manager
00351       time.sleep(0.01)
00352       count = 0
00353       while CORBA.is_nil(mgrobj):
00354         mgrobj = self.findManager(mgrstr)
00355         count += 1
00356         if count > 1000:
00357           break
00358         time.sleep(0.01)
00359 
00360     if CORBA.is_nil(mgrobj):
00361       self._rtcout.RTC_WARN("Manager cannot be found.")
00362       return RTC.RTObject._nil
00363     
00364     # create component on the manager
00365     if endpos == -1:
00366       arg = arg[:pos]
00367     else:
00368       arg = arg[:pos] + arg[endpos:]
00369     self._rtcout.RTC_DEBUG("Creating component on %s",  mgrstr)
00370     self._rtcout.RTC_DEBUG("arg: %s", arg)
00371     try:
00372       rtobj = mgrobj.create_component(arg)
00373       self._rtcout.RTC_DEBUG("Component created %s",  arg)
00374       return rtobj
00375     except CORBA.SystemException:
00376       self._rtcout.RTC_DEBUG("Exception was caught while creating component.")
00377       self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception())
00378       return RTC.RTObject._nil
00379     except:
00380       self._rtcout.RTC_DEBUG(OpenRTM_aist.Logger.print_exception())
00381 
00382     return RTC.RTObject._nil
00383 
00384   
00385   ##
00386   # @if jp
00387   # @brief コンポーネントを削除する
00388   #
00389   # 引数に指定されたコンポーネントを削除する。
00390   #
00391   # @return リターンコード
00392   #
00393   # @else
00394   # @brief Deleting an RT-Component
00395   #
00396   # This operation delete an RT-Component according to the string
00397   # argument.
00398   #
00399   # @return Return code
00400   #
00401   # @endif
00402   #
00403   # ReturnCode_t delete_component(const char* instance_name)
00404   def delete_component(self, instance_name):
00405     self._rtcout.RTC_TRACE("delete_component(%s)", instance_name)
00406     self._mgr.deleteComponent(instance_name)
00407     return RTC.RTC_OK
00408   
00409 
00410   ##
00411   # @if jp
00412   # @brief 起動中のコンポーネントのリストを取得する
00413   #
00414   # 現在当該マネージャ上で起動中のコンポーネントのリストを返す。
00415   #
00416   # @return RTコンポーネントのリスト
00417   #
00418   # @else
00419   # @brief Getting RT-Component list running on this manager
00420   #
00421   # This operation returns RT-Component list running on this manager.
00422   #
00423   # @return A list of RT-Components
00424   #
00425   # @endif
00426   #
00427   # RTCList* get_components()
00428   def get_components(self):
00429     self._rtcout.RTC_TRACE("get_components()")
00430 
00431     # get local component references
00432     rtcs = self._mgr.getComponents()
00433     crtcs = []
00434 
00435     for rtc in rtcs:
00436       crtcs.append(rtc.getObjRef())
00437 
00438     # get slaves' component references
00439     self._rtcout.RTC_DEBUG("%d slave managers exists.", len(self._slaves))
00440     for i in range(len(self._slaves)):
00441       try:
00442         if not CORBA.is_nil(self._slaves[i]):
00443           srtcs = self._slaves[i].get_components()
00444           OpenRTM_aist.CORBA_SeqUtil.push_back_list(crtcs, srtcs)
00445           continue
00446       except:
00447         self._RTC_INFO("slave (%d) has disappeared.", i)
00448         self._slaves[i] = RTM.Manager._nil
00449 
00450       OpenRTM_aist.CORBA_SeqUtil.erase(self._slaves, i)
00451       i -= 1
00452 
00453     return crtcs
00454   
00455 
00456   ##
00457   # @if jp
00458   # @brief 起動中のコンポーネントプロファイルのリストを取得する
00459   #
00460   # 現在当該マネージャ上で起動中のコンポーネントのプロファイルのリス
00461   # トを返す。
00462   #
00463   # @return RTコンポーネントプロファイルのリスト
00464   #
00465   # @else
00466   # @brief Getting RT-Component's profile list running on this manager
00467   #
00468   # This operation returns RT-Component's profile list running on
00469   # this manager.
00470   #
00471   # @return A list of RT-Components' profiles
00472   #
00473   # @endif
00474   #
00475   # ComponentProfileList* get_component_profiles()
00476   def get_component_profiles(self):
00477     rtcs = self._mgr.getComponents()
00478     cprofs = [rtc.get_component_profile() for rtc in rtcs]
00479 
00480     # copy slaves' component profiles
00481     guard = OpenRTM_aist.ScopedLock(self._slaveMutex)
00482     self._rtcout.RTC_DEBUG("%d slave managers exists.", len(self._slaves))
00483 
00484     for i in range(len(self._slaves)):
00485       try:
00486         if not CORBA.is_nil(self._slaves[i]):
00487           sprofs = self._slaves[i].get_component_profiles()
00488           OpenRTM_aist.CORBA_SeqUtil.push_back_list(cprofs, sprofs)
00489           continue
00490       except:
00491         self._rtcout.RTC_INFO("slave (%d) has disappeared.", i)
00492         self._slaves[i] = RTM.Manager._nil
00493 
00494       OpenRTM_aist.CORBA_SeqUtil.erase(self._slaves, i)
00495       i -= 1
00496 
00497     del guard
00498     return cprofs
00499 
00500 
00501   ##
00502   # @if jp
00503   # @brief マネージャのプロファイルを取得する
00504   #
00505   # 現在当該マネージャのプロファイルを取得する。
00506   #
00507   # @return マネージャプロファイル
00508   #
00509   # @else
00510   # @brief Getting this manager's profile.
00511   #
00512   # This operation returns this manager's profile.
00513   #
00514   # @return Manager's profile
00515   #
00516   # @endif
00517   #
00518   # ManagerProfile* get_profile()
00519   def get_profile(self):
00520     self._rtcout.RTC_TRACE("get_profile()")
00521     prof = RTM.ModuleProfile([])
00522     OpenRTM_aist.NVUtil.copyFromProperties(prof.properties, self._mgr.getConfig().getNode("manager"))
00523 
00524     return prof
00525   
00526 
00527   ##
00528   # @if jp
00529   # @brief マネージャのコンフィギュレーションを取得する
00530   #
00531   # 現在当該マネージャのコンフィギュレーションを取得する。
00532   #
00533   # @return マネージャコンフィギュレーション
00534   #
00535   # @else
00536   # @brief Getting this manager's configuration.
00537   #
00538   # This operation returns this manager's configuration.
00539   #
00540   # @return Manager's configuration
00541   #
00542   # @endif
00543   #
00544   # NVList* get_configuration()
00545   def get_configuration(self):
00546     self._rtcout.RTC_TRACE("get_configuration()")
00547     nvlist = []
00548     OpenRTM_aist.NVUtil.copyFromProperties(nvlist, self._mgr.getConfig())
00549     return nvlist
00550   
00551 
00552   ##
00553   # @if jp
00554   # @brief マネージャのコンフィギュレーションを設定する
00555   #
00556   # 現在当該マネージャのコンフィギュレーションを設定する。
00557   #
00558   # @param name セットするコンフィギュレーションのキー名
00559   # @param value セットするコンフィギュレーションの値
00560   # @return リターンコード
00561   #
00562   # @else
00563   # @brief Setting manager's configuration
00564   #
00565   # This operation sets managers configuration.
00566   #  
00567   # @param name A configuration key name to be set
00568   # @param value A configuration value to be set
00569   # @return Return code
00570   #
00571   # @endif
00572   #
00573   # ReturnCode_t set_configuration(const char* name, const char* value)
00574   def set_configuration(self, name, value):
00575     self._rtcout.RTC_TRACE("set_configuration(name = %s, value = %s)", (name, value))
00576     self._mgr.getConfig().setProperty(name, value)
00577     return RTC.RTC_OK
00578   
00579 
00580 
00581   ##
00582   # @if jp
00583   # @brief マネージャがマスターかどうか
00584   #
00585   # この関数はマネージャがマスターかどうかを返す。Trueならば、当該マ
00586   # ネージャはマスターであり、それ以外は False を返す。
00587   #
00588   # @return マスターマネージャかどうかのbool値
00589   #
00590   # @else
00591   # @brief Whether this manager is master or not
00592   #
00593   # It returns "True" if this manager is a master, and it returns
00594   # "False" in other cases.
00595   #  
00596   # @return A boolean value that means it is master or not.
00597   #
00598   # @endif
00599   #
00600   # bool is_master();
00601   def is_master(self):
00602     # since Python2.5
00603     # self._rtcout.RTC_TRACE("is_master(): %s", (lambda x: "YES" if x else "NO")(self._isMaster))
00604     ret = ""
00605     if self._isMaster:
00606       ret = "YES"
00607     else:
00608       ret = "NO"
00609     self._rtcout.RTC_TRACE("is_master(): %s", ret)
00610     return self._isMaster
00611 
00612 
00613   ##
00614   # @if jp
00615   # @brief マスターマネージャの取得
00616   #
00617   # このマネージャがスレーブマネージャの場合、マスターとなっているマ
00618   # ネージャのリストを返す。このマネージャがマスターの場合、空のリス
00619   # トが返る。
00620   #
00621   # @return マスターマネージャのリスト
00622   #
00623   # @else
00624   # @brief Getting master managers
00625   #
00626   # This operation returns master manager list if this manager is
00627   # slave. If this manager is master, an empty sequence would be
00628   # returned.
00629   #  
00630   # @return Master manager list
00631   #
00632   # @endif
00633   #
00634   # RTM::ManagerList* get_master_managers();
00635   def get_master_managers(self):
00636     self._rtcout.RTC_TRACE("get_master_managers()")
00637     guard = OpenRTM_aist.ScopedLock(self._masterMutex)
00638     
00639     return self._masters
00640 
00641 
00642   ##
00643   # @if jp
00644   # @brief マスターマネージャの追加
00645   #
00646   # このマネージャのマスタとしてマネージャを一つ追加する。戻り値には、
00647   # 当該マネージャ上で追加されたマスターマネージャを識別するユニーク
00648   # なIDが返される。このマネージャがマスタの場合、当該IDで指定された
00649   # マスターマネージャを返す。IDで指定されたマスターマネージャがない
00650   # 場合、nilオブジェクトが返る。
00651   #
00652   # @return マスターマネージャ
00653   #
00654   # @else
00655   # @brief Getting a master manager
00656   #
00657   # This operation returns a master manager with specified id. If
00658   # the manager with the specified id does not exist, nil object
00659   # reference would be returned.
00660   #  
00661   # @return A master manager
00662   #
00663   # @endif
00664   #
00665   # RTC::ReturnCode_t add_master_manager(RTM::Manager_ptr mgr);
00666   def add_master_manager(self, mgr):
00667     guard = OpenRTM_aist.ScopedLock(self._masterMutex)
00668     self._rtcout.RTC_TRACE("add_master_manager(), %d masters", len(self._masters))
00669     index = OpenRTM_aist.CORBA_SeqUtil.find(self._masters, self.is_equiv(mgr))
00670     
00671     if not (index < 0): # found in my list
00672       self._rtcout.RTC_ERROR("Already exists.")
00673       return RTC.BAD_PARAMETER
00674     
00675     OpenRTM_aist.CORBA_SeqUtil.push_back(self._masters, mgr)
00676     self._rtcout.RTC_TRACE("add_master_manager() done, %d masters", len(self._masters))
00677     del guard
00678     return RTC.RTC_OK
00679 
00680   
00681   ##
00682   # @if jp
00683   # @brief マスターマネージャの削除
00684   #
00685   # このマネージャが保持するマスタのうち、指定されたものを削除する。
00686   #
00687   # @param mgr マスターマネージャ
00688   # @return ReturnCode_t
00689   #
00690   # @else
00691   # @brief Removing a master manager
00692   #
00693   # This operation removes a master manager from this manager.
00694   # 
00695   # @param mgr A master manager
00696   # @return ReturnCode_t 
00697   #
00698   # @endif
00699   #
00700   # RTC::ReturnCode_t remove_master_manager(RTM::Manager_ptr mgr);
00701   def remove_master_manager(self, mgr):
00702     guard = OpenRTM_aist.ScopedLock(self._masterMutex)
00703     self._rtcout.RTC_TRACE("remove_master_manager(), %d masters", len(self._masters))
00704 
00705     index = OpenRTM_aist.CORBA_SeqUtil.find(self._masters, self.is_equiv(mgr))
00706     
00707     if index < 0: # not found in my list
00708       self._rtcout.RTC_ERROR("Not found.")
00709       return RTC.BAD_PARAMETER
00710     
00711     OpenRTM_aist.CORBA_SeqUtil.erase(self._masters, index)
00712     self._rtcout.RTC_TRACE("remove_master_manager() done, %d masters", len(self._masters))
00713     del guard
00714     return RTC.RTC_OK
00715 
00716 
00717   ##
00718   # @if jp
00719   # @brief スレーブマネージャの取得
00720   #
00721   # このマネージャがスレーブマネージャの場合、スレーブとなっているマ
00722   # ネージャのリストを返す。このマネージャがスレーブの場合、空のリス
00723   # トが返る。
00724   #
00725   # @return スレーブマネージャのリスト
00726   #
00727   # @else
00728   # @brief Getting slave managers
00729   #
00730   # This operation returns slave manager list if this manager is
00731   # slave. If this manager is slave, an empty sequence would be
00732   # returned.
00733   #  
00734   # @return Slave manager list
00735   #
00736   # @endif
00737   #
00738   # RTM::ManagerList* get_slave_managers();
00739   def get_slave_managers(self):
00740     guard = OpenRTM_aist.ScopedLock(self._slaveMutex)
00741     self._rtcout.RTC_TRACE("get_slave_managers(), %d slaves", len(self._slaves))
00742     return self._slaves
00743 
00744 
00745   ##
00746   # @if jp
00747   # @brief スレーブマネージャの追加
00748   #
00749   # このマネージャのマスタとしてマネージャを一つ追加する。
00750   #
00751   # @param mgr スレーブマネージャ
00752   # @return ReturnCode_t
00753   #
00754   # @else
00755   # @brief Getting a slave manager
00756   #
00757   # This operation add a slave manager to this manager.
00758   #  
00759   # @param mgr A slave manager
00760   # @return ReturnCode_t
00761   #
00762   # @endif
00763   #
00764   # RTC::ReturnCode_t add_slave_manager(RTM::Manager_ptr mgr);
00765   def add_slave_manager(self, mgr):
00766     guard = OpenRTM_aist.ScopedLock(self._slaveMutex)
00767     self._rtcout.RTC_TRACE("add_slave_manager(), %d slaves", len(self._slaves))
00768     
00769     index = OpenRTM_aist.CORBA_SeqUtil.find(self._slaves, self.is_equiv(mgr))
00770     
00771     if not (index < 0): # found in my list
00772       self._rtcout.RTC_ERROR("Already exists.")
00773       return RTC.BAD_PARAMETER
00774     
00775     OpenRTM_aist.CORBA_SeqUtil.push_back(self._slaves, mgr)
00776     self._rtcout.RTC_TRACE("add_slave_manager() done, %d slaves", len(self._slaves))
00777     del guard
00778     return RTC.RTC_OK
00779 
00780 
00781   ##
00782   # @if jp
00783   # @brief スレーブマネージャの削除
00784   #
00785   # このマネージャが保持するマスタのうち、指定されたものを削除する。
00786   #
00787   # @param mgr スレーブマネージャ
00788   # @return ReturnCode_t
00789   #
00790   # @else
00791   # @brief Removing a slave manager
00792   #
00793   # This operation removes a slave manager from this manager.
00794   # 
00795   # @param mgr A slave manager
00796   # @return ReturnCode_t 
00797   #
00798   # @endif
00799   #
00800   # RTC::ReturnCode_t remove_slave_manager(RTM::Manager_ptr mgr);
00801   def remove_slave_manager(self, mgr):
00802     guard = OpenRTM_aist.ScopedLock(self._slaveMutex)
00803     self._rtcout.RTC_TRACE("remove_slave_manager(), %d slaves", len(self._slaves))
00804     index = OpenRTM_aist.CORBA_SeqUtil.find(self._slaves, self.is_equiv(mgr))
00805     
00806     if index < 0: # not found in my list
00807       self._rtcout.RTC_ERROR("Not found.")
00808       return RTC.BAD_PARAMETER
00809     
00810     OpenRTM_aist.CORBA_SeqUtil.erase(self._slaves, index)
00811     self._rtcout.RTC_TRACE("remove_slave_manager() done, %d slaves", len(self._slaves))
00812     del guard
00813     return RTC.RTC_OK
00814 
00815 
00816   ##
00817   # @if jp
00818   # @brief プロセスのコピーを生成する
00819   # @return ReturnCode_t
00820   # @else
00821   # @brief The copy of the process is generated. 
00822   # @return ReturnCode_t 
00823   # @endif
00824   #
00825   # ReturnCode_t fork()
00826   def fork(self):
00827     # self._mgr.fork()
00828     return RTC.RTC_OK
00829 
00830   
00831   ##
00832   # @if jp
00833   # @brief shutdownする
00834   # @return ReturnCode_t
00835   # @else
00836   # @brief This method shutdowns RTC. 
00837   # @return ReturnCode_t 
00838   # @endif
00839   #
00840   # ReturnCode_t shutdown()
00841   def shutdown(self):
00842     self._mgr.terminate()
00843     return RTC.RTC_OK
00844 
00845   
00846   ##
00847   # @if jp
00848   # @brief 再起動する。
00849   # @return ReturnCode_t
00850   # @else
00851   # @brief This method restarts RTC.  
00852   # @return ReturnCode_t 
00853   # @endif
00854   #
00855   # ReturnCode_t restart()
00856   def restart(self):
00857     # self._mgr.restart()
00858     return RTC.RTC_OK
00859   
00860 
00861   ##
00862   # @if jp
00863   # @brief RTCのリファレンスを取得する。
00864   # @return RTCのリファレンス
00865   # @else
00866   # @brief Get the reference of RTC. 
00867   # @return RTC reference
00868   # @endif
00869   #
00870   # Object_ptr get_service(const char* name)
00871   def get_service(self, name):
00872     return CORBA.Object._nil
00873 
00874   
00875   ##
00876   # @if jp
00877   # @brief Managerのリファレンスを取得する。
00878   # @return Managerのリファレンス
00879   # @else
00880   # @brief Get the reference of Manager. 
00881   # @return Manager reference
00882   # @endif
00883   #
00884   # Manager_ptr getObjRef() const
00885   def getObjRef(self):
00886     return self._objref
00887 
00888 
00889   ##
00890   # @if jp
00891   # @brief INSManagerの生成
00892   # @return 
00893   # @else 成功:true, 失敗:false
00894   # @brief Generate INSManager. 
00895   # @return Successful:true, Failed:false
00896   # @endif
00897   #
00898   # bool createINSManager();
00899   def createINSManager(self):
00900     try:
00901       poa = self._mgr.getORB().resolve_initial_references("omniINSPOA")
00902       poa._get_the_POAManager().activate()
00903       id = self._mgr.getConfig().getProperty("manager.name")
00904       poa.activate_object_with_id(id, self)
00905       mgrobj = poa.id_to_reference(id)
00906       self._objref = mgrobj._narrow(RTM.Manager)
00907     except:
00908       self._rtcout.RTC_DEBUG(OpenRTM_aist.Logger.print_exception())
00909       return False
00910 
00911     return True
00912 
00913 
00914   ##
00915   # @if jp
00916   # @brief Managerのリファレンスを検索する。
00917   # @return Managerのリファレンス
00918   # @else
00919   # @brief Find the reference of Manager. 
00920   # @return Manager reference
00921   # @endif
00922   #
00923   # RTM::Manager_ptr findManager(const char* host_port);
00924   def findManager(self, host_port):
00925     self._rtcout.RTC_TRACE("findManager(host_port = %s)", host_port)
00926     try:
00927       config = copy.deepcopy(self._mgr.getConfig())
00928       mgrloc = "corbaloc:iiop:"
00929       mgrloc += host_port
00930       mgrloc += "/" + config.getProperty("manager.name")
00931       self._rtcout.RTC_DEBUG("corbaloc: %s", mgrloc)
00932 
00933       mobj = self._mgr.getORB().string_to_object(mgrloc)
00934       mgr = mobj._narrow(RTM.Manager)
00935       return mgr
00936 
00937     except CORBA.SystemException:
00938       self._rtcout.RTC_DEBUG(OpenRTM_aist.Logger.print_exception())
00939       
00940     except:
00941       self._rtcout.RTC_ERROR("Unknown exception cought.")
00942       self._rtcout.RTC_DEBUG(OpenRTM_aist.Logger.print_exception())
00943 
00944     return RTM.Manager._nil
00945 
00946 
00947   class is_equiv:
00948     def __init__(self, mgr):
00949       self._mgr = mgr
00950 
00951     def __call__(self, mgr):
00952       if not self._mgr or not mgr:
00953         return self._mgr == mgr
00954 
00955       return self._mgr._is_equivalent(mgr)
00956   


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