Subversion Repositories NaviCtrl

Rev

Rev 153 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
41 ingob 1
#include "fifo.h"
2
 
153 killagreg 3
u8 fifo_init (fifo_t *f, u8 *buffer, const u16 size)
41 ingob 4
{
5
        if(f == NULL) return(0);
6
        f->buffer = buffer;
153 killagreg 7
        f->size = size;
8
        fifo_purge(f);
41 ingob 9
        return(1);
10
}
11
 
12
u8 fifo_put (fifo_t *f, const u8 data)
13
{
14
        if (f->count >= f->size) return(0);     // return 0 in case of FIFO overflow.
15
 
16
        u8 * pwrite = f->pwrite;
17
 
18
        *(pwrite++) = data;         // copy data byte to buffer
19
        if(pwrite >= f->buffer + f->size) pwrite = f->buffer; // start at the begining after reaching the end 
20
        f->pwrite = pwrite;
21
        f->count++;
22
        return 1;
23
}
24
 
25
u8 fifo_get (fifo_t *f, u8 *pdata)
26
{
27
        if((f == NULL) || (pdata == NULL)) return(0);
28
        if(!f->count) return(0);
29
 
30
        u8 *pread = f->pread;
31
        *pdata = *(pread++);
32
        if(pread >= f->buffer + f->size) pread = f->buffer; // start at the begining after reaching the end 
33
        f->pread = pread;
34
        f->count--;
35
        return(1);
36
}
37
 
38
u8 fifo_get_wait (fifo_t *f, u8 *pdata)
39
{
40
        while (!f->count);
41
 
42
        return fifo_get(f, pdata);
43
}
153 killagreg 44
 
45
void fifo_purge(fifo_t* f)
46
{
47
        if((f == NULL)) return;
48
        f->count = 0;
49
        f->pread = f->buffer;
50
        f->pwrite = f->buffer;
51
        return;
52
}