General purpose ring buffer library. RTOS proof, mutex protected.
Dependents: RingBuffer_RTOS_test
Fork of RingBuffer by
RingBuffer.cpp@3:9adf0d5e0522, 2012-09-27 (annotated)
- Committer:
- ykuroda
- Date:
- Thu Sep 27 13:31:29 2012 +0000
- Revision:
- 3:9adf0d5e0522
- Parent:
- 2:ea6d02ba96ae
RTOS support. Mutex protected edition.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ykuroda | 1:1c3a10f2eb04 | 1 | // |
ykuroda | 1:1c3a10f2eb04 | 2 | // RingBuffer.cpp ... General purpose ring buffer library |
ykuroda | 1:1c3a10f2eb04 | 3 | // |
ykuroda | 1:1c3a10f2eb04 | 4 | // Copyright 2012 Yoji KURODA |
ykuroda | 1:1c3a10f2eb04 | 5 | // |
ykuroda | 1:1c3a10f2eb04 | 6 | // 2009.11.13 ... Originally written in C by Y.Kuroda for Renesas H83664 |
ykuroda | 1:1c3a10f2eb04 | 7 | // 2012.08.31 ... Code convert for mbed in C++ |
ykuroda | 1:1c3a10f2eb04 | 8 | // |
ykuroda | 1:1c3a10f2eb04 | 9 | |
ykuroda | 0:db7fa84ff50e | 10 | #include "string.h" |
ykuroda | 0:db7fa84ff50e | 11 | #include "RingBuffer.h" |
ykuroda | 0:db7fa84ff50e | 12 | |
ykuroda | 0:db7fa84ff50e | 13 | |
ykuroda | 0:db7fa84ff50e | 14 | /* |
ykuroda | 0:db7fa84ff50e | 15 | * Machine Independent Area |
ykuroda | 0:db7fa84ff50e | 16 | */ |
ykuroda | 0:db7fa84ff50e | 17 | RingBuffer::RingBuffer(int _bufsize) |
ykuroda | 0:db7fa84ff50e | 18 | : bufsize(_bufsize) |
ykuroda | 0:db7fa84ff50e | 19 | { |
ykuroda | 0:db7fa84ff50e | 20 | buf = new unsigned char [bufsize+1]; |
ykuroda | 2:ea6d02ba96ae | 21 | sp = ep = buf; |
ykuroda | 0:db7fa84ff50e | 22 | memset(buf,0,bufsize); |
ykuroda | 0:db7fa84ff50e | 23 | } |
ykuroda | 0:db7fa84ff50e | 24 | |
ykuroda | 0:db7fa84ff50e | 25 | RingBuffer::~RingBuffer() |
ykuroda | 0:db7fa84ff50e | 26 | { |
ykuroda | 0:db7fa84ff50e | 27 | delete [] buf; |
ykuroda | 0:db7fa84ff50e | 28 | } |
ykuroda | 0:db7fa84ff50e | 29 | |
ykuroda | 0:db7fa84ff50e | 30 | int |
ykuroda | 0:db7fa84ff50e | 31 | RingBuffer::save(unsigned char c) |
ykuroda | 0:db7fa84ff50e | 32 | { |
ykuroda | 3:9adf0d5e0522 | 33 | mutex.lock(); |
ykuroda | 0:db7fa84ff50e | 34 | if( (ep==sp-1)|| |
ykuroda | 2:ea6d02ba96ae | 35 | ((sp==buf)&& |
ykuroda | 3:9adf0d5e0522 | 36 | (ep==buf+bufsize-1)) ) { /* buffer full */ |
ykuroda | 3:9adf0d5e0522 | 37 | mutex.unlock(); |
ykuroda | 0:db7fa84ff50e | 38 | return 0; |
ykuroda | 3:9adf0d5e0522 | 39 | } |
ykuroda | 3:9adf0d5e0522 | 40 | |
ykuroda | 2:ea6d02ba96ae | 41 | *ep = c; |
ykuroda | 0:db7fa84ff50e | 42 | ep++; |
ykuroda | 0:db7fa84ff50e | 43 | |
ykuroda | 2:ea6d02ba96ae | 44 | if(ep > buf+bufsize) |
ykuroda | 2:ea6d02ba96ae | 45 | ep = buf; |
ykuroda | 2:ea6d02ba96ae | 46 | |
ykuroda | 3:9adf0d5e0522 | 47 | mutex.unlock(); |
ykuroda | 0:db7fa84ff50e | 48 | return 1; |
ykuroda | 0:db7fa84ff50e | 49 | } |
ykuroda | 0:db7fa84ff50e | 50 | |
ykuroda | 0:db7fa84ff50e | 51 | unsigned char |
ykuroda | 0:db7fa84ff50e | 52 | RingBuffer::read(void) |
ykuroda | 0:db7fa84ff50e | 53 | { |
ykuroda | 0:db7fa84ff50e | 54 | unsigned char ret; |
ykuroda | 0:db7fa84ff50e | 55 | |
ykuroda | 3:9adf0d5e0522 | 56 | mutex.lock(); |
ykuroda | 3:9adf0d5e0522 | 57 | if(sp == ep){ |
ykuroda | 3:9adf0d5e0522 | 58 | mutex.unlock(); |
ykuroda | 0:db7fa84ff50e | 59 | return 0; /* buffer empty */ |
ykuroda | 3:9adf0d5e0522 | 60 | } |
ykuroda | 2:ea6d02ba96ae | 61 | ret = *sp; |
ykuroda | 2:ea6d02ba96ae | 62 | *sp = 0; |
ykuroda | 0:db7fa84ff50e | 63 | sp++; |
ykuroda | 0:db7fa84ff50e | 64 | |
ykuroda | 2:ea6d02ba96ae | 65 | if(sp > buf+bufsize) |
ykuroda | 2:ea6d02ba96ae | 66 | sp = buf; |
ykuroda | 2:ea6d02ba96ae | 67 | |
ykuroda | 3:9adf0d5e0522 | 68 | mutex.unlock(); |
ykuroda | 0:db7fa84ff50e | 69 | return ret; |
ykuroda | 0:db7fa84ff50e | 70 | } |
ykuroda | 0:db7fa84ff50e | 71 | |
ykuroda | 0:db7fa84ff50e | 72 | int |
ykuroda | 0:db7fa84ff50e | 73 | RingBuffer::check(void) |
ykuroda | 0:db7fa84ff50e | 74 | { |
ykuroda | 3:9adf0d5e0522 | 75 | mutex.lock(); |
ykuroda | 0:db7fa84ff50e | 76 | int n = ep-sp; |
ykuroda | 0:db7fa84ff50e | 77 | if(n<0) |
ykuroda | 0:db7fa84ff50e | 78 | n = bufsize-n; |
ykuroda | 0:db7fa84ff50e | 79 | |
ykuroda | 3:9adf0d5e0522 | 80 | mutex.unlock(); |
ykuroda | 0:db7fa84ff50e | 81 | return n; |
ykuroda | 0:db7fa84ff50e | 82 | } |
ykuroda | 0:db7fa84ff50e | 83 |