2013年8月17日土曜日

【なでしこ】プラグインを作ってみる ~設計編 その4~

もう1種類のバッファとして、リングバッファを準備します。シリアルのデータ
受信をスレッドにする場合にはリングバッファを仕様することが多いので、
前もって準備しておきます。

※なでしこではスレッドには対応してませんので、対応する場合は
 DLL内でスレッドを生成することになります。…今のところ対応予定は
 ないですが(^^;。

------ここから------

 ・リングバッファ確保
    書式:バッファ確保([int]サイズ)
    戻値:[int]ハンドル
    説明:メモリを動的に確保して、そのハンドルを返す。成功した場合、
       0以上のハンドル値が、失敗した場合には-1が返される。
        
          なお、メモリは動的に確保されているので、使用後はかならず
          ハンドルの解放を実施して確保されたメモリ領域を解放する
          こと。
        
          「バッファ確保」と処理内容は一緒だが、以降このバッファは
          リングバッファとして扱われる。

・リングバッファ読込
    書式:リングバッファ読込([int]ハンドル、[int]先ハンドル、[int]サイズ)
    戻値:[int]サイズ
    説明:確保されているリングバッファハンドルから、サイズ分を読み
         込んで先ハンドル(バッファ)に書き込む。読み込めるサイズは
          コピー先のバッファサイズに依存し、バッファサイズ以上の
          データは読み込まない。読み込めたサイズは戻り値として返される。
        
          リングバッファなので、読み込みの開始位置は現在の読込位置
          となり、読み込んだサイズ分は以降書込可能領域となる。
        
          引数が不正な場合等、エラーの場合は-1が返される。

・リングバッファ書込
    書式:リングバッファ書込([int]ハンドル、[int]元ハンドル、[int]サイズ)
    戻値:[int]サイズ
    説明:作成済みの元ハンドル(バッファ)からサイズ分読み込んで、
       確保されているリングバッファハンドルに対して書き込む。
          書き込めるサイズは元ハンドルのサイズに依存し、それ以上の
          サイズを指定した場合は、書き込めるだけ書き込む。
          (データがある分だけ書き込む)。書き込めたサイズが戻り値
          として返される。
        
          書き込み位置はリングバッファ中の書き込み可能な領域の先頭
          からとなり、書き込んだ分は以降読込可能となる。書き込む前に
          空き領域を知りたい場合には「リングバッファ空きサイズ」
          命令でサイズを取得出来る。
        
          引数が不正な場合等、エラーの場合は-1が返される。

・リングバッファ読込サイズ
    書式:リングバッファ読込サイズ([int]ハンドル)
    戻値:[int]読込可能サイズ
    説明:確保されているリングバッファハンドルの、現在読み込める
       データサイズを返す。
        
          引数が不正な場合等、エラーの場合は-1が返される。

------ここまで------

リングバッファは一つのバッファを、読み込み側と書き込み側で
共有するためのものです。まず書き込みを行って、その部分が
読み込まれれば、そこは再度書き込み可能となります。

バッファの先頭から書き始めて終端まで行ったらまた先頭に戻り、
そこが「書き込み可能」になっていればさらに書き込みます、リング
の様にグルグルとバッファを繰り返し使うのでリングバッファです。