Fork of https://developer.mbed.org/users/bscott/code/STM32_USBDevice/
Fork of STM32_USBDevice by
Diff: USBSerial/CircBuffer.h
- Revision:
- 79:d28244984385
- Parent:
- 77:a98f786d05d4
--- a/USBSerial/CircBuffer.h Fri Oct 27 17:22:45 2017 +0200 +++ b/USBSerial/CircBuffer.h Wed Jul 25 14:04:48 2018 +0200 @@ -53,6 +53,79 @@ return(!empty); }; + void flush() + { + write = 0; + read = 0; + } + + // Queue a block of data of blockSize items + void queue(const T *block, uint16_t blockSize) + { + if (blockSize >= size) + { + // Block is too big to fit in buffer, take the last size-1 items + block = &block[blockSize - (size-1)]; + blockSize = size-1; + } + + if (write + blockSize > size) + { + // Need to wrap around + std::memcpy(&buf[write], block, sizeof(T)*(size-write)); + std::memcpy(buf, &block[size-write], sizeof(T)*(blockSize - (size-write))); + } + else + { + std::memcpy(&buf[write], block, sizeof(T)*blockSize); + } + + // Update write position + uint16_t wasFree = available() - size - 1; + write = write + blockSize; + write %= size; + if (wasFree < blockSize) + { + // Update read position as well + read = write + 1; + read %= size; + } + } + + // Dequeue a block of data of at most blockSize items, writing them into block + // Returns the number of items dequeued + uint16_t dequeue(T *block, uint16_t blockSize) + { + if (isEmpty()) + { + return 0; + } + + uint16_t isAvailable = available(); + if (isAvailable < blockSize) + { + // Only return what we have + blockSize = isAvailable; + } + + if (read + blockSize > size) + { + // Need to wrap around + std::memcpy(block, &buf[read], sizeof(T)*(size-read)); + std::memcpy(&block[size-read], buf, sizeof(T)*(blockSize - (size-read))); + } + else + { + std::memcpy(block, &buf[read], sizeof(T)*blockSize); + } + + // Update read position + read = read + blockSize; + read %= size; + + return blockSize; + } + private: volatile uint16_t write; volatile uint16_t read;