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-11-02
Revision:
2:db4675083c8c
Parent:
1:8f2a3144902b
Child:
3:dced590a2d1b

File content as of revision 2:db4675083c8c:

#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

    if(chr == NULL)
        return false;

// 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