taken over ring buffer base changes
This commit is contained in:
parent
e105be229a
commit
3e67701933
@ -1,96 +1,113 @@
|
|||||||
#ifndef FRAMEWORK_CONTAINER_RINGBUFFERBASE_H_
|
#ifndef FSFW_CONTAINER_RINGBUFFERBASE_H_
|
||||||
#define FRAMEWORK_CONTAINER_RINGBUFFERBASE_H_
|
#define FSFW_CONTAINER_RINGBUFFERBASE_H_
|
||||||
|
|
||||||
#include "../returnvalues/HasReturnvaluesIF.h"
|
#include "../returnvalues/HasReturnvaluesIF.h"
|
||||||
|
#include <cstddef>
|
||||||
|
|
||||||
template<uint8_t N_READ_PTRS = 1>
|
template<uint8_t N_READ_PTRS = 1>
|
||||||
class RingBufferBase {
|
class RingBufferBase {
|
||||||
public:
|
public:
|
||||||
RingBufferBase(uint32_t startAddress, uint32_t size, bool overwriteOld) :
|
RingBufferBase(size_t startAddress, const size_t size, bool overwriteOld) :
|
||||||
start(startAddress), write(startAddress), size(size), overwriteOld(overwriteOld) {
|
start(startAddress), write(startAddress), size(size),
|
||||||
|
overwriteOld(overwriteOld) {
|
||||||
for (uint8_t count = 0; count < N_READ_PTRS; count++) {
|
for (uint8_t count = 0; count < N_READ_PTRS; count++) {
|
||||||
read[count] = startAddress;
|
read[count] = startAddress;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ReturnValue_t readData(uint32_t amount, uint8_t n = 0) {
|
|
||||||
if (availableReadData(n) >= amount) {
|
virtual ~RingBufferBase() {}
|
||||||
incrementRead(amount, n);
|
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
|
||||||
} else {
|
|
||||||
return HasReturnvaluesIF::RETURN_FAILED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ReturnValue_t writeData(uint32_t amount) {
|
|
||||||
if (availableWriteSpace() >= amount || overwriteOld) {
|
|
||||||
incrementWrite(amount);
|
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
|
||||||
} else {
|
|
||||||
return HasReturnvaluesIF::RETURN_FAILED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
uint32_t availableReadData(uint8_t n = 0) const {
|
|
||||||
return ((write + size) - read[n]) % size;
|
|
||||||
}
|
|
||||||
uint32_t availableWriteSpace(uint8_t n = 0) const {
|
|
||||||
//One less to avoid ambiguous full/empty problem.
|
|
||||||
return (((read[n] + size) - write - 1) % size);
|
|
||||||
}
|
|
||||||
bool isFull(uint8_t n = 0) {
|
bool isFull(uint8_t n = 0) {
|
||||||
return (availableWriteSpace(n) == 0);
|
return (availableWriteSpace(n) == 0);
|
||||||
}
|
}
|
||||||
bool isEmpty(uint8_t n = 0) {
|
bool isEmpty(uint8_t n = 0) {
|
||||||
return (availableReadData(n) == 0);
|
return (getAvailableReadData(n) == 0);
|
||||||
}
|
}
|
||||||
virtual ~RingBufferBase() {
|
|
||||||
|
|
||||||
|
size_t getAvailableReadData(uint8_t n = 0) const {
|
||||||
|
return ((write + size) - read[n]) % size;
|
||||||
}
|
}
|
||||||
uint32_t getRead(uint8_t n = 0) const {
|
size_t availableWriteSpace(uint8_t n = 0) const {
|
||||||
return read[n];
|
//One less to avoid ambiguous full/empty problem.
|
||||||
|
return (((read[n] + size) - write - 1) % size);
|
||||||
}
|
}
|
||||||
void setRead(uint32_t read, uint8_t n = 0) {
|
|
||||||
if (read >= start && read < (start+size)) {
|
bool overwritesOld() const {
|
||||||
this->read[n] = read;
|
return overwriteOld;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
uint32_t getWrite() const {
|
|
||||||
return write;
|
size_t getMaxSize() const {
|
||||||
}
|
return size - 1;
|
||||||
void setWrite(uint32_t write) {
|
|
||||||
this->write = write;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void clear() {
|
void clear() {
|
||||||
write = start;
|
write = start;
|
||||||
for (uint8_t count = 0; count < N_READ_PTRS; count++) {
|
for (uint8_t count = 0; count < N_READ_PTRS; count++) {
|
||||||
read[count] = start;
|
read[count] = start;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
uint32_t writeTillWrap() {
|
|
||||||
|
size_t writeTillWrap() {
|
||||||
return (start + size) - write;
|
return (start + size) - write;
|
||||||
}
|
}
|
||||||
uint32_t readTillWrap(uint8_t n = 0) {
|
|
||||||
|
size_t readTillWrap(uint8_t n = 0) {
|
||||||
return (start + size) - read[n];
|
return (start + size) - read[n];
|
||||||
}
|
}
|
||||||
uint32_t getStart() const {
|
|
||||||
|
size_t getStart() const {
|
||||||
return start;
|
return start;
|
||||||
}
|
}
|
||||||
bool overwritesOld() const {
|
|
||||||
return overwriteOld;
|
|
||||||
}
|
|
||||||
uint32_t maxSize() const {
|
|
||||||
return size - 1;
|
|
||||||
}
|
|
||||||
protected:
|
protected:
|
||||||
const uint32_t start;
|
const size_t start;
|
||||||
uint32_t write;
|
size_t write;
|
||||||
uint32_t read[N_READ_PTRS];
|
size_t read[N_READ_PTRS];
|
||||||
const uint32_t size;
|
const size_t size;
|
||||||
const bool overwriteOld;
|
const bool overwriteOld;
|
||||||
|
|
||||||
void incrementWrite(uint32_t amount) {
|
void incrementWrite(uint32_t amount) {
|
||||||
write = ((write + amount - start) % size) + start;
|
write = ((write + amount - start) % size) + start;
|
||||||
}
|
}
|
||||||
void incrementRead(uint32_t amount, uint8_t n = 0) {
|
void incrementRead(uint32_t amount, uint8_t n = 0) {
|
||||||
read[n] = ((read[n] + amount - start) % size) + start;
|
read[n] = ((read[n] + amount - start) % size) + start;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ReturnValue_t readData(uint32_t amount, uint8_t n = 0) {
|
||||||
|
if (getAvailableReadData(n) >= amount) {
|
||||||
|
incrementRead(amount, n);
|
||||||
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
|
} else {
|
||||||
|
return HasReturnvaluesIF::RETURN_FAILED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t writeData(uint32_t amount) {
|
||||||
|
if (availableWriteSpace() >= amount or overwriteOld) {
|
||||||
|
incrementWrite(amount);
|
||||||
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
|
} else {
|
||||||
|
return HasReturnvaluesIF::RETURN_FAILED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t getRead(uint8_t n = 0) const {
|
||||||
|
return read[n];
|
||||||
|
}
|
||||||
|
|
||||||
|
void setRead(uint32_t read, uint8_t n = 0) {
|
||||||
|
if (read >= start && read < (start+size)) {
|
||||||
|
this->read[n] = read;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t getWrite() const {
|
||||||
|
return write;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setWrite(uint32_t write) {
|
||||||
|
this->write = write;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* FRAMEWORK_CONTAINER_RINGBUFFERBASE_H_ */
|
#endif /* FSFW_CONTAINER_RINGBUFFERBASE_H_ */
|
||||||
|
Loading…
Reference in New Issue
Block a user