F´ Flight Software - C/C++ Documentation
A framework for building embedded system applications to NASA flight quality standards.
RecvBuffComponentImpl.cpp
Go to the documentation of this file.
2 #include <Fw/Types/Assert.hpp>
3 #include <Os/Console.hpp>
5 
6 #include <cstdio>
7 
8 #define DEBUG_LVL 1
9 
10 namespace Ref {
11 
12 RecvBuffImpl::RecvBuffImpl(const char* compName) : RecvBuffComponentBase(compName) {
13  this->m_firstBuffReceived = 0;
14  this->m_sensor1 = 1000.0;
15  this->m_sensor2 = 10.0;
16  this->m_stats.set_BuffRecv(0);
17  this->m_stats.set_BuffErr(0);
18  this->m_stats.set_PacketStatus(PacketRecvStatus::PACKET_STATE_NO_PACKETS);
19 }
20 
22 
23 void RecvBuffImpl::Data_handler(FwIndexType portNum, Drv::DataBuffer& buff) {
24  this->m_stats.set_BuffRecv(++this->m_buffsReceived);
25  // reset deserialization of buffer
26  buff.resetDeser();
27  // deserialize packet ID
28  U32 id = 0;
29  Fw::SerializeStatus stat = buff.deserializeTo(id);
30  FW_ASSERT(stat == Fw::FW_SERIALIZE_OK, static_cast<FwAssertArgType>(stat));
31  // deserialize data
32  U8 testData[24] = {0};
33  FwSizeType size = sizeof(testData);
34  stat = buff.deserializeTo(testData, size);
35  FW_ASSERT(stat == Fw::FW_SERIALIZE_OK, static_cast<FwAssertArgType>(stat));
36  // deserialize checksum
37  U32 csum = 0;
38  stat = buff.deserializeTo(csum);
39  FW_ASSERT(stat == Fw::FW_SERIALIZE_OK, static_cast<FwAssertArgType>(stat));
40  // if first packet, send event
41  if (not this->m_firstBuffReceived) {
42  this->log_ACTIVITY_LO_FirstPacketReceived(id);
43  this->m_stats.set_PacketStatus(PacketRecvStatus::PACKET_STATE_OK);
44  this->m_firstBuffReceived = true;
45  }
46 
47  // compute checksum
48  U32 sum = 0;
49  for (U32 byte = 0; byte < size; byte++) {
50  sum += testData[byte];
51  }
52  // check checksum
53  if (sum != csum) {
54  // increment error count
55  this->m_stats.set_BuffErr(++this->m_errBuffs);
56  // send error event
57  this->log_WARNING_HI_PacketChecksumError(id);
58  // update stats
59  this->m_stats.set_PacketStatus(PacketRecvStatus::PACKET_STATE_ERRORS);
60  }
61  // update sensor values
62  this->m_sensor1 += 5.0;
63  this->m_sensor2 += 1.2;
64  // update channels
65  this->tlmWrite_Sensor1(this->m_sensor1);
66  this->tlmWrite_Sensor2(this->m_sensor2);
67  this->tlmWrite_PktState(this->m_stats);
68 }
69 
70 void RecvBuffImpl::parameterUpdated(FwPrmIdType id) {
71  this->log_ACTIVITY_LO_BuffRecvParameterUpdated(id);
72  Fw::ParamValid valid;
73  switch (id) {
74  case PARAMID_PARAMETER1: {
75  U32 val = this->paramGet_parameter1(valid);
76  this->tlmWrite_Parameter1(val);
77  break;
78  }
79  case PARAMID_PARAMETER2: {
80  I16 val = this->paramGet_parameter2(valid);
81  this->tlmWrite_Parameter2(val);
82  break;
83  }
84  default:
85  FW_ASSERT(0, id);
86  break;
87  }
88 }
89 
90 } // namespace Ref
Serialization/Deserialization operation was successful.
PlatformSizeType FwSizeType
FwIdType FwPrmIdType
The type of a parameter identifier.
SerializeStatus
forward declaration for string
RecvBuffImpl(const char *compName)
void resetDeser() override
Reset deserialization pointer to beginning of buffer.
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.h:54
PlatformIndexType FwIndexType
SerializeStatus deserializeTo(U8 &val, Endianness mode=Endianness::BIG) override
Deserialize an 8-bit unsigned integer value.
Enum representing parameter validity.
#define FW_ASSERT(...)
Definition: Assert.hpp:14