General purpose ring buffer library. RTOS proof, mutex protected.

Dependents:   RingBuffer_RTOS_test

Fork of RingBuffer by Yoji KURODA

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?

UserRevisionLine numberNew 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