00001 #!/usr/bin/env python 00002 # -*- coding: euc-jp -*- 00003 00004 ## 00005 # @file SdoServiceProviderBase.py 00006 # @brief SDO service provider base class and its factory 00007 # @date $Date$ 00008 # @author Noriaki Ando <n-ando@aist.go.jp> and Shinji Kurihara 00009 # 00010 # Copyright (C) 2011 00011 # Noriaki Ando 00012 # Intelligent Systems Research Institute, 00013 # National Institute of 00014 # Advanced Industrial Science and Technology (AIST), Japan 00015 # All rights reserved. 00016 00017 00018 import RTC 00019 import OpenRTM_aist 00020 import SDOPackage, SDOPackage__POA 00021 00022 00023 ## 00024 # @if jp 00025 # 00026 # @brief SdoServiceProvider 基底クラス 00027 # 00028 # SDOで定義されているSDOサービスのプロバイダを実装するための基底クラ 00029 # ス。SDOサービスには、外部から提供サービスをRTC(SDO)側で利用する 00030 # SDOサービスコンシューマと、RTC(SDO)自身がSDOサービスを提供するSDO 00031 # サービスプロバイダがある。すべてのSDOサービスプロバイダはこの基底 00032 # クラスを継承して実装される。 00033 # 00034 # このオブジェクトのライフサイクルは以下の通り。 00035 # 00036 # -# マネージャに対してロードされるとモジュール初期化関数によりオブ 00037 # ジェクトファクトリが、SdoServiceProviderFactory に対して登録さ 00038 # れる。登録のキーにはサービスインターフェースの IFR (interface 00039 # repository) ID が利用され、これによりサービスが区別される。 00040 # -# rtc.conf等のコンフィギュレーション指定により、有効化することが 00041 # 指定されているサービスインプロバイダは、RTCの起動と同時にインス 00042 # タンス化される。 00043 # -# インスタンス化後、初期化関数 init() が呼ばれる。引数には当該サー 00044 # ビスのためのコンフィギュレーションオプションが Propertyに 00045 # より渡される。 00046 # -# インスタンス化されたSDOサービスプロバイダは 00047 # SDO.get_sdo_service() により外部からアクセスされる。このと 00048 # き、サービスを指定するIDはIFR IDと同じである。このときのアタッ 00049 # チシーケンスは以下の通り。 00050 # -# RTCがfinalizeされ解体されると同時にSDOサービスプロバイダも解体 00051 # されるが、その際にはSdoServiceProviderBase.finalize()がコール 00052 # されるので、ここでリソースの解放など終了処理を行う。 00053 # 00054 # <pre> 00055 # 00056 # [RTC] [SDO service] [Other] 00057 # | : | 00058 # | instantiate : | 00059 # |------------->: | 00060 # | init() | | 00061 # |------------->| | 00062 # | | get_service_profiles() | 00063 # |<--------------------------------------| 00064 # | | get_sdo_service() | 00065 # |<--------------------------------------| 00066 # | | use service | 00067 # | |<-----------------------| 00068 # | | | 00069 # | finalize() | | 00070 # |------------->x | 00071 # x x | 00072 # 00073 # </pre> 00074 # 00075 # このクラスの実装に当たっては、少なくとも以下の純粋仮想関数を実装す 00076 # る必要がある。 00077 # 00078 # - init(): 初期化関数。与えられた RTObject および ServiceProfile か 00079 # ら、当該オブジェクトを初期化する。 00080 # - reinit(): 再初期化関数。ServiceProfile は設定情報更新のため同一 00081 # IDで呼び出されることが有るが、その際にこの関数が新たな 00082 # ServiceProfile とともに呼び出される。関数内では、設定の変更など 00083 # 再初期化処理を実装する。 00084 # - getProfile(): 設定されたプロファイルを返す関数。 00085 # - finalize(): 終了処理。コンシューマがデタッチされる際に呼び出され 00086 # る関数。関数内では終了処理を実装する。 00087 # 00088 # SdoServiceProviderのエントリポイントは通常、ファイル名の basename + "Init" 00089 # にしておく。以下に、クラス名、ファイル 00090 # 名、エントリポイント関数名の推奨例を示す。 00091 # 00092 # - 実装クラス名: MySdoServiceProvider 00093 # - ファイル名: MySdoServiceProvider.py 00094 # - エントリポイント関数名: MySdoServiceProviderInit() 00095 # 00096 # エントリポイント関数は通常以下のように、SdoServiceProviderFactory 00097 # に当該コンシューマのファクトリ (と解体ファンクタ) を登録する以下の 00098 # ような関数になる。 00099 # 00100 # <pre> 00101 # def MySdoServiceProviderInit(mgr=None): 00102 # factory = OpenRTM_aist.SdoServiceProviderFactory.instance() 00103 # factory.addFactory(OpenRTM.MySdoService._NP_RepositoryId, 00104 # MySdoServiceProvider, 00105 # OpenRTM_aist.Delete) 00106 # return 00107 # </pre> 00108 # 00109 # @else 00110 # 00111 # @endif 00112 # 00113 class SdoServiceProviderBase(SDOPackage__POA.SDOService): 00114 """ 00115 """ 00116 00117 ## 00118 # @if jp 00119 # @brief 仮想デストラクタ 00120 # @else 00121 # @brief virtual destructor 00122 # @endif 00123 def __del__(self): 00124 pass 00125 00126 ## 00127 # @if jp 00128 # @brief コンシューマクラスの初期化関数 00129 # 00130 # このオブジェクトの初期化を行う。外部からSDOサービスが 00131 # ServiceProfile とともにアタッチされると、SDOコンシューマがインス 00132 # タンス化され、その直後に SDO サービスがアタッチされた RTC と与え 00133 # られた ServiceProfile を引数としてこの関数が呼ばれる。 00134 # 00135 # 関数内では、ServiceProfile 内の SDO サービスリファレンスを 00136 # CorbaProvider クラス等を利用しオブジェクト内に保持するとともに、 00137 # properties から設定内容を読み込みサービス固有の設定等を行う。与 00138 # えられたサービスのオブジェクトリファレンスが不正、あるいは 00139 # properties の内容が不正、等の場合は戻り値に false を返す。 00140 # 00141 # @param rtobj このオブジェクトがインスタンス化された RTC 00142 # @param profile 外部から与えられた SDO ServiceProfile 00143 # @return 与えられた SDO Service や ServiceProfile が不正の場合 false 00144 # 00145 # @else 00146 # @brief Initialization function of the consumer class 00147 # 00148 # @endif 00149 # virtual bool init(RTObject_impl& rtobj, 00150 # const SDOPackage::ServiceProfile& profile) = 0; 00151 def init(self, rtobj, profile): 00152 pass 00153 00154 00155 ## 00156 # @if jp 00157 # @brief コンシューマクラスの再初期化関数 00158 # 00159 # このオブジェクトの再初期化を行う。ServiceProfile には id フィー 00160 # ルドにセッション固有の UUID がセットされているが、同一の id の場 00161 # 合、properties に設定された設定情報の変更や、service フィールド 00162 # のサービスの参照の変更が行われる。その際に呼ばれるのがこの 00163 # reinit() 関数である。実装では、service フィールドのオブジェクト 00164 # リファレンスの同一性を確認し、異なっている場合保持しているリファ 00165 # レンスを更新する必要がある。また properties には新たな設定が与え 00166 # られている可能性があるので、内容を読み込み設定を更新する。 00167 # 00168 # @param profile 新たに与えられた SDO ServiceProfile 00169 # @return 不正な ServiceProfile が与えられた場合は false 00170 # 00171 # @else 00172 # @brief Reinitialization function of the consumer class 00173 # 00174 # @endif 00175 # virtual bool reinit(const SDOPackage::ServiceProfile& profile) = 0; 00176 def reinit(self, profile): 00177 pass 00178 00179 00180 ## 00181 # @if jp 00182 # @brief ServiceProfile を返す 00183 # 00184 # init()/reinit()で与えられた ServiceProfile は通常オブジェクト内 00185 # で保持される。SDO Service 管理フレームワークは管理上このオブジェ 00186 # クトに対応する ServiceProfile を必要とするので、この関数では保持 00187 # されている ServiceProfile を返す。 00188 # 00189 # @return このオブジェクトが保持している ServiceProfile 00190 # 00191 # @else 00192 # @brief Getting ServiceProfile 00193 # @endif 00194 # virtual const SDOPackage::ServiceProfile& getProfile() const = 0; 00195 def getProfile(self): 00196 pass 00197 00198 00199 ## 00200 # @if jp 00201 # @brief 終了処理 00202 # 00203 # SDOサービスがでタッチされる際に呼び出される終了処理用関数。サー 00204 # ビスのでタッチに際して、当該オブジェクトが保持するリソースを解放 00205 # するなどの処理を行う。 00206 # 00207 # @else 00208 # @brief Finalization 00209 # 00210 # @endif 00211 # virtual void finalize() = 0; 00212 def finalize(self): 00213 pass 00214 00215 00216 sdoserviceproviderfactory = None 00217 00218 ## 00219 # @if jp 00220 # @brief SdoServiceProviderFactory の typedef 00221 # @else 00222 # @brief typedef of sdoServiceProviderFactory 00223 # @endif 00224 # typedef ::coil::GlobalFactory< 00225 # ::RTC::SdoServiceProviderBase > SdoServiceProviderFactory; 00226 class SdoServiceProviderFactory(OpenRTM_aist.Factory,SdoServiceProviderBase): 00227 def __init__(self): 00228 OpenRTM_aist.Factory.__init__(self) 00229 return 00230 00231 def __del__(self): 00232 pass 00233 00234 def instance(): 00235 global sdoserviceproviderfactory 00236 00237 if sdoserviceproviderfactory is None: 00238 sdoserviceproviderfactory = SdoServiceProviderFactory() 00239 00240 return sdoserviceproviderfactory 00241 00242 instance = staticmethod(instance) 00243