RingBuffer.py

説明を見る。
00001 #!/usr/bin/env python
00002 # -*- coding: euc-jp -*-
00003 
00004 ##
00005 # @file RingBuffer.py
00006 # @brief Defautl Buffer 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 RTC
00019 import OpenRTM
00020 
00021 ##
00022 # @if jp
00023 # @class RingBuffer
00024 # @brief リングバッファ実装クラス
00025 # 
00026 # 指定した長さのリング状バッファを持つバッファ実装クラス。
00027 # バッファ全体にデータが格納された場合、以降のデータは古いデータから
00028 # 順次上書きされる。
00029 # 従って、バッファ内には直近のバッファ長分のデータのみ保持される。
00030 #
00031 # 注)現在の実装では、一番最後に格納したデータのみバッファから読み出し可能
00032 #
00033 # @param DataType バッファに格納するデータ型
00034 #
00035 # @since 0.4.0
00036 #
00037 # @else
00038 #
00039 # @endif
00040 class RingBuffer(OpenRTM.BufferBase):
00041   """
00042   """
00043 
00044 
00045 
00046   ##
00047   # @if jp
00048   #
00049   # @brief コンストラクタ
00050   # 
00051   # コンストラクタ
00052   # 指定されたバッファ長でバッファを初期化する。
00053   # ただし、指定された長さが2未満の場合、長さ2でバッファを初期化する。
00054   #
00055   # @param self
00056   # @param length バッファ長
00057   # 
00058   # @else
00059   #
00060   # @endif
00061   def __init__(self, length):
00062     self._oldPtr = 0
00063     if length < 2:
00064       self._length = 2
00065       self._newPtr = 1
00066     else:
00067       self._length = length
00068       self._newPtr = length - 1
00069 
00070     self._inited = False
00071     self._buffer = [self.Data() for i in range(self._length)]
00072 
00073 
00074   ##
00075   # @if jp
00076   #
00077   # @brief 初期化
00078   # 
00079   # バッファの初期化を実行する。
00080   # 指定された値をバッファ全体に格納する。
00081   #
00082   # @param self
00083   # @param data 初期化用データ
00084   # 
00085   # @else
00086   #
00087   # @endif
00088   def init(self, data):
00089     for i in range(self._length):
00090       self.put(data)
00091 
00092 
00093   ##
00094   # @if jp
00095   #
00096   # @brief クリア
00097   # 
00098   # バッファに格納された情報をクリアする。
00099   #
00100   # @param self
00101   # 
00102   # @else
00103   #
00104   # @endif
00105   def clear(self):
00106     self._inited = False
00107 
00108 
00109   ##
00110   # @if jp
00111   #
00112   # @brief バッファ長を取得する
00113   # 
00114   # バッファ長を取得する。
00115   #
00116   # @param self
00117   # 
00118   # @return バッファ長
00119   # 
00120   # @else
00121   #
00122   # @brief Get the buffer length
00123   #
00124   # @endif
00125   def length(self):
00126     return self._length
00127 
00128 
00129   ##
00130   # @if jp
00131   #
00132   # @brief バッファに書き込む
00133   # 
00134   # 引数で与えられたデータをバッファに書き込む。
00135   # 
00136   # @param self
00137   # @param value 書き込み対象データ
00138   #
00139   # @return データ書き込み結果(常にtrue:書き込み成功を返す)
00140   # 
00141   # @else
00142   #
00143   # @brief Write data into the buffer
00144   #
00145   # @endif
00146   def write(self, value):
00147     self.put(value)
00148     return True
00149 
00150 
00151   ##
00152   # @if jp
00153   #
00154   # @brief バッファから読み出す
00155   # 
00156   # バッファに格納されたデータを読み出す。
00157   # 
00158   # @param self
00159   # @param value 読み出したデータ
00160   #
00161   # @return データ読み出し結果
00162   # 
00163   # @else
00164   #
00165   # @brief Write data into the buffer
00166   #
00167   # @endif
00168   def read(self, value):
00169     if not self._inited:
00170       return False
00171     value[0] = self.get()
00172     return True
00173 
00174 
00175   ##
00176   # @if jp
00177   #
00178   # @brief バッファが満杯であるか確認する
00179   # 
00180   # バッファ満杯を確認する。(常にfalseを返す。)
00181   # 
00182   # @param self
00183   #
00184   # @return 満杯確認結果(常にfalse)
00185   # 
00186   # @else
00187   #
00188   # @brief True if the buffer is full, else false.
00189   #
00190   # @endif
00191   def isFull(self):
00192     return False
00193 
00194 
00195   ##
00196   # @if jp
00197   #
00198   # @brief バッファが空であるか確認する
00199   # 
00200   # バッファ空を確認する。
00201   # 
00202   # 注)現在の実装では,現在のバッファ位置に格納されたデータが読み出されたか
00203   # どうかを返す。( true:データ読み出し済,false:データ未読み出し)
00204   # 
00205   # @param self
00206   #
00207   # @return 空確認結果
00208   # 
00209   # @else
00210   #
00211   # @brief True if the buffer is empty, else false.
00212   #
00213   # @endif
00214   def isEmpty(self):
00215     return not self._inited
00216 
00217 
00218   ##
00219   # @if jp
00220   #
00221   # @brief 最新データか確認する
00222   # 
00223   # 現在のバッファ位置に格納されているデータが最新データか確認する。
00224   # 
00225   # @param self
00226   #
00227   # @return 最新データ確認結果
00228   #           ( true:最新データ.データはまだ読み出されていない
00229   #            false:過去のデータ.データは既に読み出されている)
00230   # 
00231   # @else
00232   #
00233   # @endif
00234   def isNew(self):
00235     return self._buffer[self._newPtr].isNew()
00236 
00237 
00238   ##
00239   # @if jp
00240   #
00241   # @brief バッファにデータを格納する
00242   # 
00243   # 引数で与えられたデータをバッファに格納する。
00244   # 
00245   # 注)現在の実装ではデータを格納すると同時に、データの読み出し位置を
00246   # 格納したデータ位置に設定している。このため、常に直近に格納したデータを
00247   # 取得する形となっている。
00248   # 
00249   # @param self
00250   # @param data 格納対象データ
00251   # 
00252   # @else
00253   #
00254   # @brief Write data into the buffer
00255   #
00256   # @endif
00257   def put(self, data):
00258     self._buffer[self._oldPtr].write(data)
00259     self._newPtr = self._oldPtr
00260     ptr = self._oldPtr + 1
00261     self._oldPtr = ptr % self._length
00262     self._inited = True
00263 
00264 
00265   ##
00266   # @if jp
00267   #
00268   # @brief バッファからデータを取得する
00269   # 
00270   # バッファに格納されたデータを取得する。
00271   # 
00272   # @param self
00273   #
00274   # @return 取得データ
00275   # 
00276   # @else
00277   #
00278   # @brief Get data from the buffer
00279   #
00280   # @endif
00281   def get(self):
00282     return self._buffer[self._newPtr].read()
00283 
00284 
00285   ##
00286   # @if jp
00287   #
00288   # @brief 次に書き込むバッファへの参照を取得する
00289   # 
00290   # 書き込みバッファへの参照を取得する。
00291   # 
00292   # @return 次の書き込み対象バッファへの参照
00293   # 
00294   # @param self
00295   #
00296   # @else
00297   #
00298   # @brief Get the buffer's reference to be written the next
00299   #
00300   # @endif
00301   def getRef(self):
00302     return self._buffer[self._newPtr].data
00303 
00304 
00305   ##
00306   # @if jp
00307   # @class Data
00308   # @brief バッファデータクラス
00309   # 
00310   # バッファデータ格納用配列クラス。
00311   #
00312   # @since 0.4.0
00313   #
00314   # @else
00315   # @brief Buffer sequence
00316   # @endif
00317   class Data:
00318     def __init__(self):
00319       self.data = None
00320       self.is_new = False
00321 
00322 
00323     def write(self, other):
00324       self.is_new = True
00325       self.data = other
00326 
00327 
00328     def read(self):
00329       self.is_new = False
00330       return self.data
00331 
00332 
00333     def isNew(self):
00334       return self.is_new

OpenRTMに対してMon Mar 17 15:11:06 2008に生成されました。  doxygen 1.5.4