Merge pull request 'RingBuffer, static CTOR' (#132) from KSat/fsfw:mueller_ringBufferStatic into master
Reviewed-on: fsfw/fsfw#132
This commit is contained in:
commit
b32ea6e316
@ -1,18 +1,23 @@
|
|||||||
#include "SimpleRingBuffer.h"
|
#include "SimpleRingBuffer.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
SimpleRingBuffer::SimpleRingBuffer(uint32_t size, bool overwriteOld) :
|
SimpleRingBuffer::SimpleRingBuffer(const size_t size, bool overwriteOld) :
|
||||||
RingBufferBase<>(0, size, overwriteOld), buffer(NULL) {
|
RingBufferBase<>(0, size, overwriteOld) {
|
||||||
buffer = new uint8_t[size];
|
buffer = new uint8_t[size];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SimpleRingBuffer::SimpleRingBuffer(uint8_t *buffer, const size_t size,
|
||||||
|
bool overwriteOld):
|
||||||
|
RingBufferBase<>(0, size, overwriteOld), buffer(buffer) {}
|
||||||
|
|
||||||
|
|
||||||
SimpleRingBuffer::~SimpleRingBuffer() {
|
SimpleRingBuffer::~SimpleRingBuffer() {
|
||||||
delete[] buffer;
|
delete[] buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t SimpleRingBuffer::writeData(const uint8_t* data,
|
ReturnValue_t SimpleRingBuffer::writeData(const uint8_t* data,
|
||||||
uint32_t amount) {
|
uint32_t amount) {
|
||||||
if (availableWriteSpace() >= amount || overwriteOld) {
|
if (availableWriteSpace() >= amount or overwriteOld) {
|
||||||
uint32_t amountTillWrap = writeTillWrap();
|
uint32_t amountTillWrap = writeTillWrap();
|
||||||
if (amountTillWrap >= amount) {
|
if (amountTillWrap >= amount) {
|
||||||
memcpy(&buffer[write], data, amount);
|
memcpy(&buffer[write], data, amount);
|
||||||
@ -38,7 +43,7 @@ ReturnValue_t SimpleRingBuffer::readData(uint8_t* data, uint32_t amount,
|
|||||||
return HasReturnvaluesIF::RETURN_FAILED;
|
return HasReturnvaluesIF::RETURN_FAILED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (trueAmount != NULL) {
|
if (trueAmount != nullptr) {
|
||||||
*trueAmount = amount;
|
*trueAmount = amount;
|
||||||
}
|
}
|
||||||
if (amountTillWrap >= amount) {
|
if (amountTillWrap >= amount) {
|
||||||
@ -60,9 +65,10 @@ ReturnValue_t SimpleRingBuffer::deleteData(uint32_t amount,
|
|||||||
return HasReturnvaluesIF::RETURN_FAILED;
|
return HasReturnvaluesIF::RETURN_FAILED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (trueAmount != NULL) {
|
if (trueAmount != nullptr) {
|
||||||
*trueAmount = amount;
|
*trueAmount = amount;
|
||||||
}
|
}
|
||||||
incrementRead(amount, READ_PTR);
|
incrementRead(amount, READ_PTR);
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,17 +4,64 @@
|
|||||||
#include "RingBufferBase.h"
|
#include "RingBufferBase.h"
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Circular buffer implementation, useful for buffering
|
||||||
|
* into data streams.
|
||||||
|
* @details
|
||||||
|
* Note that the deleteData() has to be called to increment the read pointer.
|
||||||
|
* This class allocated dynamically, so
|
||||||
|
* @ingroup containers
|
||||||
|
*/
|
||||||
class SimpleRingBuffer: public RingBufferBase<> {
|
class SimpleRingBuffer: public RingBufferBase<> {
|
||||||
public:
|
public:
|
||||||
SimpleRingBuffer(uint32_t size, bool overwriteOld);
|
/**
|
||||||
|
* This constructor allocates a new internal buffer with the supplied size.
|
||||||
|
* @param size
|
||||||
|
* @param overwriteOld
|
||||||
|
*/
|
||||||
|
SimpleRingBuffer(const size_t size, bool overwriteOld);
|
||||||
|
/**
|
||||||
|
* This constructor takes an external buffer with the specified size.
|
||||||
|
* @param buffer
|
||||||
|
* @param size
|
||||||
|
* @param overwriteOld
|
||||||
|
*/
|
||||||
|
SimpleRingBuffer(uint8_t* buffer, const size_t size, bool overwriteOld);
|
||||||
|
|
||||||
virtual ~SimpleRingBuffer();
|
virtual ~SimpleRingBuffer();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write to circular buffer and increment write pointer by amount
|
||||||
|
* @param data
|
||||||
|
* @param amount
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
ReturnValue_t writeData(const uint8_t* data, uint32_t amount);
|
ReturnValue_t writeData(const uint8_t* data, uint32_t amount);
|
||||||
ReturnValue_t readData(uint8_t* data, uint32_t amount, bool readRemaining = false, uint32_t* trueAmount = NULL);
|
|
||||||
ReturnValue_t deleteData(uint32_t amount, bool deleteRemaining = false, uint32_t* trueAmount = NULL);
|
/**
|
||||||
|
* Read from circular buffer at read pointer
|
||||||
|
* @param data
|
||||||
|
* @param amount
|
||||||
|
* @param readRemaining
|
||||||
|
* @param trueAmount
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
ReturnValue_t readData(uint8_t* data, uint32_t amount,
|
||||||
|
bool readRemaining = false, uint32_t* trueAmount = nullptr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete data starting by incrementing read pointer
|
||||||
|
* @param amount
|
||||||
|
* @param deleteRemaining
|
||||||
|
* @param trueAmount
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
ReturnValue_t deleteData(uint32_t amount, bool deleteRemaining = false,
|
||||||
|
uint32_t* trueAmount = nullptr);
|
||||||
private:
|
private:
|
||||||
// static const uint8_t TEMP_READ_PTR = 1;
|
// static const uint8_t TEMP_READ_PTR = 1;
|
||||||
static const uint8_t READ_PTR = 0;
|
static const uint8_t READ_PTR = 0;
|
||||||
uint8_t* buffer;
|
uint8_t* buffer = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* FRAMEWORK_CONTAINER_SIMPLERINGBUFFER_H_ */
|
#endif /* FRAMEWORK_CONTAINER_SIMPLERINGBUFFER_H_ */
|
||||||
|
Loading…
Reference in New Issue
Block a user