/*
* リングバッファ(FIFO)を表現するCソース
* これは数値用。
* num_tを定義して使用のこと
*
* @author fenrir (M.Naruoka)
* @since 04/05/30
* @version 1.0
*/
#include <stdio.h>
#include <common.h>
#include "fifo_num.h"
/**
* FIFOを初期化します。
*
* @param buffer 初期化するFIFO
* @param array 実際にバッファとして機能する領域
* @param size 実際のバッファサイズ、arrayの大きさ
* @return (fifo_num_t) 初期化されたリングバッファ
*/
fifo_num_t *fifo_num_init(fifo_num_t *buffer, num_t *array, fifo_num_size_t size){
if(size > 0){
buffer->buffer = array;
buffer->size = size;
buffer->prius = buffer->buffer;
buffer->follower = buffer->buffer + size -1;
return buffer;
}else{return NULL;}
}
/**
* FIFOに数値データを書き込みます。
*
* @param buffer 書き込む対象FIFO
* @param data 書き込む数値データ
* @return (accuracy *) 正常に書き込まれたかどうか、NULLは異常
*/
num_t *fifo_num_write(fifo_num_t *buffer, num_t data){
/* 空いているかチェック */
if(buffer->prius != buffer->follower){
if(buffer->prius == buffer->buffer + buffer->size){buffer->prius = buffer->buffer;}
*(buffer->prius++) = data;
return buffer->prius;
}
return NULL;
}
/**
* FIFOから数値データを読み取ります。
*
* @param buffer 読み込み元となるFIFO
* @param data 読み取ったデータを格納するバッファ
* @return (accuracy *) 読み取ったデータを格納するバッファ、データを読み込まなかった場合、NULL
*/
num_t *fifo_num_read(fifo_num_t *buffer, num_t *data){
if(data != NULL){
/* リングバッファ上にデータがあるかチェック */
if(((buffer->follower + 1) -buffer->prius) % buffer->size != 0){
/* 読込先に書き込み */
if(++buffer->follower == buffer->buffer + buffer->size){buffer->follower = buffer->buffer;}
*data = *(buffer->follower);
return data;
}
}
return NULL;
}
/**
* FIFO上にあるデータの個数を取得します。
*
* @param buffer FIFO
* @return (int) FIFO上にあるデータの個数
*/
fifo_num_size_t fifo_num_size(fifo_num_t *buffer){
return (buffer->prius > buffer->follower ?
buffer->prius -buffer->follower -1:
buffer->prius + buffer->size -buffer->follower -1);
}