F´ Flight Software - C/C++ Documentation
A framework for building embedded system applications to NASA flight quality standards.
Queue.hpp
Go to the documentation of this file.
1 // ======================================================================
2 // \title Os/Queue.hpp
3 // \brief common function definitions for Os::Queue
4 // ======================================================================
5 #ifndef Os_Queue_hpp_
6 #define Os_Queue_hpp_
7 
8 #include <FpConfig.hpp>
9 #include <Fw/Obj/ObjBase.hpp>
11 #include <Os/Mutex.hpp>
12 #include <Os/Os.hpp>
13 #include <Os/QueueString.hpp>
14 namespace Os {
15 // Forward declaration for registry
16 class QueueRegistry;
17 
19 class QueueHandle {};
20 
28  public:
30  enum Status {
39  FULL,
42  };
43 
45  enum BlockingType {
48  };
49 
51  QueueInterface() = default;
52 
54  virtual ~QueueInterface() = default;
55 
57  QueueInterface(const QueueInterface& other) = delete;
58 
60  QueueInterface(const QueueInterface* other) = delete;
61 
63  virtual QueueInterface& operator=(const QueueInterface& other) = delete;
64 
75  virtual Status create(const Fw::StringBase& name, FwSizeType depth, FwSizeType messageSize) = 0;
76 
91  virtual Status send(const U8* buffer, FwSizeType size, FwQueuePriorityType priority, BlockingType blockType) = 0;
92 
108  virtual Status receive(U8* destination,
109  FwSizeType capacity,
110  BlockingType blockType,
111  FwSizeType& actualSize,
112  FwQueuePriorityType& priority) = 0;
113 
119  virtual FwSizeType getMessagesAvailable() const = 0;
120 
126  virtual FwSizeType getMessageHighWaterMark() const = 0;
127 
130  virtual QueueHandle* getHandle() = 0;
131 
151  static QueueInterface* getDelegate(QueueHandleStorage& aligned_placement_new_memory);
152 };
153 
154 class Queue final : public QueueInterface {
155  public:
157  Queue();
158 
160  virtual ~Queue();
161 
163  Queue(const Queue& other) = delete;
164 
166  Queue(const Queue* other) = delete;
167 
169  QueueInterface& operator=(const QueueInterface& other) override = delete;
170 
181  Status create(const Fw::StringBase& name, FwSizeType depth, FwSizeType messageSize) override;
182 
197  Status send(const U8* buffer, FwSizeType size, FwQueuePriorityType priority, BlockingType blockType) override;
198 
215  Status receive(U8* destination,
216  FwSizeType capacity,
217  BlockingType blockType,
218  FwSizeType& actualSize,
219  FwQueuePriorityType& priority) override;
220 
227  FwSizeType getMessagesAvailable() const override;
228 
234  FwSizeType getMessageHighWaterMark() const override;
235 
238  QueueHandle* getHandle() override;
239 
250  Status send(const Fw::SerializeBufferBase& message, FwQueuePriorityType priority, BlockingType blockType);
251 
263  Status receive(Fw::SerializeBufferBase& destination, BlockingType blockType, FwQueuePriorityType& priority);
264 
266  FwSizeType getDepth() const;
267 
269  FwSizeType getMessageSize() const;
270 
272  const QueueString& getName() const;
273 
275  static FwSizeType getNumQueues();
276 
278  static Os::Mutex& getStaticMutex();
279 
280  private:
281  QueueString m_name;
282  FwSizeType m_depth;
283  FwSizeType m_size;
284  static Os::Mutex s_countLock;
285  static FwSizeType s_queueCount;
286 
287 #if FW_QUEUE_REGISTRATION
288  public:
292  static void setRegistry(QueueRegistry* registry);
293 
294  private:
295  static QueueRegistry* s_queueRegistry;
296 #endif
297 
298  // This section is used to store the implementation-defined file handle. To Os::File and fprime, this type is
299  // opaque and thus normal allocation cannot be done. Instead, we allow the implementor to store then handle in
300  // the byte-array here and set `handle` to that address for storage.
301  //
302  alignas(FW_HANDLE_ALIGNMENT) QueueHandleStorage m_handle_storage;
303  QueueInterface& m_delegate;
304 };
310  public:
312  QueueRegistry() = default;
314  virtual ~QueueRegistry() = default;
315 
321  virtual void registerQueue(Queue* queue) = 0;
322 };
323 } // namespace Os
324 #endif
QueueInterface & operator=(const QueueInterface &other) override=delete
assignment operator is forbidden
invalid priority requested
Definition: Queue.hpp:38
virtual QueueInterface & operator=(const QueueInterface &other)=delete
assignment operator is forbidden
Status
status returned from the queue send function
Definition: Queue.hpp:30
QueueHandle parent class.
Definition: Queue.hpp:19
static FwSizeType getNumQueues()
get number of queues system-wide
Definition: Queue.cpp:127
PlatformSizeType FwSizeType
Definition: FpConfig.h:35
QueueRegistry()=default
Default QueueRegistry.
base queue interface
Definition: Queue.hpp:27
virtual Status receive(U8 *destination, FwSizeType capacity, BlockingType blockType, FwSizeType &actualSize, FwQueuePriorityType &priority)=0
receive a message from the queue
FwSizeType getDepth() const
get the queue&#39;s depth in messages
Definition: Queue.cpp:115
static QueueInterface * getDelegate(QueueHandleStorage &aligned_placement_new_memory)
provide a pointer to a queue delegate object
Unexpected error; can&#39;t match with returns.
Definition: Queue.hpp:41
message send error
Definition: Queue.hpp:36
Queue()
queue constructor
Definition: Queue.cpp:14
virtual ~QueueInterface()=default
default queue destructor
virtual void registerQueue(Queue *queue)=0
queue registry callback
virtual ~Queue()
default queue destructor
Definition: Queue.cpp:16
virtual ~QueueRegistry()=default
Default ~QueueRegistry.
Message will block until space is available.
Definition: Queue.hpp:46
virtual FwSizeType getMessagesAvailable() const =0
get number of messages available
QueueHandle * getHandle() override
return the underlying queue handle (implementation specific). Delegates to implementation.
Definition: Queue.cpp:87
virtual QueueHandle * getHandle()=0
return the underlying queue handle (implementation specific)
const QueueString & getName() const
get the queue&#39;s name
Definition: Queue.cpp:123
virtual Status create(const Fw::StringBase &name, FwSizeType depth, FwSizeType messageSize)=0
create queue storage
FwSizeType getMessageSize() const
get the queue&#39;s message maximum size
Definition: Queue.cpp:119
Status send(const U8 *buffer, FwSizeType size, FwQueuePriorityType priority, BlockingType blockType) override
send a message into the queue through delegate
message receive error
Definition: Queue.hpp:37
Queue wasn&#39;t initialized successfully.
Definition: Queue.hpp:34
If non-blocking, all the messages have been drained.
Definition: Queue.hpp:33
C++-compatible configuration header for fprime configuration.
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.h:30
BlockingType
message type
Definition: Queue.hpp:45
attempted to send or receive with buffer too large, too small
Definition: Queue.hpp:35
static Os::Mutex & getStaticMutex()
get static mutex
Definition: Queue.cpp:132
QueueInterface()=default
default queue interface constructor
FwSizeType getMessagesAvailable() const override
get number of messages available
Definition: Queue.cpp:77
Status create(const Fw::StringBase &name, FwSizeType depth, FwSizeType messageSize) override
create queue storage through delegate
Definition: Queue.cpp:20
Declarations for Fw::ObjBase and Fw::ObjRegistry.
PlatformQueuePriorityType FwQueuePriorityType
Definition: FpConfig.h:55
Queue feature is not supported.
Definition: Queue.hpp:40
U8 QueueHandleStorage[FW_QUEUE_HANDLE_MAX_SIZE]
Storage type for OSAL handles.
Definition: Os.hpp:10
virtual FwSizeType getMessageHighWaterMark() const =0
get maximum messages stored at any given time
FwSizeType getMessageHighWaterMark() const override
get maximum messages stored at any given time through delegate
Definition: Queue.cpp:82
message sent/received okay
Definition: Queue.hpp:31
queue registry interface
Definition: Queue.hpp:309
Queue was full when attempting to send a message.
Definition: Queue.hpp:39
virtual Status send(const U8 *buffer, FwSizeType size, FwQueuePriorityType priority, BlockingType blockType)=0
send a message into the queue
Message will return with status when space is unavailable.
Definition: Queue.hpp:47
Status receive(U8 *destination, FwSizeType capacity, BlockingType blockType, FwSizeType &actualSize, FwQueuePriorityType &priority) override
receive a message from the queue through delegate
#define FW_HANDLE_ALIGNMENT
Alignment of handle storage.
Definition: FpConfig.h:440
creating an already created queue
Definition: Queue.hpp:32