GCC Code Coverage Report


Directory: Svc/FprimeFramer/
File: FprimeFramer.cpp
Date: 2026-09-23 21:14:29
Exec Total Coverage
Lines: 41 41 100.0%
Functions: 5 5 100.0%
Branches: 39 41 95.1%

Line Branch Exec Source
1 // ======================================================================
2 // \title FprimeFramer.cpp
3 // \author thomas-bc
4 // \brief cpp file for FprimeFramer component implementation class
5 // ======================================================================
6
7 #include "Svc/FprimeFramer/FprimeFramer.hpp"
8 #include "Svc/FprimeProtocol/FrameHeaderSerializableAc.hpp"
9 #include "Svc/FprimeProtocol/FrameTrailerSerializableAc.hpp"
10 #include "Utils/Hash/Hash.hpp"
11
12 namespace Svc {
13
14 // ----------------------------------------------------------------------
15 // Component construction and destruction
16 // ----------------------------------------------------------------------
17
18 6 FprimeFramer ::FprimeFramer(const char* const compName) : FprimeFramerComponentBase(compName) {}
19
20 12 FprimeFramer ::~FprimeFramer() {}
21
22 // ----------------------------------------------------------------------
23 // Handler implementations for typed input ports
24 // ----------------------------------------------------------------------
25
26 4 void FprimeFramer ::dataIn_handler(FwIndexType portNum, Fw::Buffer& data, const ComCfg::FrameContext& context) {
27
1/1
✓ Branch 2 taken 4 times.
4 FprimeProtocol::FrameHeader header;
28
1/1
✓ Branch 2 taken 4 times.
4 FprimeProtocol::FrameTrailer trailer;
29
30 // Full size of the frame will be size of header + data + trailer
31 FwSizeType frameSize =
32
1/1
✓ Branch 4 taken 4 times.
4 FprimeProtocol::FrameHeader::SERIALIZED_SIZE + data.getSize() + FprimeProtocol::FrameTrailer::SERIALIZED_SIZE;
33 4 FW_ASSERT(data.getSize() <= std::numeric_limits<FprimeProtocol::TokenType>::max(),
34 static_cast<FwAssertArgType>(frameSize));
35 4 FW_ASSERT(frameSize <= std::numeric_limits<Fw::Buffer::SizeType>::max(), static_cast<FwAssertArgType>(frameSize));
36
37 // Allocate frame buffer
38
1/1
✓ Branch 3 taken 4 times.
4 Fw::Buffer frameBuffer = this->bufferAllocate_out(0, frameSize);
39 // The allocator may return an invalid or smaller-than-requested buffer
40
8/8
✓ Branch 2 taken 4 times.
✓ Branch 4 taken 3 times.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 3 times.
✓ Branch 10 taken 1 times.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 2 times.
4 if ((not frameBuffer.isValid()) || (frameBuffer.getSize() < frameSize)) {
41
1/1
✓ Branch 5 taken 2 times.
2 this->log_WARNING_HI_NoBufferAvailable();
42
3/3
✓ Branch 2 taken 2 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 1 times.
2 if (frameBuffer.isValid()) {
43
1/1
✓ Branch 5 taken 1 times.
1 this->bufferDeallocate_out(0, frameBuffer);
44 }
45
1/1
✓ Branch 5 taken 2 times.
2 this->dataReturnOut_out(0, data, context);
46 // No frame produced: report SUCCESS so the upstream ComQueue keeps sending (Framer Status Protocol)
47
2/3
✓ Branch 5 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
2 if (this->isConnected_comStatusOut_OutputPort(0)) {
48
1/1
✓ Branch 2 taken 2 times.
2 Fw::Success status = Fw::Success::SUCCESS;
49
1/1
✓ Branch 5 taken 2 times.
2 this->comStatusOut_out(0, status);
50 2 }
51 2 return;
52 }
53
1/1
✓ Branch 2 taken 2 times.
2 auto frameSerializer = frameBuffer.getSerializer();
54 Fw::SerializeStatus status;
55
56 // Serialize the header
57 // 0xDEADBEEF is already set as the default value for the header startWord field in the FPP type definition
58
2/2
✓ Branch 5 taken 2 times.
✓ Branch 8 taken 2 times.
2 header.set_lengthField(static_cast<FprimeProtocol::TokenType>(data.getSize()));
59
1/1
✓ Branch 2 taken 2 times.
2 status = frameSerializer.serializeFrom(header);
60 2 FW_ASSERT(status == Fw::FW_SERIALIZE_OK, status);
61
62 // Serialize the data
63
3/3
✓ Branch 5 taken 2 times.
✓ Branch 11 taken 2 times.
✓ Branch 14 taken 2 times.
2 status = frameSerializer.serializeFrom(data.getData(), data.getSize(), Fw::Serialization::OMIT_LENGTH);
64 2 FW_ASSERT(status == Fw::FW_SERIALIZE_OK, status);
65
66 // Serialize the trailer (with CRC computation)
67
1/1
✓ Branch 2 taken 2 times.
2 Utils::HashBuffer hashBuffer;
68
2/2
✓ Branch 2 taken 2 times.
✓ Branch 5 taken 2 times.
2 Utils::Hash::hash(frameBuffer.getData(), frameSize - HASH_DIGEST_LENGTH, hashBuffer);
69
2/2
✓ Branch 3 taken 2 times.
✓ Branch 6 taken 2 times.
2 trailer.set_crcField(hashBuffer.asBigEndianU32());
70
1/1
✓ Branch 2 taken 2 times.
2 status = frameSerializer.serializeFrom(trailer);
71 2 FW_ASSERT(status == Fw::FW_SERIALIZE_OK, status);
72 // Trim to actual frame size in case allocator returned a larger buffer
73
1/1
✓ Branch 2 taken 2 times.
2 frameBuffer.setSize(static_cast<Fw::Buffer::SizeType>(frameSize));
74
75 // Send the full frame out - this port shall always be connected
76
1/1
✓ Branch 5 taken 2 times.
2 this->dataOut_out(0, frameBuffer, context);
77 // Return original (unframed) data buffer ownership back to its sender - always connected
78
1/1
✓ Branch 5 taken 2 times.
2 this->dataReturnOut_out(0, data, context);
79 8 }
80
81 2 void FprimeFramer ::comStatusIn_handler(FwIndexType portNum, Fw::Success& condition) {
82
1/2
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 if (this->isConnected_comStatusOut_OutputPort(portNum)) {
83 2 this->comStatusOut_out(portNum, condition);
84 }
85 2 }
86
87 1 void FprimeFramer ::dataReturnIn_handler(FwIndexType portNum,
88 Fw::Buffer& frameBuffer,
89 const ComCfg::FrameContext& context) {
90 // dataReturnIn is the allocated buffer coming back from the ComManager (e.g. ComStub) component
91 1 this->bufferDeallocate_out(0, frameBuffer);
92 1 }
93
94 } // namespace Svc
95