diff --git a/container/SimpleRingBuffer.cpp b/container/SimpleRingBuffer.cpp index 69d94143e..3cc1ffdf9 100644 --- a/container/SimpleRingBuffer.cpp +++ b/container/SimpleRingBuffer.cpp @@ -1,20 +1,43 @@ #include #include -SimpleRingBuffer::SimpleRingBuffer(const size_t size, bool overwriteOld) : - RingBufferBase<>(0, size, overwriteOld) { - buffer = new uint8_t[size]; +SimpleRingBuffer::SimpleRingBuffer(const size_t size, bool overwriteOld, + size_t maxExcessBytes) : + RingBufferBase<>(0, size, overwriteOld), + maxExcessBytes(maxExcessBytes) { + buffer = new uint8_t[size + maxExcessBytes]; } SimpleRingBuffer::SimpleRingBuffer(uint8_t *buffer, const size_t size, - bool overwriteOld): - RingBufferBase<>(0, size, overwriteOld), buffer(buffer) {} + bool overwriteOld, size_t maxExcessBytes): + RingBufferBase<>(0, size, overwriteOld), buffer(buffer), + maxExcessBytes(maxExcessBytes) {} SimpleRingBuffer::~SimpleRingBuffer() { delete[] buffer; } + +ReturnValue_t SimpleRingBuffer::getFreeElement(uint8_t **writePointer, + size_t amount) { + if (availableWriteSpace() >= amount or overwriteOld) { + size_t amountTillWrap = writeTillWrap(); + if (amountTillWrap < amount) { + if((amount - amountTillWrap + excessBytes) > maxExcessBytes) { + return HasReturnvaluesIF::RETURN_FAILED; + } + excessBytes += amount - amountTillWrap; + } + *writePointer = &buffer[write]; + incrementWrite(amount); + return HasReturnvaluesIF::RETURN_OK; + } + else { + return HasReturnvaluesIF::RETURN_FAILED; + } +} + ReturnValue_t SimpleRingBuffer::writeData(const uint8_t* data, size_t amount) { if (availableWriteSpace() >= amount or overwriteOld) { @@ -62,6 +85,17 @@ ReturnValue_t SimpleRingBuffer::readData(uint8_t* data, size_t amount, return HasReturnvaluesIF::RETURN_OK; } +size_t SimpleRingBuffer::getExcessBytes() const { + return excessBytes; +} + +void SimpleRingBuffer::moveExcessBytesToStart() { + if(excessBytes > 0) { + std::memcpy(buffer, &buffer[size], excessBytes); + excessBytes = 0; + } +} + ReturnValue_t SimpleRingBuffer::deleteData(size_t amount, bool deleteRemaining, size_t* trueAmount) { size_t availableData = availableReadData(READ_PTR); diff --git a/container/SimpleRingBuffer.h b/container/SimpleRingBuffer.h index 9a5488153..4bb3a4e8b 100644 --- a/container/SimpleRingBuffer.h +++ b/container/SimpleRingBuffer.h @@ -64,6 +64,14 @@ public: */ ReturnValue_t getFreeElement(uint8_t** writePointer, size_t amount); + size_t getExcessBytes() const; + /** + * Helper functions which moves any excess bytes to the start + * of the ring buffer. + * @return + */ + void moveExcessBytesToStart(); + /** * Read from circular buffer at read pointer. * @param data