12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- #include "CircularBuffer.h"
- #include <algorithm> // for min
- using namespace bell;
- CircularBuffer::CircularBuffer(size_t dataCapacity) {
- this->dataCapacity = dataCapacity;
- buffer = std::vector<uint8_t>(dataCapacity);
- this->dataSemaphore = std::make_unique<bell::WrappedSemaphore>(5);
- };
- size_t CircularBuffer::write(const uint8_t* data, size_t bytes) {
- if (bytes == 0)
- return 0;
- std::lock_guard<std::mutex> guard(bufferMutex);
- size_t bytesToWrite = std::min(bytes, dataCapacity - dataSize);
- // Write in a single step
- if (bytesToWrite <= dataCapacity - endIndex) {
- memcpy(buffer.data() + endIndex, data, bytesToWrite);
- endIndex += bytesToWrite;
- if (endIndex == dataCapacity)
- endIndex = 0;
- }
- // Write in two steps
- else {
- size_t firstChunkSize = dataCapacity - endIndex;
- memcpy(buffer.data() + endIndex, data, firstChunkSize);
- size_t secondChunkSize = bytesToWrite - firstChunkSize;
- memcpy(buffer.data(), data + firstChunkSize, secondChunkSize);
- endIndex = secondChunkSize;
- }
- dataSize += bytesToWrite;
- // this->dataSemaphore->give();
- return bytesToWrite;
- }
- void CircularBuffer::emptyBuffer() {
- std::lock_guard<std::mutex> guard(bufferMutex);
- begIndex = 0;
- dataSize = 0;
- endIndex = 0;
- }
- void CircularBuffer::emptyExcept(size_t sizeToSet) {
- std::lock_guard<std::mutex> guard(bufferMutex);
- if (sizeToSet > dataSize)
- sizeToSet = dataSize;
- dataSize = sizeToSet;
- endIndex = begIndex + sizeToSet;
- if (endIndex > dataCapacity) {
- endIndex -= dataCapacity;
- }
- }
- size_t CircularBuffer::read(uint8_t* data, size_t bytes) {
- if (bytes == 0)
- return 0;
- std::lock_guard<std::mutex> guard(bufferMutex);
- size_t bytesToRead = std::min(bytes, dataSize);
- // Read in a single step
- if (bytesToRead <= dataCapacity - begIndex) {
- memcpy(data, buffer.data() + begIndex, bytesToRead);
- begIndex += bytesToRead;
- if (begIndex == dataCapacity)
- begIndex = 0;
- }
- // Read in two steps
- else {
- size_t firstChunkSize = dataCapacity - begIndex;
- memcpy(data, buffer.data() + begIndex, firstChunkSize);
- size_t secondChunkSize = bytesToRead - firstChunkSize;
- memcpy(data + firstChunkSize, buffer.data(), secondChunkSize);
- begIndex = secondChunkSize;
- }
- dataSize -= bytesToRead;
- return bytesToRead;
- }
|