OpenCores
URL https://opencores.org/ocsvn/igor/igor/trunk

Subversion Repositories igor

[/] [igor/] [trunk/] [avr/] [src/] [buf.c] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 atypic
#include "buf.h"
2
 
3
static uint16_t incptr(uint16_t);
4
static int8_t   buf_read_byte(struct buf *, uint8_t *);
5
static int8_t   buf_write_byte(struct buf *, uint8_t);
6
 
7
/* Common routines for buffer handling. */
8
void
9
buf_init(struct buf *buf)
10
{
11
        uint16_t i;
12
 
13
        for (i = 0; i < MAXBUFLEN; i++)
14
                buf->data[i] = 0;
15
        buf->off_read = 0;
16
        buf->off_write = 0;
17
        buf->wcount = 0;
18
        buf->rcount = 0;
19
        buf->status = BUF_STATUS_EMPTY;
20
}
21
 
22
static uint16_t
23
incptr(uint16_t val)
24
{
25
        return ((val + 1) % MAXBUFLEN);
26
}
27
 
28
/* Read from a circular buffer. */
29
static int8_t
30
buf_read_byte(struct buf *buf, uint8_t *data)
31
{
32
        /* No more data to read. */
33
        if (buf_readsleft(buf) == 0) {
34
                buf->status |= BUF_STATUS_EMPTY;
35
                return (-1);
36
        }
37
        *data = *(buf->data + buf->off_read);
38
        buf->off_read = incptr(buf->off_read);
39
        buf->rcount++;
40
        buf->status &= ~BUF_STATUS_FULL;
41
        return (0);
42
}
43
 
44
/*
45
 * Read many bytes from a buffer.
46
 * Assume data points to a buffer large enough to store num bytes.
47
 * Returns number of bytes read.
48
 */
49
int8_t
50
buf_read(struct buf *buf, uint8_t *data, uint8_t num)
51
{
52
        int8_t i;
53
 
54
        for (i = 0; i < num; i++)
55
                if (buf_read_byte(buf, (data + i)) != 0)
56
                        break;
57
        return (i);
58
}
59
 
60
/* Write to a circular buffer. */
61
static int8_t
62
buf_write_byte(struct buf *buf, uint8_t data)
63
{
64
        /* See if we have filled the buffer. */
65
        if (buf_writesleft(buf) == 0) {
66
                buf->status |= BUF_STATUS_FULL;
67
                return (-1);
68
        }
69
        *(buf->data + buf->off_write) = data;
70
        buf->off_write = incptr(buf->off_write);
71
        buf->wcount++;
72
        buf->status &= ~BUF_STATUS_EMPTY;
73
        return (0);
74
}
75
 
76
/*
77
 * Write many bytes to a buffer.
78
 * Assume data points to a buffer with num bytes to be sent.
79
 * Return number of bytes written.
80
 */
81
int8_t
82
buf_write(struct buf *buf, uint8_t *data, uint8_t num)
83
{
84
        uint8_t i;
85
 
86
        for (i = 0; i < num; i++)
87
                if (buf_write_byte(buf, *(data + i)) != 0)
88
                        break;
89
        return (i);
90
}
91
 
92
/* Returns number of buffers available for reading. */
93
uint16_t
94
buf_readsleft(struct buf *buf)
95
{
96
        return (buf->wcount > buf->rcount ?
97
            buf->wcount - buf->rcount :
98
            buf->rcount - buf->wcount);
99
}
100
 
101
/* Returns number of buffers available for writing. */
102
uint16_t
103
buf_writesleft(struct buf *buf)
104
{
105
        return (MAXBUFLEN - buf_readsleft(buf));
106
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.