General purpose ring buffer library. RTOS proof, mutex protected.
Dependents: RingBuffer_RTOS_test
Fork of RingBuffer by
RingBuffer.cpp@0:db7fa84ff50e, 2012-08-31 (annotated)
- Committer:
- ykuroda
- Date:
- Fri Aug 31 10:13:15 2012 +0000
- Revision:
- 0:db7fa84ff50e
- Child:
- 1:1c3a10f2eb04
1st implement
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ykuroda | 0:db7fa84ff50e | 1 | /* |
ykuroda | 0:db7fa84ff50e | 2 | * ringbuffer.c |
ykuroda | 0:db7fa84ff50e | 3 | * |
ykuroda | 0:db7fa84ff50e | 4 | * 2009.11.12 ... Y.Kuroda |
ykuroda | 0:db7fa84ff50e | 5 | */ |
ykuroda | 0:db7fa84ff50e | 6 | #include "string.h" |
ykuroda | 0:db7fa84ff50e | 7 | #include "RingBuffer.h" |
ykuroda | 0:db7fa84ff50e | 8 | |
ykuroda | 0:db7fa84ff50e | 9 | |
ykuroda | 0:db7fa84ff50e | 10 | /* |
ykuroda | 0:db7fa84ff50e | 11 | * Machine Independent Area |
ykuroda | 0:db7fa84ff50e | 12 | */ |
ykuroda | 0:db7fa84ff50e | 13 | RingBuffer::RingBuffer(int _bufsize) |
ykuroda | 0:db7fa84ff50e | 14 | : bufsize(_bufsize) |
ykuroda | 0:db7fa84ff50e | 15 | { |
ykuroda | 0:db7fa84ff50e | 16 | buf = new unsigned char [bufsize+1]; |
ykuroda | 0:db7fa84ff50e | 17 | |
ykuroda | 0:db7fa84ff50e | 18 | sp = ep = (unsigned int)buf; |
ykuroda | 0:db7fa84ff50e | 19 | memset(buf,0,bufsize); |
ykuroda | 0:db7fa84ff50e | 20 | } |
ykuroda | 0:db7fa84ff50e | 21 | |
ykuroda | 0:db7fa84ff50e | 22 | RingBuffer::~RingBuffer() |
ykuroda | 0:db7fa84ff50e | 23 | { |
ykuroda | 0:db7fa84ff50e | 24 | delete [] buf; |
ykuroda | 0:db7fa84ff50e | 25 | } |
ykuroda | 0:db7fa84ff50e | 26 | |
ykuroda | 0:db7fa84ff50e | 27 | int |
ykuroda | 0:db7fa84ff50e | 28 | RingBuffer::save(unsigned char c) |
ykuroda | 0:db7fa84ff50e | 29 | { |
ykuroda | 0:db7fa84ff50e | 30 | if( (ep==sp-1)|| |
ykuroda | 0:db7fa84ff50e | 31 | ((sp==(unsigned int)buf)&& |
ykuroda | 0:db7fa84ff50e | 32 | (ep==(unsigned int)buf+bufsize-1)) ) /* buffer full */ |
ykuroda | 0:db7fa84ff50e | 33 | return 0; |
ykuroda | 0:db7fa84ff50e | 34 | |
ykuroda | 0:db7fa84ff50e | 35 | *(unsigned char*)ep = c; |
ykuroda | 0:db7fa84ff50e | 36 | ep++; |
ykuroda | 0:db7fa84ff50e | 37 | |
ykuroda | 0:db7fa84ff50e | 38 | if(ep > (unsigned int)buf+bufsize) |
ykuroda | 0:db7fa84ff50e | 39 | ep = (unsigned int)buf; |
ykuroda | 0:db7fa84ff50e | 40 | return 1; |
ykuroda | 0:db7fa84ff50e | 41 | } |
ykuroda | 0:db7fa84ff50e | 42 | |
ykuroda | 0:db7fa84ff50e | 43 | unsigned char |
ykuroda | 0:db7fa84ff50e | 44 | RingBuffer::read(void) |
ykuroda | 0:db7fa84ff50e | 45 | { |
ykuroda | 0:db7fa84ff50e | 46 | unsigned char ret; |
ykuroda | 0:db7fa84ff50e | 47 | |
ykuroda | 0:db7fa84ff50e | 48 | if(sp == ep) |
ykuroda | 0:db7fa84ff50e | 49 | return 0; /* buffer empty */ |
ykuroda | 0:db7fa84ff50e | 50 | |
ykuroda | 0:db7fa84ff50e | 51 | ret = *(unsigned char*)sp; |
ykuroda | 0:db7fa84ff50e | 52 | *(unsigned char*)sp = 0; |
ykuroda | 0:db7fa84ff50e | 53 | sp++; |
ykuroda | 0:db7fa84ff50e | 54 | |
ykuroda | 0:db7fa84ff50e | 55 | if(sp> (unsigned int)buf+bufsize) |
ykuroda | 0:db7fa84ff50e | 56 | sp = (unsigned int)buf; |
ykuroda | 0:db7fa84ff50e | 57 | return ret; |
ykuroda | 0:db7fa84ff50e | 58 | } |
ykuroda | 0:db7fa84ff50e | 59 | |
ykuroda | 0:db7fa84ff50e | 60 | int |
ykuroda | 0:db7fa84ff50e | 61 | RingBuffer::check(void) |
ykuroda | 0:db7fa84ff50e | 62 | { |
ykuroda | 0:db7fa84ff50e | 63 | int n = ep-sp; |
ykuroda | 0:db7fa84ff50e | 64 | if(n<0) |
ykuroda | 0:db7fa84ff50e | 65 | n = bufsize-n; |
ykuroda | 0:db7fa84ff50e | 66 | |
ykuroda | 0:db7fa84ff50e | 67 | return n; |
ykuroda | 0:db7fa84ff50e | 68 | } |
ykuroda | 0:db7fa84ff50e | 69 |