GCC Code Coverage Report


Directory: /home/runner/work/fprime/fprime/Fw/Tlm/
File: TlmPacket.cpp
Date: 2026-09-03 22:13:07
Exec Total Coverage
Lines: 26 71 36.6%
Functions: 6 11 54.5%
Branches: 7 34 20.6%

Line Branch Exec Source
1 /*
2 * TlmPacket.cpp
3 *
4 * Created on: May 24, 2014
5 * Author: Timothy Canham
6 */
7 #include <Fw/Tlm/TlmPacket.hpp>
8 #include <Fw/Types/Assert.hpp>
9 #include <Fw/Types/Serializable.hpp>
10
11 namespace Fw {
12
13
1/1
✓ Branch 2 taken 235 times.
235 TlmPacket::TlmPacket() : m_numEntries(0) {
14 235 this->m_type = ComPacketType::FW_PACKET_TELEM;
15
1/1
✓ Branch 1 taken 235 times.
235 this->m_tlmBuffer.resetSer();
16 235 }
17
18 470 TlmPacket::~TlmPacket() {}
19
20 236 SerializeStatus TlmPacket::resetPktSer() {
21 236 this->m_tlmBuffer.resetSer();
22 // reset packet count
23 236 this->m_numEntries = 0;
24 // make sure packet type is correct before serializing. It should
25 // never be anything but FW_PACKET_TELEM, so assert.
26 236 FW_ASSERT(ComPacketType::FW_PACKET_TELEM == this->m_type, static_cast<FwAssertArgType>(this->m_type));
27 // serialize descriptor
28 // The function serializeBase inherited from ComPacket converts this->m_type
29 // to type FwPacketDescriptorType and serializes the result into this->m_tlmBuffer.
30 236 return this->serializeBase(this->m_tlmBuffer);
31 }
32
33 SerializeStatus TlmPacket::resetPktDeser() {
34 this->m_tlmBuffer.resetDeser();
35 // deserialize descriptor
36 // The function deserializeBase inherited from ComPacket deserializes a
37 // value of type FwPacketDescriptorType from this->m_tlmBuffer and stores it
38 // into this->m_type.
39 Fw::SerializeStatus stat = this->deserializeBase(this->m_tlmBuffer);
40 if (stat != Fw::FW_SERIALIZE_OK) {
41 return stat;
42 }
43 // make sure that this->m_tlmBuffer stores a telemetry packet
44 if (this->m_type != ComPacketType::FW_PACKET_TELEM) {
45 return Fw::FW_DESERIALIZE_TYPE_MISMATCH;
46 }
47
48 return Fw::FW_SERIALIZE_OK;
49 }
50
51 235 FwSizeType TlmPacket::getNumEntries() {
52 235 return this->m_numEntries;
53 }
54
55 226 Fw::ComBuffer& TlmPacket::getBuffer() {
56 226 return this->m_tlmBuffer;
57 }
58
59 void TlmPacket::setBuffer(Fw::ComBuffer& buffer) {
60 this->m_tlmBuffer = buffer;
61 }
62
63 2876 SerializeStatus TlmPacket::addValue(FwChanIdType id, Time& timeTag, TlmBuffer& buffer) {
64 // check to make sure there is room for all the fields
65 2876 FwSizeType left = this->m_tlmBuffer.getCapacity() - this->m_tlmBuffer.getSize();
66
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 2875 times.
2876 if ((sizeof(FwChanIdType) + Time::SERIALIZED_SIZE + buffer.getSize()) > left) {
67 1 return Fw::FW_SERIALIZE_NO_ROOM_LEFT;
68 }
69
70 // serialize items into buffer
71
72 // id
73 2875 SerializeStatus stat = this->m_tlmBuffer.serializeFrom(id);
74
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2875 times.
2875 if (stat != Fw::FW_SERIALIZE_OK) {
75 return stat;
76 }
77
78 // time tag
79 2875 stat = this->m_tlmBuffer.serializeFrom(timeTag);
80
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2875 times.
2875 if (stat != Fw::FW_SERIALIZE_OK) {
81 return stat;
82 }
83
84 // telemetry buffer
85 2875 stat = this->m_tlmBuffer.serializeFrom(buffer.getBuffAddr(), buffer.getSize(), Fw::Serialization::OMIT_LENGTH);
86
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2875 times.
2875 if (stat != Fw::FW_SERIALIZE_OK) {
87 return stat;
88 }
89
90 // increment number of packets
91 2875 this->m_numEntries++;
92
93 2875 return Fw::FW_SERIALIZE_OK;
94 }
95
96 // extract telemetry value
97 SerializeStatus TlmPacket::extractValue(FwChanIdType& id, Time& timeTag, TlmBuffer& buffer, FwSizeType bufferSize) {
98 // deserialize items out of buffer
99
100 // id
101 SerializeStatus stat = this->m_tlmBuffer.deserializeTo(id);
102 if (stat != Fw::FW_SERIALIZE_OK) {
103 return stat;
104 }
105
106 // time tag
107 stat = this->m_tlmBuffer.deserializeTo(timeTag);
108 if (stat != Fw::FW_SERIALIZE_OK) {
109 return stat;
110 }
111
112 // telemetry buffer
113 stat = this->m_tlmBuffer.deserializeTo(buffer.getBuffAddr(), bufferSize, Fw::Serialization::OMIT_LENGTH);
114 if (stat != Fw::FW_SERIALIZE_OK) {
115 return stat;
116 }
117
118 // set buffer size
119 stat = buffer.setBuffLen(bufferSize);
120 if (stat != Fw::FW_SERIALIZE_OK) {
121 return stat;
122 }
123
124 return Fw::FW_SERIALIZE_OK;
125 }
126
127 SerializeStatus TlmPacket::serializeTo(SerialBufferBase& buffer, Fw::Endianness mode) const {
128 // serialize the number of packets
129 SerializeStatus stat = buffer.serializeFrom(this->m_numEntries, mode);
130 if (stat != Fw::FW_SERIALIZE_OK) {
131 return stat;
132 }
133 // Serialize the ComBuffer
134 return buffer.serializeFrom(this->m_tlmBuffer.getBuffAddr(), m_tlmBuffer.getSize(), Fw::Serialization::OMIT_LENGTH);
135 }
136
137 SerializeStatus TlmPacket::deserializeFrom(SerialBufferBase& buffer, Fw::Endianness mode) {
138 // deserialize the number of packets
139 SerializeStatus stat = buffer.deserializeTo(this->m_numEntries, mode);
140 if (stat != Fw::FW_SERIALIZE_OK) {
141 return stat;
142 }
143 // deserialize the channel value entry buffers
144 FwSizeType size = buffer.getDeserializeSizeLeft();
145 if (size > this->m_tlmBuffer.getCapacity()) {
146 return FW_DESERIALIZE_SIZE_MISMATCH;
147 }
148 stat = buffer.deserializeTo(this->m_tlmBuffer.getBuffAddr(), size, Fw::Serialization::OMIT_LENGTH);
149 if (stat == FW_SERIALIZE_OK) {
150 // Shouldn't fail
151 stat = this->m_tlmBuffer.setBuffLen(size);
152 FW_ASSERT(stat == FW_SERIALIZE_OK, static_cast<FwAssertArgType>(stat));
153 }
154 return stat;
155 }
156
157 } /* namespace Fw */
158