Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: M2X_dev axeda_wrapper_dev MTS_M2x_Example1 MTS_Cellular_Connect_Example ... more
utils/MTSCircularBuffer.cpp
- Committer:
- jengbrecht
- Date:
- 2013-12-09
- Revision:
- 0:563b70517320
- Child:
- 2:8d3ea0dfce39
File content as of revision 0:563b70517320:
#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() { if (available() == 0) { return -1; } if (readIndex == bufferSize) { readIndex = 0; } int tmp = buffer[readIndex++]; checkThreshold(); return tmp; } int MTSCircularBuffer::write(char* data, int length) { if (length > capacity()) { return -1; } int i = 0; while((i < length) && (available() < bufferSize)) { if(writeIndex == bufferSize) { writeIndex = 0; } buffer[writeIndex++] = data[i++]; } checkThreshold(); return capacity(); } int MTSCircularBuffer::write(char data) { if (available() == bufferSize) { return -1; } if(writeIndex == bufferSize) { writeIndex = 0; } buffer[writeIndex++] = data; checkThreshold(); return capacity(); } void MTSCircularBuffer::attach(void(*fptr)(void), int _threshold, Vars::RelationalOperator _op) { threshold = _threshold; op = _op; notify.attach(fptr); } template<typename T> void MTSCircularBuffer::attach(T *tptr, void(T::*mptr)(void), int threshold, Vars::RelationalOperator op) { this.threshold = threshold; this.op = op; notify.attach(tptr, mptr); } 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 */