From 0bc3807c18d9ec2b254a53a4d62d8da22626ad10 Mon Sep 17 00:00:00 2001
From: "Robin.Mueller" <robin.mueller.m@gmail.com>
Date: Tue, 22 Sep 2020 16:22:37 +0200
Subject: [PATCH 1/3] added FIFO

---
 container/SharedRingBuffer.cpp | 25 +++++++++++++++++++++++++
 container/SharedRingBuffer.h   | 16 ++++++++++++++++
 2 files changed, 41 insertions(+)

diff --git a/container/SharedRingBuffer.cpp b/container/SharedRingBuffer.cpp
index 800e75d37..48bdb9dfd 100644
--- a/container/SharedRingBuffer.cpp
+++ b/container/SharedRingBuffer.cpp
@@ -9,6 +9,7 @@ SharedRingBuffer::SharedRingBuffer(object_id_t objectId, const size_t size,
 	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,
@@ -16,6 +17,11 @@ SharedRingBuffer::SharedRingBuffer(object_id_t objectId, uint8_t *buffer,
 	mutex = MutexFactory::instance()->createMutex();
 }
 
+
+void SharedRingBuffer::setToUseReceiveSizeFIFO(uint32_t fifoDepth) {
+	this->fifoDepth = fifoDepth;
+}
+
 ReturnValue_t SharedRingBuffer::lockRingBufferMutex(
         MutexIF::TimeoutType timeoutType, dur_millis_t timeout) {
     return mutex->lockMutex(timeoutType, timeout);
@@ -25,6 +31,25 @@ ReturnValue_t SharedRingBuffer::unlockRingBufferMutex() {
     return mutex->unlockMutex();
 }
 
+
+
 MutexIF* SharedRingBuffer::getMutexHandle() const {
     return mutex;
 }
+
+ReturnValue_t SharedRingBuffer::initialize() {
+	if(fifoDepth > 0) {
+		receiveSizesFIFO = new DynamicFIFO<size_t>(fifoDepth);
+	}
+	return SystemObject::initialize();
+}
+
+DynamicFIFO<size_t>* SharedRingBuffer::getReceiveSizesFIFO() {
+	if(receiveSizesFIFO == nullptr) {
+		// Configuration error.
+		sif::warning << "SharedRingBuffer::getReceiveSizesFIFO: Ring buffer"
+				<< " was not configured to have sizes FIFO, returning nullptr!"
+				<< std::endl;
+	}
+	return receiveSizesFIFO;
+}
diff --git a/container/SharedRingBuffer.h b/container/SharedRingBuffer.h
index 80c068b3d..c9e0ae3fc 100644
--- a/container/SharedRingBuffer.h
+++ b/container/SharedRingBuffer.h
@@ -1,6 +1,7 @@
 #ifndef FSFW_CONTAINER_SHAREDRINGBUFFER_H_
 #define FSFW_CONTAINER_SHAREDRINGBUFFER_H_
 
+#include <fsfw/container/DynamicFIFO.h>
 #include "SimpleRingBuffer.h"
 #include "../ipc/MutexIF.h"
 #include "../objectmanager/SystemObject.h"
@@ -26,6 +27,8 @@ public:
 	SharedRingBuffer(object_id_t objectId, const size_t size,
 			bool overwriteOld, size_t maxExcessBytes);
 
+	void setToUseReceiveSizeFIFO(uint32_t fifoDepth);
+
 	/**
 	 * This constructor takes an external buffer with the specified size.
 	 * @param buffer
@@ -59,8 +62,21 @@ public:
 	 * @return
 	 */
 	MutexIF* getMutexHandle() const;
+
+	ReturnValue_t initialize() override;
+
+	/**
+	 * If the shared ring buffer was configured to have a sizes FIFO, a handle
+	 * to that FIFO can be retrieved with this function.
+	 * Do not forget to protect access with a lock if required!
+	 * @return
+	 */
+	DynamicFIFO<size_t>* getReceiveSizesFIFO();
 private:
 	MutexIF* mutex = nullptr;
+
+	size_t fifoDepth = 0;
+	DynamicFIFO<size_t>* receiveSizesFIFO = nullptr;
 };
 
 

From 2f73841580339d39d0e784b60a4bc49867eff112 Mon Sep 17 00:00:00 2001
From: "Robin.Mueller" <robin.mueller.m@gmail.com>
Date: Tue, 22 Sep 2020 16:24:40 +0200
Subject: [PATCH 2/3] include fix

---
 container/SharedRingBuffer.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/container/SharedRingBuffer.h b/container/SharedRingBuffer.h
index c9e0ae3fc..fdc9d6267 100644
--- a/container/SharedRingBuffer.h
+++ b/container/SharedRingBuffer.h
@@ -1,8 +1,8 @@
 #ifndef FSFW_CONTAINER_SHAREDRINGBUFFER_H_
 #define FSFW_CONTAINER_SHAREDRINGBUFFER_H_
 
-#include <fsfw/container/DynamicFIFO.h>
 #include "SimpleRingBuffer.h"
+#include "DynamicFIFO.h"
 #include "../ipc/MutexIF.h"
 #include "../objectmanager/SystemObject.h"
 #include "../timemanager/Clock.h"

From 978d7514a486482869a31852c571ea0009f0ffa0 Mon Sep 17 00:00:00 2001
From: "Robin.Mueller" <robin.mueller.m@gmail.com>
Date: Tue, 22 Sep 2020 16:32:59 +0200
Subject: [PATCH 3/3] added doc, changed type

---
 container/SharedRingBuffer.cpp |  2 +-
 container/SharedRingBuffer.h   | 10 +++++++++-
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/container/SharedRingBuffer.cpp b/container/SharedRingBuffer.cpp
index 48bdb9dfd..6ddb3d3ee 100644
--- a/container/SharedRingBuffer.cpp
+++ b/container/SharedRingBuffer.cpp
@@ -18,7 +18,7 @@ SharedRingBuffer::SharedRingBuffer(object_id_t objectId, uint8_t *buffer,
 }
 
 
-void SharedRingBuffer::setToUseReceiveSizeFIFO(uint32_t fifoDepth) {
+void SharedRingBuffer::setToUseReceiveSizeFIFO(size_t fifoDepth) {
 	this->fifoDepth = fifoDepth;
 }
 
diff --git a/container/SharedRingBuffer.h b/container/SharedRingBuffer.h
index fdc9d6267..64d7ee291 100644
--- a/container/SharedRingBuffer.h
+++ b/container/SharedRingBuffer.h
@@ -27,7 +27,15 @@ public:
 	SharedRingBuffer(object_id_t objectId, const size_t size,
 			bool overwriteOld, size_t maxExcessBytes);
 
-	void setToUseReceiveSizeFIFO(uint32_t fifoDepth);
+	/**
+	 * @brief	This function can be used to add an optional FIFO to the class
+	 * @details 
+	 * This FIFO will be allocated in the initialize function (and will
+	 * have a fixed maximum size after that). It can be used to store
+	 * values like packet sizes, for example for a shared ring buffer
+	 * used by producer/consumer tasks.
+	 */
+	void setToUseReceiveSizeFIFO(size_t fifoDepth);
 
 	/**
 	 * This constructor takes an external buffer with the specified size.