F´ Flight Software - C/C++ Documentation
A framework for building embedded system applications to NASA flight quality standards.
TlmPacket.cpp
Go to the documentation of this file.
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>
10 
11 namespace Fw {
12 
13 TlmPacket::TlmPacket() : m_numEntries(0) {
14  this->m_type = ComPacketType::FW_PACKET_TELEM;
15  this->m_tlmBuffer.resetSer();
16 }
17 
19 
21  this->m_tlmBuffer.resetSer();
22  // reset packet count
23  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  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  return this->serializeBase(this->m_tlmBuffer);
31 }
32 
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) {
46  }
47 
48  return Fw::FW_SERIALIZE_OK;
49 }
50 
52  return this->m_numEntries;
53 }
54 
56  return this->m_tlmBuffer;
57 }
58 
60  this->m_tlmBuffer = buffer;
61 }
62 
64  // check to make sure there is room for all the fields
65  FwSizeType left = this->m_tlmBuffer.getCapacity() - this->m_tlmBuffer.getSize();
66  if ((sizeof(FwChanIdType) + Time::SERIALIZED_SIZE + buffer.getSize()) > left) {
68  }
69 
70  // serialize items into buffer
71 
72  // id
73  SerializeStatus stat = this->m_tlmBuffer.serializeFrom(id);
74  if (stat != Fw::FW_SERIALIZE_OK) {
75  return stat;
76  }
77 
78  // time tag
79  stat = this->m_tlmBuffer.serializeFrom(timeTag);
80  if (stat != Fw::FW_SERIALIZE_OK) {
81  return stat;
82  }
83 
84  // telemetry buffer
85  stat = this->m_tlmBuffer.serializeFrom(buffer.getBuffAddr(), buffer.getSize(), Fw::Serialization::OMIT_LENGTH);
86  if (stat != Fw::FW_SERIALIZE_OK) {
87  return stat;
88  }
89 
90  // increment number of packets
91  this->m_numEntries++;
92 
93  return Fw::FW_SERIALIZE_OK;
94 }
95 
96 // extract telemetry value
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 
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 
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  stat = buffer.deserializeTo(this->m_tlmBuffer.getBuffAddr(), size, Fw::Serialization::OMIT_LENGTH);
146  if (stat == FW_SERIALIZE_OK) {
147  // Shouldn't fail
148  stat = this->m_tlmBuffer.setBuffLen(size);
149  FW_ASSERT(stat == FW_SERIALIZE_OK, static_cast<FwAssertArgType>(stat));
150  }
151  return stat;
152 }
153 
154 } /* namespace Fw */
Serialization/Deserialization operation was successful.
void setBuffer(Fw::ComBuffer &buffer)
set the internal buffer for deserializing values
Definition: TlmPacket.cpp:59
SerializeStatus serializeFrom(U8 val, Endianness mode=Endianness::BIG) override
Serialize an 8-bit unsigned integer value.
PlatformSizeType FwSizeType
SerializeStatus serializeTo(SerialBufferBase &buffer, Fw::Endianness mode=Fw::Endianness::BIG) const override
serialize contents
Definition: TlmPacket.cpp:127
Serializable::SizeType getSize() const override
Get current buffer size.
No room left in the buffer to serialize data.
ComPacketType m_type
Definition: ComPacket.hpp:28
SerializeStatus deserializeBase(SerialBufferBase &buffer)
Definition: ComPacket.cpp:20
Fw::ComBuffer & getBuffer()
get buffer to send to the ground
Definition: TlmPacket.cpp:55
virtual SerializeStatus serializeFrom(U8 val, Endianness mode=Endianness::BIG)=0
Serialize an 8-bit unsigned integer value.
FwSizeType getNumEntries()
get the number of packets added via addValue()
Definition: TlmPacket.cpp:51
SerializeStatus
forward declaration for string
virtual SerializeStatus deserializeTo(U8 &val, Endianness mode=Endianness::BIG)=0
Deserialize an 8-bit unsigned integer value.
SerializeStatus addValue(FwChanIdType id, Time &timeTag, TlmBuffer &buffer)
Add telemetry value to buffer.
Definition: TlmPacket.cpp:63
Omit length from serialization.
FwIdType FwChanIdType
The type of a telemetry channel identifier.
SerializeStatus resetPktSer()
Reset serialization of values. This should be done when starting to accumulate a new set of values...
Definition: TlmPacket.cpp:20
virtual ~TlmPacket()
Destructor.
Definition: TlmPacket.cpp:18
U8 * getBuffAddr()
Get buffer address for data filling (non-const version)
Definition: ComBuffer.cpp:42
U8 * getBuffAddr()
Get buffer address for data filling (non-const version)
Definition: TlmBuffer.cpp:42
void resetDeser() override
Reset deserialization pointer to beginning of buffer.
void resetSer() override
Reset serialization pointer to beginning of buffer.
Deserialized type ID didn&#39;t match.
virtual Serializable::SizeType getDeserializeSizeLeft() const =0
Get remaining deserialization buffer size.
SerializeStatus serializeBase(SerialBufferBase &buffer) const
Definition: ComPacket.cpp:16
FwSizeType getCapacity() const
Get buffer capacity.
Definition: ComBuffer.cpp:30
SerializeStatus deserializeFrom(SerialBufferBase &buffer, Fw::Endianness mode=Fw::Endianness::BIG) override
Deserialize the contents of this object from a buffer.
Definition: TlmPacket.cpp:137
SerializeStatus deserializeTo(U8 &val, Endianness mode=Endianness::BIG) override
Deserialize an 8-bit unsigned integer value.
SerializeStatus setBuffLen(Serializable::SizeType length) override
Set buffer length manually.
Implementation of malloc based allocator.
Endianness
TlmPacket()
Constructor.
Definition: TlmPacket.cpp:13
#define FW_ASSERT(...)
Definition: Assert.hpp:14
SerializeStatus resetPktDeser()
Reset deserialization. This should be done before extracting values.
Definition: TlmPacket.cpp:33
SerializeStatus extractValue(FwChanIdType &id, Time &timeTag, TlmBuffer &buffer, FwSizeType bufferSize)
Definition: TlmPacket.cpp:97