fsfw/src/fsfw/container/SharedRingBuffer.cpp

66 lines
2.3 KiB
C++
Raw Normal View History

2021-07-13 20:22:54 +02:00
#include "fsfw/container/SharedRingBuffer.h"
2022-02-02 10:29:30 +01:00
2024-03-19 18:55:13 +01:00
#include "SharedRingBuffer.h"
2021-07-13 20:22:54 +02:00
#include "fsfw/ipc/MutexFactory.h"
#include "fsfw/ipc/MutexGuard.h"
2020-08-18 11:25:57 +02:00
2022-02-02 10:29:30 +01:00
SharedRingBuffer::SharedRingBuffer(object_id_t objectId, const size_t size, bool overwriteOld,
size_t maxExcessBytes)
: SystemObject(objectId), SimpleRingBuffer(size, overwriteOld, maxExcessBytes) {
mutex = MutexFactory::instance()->createMutex();
2020-08-18 11:25:57 +02:00
}
2022-02-02 10:29:30 +01:00
SharedRingBuffer::SharedRingBuffer(object_id_t objectId, uint8_t* buffer, const size_t size,
bool overwriteOld, size_t maxExcessBytes)
: SystemObject(objectId), SimpleRingBuffer(buffer, size, overwriteOld, maxExcessBytes) {
mutex = MutexFactory::instance()->createMutex();
2021-04-11 21:54:48 +02:00
}
2020-09-22 16:22:37 +02:00
2024-03-19 17:38:35 +01:00
SharedRingBuffer::~SharedRingBuffer() {
MutexFactory::instance()->deleteMutex(mutex);
2024-03-21 16:10:45 +01:00
if (receiveSizesFifo != nullptr) {
delete (receiveSizesFifo);
2024-03-19 17:38:35 +01:00
}
}
2020-09-22 16:22:37 +02:00
2022-02-02 10:29:30 +01:00
void SharedRingBuffer::setToUseReceiveSizeFIFO(size_t fifoDepth) { this->fifoDepth = fifoDepth; }
2020-08-18 11:25:57 +02:00
2022-02-02 10:29:30 +01:00
ReturnValue_t SharedRingBuffer::lockRingBufferMutex(MutexIF::TimeoutType timeoutType,
dur_millis_t timeout) {
return mutex->lockMutex(timeoutType, timeout);
2020-08-18 11:25:57 +02:00
}
2022-02-02 10:29:30 +01:00
ReturnValue_t SharedRingBuffer::unlockRingBufferMutex() { return mutex->unlockMutex(); }
2020-09-22 16:22:37 +02:00
2022-02-02 10:29:30 +01:00
MutexIF* SharedRingBuffer::getMutexHandle() const { return mutex; }
2020-09-22 16:22:37 +02:00
ReturnValue_t SharedRingBuffer::initialize() {
2022-02-02 10:29:30 +01:00
if (fifoDepth > 0) {
2024-03-21 16:10:45 +01:00
receiveSizesFifo = new DynamicFIFO<size_t>(fifoDepth);
2022-02-02 10:29:30 +01:00
}
return SystemObject::initialize();
2020-09-22 16:22:37 +02:00
}
2024-03-21 16:10:45 +01:00
DynamicFIFO<size_t>* SharedRingBuffer::getReceiveSizesFifo() {
if (receiveSizesFifo == nullptr) {
2022-02-02 10:29:30 +01:00
// Configuration error.
2021-01-03 14:16:52 +01:00
#if FSFW_CPP_OSTREAM_ENABLED == 1
2022-02-02 10:29:30 +01:00
sif::warning << "SharedRingBuffer::getReceiveSizesFIFO: Ring buffer"
<< " was not configured to have sizes FIFO, returning nullptr!" << std::endl;
#endif
2022-02-02 10:29:30 +01:00
}
2024-03-21 16:10:45 +01:00
return receiveSizesFifo;
2020-09-22 16:22:37 +02:00
}
2024-03-21 16:10:45 +01:00
2024-03-27 12:13:01 +01:00
ReturnValue_t SharedRingBuffer::fifoEmpty(bool& empty, MutexIF::TimeoutType timeoutType,
uint32_t timeoutMs) {
if (receiveSizesFifo == nullptr) {
return returnvalue::FAILED;
}
MutexGuard mg(mutex, timeoutType, timeoutMs);
if (mg.getLockResult() != returnvalue::OK) {
return mg.getLockResult();
}
empty = receiveSizesFifo->empty();
return returnvalue::OK;
}