Multi-Hackers / SocketModem

Dependents:   M2X_dev axeda_wrapper_dev MTS_M2x_Example1 MTS_Cellular_Connect_Example ... more

utils/MTSCircularBuffer.cpp

Committer:
sgodinez
Date:
2013-12-19
Revision:
41:81d035fb0b6a
Parent:
35:f28acb1be52d
Child:
43:3cacf019ed7d

File content as of revision 41:81d035fb0b6a:

#ifndef MTSCIRCULARBUFFER_CPP
#define MTSCIRCULARBUFFER_CPP

#include "MTSCircularBuffer.h"

MTSCircularBuffer::MTSCircularBuffer(int bufferSize) : bufferSize(bufferSize), readIndex(0), writeIndex(0), _threshold(-1), _op(Vars::GREATER)
{
    buffer = new char[bufferSize];
}

MTSCircularBuffer::~MTSCircularBuffer()
{
    delete[] buffer;
}

int MTSCircularBuffer::getSize()
{
    return bufferSize;
}

int MTSCircularBuffer::read(char* data, int length)
{
    int i = 0;
    while ((i < length) && (available() > 0)) {
        if (readIndex == bufferSize) {
            readIndex = 0;
        }
        data[i++] = buffer[readIndex++];
    }
    checkThreshold();
    return i;
}

int MTSCircularBuffer::read(char& data)
{
    if (available() == 0) {
        return 0;
    }
    if (readIndex == bufferSize) {
        readIndex = 0;
    }
    data = buffer[readIndex++];
    checkThreshold();
    return 1;
}

int MTSCircularBuffer::write(const char* data, int length)
{
    if (length > capacity()) {
        return 0;
    }
    int i = 0;
    while((i < length) && (available() < bufferSize)) {
        if(writeIndex == bufferSize) {
            writeIndex = 0;
        }
        buffer[writeIndex++] = data[i++];
    }
    checkThreshold();
    return i;
}

int MTSCircularBuffer::write(char data)
{
    if (available() == bufferSize) {
        return 0;
    }
    if(writeIndex == bufferSize) {
        writeIndex = 0;
    }
    buffer[writeIndex++] = data;
    checkThreshold();
    return 1;
}

int MTSCircularBuffer::capacity()
{
    return bufferSize - available();
}

int MTSCircularBuffer::available()
{
    if (readIndex <= writeIndex) {
        return writeIndex - readIndex;
    } else {
        return bufferSize + writeIndex - readIndex;
    }
}

bool MTSCircularBuffer::isFull()
{
    if (available() == bufferSize) {
        return true;
    } else {
        return false;
    }
}

bool MTSCircularBuffer::isEmpty()
{
    if (available() == 0) {
        return true;
    } else {
        return false;
    }
}

void MTSCircularBuffer::clear()
{
    writeIndex = readIndex;
}

void MTSCircularBuffer::checkThreshold()
{
    if (_threshold == -1) {
        return;
    }
    switch (_op) {
        case Vars::GREATER:
            if (available() > _threshold) {
                notify.call();
            }
            break;
        case Vars::LESS:
            if (available() < _threshold) {
                notify.call();
            }
            break;
        case Vars::GREATER_EQUAL:
            if (available() >= _threshold) {
                notify.call();
            }
            break;
        case Vars::LESS_EQUAL:
            if (available() <= _threshold) {
                notify.call();
            }
            break;
        case Vars::EQUAL:
            if (available() == _threshold) {
                notify.call();
            }
            break;
    }
}

#endif /* MTSCIRCULARBUFFER_CPP */