fprime/Svc/Framer/Framer.hpp
2025-02-28 15:05:15 -08:00

114 lines
4.1 KiB
C++

// ======================================================================
// \title Framer.hpp
// \author mstarch, bocchino
// \brief hpp file for Framer component implementation class
//
// \copyright
// Copyright 2009-2022, by the California Institute of Technology.
// ALL RIGHTS RESERVED. United States Government Sponsorship
// acknowledged.
//
// ======================================================================
#ifndef Svc_Framer_HPP
#define Svc_Framer_HPP
#include "Svc/Framer/FramerComponentAc.hpp"
#include "Svc/FramingProtocol/FramingProtocol.hpp"
#include "Svc/FramingProtocol/FramingProtocolInterface.hpp"
namespace Svc {
/**
* \brief Generic framing component using FramingProtocol implementation for actual framing
*
* Framing component used to take Com and File packets and frame serialize them using a
* framing protocol specified in a FramingProtocol instance. The instance must be supplied
* using the `setup` method.
*
* Using this component, projects can implement and supply a fresh FramingProtocol implementation
* without changing the reference topology.
*/
class Framer final : public FramerComponentBase, public FramingProtocolInterface {
public:
// ----------------------------------------------------------------------
// Construction, initialization, and destruction
// ----------------------------------------------------------------------
//! Construct object Framer
//!
Framer(const char* const compName /*!< The component name*/
);
//! \brief Setup this component with a supplied framing protocol
//!
void setup(FramingProtocol& protocol /*!< Protocol used in framing */);
//! Destroy object Framer
//!
~Framer();
PRIVATE:
// ----------------------------------------------------------------------
// Handler implementations for user-defined typed input ports
// ----------------------------------------------------------------------
//! Handler implementation for comIn
//!
void comIn_handler(const FwIndexType portNum, /*!< The port number*/
Fw::ComBuffer& data, /*!< Buffer containing packet data*/
U32 context /*!< Call context value; meaning chosen by user*/
);
//! Handler implementation for bufferIn
//!
void bufferIn_handler(const FwIndexType portNum, /*!< The port number*/
Fw::Buffer& fwBuffer /*!< The buffer*/
);
//! Handler implementation for comStatusIn
//!
void comStatusIn_handler(const FwIndexType portNum, /*!< The port number*/
Fw::Success& condition /*!< The condition*/);
// ----------------------------------------------------------------------
// Implementation of FramingProtocolInterface
// ----------------------------------------------------------------------
//! \brief Allocation callback used to request memory for the framer
//!
//! Method used by the FramingProtocol to allocate memory for the framed buffer. Framing
//! typically adds tokens on the beginning and end of the raw data so it must allocate new space
//! to place those and a copy of the data in.
//!
//! \param size: size of allocation
//! \return Fw::Buffer containing allocation to write into
Fw::Buffer allocate(const U32 size);
//! Send implementation
//!
void send(Fw::Buffer& outgoing //!< The buffer to send
);
// ----------------------------------------------------------------------
// Helper functions
// ----------------------------------------------------------------------
//! \brief helper function to handle framing of the raw data
//!
void handle_framing(const U8* const data, const U32 size, Fw::ComPacket::ComPacketType packet_type);
// ----------------------------------------------------------------------
// Member variables
// ----------------------------------------------------------------------
//! The FramingProtocol implementation
FramingProtocol* m_protocol;
//! Flag determining if at least one frame was sent during framing
bool m_frame_sent;
};
} // end namespace Svc
#endif