Blame |
Last modification |
View Log
| RSS feed
/**
* a simple Fifo
* @file fifo.c
* @author Pascal Schnurr
*/
#include "fifo.h"
//--------------------------------------------------------------
void fifo_init (fifo_t * fifo, uint8_t * buffer, uint16_t size)
{
fifo->size = size;
fifo->buffer = buffer;
fifo->head = 0;
fifo->count = 0;
}
//--------------------------------------------------------------
bool fifo_is_empty (const fifo_t * fifo)
{
return (fifo->count == 0);
}
//--------------------------------------------------------------
bool fifo_is_full (const fifo_t * fifo)
{
return (fifo->size - fifo->count == 0);
}
//--------------------------------------------------------------
bool fifo_read (fifo_t * fifo, char *data)
{
if (fifo_is_empty (fifo))
return false;
uint8_t *head = fifo->buffer + fifo->head;
*data = (char) * head;
fifo->head = ( (fifo->head + 1) % fifo->size);
fifo->count--;
return true;
}
//--------------------------------------------------------------
bool fifo_write (fifo_t * fifo, const char data)
{
if (fifo_is_full (fifo))
return false;
uint8_t *end = fifo->buffer + ( (fifo->head + fifo->count) % fifo->size);
*end = (uint8_t) data;
fifo->count++;
return true;
}
//--------------------------------------------------------------
bool fifo_clear (fifo_t * fifo)
{
fifo->count = 0;
fifo->head = 0;
return true;
}
//--------------------------------------------------------------
static bool fifo_cmp_pgm_at (fifo_t * fifo, const prog_char * pgm, const uint16_t index)
{
uint16_t i;
uint8_t fifo_byte;
uint8_t pgm_byte;
for (i = 0; pgm_read_byte (pgm + i) != 0; i++)
{
if (fifo->count <= (i + index))
return false;
pgm_byte = pgm_read_byte (pgm + i);
fifo_byte = * (fifo->buffer + ( (fifo->head + i + index) % fifo->size));
if (fifo_byte != pgm_byte)
return false;
}
// We found the string, lets move the pointer
fifo->head = ( (fifo->head + i + index) % fifo->size);
fifo->count -= (i + index);
return true;
}
//--------------------------------------------------------------
bool fifo_cmp_pgm (fifo_t * fifo, const prog_char * pgm)
{
return fifo_cmp_pgm_at (fifo, pgm, 0);
}
//--------------------------------------------------------------
bool fifo_strstr_pgm (fifo_t * fifo, const prog_char * pgm)
{
for (uint16_t i = 0; i < fifo->count; i++)
{
if (fifo_cmp_pgm_at (fifo, pgm, i))
return true;
}
return false;
}