00001 #!/usr/bin/env python 00002 # -*- coding: euc-jp -*- 00003 00004 00005 ## 00006 # @file OutPort.py 00007 # @brief OutPort class 00008 # @date $Date: 2007/09/19$ 00009 # @author Noriaki Ando <n-ando@aist.go.jp> and Shinji Kurihara 00010 # 00011 # Copyright (C) 2006-2008 00012 # Noriaki Ando 00013 # Task-intelligence Research Group, 00014 # Intelligent Systems Research Institute, 00015 # National Institute of 00016 # Advanced Industrial Science and Technology (AIST), Japan 00017 # All rights reserved. 00018 00019 00020 from omniORB import * 00021 from omniORB import any 00022 00023 import OpenRTM_aist 00024 00025 00026 ## 00027 # @if jp 00028 # @brief データにタイムスタンプをセットする 00029 # 00030 # データポートのデータに対してタイムスタンプをセットする。データポート 00031 # のデータは構造体のメンバーとして tm.sec, tm.nsec を持つ必要がある。 00032 # 00033 # @param data タイムスタンプをセットするデータ。実行後実行時のタイムス 00034 # タンプがセットされる 00035 # 00036 # @else 00037 # @brief Setting timestamp to data 00038 # 00039 # This function sets timestamp to data of data port. This data should 00040 # have tm.sec, tm.nsec as members of the structure. 00041 # 00042 # @param data Data to be set timestamp. After executing this 00043 # function, current timestamp is set to the data. 00044 # 00045 # @endif 00046 # template <class DataType> 00047 # void setTimestamp(DataType& data) 00048 def setTimestamp(data): 00049 # set timestamp 00050 tm = OpenRTM_aist.Time() 00051 data.tm.sec = tm.sec 00052 data.tm.nsec = tm.usec * 1000 00053 00054 00055 ## 00056 # @if jp 00057 # 00058 # @class OutPort 00059 # 00060 # @brief OutPort クラス 00061 # 00062 # OutPort 用クラス 00063 # 00064 # @since 0.2.0 00065 # 00066 # @else 00067 # 00068 # @endif 00069 class OutPort(OpenRTM_aist.OutPortBase): 00070 """ 00071 """ 00072 00073 00074 00075 ## 00076 # @if jp 00077 # 00078 # @brief コンストラクタ 00079 # 00080 # コンストラクタ 00081 # 00082 # @param self 00083 # @param name ポート名 00084 # @param value このポートにバインドされるデータ変数 00085 # @param buffer_ バッファ 00086 # 00087 # @else 00088 # 00089 # @brief Constructor 00090 # 00091 # @endif 00092 def __init__(self, name, value, buffer=None): 00093 OpenRTM_aist.OutPortBase.__init__(self, name, OpenRTM_aist.toTypename(value)) 00094 self._value = value 00095 #self._timeoutTick = 1000 # timeout tick: 1ms 00096 #self._writeBlock = False 00097 #self._writeTimeout = 0 00098 self._OnWrite = None 00099 self._OnWriteConvert = None 00100 #self._OnOverflow = None 00101 #self._OnUnderflow = None 00102 #self._OnConnect = None 00103 #self._OnDisconnect = None 00104 00105 00106 def __del__(self, OutPortBase=OpenRTM_aist.OutPortBase): 00107 OutPortBase.__del__(self) 00108 return 00109 00110 ## 00111 # @if jp 00112 # 00113 # @brief データ書き込み 00114 # 00115 # ポートへデータを書き込む。 00116 # 00117 # - コールバックファンクタ OnWrite がセットされている場合、 00118 # OutPort が保持するバッファに書き込む前に OnWrite が呼ばれる。 00119 # - OutPort が保持するバッファがオーバーフローを検出できるバッファであり、 00120 # かつ、書き込む際にバッファがオーバーフローを検出した場合、 00121 # コールバックファンクタ OnOverflow が呼ばれる。 00122 # - コールバックファンクタ OnWriteConvert がセットされている場合、 00123 # バッファ書き込み時に、 OnWriteConvert の operator() の戻り値が 00124 # バッファに書き込まれる。 00125 # 00126 # @param self 00127 # @param value 書き込み対象データ 00128 # 00129 # @return 書き込み処理結果(書き込み成功:true、書き込み失敗:false) 00130 # 00131 # @else 00132 # 00133 # @brief Write data 00134 # 00135 # @endif 00136 # virtual bool write(const DataType& value) 00137 ## 00138 # @if jp 00139 # 00140 # @brief データ書き込み 00141 # 00142 # ポートへデータを書き込む。 00143 # 設定された値をポートに書き込む。 00144 # 00145 # @param self 00146 # @param value 書き込み対象データ 00147 # 00148 # @return 書き込み処理結果(書き込み成功:true、書き込み失敗:false) 00149 # 00150 # @else 00151 # 00152 # @endif 00153 # bool operator<<(DataType& value) 00154 def write(self, value=None): 00155 if not value: 00156 value=self._value 00157 00158 00159 if self._OnWrite: 00160 self._OnWrite(value) 00161 00162 # check number of connectors 00163 conn_size = len(self._connectors) 00164 if not conn_size > 0: 00165 return True 00166 00167 # set timestamp 00168 #tm = Time() 00169 #value.tm.sec = tm.sec 00170 #value.tm.nsec = tm.usec * 1000 00171 00172 #tm_pre = Time() 00173 00174 if self._OnWriteConvert: 00175 value = self._OnWriteConvert(value) 00176 00177 result = True 00178 00179 guard = OpenRTM_aist.ScopedLock(self._connector_mutex) 00180 for con in self._connectors: 00181 ret = con.write(value) 00182 if ret != self.PORT_OK: 00183 result = False 00184 if ret == self.CONNECTION_LOST: 00185 self.disconnect(con.id()) 00186 00187 return result 00188 00189 00190 ## 00191 # @if jp 00192 # 00193 # @brief データ書き込み処理のブロックモードの設定 00194 # 00195 # 書き込み処理に対してブロックモードを設定する。 00196 # ブロックモードを指定した場合、バッファに書き込む領域ができるか 00197 # タイムアウトが発生するまで write() メソッドの呼びだしがブロックされる。 00198 # 00199 # @param self 00200 # @param block ブロックモードフラグ 00201 # 00202 # @else 00203 # 00204 # @brief Set read() block mode 00205 # 00206 # @endif 00207 #def setWriteBlock(self, block): 00208 # self._writeBlock = block 00209 00210 00211 ## 00212 # @if jp 00213 # 00214 # @brief 書き込み処理のタイムアウト時間の設定 00215 # 00216 # write() のタイムアウト時間を usec で設定する。 00217 # write() はブロックモードでなければならない。 00218 # 00219 # @param self 00220 # @param timeout タイムアウト時間 [usec] 00221 # 00222 # @else 00223 # 00224 # @brief Set write() timeout 00225 # 00226 # @endif 00227 #def setWriteTimeout(self, timeout): 00228 # self._writeTimeout = timeout 00229 00230 00231 ## 00232 # @if jp 00233 # 00234 # @brief OnWrite コールバックの設定 00235 # 00236 # データ書き込み直前に呼ばれる OnWrite コールバックファンクタを設定する。 00237 # 00238 # @param self 00239 # @param on_write OnWrite コールバックファンクタ 00240 # 00241 # @else 00242 # 00243 # @brief Set OnWrite callback 00244 # 00245 # @endif 00246 def setOnWrite(self, on_write): 00247 self._OnWrite = on_write 00248 00249 00250 ## 00251 # @if jp 00252 # 00253 # @brief OnWriteConvert コールバックの設定 00254 # 00255 # データ書き込み時に呼ばれる OnWriteConvert コールバックファンクタを設定 00256 # する。 00257 # このコールバック関数の処理結果が書き込まれる。 00258 # このため書き込みデータのフィルタリングが可能となる。 00259 # 00260 # @param self 00261 # @param on_wconvert OnWriteConvert コールバックファンクタ 00262 # 00263 # @else 00264 # 00265 # @brief Set OnWriteConvert callback 00266 # 00267 # @endif 00268 def setOnWriteConvert(self, on_wconvert): 00269 self._OnWriteConvert = on_wconvert 00270 00271 00272 ## 00273 # @if jp 00274 # 00275 # @brief データ型名取得用メソッド 00276 # 00277 # データの型名を取得するため、InPortCorbaProviderから呼ばれる。 00278 # 00279 # @param self 00280 # 00281 # @return バッファに設定されているデータの型名 00282 # 00283 # @else 00284 # 00285 # @endif 00286 def getPortDataType(self): 00287 val = any.to_any(self._value) 00288 return str(val.typecode().name()) 00289 00290 00291 00292 class subscribe: 00293 def __init__(self, prof, subs = None): 00294 if subs: 00295 self._prof = subs._prof 00296 self._consumer = subs._consumer 00297 return 00298 00299 self._prof = prof 00300 self._consumer = None 00301 00302 00303 def __call__(self, cons): 00304 if cons.subscribeInterface(self._prof.properties): 00305 self._consumer = cons