fprime/Svc/BufferAccumulator/BufferAccumulator.hpp
Joshua Anderson 3cccd731d9
Refactor FW_OBJECT_NAMES switches and fix building without object names
Instead of adding the name argument to a constructor when FW_OBJECT_NAMES
is enabled, always supply a name argument.

Add a marco that conditionally sets the name to "" if FW_OBJECT_NAMES is not set.
This cleans up a lot of the conditional compilation switches that weren't being tested
and would silently break, while still stripping the strings from the binary.
2020-10-07 17:19:05 -07:00

213 lines
6.2 KiB
C++

// ======================================================================
// \title BufferAccumulator.hpp
// \author bocchino
// \brief BufferAccumulator interface
//
// \copyright
// Copyright (C) 2017 California Institute of Technology.
// ALL RIGHTS RESERVED. United States Government Sponsorship
// acknowledged.
//
// ======================================================================
#ifndef Svc_BufferAccumulator_HPP
#define Svc_BufferAccumulator_HPP
#include "Svc/BufferAccumulator/BufferAccumulatorComponentAc.hpp"
#include "Os/Queue.hpp"
#include <Fw/Types/MemAllocator.hpp>
namespace Svc {
class BufferAccumulator :
public BufferAccumulatorComponentBase
{
PRIVATE:
// ----------------------------------------------------------------------
// Types
// ----------------------------------------------------------------------
//! A BufferLogger file
class ArrayFIFOBuffer {
public:
//! Construct an ArrayFIFOBuffer object
ArrayFIFOBuffer();
//! Destroy an ArrayFIFOBuffer File object
~ArrayFIFOBuffer(void);
void init(Fw::Buffer *const elements, //!< The array elements
NATIVE_UINT_TYPE capacity //!< The capacity
);
//! Enqueue an index.
//! Fails if the queue is full.
//! \return Whether the operation succeeded
bool enqueue(
const Fw::Buffer& e //!< The element to enqueue
);
//! Dequeue an index.
//! Fails if the queue is empty.
bool dequeue(
Fw::Buffer& e //!< The dequeued element
);
//! Get the size of the queue
//! \return The size
U32 getSize(void) const;
//! Get the capacity of the queue
//! \return The capacity
U32 getCapacity(void) const;
PRIVATE:
// ----------------------------------------------------------------------
// Private member variables
// ----------------------------------------------------------------------
//! The memory for the elements
Fw::Buffer * elements;
//! The capacity of the queue
NATIVE_UINT_TYPE capacity;
//! The enqueue index
NATIVE_UINT_TYPE enqueueIndex;
//! The dequeue index
NATIVE_UINT_TYPE dequeueIndex;
//! The size of the queue
NATIVE_UINT_TYPE size;
}; //class ArrayFIFOBuffer
public:
// ----------------------------------------------------------------------
// Construction, initialization, and destruction
// ----------------------------------------------------------------------
//! Construct BufferAccumulator instance
//!
BufferAccumulator(
const char *const compName /*!< The component name*/
);
//! Initialize BufferAccumulator instance
//!
void init(
const NATIVE_INT_TYPE queueDepth, //!< The queue depth
const NATIVE_INT_TYPE instance = 0 //!< The instance number
);
//! Destroy BufferAccumulator instance
//!
~BufferAccumulator(void);
// ----------------------------------------------------------------------
// Public methods
// ----------------------------------------------------------------------
//! Give the class a memory buffer. Should be called after constructor
//! and init, but before task is spawned.
void allocateQueue(
NATIVE_INT_TYPE identifier,
Fw::MemAllocator& allocator,
NATIVE_UINT_TYPE maxNumBuffers //!< The maximum number of buffers
);
//! Return allocated queue. Should be done during shutdown
void deallocateQueue(Fw::MemAllocator& allocator);
PRIVATE:
// ----------------------------------------------------------------------
// Handler implementations for user-defined typed input ports
// ----------------------------------------------------------------------
//! Handler implementation for bufferSendInFill
//!
void bufferSendInFill_handler(
const NATIVE_INT_TYPE portNum, //!< The port number
Fw::Buffer& buffer
);
//! Handler implementation for bufferSendInReturn
//!
void bufferSendInReturn_handler(
const NATIVE_INT_TYPE portNum, //!< The port number
Fw::Buffer& buffer
);
//! Handler implementation for pingIn
//!
void pingIn_handler(
const NATIVE_INT_TYPE portNum, //!< The port number
U32 key //!< Value to return to pinger
);
//! Handler implementation for schedIn
//!
void schedIn_handler(
const NATIVE_INT_TYPE portNum, /*!< The port number*/
NATIVE_UINT_TYPE context /*!< The call order*/
);
PRIVATE:
// ----------------------------------------------------------------------
// Command handler implementations
// ----------------------------------------------------------------------
//! Implementation for SetMode command handler
//! Set the mode
void BA_SetMode_cmdHandler(
const FwOpcodeType opCode, //!< The opcode
const U32 cmdSeq, //!< The command sequence number
OpState mode //!< The mode
);
PRIVATE:
// ----------------------------------------------------------------------
// Private helper methods
// ----------------------------------------------------------------------
//! Send a stored buffer
void sendStoredBuffer(void);
PRIVATE:
// ----------------------------------------------------------------------
// Private member variables
// ----------------------------------------------------------------------
//! The mode
OpState mode;
//! Memory for the buffer array
Fw::Buffer * bufferMemory;
//! The FIFO queue of buffers
ArrayFIFOBuffer bufferQueue;
//! Whether to send a buffer to the downstream client
bool send;
//! The number of QueueFull warnings sent since the last successful enqueue operation
U32 numWarnings;
//! The allocator ID
NATIVE_INT_TYPE allocatorId;
};
}
#endif