#include "fsfw/container/SharedRingBuffer.h" #include "SharedRingBuffer.h" #include "fsfw/ipc/MutexFactory.h" #include "fsfw/ipc/MutexGuard.h" 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(); } 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(); } SharedRingBuffer::~SharedRingBuffer() { MutexFactory::instance()->deleteMutex(mutex); if (receiveSizesFifo != nullptr) { delete (receiveSizesFifo); } } void SharedRingBuffer::setToUseReceiveSizeFIFO(size_t fifoDepth) { this->fifoDepth = fifoDepth; } ReturnValue_t SharedRingBuffer::lockRingBufferMutex(MutexIF::TimeoutType timeoutType, dur_millis_t timeout) { return mutex->lockMutex(timeoutType, timeout); } ReturnValue_t SharedRingBuffer::unlockRingBufferMutex() { return mutex->unlockMutex(); } MutexIF* SharedRingBuffer::getMutexHandle() const { return mutex; } ReturnValue_t SharedRingBuffer::initialize() { if (fifoDepth > 0) { receiveSizesFifo = new DynamicFIFO(fifoDepth); } return SystemObject::initialize(); } DynamicFIFO* SharedRingBuffer::getReceiveSizesFifo() { if (receiveSizesFifo == nullptr) { // Configuration error. #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::warning << "SharedRingBuffer::getReceiveSizesFIFO: Ring buffer" << " was not configured to have sizes FIFO, returning nullptr!" << std::endl; #endif } return receiveSizesFifo; } 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; }