00001 #!/usr/bin/env python 00002 # -*- coding: euc-jp -*- 00003 00004 ## 00005 # @file BufferBase.py 00006 # @brief Buffer abstract class 00007 # @date $Date: 2007/09/12 $ 00008 # @author Noriaki Ando <n-ando@aist.go.jp> and Shinji Kurihara 00009 # 00010 # Copyright (C) 2006-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 OpenRTM_aist 00019 00020 ## 00021 # @if jp 00022 # @class BufferBase 00023 # @brief BufferBase 抽象クラス 00024 # 00025 # 種々のバッファのための抽象インターフェースクラス。 00026 # 具象バッファクラスは、以下の関数の実装を提供しなければならない。 00027 # 00028 # publicインターフェースとして以下のものを提供する。 00029 # - write(): バッファに書き込む 00030 # - read(): バッファから読み出す 00031 # - length(): バッファ長を返す 00032 # - isFull(): バッファが満杯である 00033 # - isEmpty(): バッファが空である 00034 # 00035 # protectedインターフェースとして以下のものを提供する。 00036 # - put(): バッファにデータを書き込む 00037 # - get(): バッファからデータを読み出す 00038 # 00039 # @since 0.4.0 00040 # 00041 # @else 00042 # 00043 # @class BufferBase 00044 # @brief BufferBase abstract class 00045 # 00046 # This is the abstract interface class for various Buffer. 00047 # 00048 # @since 0.4.0 00049 # 00050 # @endif 00051 class BufferBase(OpenRTM_aist.BufferStatus): 00052 """ 00053 """ 00054 00055 00056 ## 00057 # @if jp 00058 # @brief バッファの設定 00059 # 00060 # Properties で与えられるプロパティにより、 00061 # バッファの設定を初期化する。 00062 # 使用できるオプションと意味は以下の通り 00063 # 00064 # - buffer.length: 00065 # バッファの長さ。自然数以外の数値が指定されても無視される。す 00066 # でにバッファが使用状態でも、長さが再設定されたのち、すべての 00067 # ポインタが初期化される。 00068 # 00069 # - buffer.write.full_policy: 00070 # 上書きするかどうかのポリシー。 00071 # overwrite (上書き), do_nothing (何もしない), block (ブロックする) 00072 # block を指定した場合、次の timeout 値を指定すれば、指定時間後 00073 # 書き込み不可能であればタイムアウトする。 00074 # デフォルトは overwrite (上書き)。 00075 # 00076 # - buffer.write.timeout: 00077 # タイムアウト時間を [sec] で指定する。デフォルトは 1.0 [sec]。 00078 # 1 sec -> 1.0, 1 ms -> 0.001, タイムアウトしない -> 0.0 00079 # 00080 # - buffer.read.empty_policy: 00081 # バッファが空のときの読み出しポリシー。 00082 # readback (最後の要素), do_nothing (何もしない), block (ブロックする) 00083 # block を指定した場合、次の timeout 値を指定すれば、指定時間後 00084 # 読み出し不可能であればタイムアウトする。 00085 # デフォルトは readback (最後の要素)。 00086 # 00087 # - buffer.read.timeout: 00088 # タイムアウト時間 [sec] で指定する。デフォルトは 1.0 [sec]。 00089 # 1sec -> 1.0, 1ms -> 0.001, タイムアウトしない -> 0.0 00090 # 00091 # @else 00092 # 00093 # @endif 00094 def init(self, prop): 00095 pass 00096 00097 00098 ## 00099 # @if jp 00100 # 00101 # @brief バッファの長さを取得する(サブクラス実装用) 00102 # 00103 # バッファ長を取得する<BR> 00104 # ※サブクラスでの実装参照用 00105 # 00106 # @param self 00107 # 00108 # @return バッファ長 00109 # 00110 # @else 00111 # 00112 # @brief Get the buffer length 00113 # 00114 # @return buffer length 00115 # 00116 # @endif 00117 def length(self): 00118 pass 00119 00120 00121 ## 00122 # @if jp 00123 # 00124 # @brief バッファの状態をリセットする 00125 # 00126 # バッファの読み出しポインタと書き込みポインタの位置をリセットする。 00127 # 00128 # @return BUFFER_OK: 正常終了 00129 # NOT_SUPPORTED: バッファ長変更不可 00130 # BUFFER_ERROR: 異常終了 00131 # 00132 # @else 00133 # 00134 # @brief Get the buffer length 00135 # 00136 # Pure virtual function to get the buffer length. 00137 # 00138 # @return buffer length 00139 # 00140 # @endif 00141 # 00142 def reset(self): 00143 pass 00144 00145 00146 ## 00147 # @if jp 00148 # 00149 # @brief バッファの現在の書込み要素のポインタ 00150 # 00151 # バッファの現在の書込み要素のポインタまたは、n個先のポインタを返す 00152 # 00153 # @param n 書込みポインタ + n の位置のポインタ 00154 # @return 書込み位置のポインタ 00155 # 00156 # @else 00157 # 00158 # @brief Get the buffer length 00159 # 00160 # Pure virtual function to get the buffer length. 00161 # 00162 # @return buffer length 00163 # 00164 # @endif 00165 def wptr(self, n=0): 00166 pass 00167 00168 00169 ## 00170 # @if jp 00171 # 00172 # @brief 書込みポインタを進める 00173 # 00174 # 現在の書き込み位置のポインタを n 個進める。 00175 # 00176 # @param n 書込みポインタ + n の位置のポインタ 00177 # @return BUFFER_OK: 正常終了 00178 # BUFFER_ERROR: 異常終了 00179 # 00180 # @else 00181 # 00182 # @brief Get the buffer length 00183 # 00184 # Pure virtual function to get the buffer length. 00185 # 00186 # @return buffer length 00187 # 00188 # @endif 00189 def advanceWptr(self, n = 1): 00190 pass 00191 00192 00193 ## 00194 # @if jp 00195 # 00196 # @brief バッファにデータを格納する(サブクラス実装用) 00197 # 00198 # バッファへのデータ格納用関数<BR> 00199 # ※サブクラスでの実装参照用 00200 # 00201 # @param self 00202 # @param data 対象データ 00203 # 00204 # @else 00205 # 00206 # @brief Write data into the buffer 00207 # 00208 # @endif 00209 def put(self, data): 00210 pass 00211 00212 00213 ## 00214 # @if jp 00215 # 00216 # @brief バッファにデータを書き込む(サブクラス実装用) 00217 # 00218 # バッファにデータを書き込む<BR> 00219 # ※サブクラスでの実装参照用 00220 # 00221 # @param self 00222 # @param value 書き込み対象データ 00223 # 00224 # @return データ書き込み結果(true:書き込み成功,false:書き込み失敗) 00225 # 00226 # @else 00227 # 00228 # @brief Write data into the buffer 00229 # 00230 # @endif 00231 def write(self, value, sec=-1, nsec=-1): 00232 pass 00233 00234 00235 ## 00236 # @if jp 00237 # 00238 # @brief バッファに書込み可能な要素数 00239 # 00240 # バッファに書込み可能な要素数を返す。 00241 # 00242 # @return 書き込み可能な要素数 00243 # 00244 # @return BUFFER_OK: 正常終了 00245 # BUFFER_ERROR: 異常終了 00246 # 00247 # @else 00248 # 00249 # @brief Write data into the buffer 00250 # 00251 # Pure virtual function to write data into the buffer. 00252 # 00253 # @param value Target data to write. 00254 # 00255 # @return Result of having written in data (true:Successful, false:Failed) 00256 # 00257 # @endif 00258 def writable(self): 00259 pass 00260 00261 00262 ## 00263 # @if jp 00264 # 00265 # @brief バッファfullチェック 00266 # 00267 # バッファfullチェック用純粋仮想関数 00268 # 00269 # @return fullチェック結果(true:バッファfull,false:バッファ空きあり) 00270 # 00271 # @else 00272 # 00273 # @brief Check on whether the buffer is full. 00274 # 00275 # Pure virtual function to check on whether the buffer is full. 00276 # 00277 # @return True if the buffer is full, else false. 00278 # 00279 # @endif 00280 def full(self): 00281 pass 00282 00283 00284 ## 00285 # @if jp 00286 # 00287 # @brief バッファの現在の読み出し要素のポインタ 00288 # 00289 # バッファの現在の読み出し要素のポインタまたは、n個先のポインタを返す 00290 # 00291 # @param n 読み出しポインタ + n の位置のポインタ 00292 # @return 読み出し位置のポインタ 00293 # 00294 # @else 00295 # 00296 # @brief Get the buffer length 00297 # 00298 # Pure virtual function to get the buffer length. 00299 # 00300 # @return buffer length 00301 # 00302 # @endif 00303 def rptr(self, n = 0): 00304 pass 00305 00306 ## 00307 # @if jp 00308 # 00309 # @brief 読み出しポインタを進める 00310 # 00311 # 現在の読み出し位置のポインタを n 個進める。 00312 # 00313 # @param n 読み出しポインタ + n の位置のポインタ 00314 # @return BUFFER_OK: 正常終了 00315 # BUFFER_ERROR: 異常終了 00316 # 00317 # @else 00318 # 00319 # @brief Get the buffer length 00320 # 00321 # Pure virtual function to get the buffer length. 00322 # 00323 # @return buffer length 00324 # 00325 # @endif 00326 def advanceRptr(self, n = 1): 00327 pass 00328 00329 00330 ## 00331 # @if jp 00332 # 00333 # @brief バッファからデータを取得する(サブクラス実装用) 00334 # 00335 # バッファに格納されたデータ取得用関数<BR> 00336 # ※サブクラスでの実装参照用 00337 # 00338 # @param self 00339 # 00340 # @return 取得データ 00341 # 00342 # @else 00343 # 00344 # @brief Get data from the buffer 00345 # 00346 # @endif 00347 def get(self): 00348 pass 00349 00350 00351 ## 00352 # @if jp 00353 # 00354 # @brief バッファからデータを読み出す(サブクラス実装用) 00355 # 00356 # バッファからデータを読み出す<BR> 00357 # ※サブクラスでの実装参照用 00358 # 00359 # @param self 00360 # @param value 読み出しデータ 00361 # 00362 # @return データ読み出し結果(true:読み出し成功,false:読み出し失敗) 00363 # 00364 # @else 00365 # 00366 # @brief Read data from the buffer 00367 # 00368 # @endif 00369 def read(self, value, sec = -1, nsec = -1): 00370 pass 00371 00372 00373 ## 00374 # @if jp 00375 # 00376 # @brief バッファから読み出し可能な要素数 00377 # 00378 # バッファから読み出し可能な要素数を返す。 00379 # 00380 # @return 読み出し可能な要素数 00381 # 00382 # @return BUFFER_OK: 正常終了 00383 # BUFFER_ERROR: 異常終了 00384 # 00385 # @else 00386 # 00387 # @brief Write data into the buffer 00388 # 00389 # Pure virtual function to write data into the buffer. 00390 # 00391 # @param value Target data to write. 00392 # 00393 # @return Result of having written in data (true:Successful, false:Failed) 00394 # 00395 # @endif 00396 def readable(self): 00397 pass 00398 00399 00400 ## 00401 # @if jp 00402 # 00403 # @brief バッファemptyチェック 00404 # 00405 # バッファemptyチェック用純粋仮想関数 00406 # 00407 # @return emptyチェック結果(true:バッファempty,false:バッファデータあり) 00408 # 00409 # @else 00410 # 00411 # @brief Check on whether the buffer is empty. 00412 # 00413 # Pure virtual function to check on whether the buffer is empty. 00414 # 00415 # @return True if the buffer is empty, else false. 00416 # 00417 # @endif 00418 def empty(self): 00419 pass 00420 00421 00422 00423 ## 00424 # @if jp 00425 # @class NullBuffer 00426 # @brief ダミーバッファ実装クラス 00427 # 00428 # バッファ長が1固定のダミーバッファ実装クラス。 00429 # 00430 # @param DataType バッファに格納するデータ型 00431 # 00432 # @since 0.4.0 00433 # 00434 # @else 00435 # 00436 # @endif 00437 class NullBuffer(BufferBase): 00438 """ 00439 """ 00440 00441 00442 00443 ## 00444 # @if jp 00445 # 00446 # @brief コンストラクタ 00447 # 00448 # コンストラクタ 00449 # バッファ長を1(固定)で初期化する。 00450 # 00451 # @param self 00452 # @param size バッファ長(デフォルト値:None,ただし無効) 00453 # 00454 # @else 00455 # 00456 # @endif 00457 def __init__(self, size=None): 00458 self._length = 1 00459 self._data = None 00460 self._is_new = False 00461 self._inited = False 00462 00463 00464 ## 00465 # @if jp 00466 # 00467 # @brief バッファ長(1固定)を取得する 00468 # 00469 # バッファ長を取得する。(常に1を返す。) 00470 # 00471 # @param self 00472 # 00473 # @return バッファ長(1固定) 00474 # 00475 # @else 00476 # 00477 # @brief Get the buffer length 00478 # 00479 # @return buffer length(always 1) 00480 # 00481 # @endif 00482 def length(self): 00483 return 1 00484 00485 00486 ## 00487 # @if jp 00488 # 00489 # @brief バッファにデータを書き込む 00490 # 00491 # 引数で与えられたデータをバッファに書き込む。 00492 # 00493 # @param self 00494 # @param value 書き込み対象データ 00495 # 00496 # @return データ書き込み結果(true:書き込み成功,false:書き込み失敗) 00497 # 00498 # @else 00499 # 00500 # @brief Write data into the buffer 00501 # 00502 # @endif 00503 def write(self, value, sec=-1, nsec=-1): 00504 self.put(value) 00505 return True 00506 00507 00508 ## 00509 # @if jp 00510 # 00511 # @brief バッファからデータを読み出す 00512 # 00513 # バッファに格納されたデータを読み出す。 00514 # 00515 # @param self 00516 # @param value 読み出したデータ 00517 # 00518 # @return データ読み出し結果(true:読み出し成功,false:読み出し失敗) 00519 # 00520 # @else 00521 # 00522 # @brief Read data from the buffer 00523 # 00524 # @endif 00525 def read(self, value): 00526 if not self._inited: 00527 return False 00528 value[0] = self.get() 00529 return True 00530 00531 00532 ## 00533 # @if jp 00534 # 00535 # @brief バッファfullチェック 00536 # 00537 # バッファfullをチェックする。(常にfalseを返す。) 00538 # 00539 # @param self 00540 # 00541 # @return fullチェック結果(常にfalse) 00542 # 00543 # @else 00544 # 00545 # @brief Always false. 00546 # 00547 # @endif 00548 def isFull(self): 00549 return False 00550 00551 00552 ## 00553 # @if jp 00554 # 00555 # @brief バッファemptyチェック 00556 # 00557 # バッファemptyをチェックする。(常にfalseを返す。) 00558 # ※要確認 00559 # 00560 # @param self 00561 # 00562 # @return emptyチェック結果(常にfalse) 00563 # 00564 # @else 00565 # 00566 # @brief Always false. 00567 # 00568 # @endif 00569 def isEmpty(self): 00570 return False 00571 00572 00573 ## 00574 # @if jp 00575 # 00576 # @brief 最新データか確認する 00577 # 00578 # 現在のバッファ位置に格納されているデータが最新データか確認する。 00579 # 00580 # @param self 00581 # 00582 # @return 最新データ確認結果 00583 # ( true:最新データ.データはまだ読み出されていない 00584 # false:過去のデータ.データは既に読み出されている) 00585 # 00586 # @else 00587 # 00588 # @endif 00589 def isNew(self): 00590 return self._is_new 00591 00592 00593 ## 00594 # @if jp 00595 # 00596 # @brief バッファにデータを格納 00597 # 00598 # 引数で与えられたデータをバッファに格納する。 00599 # 00600 # @param self 00601 # @param data 対象データ 00602 # 00603 # @else 00604 # 00605 # @brief Write data into the buffer 00606 # 00607 # @endif 00608 def put(self, data): 00609 self._data = data 00610 self._is_new = True 00611 self._inited = True 00612 00613 00614 ## 00615 # @if jp 00616 # 00617 # @brief バッファからデータを取得する 00618 # 00619 # バッファに格納されたデータを取得する。 00620 # 00621 # @param self 00622 # 00623 # @return 取得データ 00624 # 00625 # @else 00626 # 00627 # @brief Get data from the buffer 00628 # 00629 # @endif 00630 def get(self): 00631 self._is_new = False 00632 return self._data 00633 00634 00635 ## 00636 # @if jp 00637 # 00638 # @brief 次に書き込むバッファへの参照を取得する 00639 # 00640 # 書き込みバッファへの参照を取得する。 00641 # 本バッファ実装ではバッファ長は固定で1であるため, 00642 # 常に同じ位置への参照を返す。 00643 # 00644 # @param self 00645 # 00646 # @return 次の書き込み対象バッファへの参照(固定) 00647 # 00648 # @else 00649 # 00650 # @brief Get the buffer's reference to be written the next 00651 # 00652 # @endif 00653 def getRef(self): 00654 return self._data