00001 #!/usr/bin/env python 00002 # -*- coding: euc-jp -*- 00003 00004 ## 00005 # @file PortProfileHelper.py 00006 # @brief RTCs PortProfile helper class 00007 # @date $Date: 2007-04-26 15:32:25 $ 00008 # @author Noriaki Ando <n-ando@aist.go.jp> 00009 # 00010 # Copyright (C) 2006 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 # $Id: PortProfileHelper.py 1135 2009-01-19 16:11:02Z n-ando $ 00018 # 00019 # 00020 00021 import threading 00022 import OpenRTM_aist 00023 import RTC 00024 00025 00026 ## 00027 # @if jp 00028 # 00029 # @class PortProfileHelper 00030 # @brief PortProfile ヘルパークラス 00031 # 00032 # RTC::Port の種々のプロファイルを保持する PortProfile を管理するクラス。 00033 # 主として PortBase の内部で使用される。 00034 # 00035 # @else 00036 # 00037 # @class PortProfileHelper 00038 # @brief PortProfile helper class 00039 # 00040 # This class manages the PortProfile that is profiles of the RTC:Port. 00041 # This is mainly used in PortBase class. 00042 # 00043 # @endif 00044 # 00045 class PortProfileHelper: 00046 """ 00047 """ 00048 00049 def __init__(self): 00050 self._mutex = threading.RLock() 00051 self._name = "" 00052 self._ifProfiles = [] 00053 self._portRef = None 00054 self._connProfiles = [] 00055 self._owner = None 00056 self._properties = [] 00057 return 00058 00059 ## 00060 # @if jp 00061 # 00062 # @brief PortProfile を設定する 00063 # 00064 # このオブジェクトが保持する PortProfile を引数で与えられた PortProfile 00065 # をコピーし上書きして保存する。 00066 # 00067 # @param PortProfile 上書きする PortProfile 00068 # 00069 # @else 00070 # 00071 # @brief Set PortProfile 00072 # 00073 # This operation copies the given PortProfile and overwrites the existent 00074 # PortProfile by the given ProtProfile. 00075 # 00076 # @param PortProfile The PortProfile to be stored. 00077 # 00078 # @endif 00079 # 00080 # void setPortProfile(const PortProfile& profile); 00081 def setPortProfile(self, profile): 00082 guard = OpenRTM_aist.ScopedLock(self._mutex) 00083 self._name = profile.name 00084 self._ifProfiles = profile.interfaces 00085 self._portRef = profile.port_ref 00086 self._connProfiles = profile.connector_profiles 00087 self._owner = profile.owner 00088 self._properties = profile.properties 00089 return 00090 00091 ## 00092 # @if jp 00093 # 00094 # @brief PortProfile を取得する 00095 # 00096 # このオブジェクトが保持する PortProfile を返す。 00097 # 00098 # @return このオブジェクトが保持する PortProfile 00099 # 00100 # @else 00101 # 00102 # @brief Get PortProfile 00103 # 00104 # This operation returns the PortProfile. 00105 # 00106 # @return The PortProfile stored by the object. 00107 # 00108 # @endif 00109 # 00110 # PortProfile* getPortProfile(); 00111 def getPortProfile(self): 00112 guard = OpenRTM_aist.ScopedLock(self._mutex) 00113 prof = RTC.PortProfile(self._name, 00114 self._ifProfiles, 00115 self._portRef, 00116 self._connProfiles, 00117 self._owner, 00118 self._properties) 00119 return prof 00120 00121 00122 ## 00123 # @if jp 00124 # 00125 # @brief PortProfile.name を設定する 00126 # 00127 # このオペレーションは引数で与えられた文字列をコポーし、 00128 # PortProfile.name として保持する。 00129 # 00130 # @param name PortProfile.name に格納する Port の名前 00131 # 00132 # @else 00133 # 00134 # @brief Set PortProfile.name 00135 # 00136 # This operation stores a copy of given name to the PortProfile.name. 00137 # 00138 # @param name The name of Port to be stored to the PortProfile.name. 00139 # 00140 # @endif 00141 # 00142 # void setName(const char* name); 00143 def setName(self, name): 00144 guard = OpenRTM_aist.ScopedLock(self._mutex) 00145 self._name = name 00146 return 00147 00148 ## 00149 # @if jp 00150 # 00151 # @brief PortProfile.name を取得する 00152 # 00153 # このオペレーションは PortProfile.name を取得する。 00154 # 00155 # @return PortProfile.name へのポインタ 00156 # 00157 # @else 00158 # 00159 # @brief Get PortProfile.name 00160 # 00161 # This operation returns a pointer to the PortProfile.name. 00162 # 00163 # @return The pointer to PortProfile.name. 00164 # 00165 # @endif 00166 # 00167 # const char* getName() const; 00168 def getName(self): 00169 guard = OpenRTM_aist.ScopedLock(self._mutex) 00170 return self._name 00171 00172 00173 ## 00174 # @if jp 00175 # 00176 # @brief PortInterfaceProfile を追加する 00177 # 00178 # このオペレーションは PortProfile に PortInterfaceProfile を追加する。 00179 # 00180 # @param if_profile PortProfile に追加する PortInterfaceProfile 00181 # 00182 # @else 00183 # 00184 # @brief Append PortInterfaceProfile to the PortProfile 00185 # 00186 # This operation appends the PortInterfaceProfile to the PortProfile 00187 # 00188 # @param if_profile PortInterfaceProfile to be appended the PortProfile 00189 # 00190 # @endif 00191 # 00192 # void appendPortInterfaceProfile(PortInterfaceProfile if_prof); 00193 def appendPortInterfaceProfile(self, if_prof): 00194 guard = OpenRTM_aist.ScopedLock(self._mutex) 00195 self._ifProfiles.append(if_prof) 00196 return 00197 00198 ## 00199 # @if jp 00200 # 00201 # @brief PortInterfaceProfileList を取得する 00202 # 00203 # このオペレーションは PortInterfaceProfileList を返す。 00204 # 00205 # @return PortInterfaceProfileList 00206 # 00207 # @else 00208 # 00209 # @brief Get PortInterfaceProfileList 00210 # 00211 # This operation returns the PortInterfaceProfileList. 00212 # 00213 # @return PortInterfaceProfileList 00214 # 00215 # @endif 00216 # 00217 # const PortInterfaceProfileList& getPortInterfaceProfiles() const; 00218 def getPortInterfaceProfiles(self): 00219 guard = OpenRTM_aist.ScopedLock(self._mutex) 00220 return self._ifProfiles 00221 00222 00223 ## 00224 # @if jp 00225 # 00226 # @brief PortInterfaceProfile を取得する 00227 # 00228 # このオペレーションは instance_name で指定された PortInterfaceProfile 00229 # を返す。 00230 # 00231 # @param instance_name PortInterfaceProfile の instance_name 00232 # @return PortInterfaceProfile 00233 # 00234 # @else 00235 # 00236 # @brief Get PortInterfaceProfile 00237 # 00238 # This operation returns the PortInterfaceProfile specified 00239 # by instance_name. 00240 # 00241 # @param instance_name instance_name of the PortInterfaceProfile 00242 # @return PortInterfaceProfile 00243 # 00244 # @endif 00245 # 00246 # const PortInterfaceProfile getPortInterfaceProfile(const char* instance_name) const; 00247 def getPortInterfaceProfile(self, instance_name): 00248 guard = OpenRTM_aist.ScopedLock(self._mutex) 00249 index = OpenRTM_aist.CORBA_SeqUtil.find(self._ifProfiles, 00250 self.if_name(instance_name)) 00251 if index < 0: 00252 return None 00253 else: 00254 return self._ifProfiles[index] 00255 00256 00257 ## 00258 # @if jp 00259 # 00260 # @brief PortInterfaceProfile を削除する 00261 # 00262 # このオペレーションは instance_name で指定された PortInterfaceProfile 00263 # を削除する。指定した名前の PortInterfaceProfile が存在しない場合には、 00264 # NotFound exception を返す。 00265 # 00266 # @param instance_name 削除する PortInterfaceProfile の名前 00267 # 00268 # @else 00269 # 00270 # @brief Erase PortInterfaceProfile from the PortProfile 00271 # 00272 # This operation erases the PortInterfaceProfile from the PortProfile 00273 # 00274 # @param instance_name PortInterfaceProfile to be erased from the 00275 # PortProfile 00276 # 00277 # @endif 00278 # 00279 # void erasePortInterfaceProfile(const char* instance_name); 00280 def erasePortInterfaceProfile(self, instance_name): 00281 guard = OpenRTM_aist.ScopedLock(self._mutex) 00282 index = OpenRTM_aist.CORBA_SeqUtil.find(self._ifProfiles, 00283 self.if_name(instance_name)) 00284 if index < 0: 00285 return 00286 else: 00287 del self._ifProfiles[index] 00288 00289 00290 ## 00291 # @if jp 00292 # 00293 # @brief Port のオブジェクト参照をセットする 00294 # 00295 # このオペレーションは PortProfile に、関連する Port のオブジェクト参照 00296 # を設定する。 00297 # 00298 # @param port 設定する Port のオブジェクトリファレンス 00299 # 00300 # @else 00301 # 00302 # @brief Set Port's object reference 00303 # 00304 # This operation set the object reference of the Port. 00305 # 00306 # @param port Port's object reference to be set. 00307 # 00308 # @endif 00309 # 00310 # void setPortRef(PortService_ptr port); 00311 def setPortRef(self, port): 00312 guard = OpenRTM_aist.ScopedLock(self._mutex) 00313 self._portRef = port 00314 return 00315 00316 00317 ## 00318 # @if jp 00319 # 00320 # @brief Port のオブジェクト参照を取得する 00321 # 00322 # このオペレーションは PortProfile に関連付けられた Port の 00323 # オブジェクト参照を返す。 00324 # 00325 # @return 関連付けられた Port のオブジェクト参照 00326 # 00327 # @else 00328 # 00329 # @brief Get Port's object reference 00330 # 00331 # This operation returns the object reference of the PortProfile. 00332 # 00333 # @return Port's object reference associated with the PortProfile. 00334 # 00335 # @endif 00336 # 00337 # PortService_ptr getPortRef() const; 00338 def getPortRef(self): 00339 guard = OpenRTM_aist.ScopedLock(self._mutex) 00340 return self._portRef 00341 00342 00343 ## 00344 # @if jp 00345 # 00346 # @brief ConnectorProfile を追加する 00347 # 00348 # このオペレーションは PortProfile に ConnectorProfile を追加する。 00349 # 00350 # @param conn_profile ConnectorProfile 00351 # 00352 # @else 00353 # 00354 # @brief Append ConnectorProfile 00355 # 00356 # This operation appends the ConnectorProfile to the PortProfile. 00357 # 00358 # @param conn_profile ConnectorProfile to be added. 00359 # 00360 # @endif 00361 # 00362 # void appendConnectorProfile(ConnectorProfile conn_profile); 00363 def appendConnectorProfile(self, conn_profile): 00364 guard = OpenRTM_aist.ScopedLock(self._mutex) 00365 self._connProfiles.append(conn_profile) 00366 return 00367 00368 ## 00369 # @if jp 00370 # 00371 # @brief ConnectorProfileList を取得する 00372 # 00373 # このオペレーションは PortProfile に関連付けられた ConnectorProfile の 00374 # リスト ConnectorProfileList を返す。 00375 # 00376 # @return 関連付けられた ConnectorProfileList 00377 # 00378 # @else 00379 # 00380 # @brief Get ConnectorProfileList 00381 # 00382 # This operation returns the list of ConnectorProfile of the PortProfile. 00383 # 00384 # @return Port's ConnectorProfileList. 00385 # 00386 # @endif 00387 # 00388 # const ConnectorProfileList getConnectorProfiles() const; 00389 def getConnectorProfiles(self): 00390 guard = OpenRTM_aist.ScopedLock(self._mutex) 00391 return self._connProfiles 00392 00393 00394 ## 00395 # @if jp 00396 # 00397 # @brief ConnectorProfile を取得する 00398 # 00399 # このオペレーションは引数で指定された名前を持つ ConnectorProfile を返す。 00400 # 00401 # @param name ConnectorProfile の名前 00402 # @return ConnectorProfile 00403 # 00404 # @else 00405 # 00406 # @brief Get ConnectorProfile 00407 # 00408 # This operation returns the ConnectorProfile specified by name. 00409 # 00410 # @param name The name of ConnectorProfile 00411 # @return ConnectorProfile. 00412 # 00413 # @endif 00414 # 00415 # const ConnectorProfile getConnectorProfile(const char* name) const; 00416 def getConnectorProfile(self, name): 00417 guard = OpenRTM_aist.ScopedLock(self._mutex) 00418 index = OpenRTM_aist.CORBA_SeqUtil.find(self._connProfiles, 00419 self.conn_name(name)) 00420 if index < 0: 00421 return None 00422 else: 00423 return self._connProfiles[index] 00424 00425 return None 00426 00427 00428 ## 00429 # @if jp 00430 # 00431 # @brief ConnectorProfile を取得する 00432 # 00433 # このオペレーションは引数で指定されたIDを持つ ConnectorProfile を返す。 00434 # 00435 # @param id ConnectorProfile のID 00436 # @return ConnectorProfile 00437 # 00438 # @else 00439 # 00440 # @brief Get ConnectorProfile 00441 # 00442 # This operation returns the ConnectorProfile specified by ID. 00443 # 00444 # @param id The ID of ConnectorProfile 00445 # @return ConnectorProfile. 00446 # 00447 # @endif 00448 # 00449 # const ConnectorProfile getConnectorProfileById(const char* id) const; 00450 def getConnectorProfileById(self, id): 00451 guard = OpenRTM_aist.ScopedLock(self._mutex) 00452 index = OpenRTM_aist.CORBA_SeqUtil.find(self._connProfiles, 00453 self.conn_id(id)) 00454 if index < 0: 00455 return None 00456 else: 00457 return self._connProfiles[index] 00458 00459 return None 00460 00461 ## 00462 # @if jp 00463 # 00464 # @brief ConnectorProfile を削除する 00465 # 00466 # このオペレーションは PortProfile の ConnectorProfile を 00467 # 名前で指定して削除する。 00468 # 00469 # @param naem ConnectorProfile の名前 00470 # 00471 # @else 00472 # 00473 # @brief Erase ConnectorProfile 00474 # 00475 # This operation erases the ConnectorProfile from the PortProfile. 00476 # 00477 # @param name The name of the ConnectorProfile to be erased. 00478 # 00479 # @endif 00480 # 00481 # void eraseConnectorProfile(const char* name); 00482 def eraseConnectorProfile(self, name): 00483 guard = OpenRTM_aist.ScopedLock(self._mutex) 00484 index = OpenRTM_aist.CORBA_SeqUtil.find(self._connProfiles, 00485 self.conn_name(name)) 00486 if index < 0: 00487 return 00488 else: 00489 del self._connProfiles[index] 00490 00491 return 00492 00493 00494 ## 00495 # @if jp 00496 # 00497 # @brief ConnectorProfile を削除する 00498 # 00499 # このオペレーションは PortProfile の ConnectorProfile を 00500 # ID で指定して削除する。 00501 # 00502 # @param id ConnectorProfile のID 00503 # 00504 # @else 00505 # 00506 # @brief Erase ConnectorProfile 00507 # 00508 # This operation erases the ConnectorProfile from the PortProfile. 00509 # 00510 # @param id The ID of the ConnectorProfile to be erased. 00511 # 00512 # @endif 00513 # 00514 # void eraseConnectorProfileById(const char* id); 00515 def eraseConnectorProfileById(self, id): 00516 guard = OpenRTM_aist.ScopedLock(self._mutex) 00517 index = OpenRTM_aist.CORBA_SeqUtil.find(self._connProfiles, 00518 self.conn_id(id)) 00519 if index < 0: 00520 return 00521 else: 00522 del self._connProfiles[index] 00523 00524 return 00525 00526 ## 00527 # @if jp 00528 # 00529 # @brief PortProfile の owner を設定する 00530 # 00531 # このオペレーションは PortProfile の owner を設定する。 00532 # 00533 # @param owner PortProfile の owner のオブジェクト参照 00534 # 00535 # @else 00536 # 00537 # @brief Set owner's object reference to the PortProfile 00538 # 00539 # This operation sets the owner's object reference to the PortProfile. 00540 # 00541 # @param owner The owner's object reference of PortProfile. 00542 # 00543 # @endif 00544 # 00545 # void setOwner(RTObject_ptr owner); 00546 def setOwner(self, owner): 00547 guard = OpenRTM_aist.ScopedLock(self._mutex) 00548 self._owner = owner 00549 return 00550 00551 ## 00552 # @if jp 00553 # 00554 # @brief PortProfile の owner を取得する 00555 # 00556 # このオペレーションは PortProfile の owner のオブジェクト参照を返す。 00557 # 00558 # @return PortProfile の owner のオブジェクト参照 00559 # 00560 # @else 00561 # 00562 # @brief Get owner's object reference from the PortProfile 00563 # 00564 # This operation returns the owner's object reference of the PortProfile. 00565 # 00566 # @return The owner's object reference of PortProfile. 00567 # 00568 # @endif 00569 # 00570 # RTObject_ptr getOwner() const; 00571 def getOwner(self): 00572 guard = OpenRTM_aist.ScopedLock(self._mutex) 00573 return self._owner 00574 00575 00576 ## 00577 # @if jp 00578 # 00579 # @brief PortProfile の properties を設定する 00580 # 00581 # このオペレーションは PortProfile に properties を設定する。 00582 # 00583 # @param prop PortProfile の properties の NVList 00584 # 00585 # @else 00586 # 00587 # @brief Set properties to the PortProfile 00588 # 00589 # This operation set the properties to the PortProfile. 00590 # 00591 # @param prop The NVList of PortProfile's properties. 00592 # 00593 # @endif 00594 # 00595 # void setProperties(NVList& prop); 00596 def setProperties(self, prop): 00597 guard = OpenRTM_aist.ScopedLock(self._mutex) 00598 self._properties = prop 00599 return 00600 00601 ## 00602 # @if jp 00603 # 00604 # @brief PortProfile の properties を取得する 00605 # 00606 # このオペレーションは PortProfile の propertiesを返す。 00607 # 00608 # @return PortProfile の properties の NVList 00609 # 00610 # @else 00611 # 00612 # @brief Get properties of the PortProfile 00613 # 00614 # This operation returns the properties of the PortProfile. 00615 # 00616 # @return The NVList of PortProfile's properties. 00617 # 00618 # @endif 00619 # 00620 # const NVList& getProperties() const; 00621 def getProperties(self): 00622 guard = OpenRTM_aist.ScopedLock(self._mutex) 00623 return self._properties 00624 00625 00626 ## 00627 # @if jp 00628 # @class if_name 00629 # @brief instance_name を持つ PortInterfaceProfile を探す Functor 00630 # @else 00631 # @brief A functor to find a PortInterfaceProfile named instance_name 00632 # @endif 00633 class if_name: 00634 def __init__(self, name): 00635 self._name = name 00636 return 00637 00638 def __call__(self, prof): 00639 return str(self._name) == str(prof.instance_name) 00640 00641 00642 # Functor to find ConnectorProfile by name 00643 class conn_name: 00644 def __init__(self, name): 00645 self._name = name 00646 return 00647 00648 def __call__(self, cprof): 00649 return str(self._name) == str(cprof.name) 00650 00651 00652 # Functor to find ConnectorProfile by id 00653 class conn_id: 00654 def __init__(self, id_): 00655 self._id = id_ 00656 return 00657 00658 def __call__(self, cprof): 00659 return str(self._id) == str(cprof.connector_id)