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 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: 00052 """ 00053 """ 00054 00055 00056 ## 00057 # @if jp 00058 # 00059 # @brief バッファの長さを取得する(サブクラス実装用) 00060 # 00061 # バッファ長を取得する<BR> 00062 # ※サブクラスでの実装参照用 00063 # 00064 # @param self 00065 # 00066 # @return バッファ長 00067 # 00068 # @else 00069 # 00070 # @brief Get the buffer length 00071 # 00072 # @return buffer length 00073 # 00074 # @endif 00075 def length(self): 00076 pass 00077 00078 00079 ## 00080 # @if jp 00081 # 00082 # @brief バッファにデータを書き込む(サブクラス実装用) 00083 # 00084 # バッファにデータを書き込む<BR> 00085 # ※サブクラスでの実装参照用 00086 # 00087 # @param self 00088 # @param value 書き込み対象データ 00089 # 00090 # @return データ書き込み結果(true:書き込み成功,false:書き込み失敗) 00091 # 00092 # @else 00093 # 00094 # @brief Write data into the buffer 00095 # 00096 # @endif 00097 def write(self, value): 00098 pass 00099 00100 00101 ## 00102 # @if jp 00103 # 00104 # @brief バッファからデータを読み出す(サブクラス実装用) 00105 # 00106 # バッファからデータを読み出す<BR> 00107 # ※サブクラスでの実装参照用 00108 # 00109 # @param self 00110 # @param value 読み出しデータ 00111 # 00112 # @return データ読み出し結果(true:読み出し成功,false:読み出し失敗) 00113 # 00114 # @else 00115 # 00116 # @brief Read data from the buffer 00117 # 00118 # @endif 00119 def read(self, value): 00120 pass 00121 00122 00123 ## 00124 # @if jp 00125 # 00126 # @brief バッファfullチェック(サブクラス実装用) 00127 # 00128 # バッファfullチェック用関数<BR> 00129 # ※サブクラスでの実装参照用 00130 # 00131 # @param self 00132 # 00133 # @return fullチェック結果(true:バッファfull,false:バッファ空きあり) 00134 # 00135 # @else 00136 # 00137 # @brief True if the buffer is full, else false. 00138 # 00139 # @endif 00140 def isFull(self): 00141 pass 00142 00143 00144 ## 00145 # @if jp 00146 # 00147 # @brief バッファemptyチェック(サブクラス実装用) 00148 # 00149 # バッファemptyチェック用関数<BR> 00150 # ※サブクラスでの実装参照用 00151 # 00152 # @param self 00153 # 00154 # @return emptyチェック結果(true:バッファempty,false:バッファデータあり) 00155 # 00156 # @else 00157 # 00158 # @brief True if the buffer is empty, else false. 00159 # 00160 # @endif 00161 def isEmpty(self): 00162 pass 00163 00164 00165 ## 00166 # @if jp 00167 # 00168 # @brief バッファにデータを格納する(サブクラス実装用) 00169 # 00170 # バッファへのデータ格納用関数<BR> 00171 # ※サブクラスでの実装参照用 00172 # 00173 # @param self 00174 # @param data 対象データ 00175 # 00176 # @else 00177 # 00178 # @brief Write data into the buffer 00179 # 00180 # @endif 00181 def put(self, data): 00182 pass 00183 00184 00185 ## 00186 # @if jp 00187 # 00188 # @brief バッファからデータを取得する(サブクラス実装用) 00189 # 00190 # バッファに格納されたデータ取得用関数<BR> 00191 # ※サブクラスでの実装参照用 00192 # 00193 # @param self 00194 # 00195 # @return 取得データ 00196 # 00197 # @else 00198 # 00199 # @brief Get data from the buffer 00200 # 00201 # @endif 00202 def get(self): 00203 pass 00204 00205 00206 ## 00207 # @if jp 00208 # 00209 # @brief 次に書き込むバッファへの参照を取得する(サブクラス実装用) 00210 # 00211 # 書き込みバッファへの参照取得用関数<BR> 00212 # ※サブクラスでの実装参照用 00213 # 00214 # @param self 00215 # 00216 # @return 次の書き込み対象バッファへの参照 00217 # 00218 # @else 00219 # 00220 # @brief Get the buffer's reference to be written the next 00221 # 00222 # @endif 00223 def getRef(self): 00224 pass 00225 00226 00227 ## 00228 # @if jp 00229 # @class NullBuffer 00230 # @brief ダミーバッファ実装クラス 00231 # 00232 # バッファ長が1固定のダミーバッファ実装クラス。 00233 # 00234 # @param DataType バッファに格納するデータ型 00235 # 00236 # @since 0.4.0 00237 # 00238 # @else 00239 # 00240 # @endif 00241 class NullBuffer(BufferBase): 00242 """ 00243 """ 00244 00245 00246 00247 ## 00248 # @if jp 00249 # 00250 # @brief コンストラクタ 00251 # 00252 # コンストラクタ 00253 # バッファ長を1(固定)で初期化する。 00254 # 00255 # @param self 00256 # @param size バッファ長(デフォルト値:None,ただし無効) 00257 # 00258 # @else 00259 # 00260 # @endif 00261 def __init__(self, size=None): 00262 if size is None: 00263 size=1 00264 self._length = 1 00265 self._data = None 00266 self._is_new = False 00267 self._inited = False 00268 00269 00270 ## 00271 # @if jp 00272 # 00273 # @brief コンストラクタ 00274 # 00275 # コンストラクタ 00276 # 00277 # @param self 00278 # @param data 格納データ 00279 # 00280 # @else 00281 # 00282 # @endif 00283 def init(self, data): 00284 self.put(data) 00285 00286 00287 ## 00288 # @if jp 00289 # 00290 # @brief バッファの初期化 00291 # 00292 # バッファの初期化を実行する。 00293 # 00294 # @param self 00295 # 00296 # @else 00297 # 00298 # @endif 00299 def clear(self): 00300 self._inited = False 00301 00302 00303 ## 00304 # @if jp 00305 # 00306 # @brief バッファ長(1固定)を取得する 00307 # 00308 # バッファ長を取得する。(常に1を返す。) 00309 # 00310 # @param self 00311 # 00312 # @return バッファ長(1固定) 00313 # 00314 # @else 00315 # 00316 # @brief Get the buffer length 00317 # 00318 # @return buffer length(always 1) 00319 # 00320 # @endif 00321 def length(self): 00322 return 1 00323 00324 00325 ## 00326 # @if jp 00327 # 00328 # @brief バッファにデータを書き込む 00329 # 00330 # 引数で与えられたデータをバッファに書き込む。 00331 # 00332 # @param self 00333 # @param value 書き込み対象データ 00334 # 00335 # @return データ書き込み結果(true:書き込み成功,false:書き込み失敗) 00336 # 00337 # @else 00338 # 00339 # @brief Write data into the buffer 00340 # 00341 # @endif 00342 def write(self, value): 00343 self.put(value) 00344 return True 00345 00346 00347 ## 00348 # @if jp 00349 # 00350 # @brief バッファからデータを読み出す 00351 # 00352 # バッファに格納されたデータを読み出す。 00353 # 00354 # @param self 00355 # @param value 読み出したデータ 00356 # 00357 # @return データ読み出し結果(true:読み出し成功,false:読み出し失敗) 00358 # 00359 # @else 00360 # 00361 # @brief Read data from the buffer 00362 # 00363 # @endif 00364 def read(self, value): 00365 if not self._inited: 00366 return False 00367 value[0] = self.get() 00368 return True 00369 00370 00371 ## 00372 # @if jp 00373 # 00374 # @brief バッファfullチェック 00375 # 00376 # バッファfullをチェックする。(常にfalseを返す。) 00377 # 00378 # @param self 00379 # 00380 # @return fullチェック結果(常にfalse) 00381 # 00382 # @else 00383 # 00384 # @brief Always false. 00385 # 00386 # @endif 00387 def isFull(self): 00388 return False 00389 00390 00391 ## 00392 # @if jp 00393 # 00394 # @brief バッファemptyチェック 00395 # 00396 # バッファemptyをチェックする。(常にfalseを返す。) 00397 # ※要確認 00398 # 00399 # @param self 00400 # 00401 # @return emptyチェック結果(常にfalse) 00402 # 00403 # @else 00404 # 00405 # @brief Always false. 00406 # 00407 # @endif 00408 def isEmpty(self): 00409 return not self._inited 00410 00411 00412 ## 00413 # @if jp 00414 # 00415 # @brief 最新データか確認する 00416 # 00417 # 現在のバッファ位置に格納されているデータが最新データか確認する。 00418 # 00419 # @param self 00420 # 00421 # @return 最新データ確認結果 00422 # ( true:最新データ.データはまだ読み出されていない 00423 # false:過去のデータ.データは既に読み出されている) 00424 # 00425 # @else 00426 # 00427 # @endif 00428 def isNew(self): 00429 return self._is_new 00430 00431 00432 ## 00433 # @if jp 00434 # 00435 # @brief バッファにデータを格納 00436 # 00437 # 引数で与えられたデータをバッファに格納する。 00438 # 00439 # @param self 00440 # @param data 対象データ 00441 # 00442 # @else 00443 # 00444 # @brief Write data into the buffer 00445 # 00446 # @endif 00447 def put(self, data): 00448 self._data = data 00449 self._is_new = True 00450 self._inited = True 00451 00452 00453 ## 00454 # @if jp 00455 # 00456 # @brief バッファからデータを取得する 00457 # 00458 # バッファに格納されたデータを取得する。 00459 # 00460 # @param self 00461 # 00462 # @return 取得データ 00463 # 00464 # @else 00465 # 00466 # @brief Get data from the buffer 00467 # 00468 # @endif 00469 def get(self): 00470 self._is_new = False 00471 return self._data 00472 00473 00474 ## 00475 # @if jp 00476 # 00477 # @brief 次に書き込むバッファへの参照を取得する 00478 # 00479 # 書き込みバッファへの参照を取得する。 00480 # 本バッファ実装ではバッファ長は固定で1であるため, 00481 # 常に同じ位置への参照を返す。 00482 # 00483 # @param self 00484 # 00485 # @return 次の書き込み対象バッファへの参照(固定) 00486 # 00487 # @else 00488 # 00489 # @brief Get the buffer's reference to be written the next 00490 # 00491 # @endif 00492 def getRef(self): 00493 return self._data