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

Dependents:   RingBuffer_RTOS_test

Fork of RingBuffer by Yoji KURODA

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?

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