Ring Buffer reconciled with RTOS. If with using RTOS, this lib is enabled Mutex. Default RingBuffer size is 256 Bytes, Max size is 1024 Bytes.
Dependents: RN41 HC05 HC05 mySerial ... more
RingBuffer.cpp
- Committer:
- AkinoriHashimoto
- Date:
- 2015-10-30
- Revision:
- 1:8f2a3144902b
- Parent:
- 0:5373472190f5
- Child:
- 2:db4675083c8c
File content as of revision 1:8f2a3144902b:
#include "RingBuffer.h" RingBuffer::RingBuffer(unsigned int size) { _empty= true; idxF= idxR= 0; // BufSizeの制限は… if(size > MaxBufSize) size= MaxBufSize; buf= new char[size]; bufSize= size; isPowers2= false; if( (size & (size- 1)) == 0) isPowers2= true; } RingBuffer::~RingBuffer() { delete [] buf; } bool RingBuffer::empty() { return this->_empty; } bool RingBuffer::set(string &str) { int size= str.size(); for(int idx= 0; idx < size; idx++) if(this->set( (char)str[idx] )) // True:FULL return true; return false; } bool RingBuffer::set(char chr) { if((idxR == idxF) && !_empty) // R==F: empty or full return true; // means FULL // mutex for RTOS #ifdef RTOS_H mutex.lock(); #endif buf[idxR] = chr; idxR++; // idxR %= bufSize; modulo(idxR); _empty= false; #ifdef RTOS_H mutex.unlock(); #endif if(idxR == idxF) return true; return false; } string RingBuffer::get() { if(_empty) return ""; string str; // int idx= idxF; while(!_empty) { str += buf[idxF]; idxF++; // idxF %= bufSize; modulo(idxF); if(idxF == idxR) _empty= true; } return str; } void RingBuffer::modulo(unsigned short &idx) { if(isPowers2) idx= idx & (bufSize-1); else idx %= bufSize; return; } //eof