|
#include "fifo_private.h"
|
|
/**
|
* Initialize fifo
|
* @param fifo
|
*/
|
void fifo_init(scpi_fifo_t * fifo) {
|
fifo->wr = 0;
|
fifo->rd = 0;
|
fifo->size = FIFO_SIZE;
|
}
|
|
/**
|
* Empty fifo
|
* @param fifo
|
*/
|
void fifo_clear(scpi_fifo_t * fifo) {
|
fifo->wr = 0;
|
fifo->rd = 0;
|
}
|
|
/**
|
* Test if fifo is empty
|
* @param fifo
|
* @return
|
*/
|
scpi_bool_t fifo_is_empty(scpi_fifo_t * fifo) {
|
return fifo->wr == fifo->rd;
|
}
|
|
/**
|
* Test if fifo is full
|
* @param fifo
|
* @return
|
*/
|
scpi_bool_t fifo_is_full(scpi_fifo_t * fifo) {
|
return fifo->wr == ((fifo->rd + fifo->size - 1) % (fifo->size));
|
}
|
|
/**
|
* Add element to fifo. If fifo is full, return FALSE.
|
* @param fifo
|
* @param value
|
* @return
|
*/
|
scpi_bool_t fifo_add(scpi_fifo_t * fifo, int16_t value) {
|
/* FIFO full? */
|
if (fifo_is_full(fifo)) {
|
return FALSE;
|
}
|
|
fifo->data[fifo->wr] = value;
|
fifo->wr = (fifo->wr + 1) % (fifo->size);
|
|
return TRUE;
|
}
|
|
/**
|
* Remove element form fifo
|
* @param fifo
|
* @param value
|
* @return FALSE - fifo is empty
|
*/
|
scpi_bool_t fifo_remove(scpi_fifo_t * fifo, int16_t * value) {
|
/* FIFO empty? */
|
if (fifo_is_empty(fifo)) {
|
return FALSE;
|
}
|
|
if (value) {
|
*value = fifo->data[fifo->rd];
|
}
|
|
fifo->rd = (fifo->rd + 1) % (fifo->size);
|
|
return TRUE;
|
}
|
|
/**
|
* Remove last element from fifo
|
* @param fifo
|
* @param value
|
* @return FALSE - fifo is empty
|
*/
|
scpi_bool_t fifo_remove_last(scpi_fifo_t * fifo, int16_t * value) {
|
/* FIFO empty? */
|
if (fifo_is_empty(fifo)) {
|
return FALSE;
|
}
|
|
fifo->wr = (fifo->wr + fifo->size - 1) % (fifo->size);
|
|
if (value) {
|
*value = fifo->data[fifo->wr];
|
}
|
|
return TRUE;
|
}
|
|
/**
|
* Retrive number of elements in fifo
|
* @param fifo
|
* @param value
|
* @return
|
*/
|
scpi_bool_t fifo_count(scpi_fifo_t * fifo, int16_t * value) {
|
*value = fifo->wr - fifo->rd;
|
if (*value < 0) {
|
*value += (fifo->size);
|
}
|
return TRUE;
|
}
|