Go to most recent revision | Details | 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 | } |