F´ Flight Software - C/C++ Documentation  devel
A framework for building embedded system applications to NASA flight quality standards.
Framer.cpp
Go to the documentation of this file.
1 // ======================================================================
2 // \title Framer.cpp
3 // \author mstarch
4 // \brief cpp file for Framer component implementation class
5 //
6 // \copyright
7 // Copyright 2009-2022, by the California Institute of Technology.
8 // ALL RIGHTS RESERVED. United States Government Sponsorship
9 // acknowledged.
10 //
11 // ======================================================================
12 
13 #include <FpConfig.hpp>
14 #include <Svc/Framer/Framer.hpp>
15 #include "Fw/Logger/Logger.hpp"
16 #include "Utils/Hash/Hash.hpp"
17 
18 namespace Svc {
19 
20 // ----------------------------------------------------------------------
21 // Construction, initialization, and destruction
22 // ----------------------------------------------------------------------
23 
24 Framer ::Framer(const char* const compName)
25  : FramerComponentBase(compName), FramingProtocolInterface(), m_protocol(nullptr), m_frame_sent(false) {}
26 
27 void Framer ::init(const NATIVE_INT_TYPE instance) {
28  FramerComponentBase::init(instance);
29 }
30 
32 
34  FW_ASSERT(this->m_protocol == nullptr);
35  this->m_protocol = &protocol;
36  protocol.setup(*this);
37 }
38 
39 void Framer ::handle_framing(const U8* const data, const U32 size, Fw::ComPacket::ComPacketType packet_type) {
40  FW_ASSERT(this->m_protocol != nullptr);
41  this->m_frame_sent = false; // Clear the flag to detect if frame was sent
42  this->m_protocol->frame(data, size, packet_type);
43  // If no frame was sent, Framer has the obligation to report success
44  if (this->isConnected_comStatusOut_OutputPort(0) && (!this->m_frame_sent)) {
46  this->comStatusOut_out(0, status);
47  }
48 }
49 
50 // ----------------------------------------------------------------------
51 // Handler implementations for user-defined typed input ports
52 // ----------------------------------------------------------------------
53 
54 void Framer ::comIn_handler(const NATIVE_INT_TYPE portNum, Fw::ComBuffer& data, U32 context) {
55  this->handle_framing(data.getBuffAddr(), data.getBuffLength(), Fw::ComPacket::FW_PACKET_UNKNOWN);
56 }
57 
58 void Framer ::bufferIn_handler(const NATIVE_INT_TYPE portNum, Fw::Buffer& fwBuffer) {
59  this->handle_framing(fwBuffer.getData(), fwBuffer.getSize(), Fw::ComPacket::FW_PACKET_FILE);
60  // Deallocate the buffer after it was processed by the framing protocol
61  this->bufferDeallocate_out(0, fwBuffer);
62 }
63 
64 void Framer ::comStatusIn_handler(const NATIVE_INT_TYPE portNum, Fw::Success& condition) {
65  if (this->isConnected_comStatusOut_OutputPort(portNum)) {
66  this->comStatusOut_out(portNum, condition);
67  }
68 }
69 
70 // ----------------------------------------------------------------------
71 // Framing protocol implementations
72 // ----------------------------------------------------------------------
73 
74 void Framer ::send(Fw::Buffer& outgoing) {
75  FW_ASSERT(!this->m_frame_sent); // Prevent multiple sends per-packet
76  const Drv::SendStatus sendStatus = this->framedOut_out(0, outgoing);
77  if (sendStatus.e != Drv::SendStatus::SEND_OK) {
78  // Note: if there is a data sending problem, an EVR likely wouldn't
79  // make it down. Log the issue in hopes that
80  // someone will see it.
81  Fw::Logger::logMsg("[ERROR] Failed to send framed data: %d\n", sendStatus.e);
82  }
83  this->m_frame_sent = true; // A frame was sent
84 }
85 
86 Fw::Buffer Framer ::allocate(const U32 size) {
87  return this->framedAllocate_out(0, size);
88 }
89 
90 } // end namespace Svc
#define FW_ASSERT(...)
Definition: Assert.hpp:14
PlatformIntType NATIVE_INT_TYPE
Definition: BasicTypes.h:51
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.h:26
C++-compatible configuration header for fprime configuration.
Status returned by the send call.
T e
The raw enum value.
@ SEND_OK
Send worked as expected.
U8 * getData() const
Definition: Buffer.cpp:68
U32 getSize() const
Definition: Buffer.cpp:72
U8 * getBuffAddr()
gets buffer address for data filling
Definition: ComBuffer.cpp:40
static void logMsg(const char *fmt, POINTER_CAST a0=0, POINTER_CAST a1=0, POINTER_CAST a2=0, POINTER_CAST a3=0, POINTER_CAST a4=0, POINTER_CAST a5=0, POINTER_CAST a6=0, POINTER_CAST a7=0, POINTER_CAST a8=0, POINTER_CAST a9=0)
Definition: Logger.cpp:18
void init()
Object initializer.
Definition: ObjBase.cpp:27
Serializable::SizeType getBuffLength() const
returns current buffer size
Success/Failure.
@ SUCCESS
Representing success.
Auto-generated base for Framer component.
void bufferDeallocate_out(FwIndexType portNum, Fw::Buffer &fwBuffer)
Invoke output port bufferDeallocate.
void comStatusOut_out(FwIndexType portNum, Fw::Success &condition)
Invoke output port comStatusOut.
Drv::SendStatus framedOut_out(FwIndexType portNum, Fw::Buffer &sendBuffer)
Invoke output port framedOut.
Fw::Buffer framedAllocate_out(FwIndexType portNum, U32 size)
Invoke output port framedAllocate.
bool isConnected_comStatusOut_OutputPort(FwIndexType portNum)
Framer(const char *const compName)
Definition: Framer.cpp:24
void setup(FramingProtocol &protocol)
Setup this component with a supplied framing protocol.
Definition: Framer.cpp:33
abstract class representing a framing protocol
virtual void frame(const U8 *const data, const U32 size, Fw::ComPacket::ComPacketType packet_type)=0
frame a given set of bytes
void setup(FramingProtocolInterface &interface)
setup function called to supply the interface used for allocation and sending
interface supplied to the framing protocol