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_buffsReceived = 0;
14  this->m_errBuffs = 0;
15  this->m_firstBuffReceived = 0;
16  this->m_sensor1 = 1000.0;
17  this->m_sensor2 = 10.0;
18  this->m_stats.set_BuffRecv(0);
19  this->m_stats.set_BuffErr(0);
20  this->m_stats.set_PacketStatus(PacketRecvStatus::PACKET_STATE_NO_PACKETS);
21 }
22 
24 
25 void RecvBuffImpl::Data_handler(FwIndexType portNum, Drv::DataBuffer& buff) {
26  this->m_stats.set_BuffRecv(++this->m_buffsReceived);
27  // reset deserialization of buffer
28  buff.resetDeser();
29  // deserialize packet ID
30  U32 id = 0;
31  Fw::SerializeStatus stat = buff.deserializeTo(id);
32  FW_ASSERT(stat == Fw::FW_SERIALIZE_OK, static_cast<FwAssertArgType>(stat));
33  // deserialize data
34  U8 testData[24] = {0};
35  FwSizeType size = sizeof(testData);
36  stat = buff.deserializeTo(testData, size);
37  FW_ASSERT(stat == Fw::FW_SERIALIZE_OK, static_cast<FwAssertArgType>(stat));
38  // deserialize checksum
39  U32 csum = 0;
40  stat = buff.deserializeTo(csum);
41  FW_ASSERT(stat == Fw::FW_SERIALIZE_OK, static_cast<FwAssertArgType>(stat));
42  // if first packet, send event
43  if (not this->m_firstBuffReceived) {
44  this->log_ACTIVITY_LO_FirstPacketReceived(id);
45  this->m_stats.set_PacketStatus(PacketRecvStatus::PACKET_STATE_OK);
46  this->m_firstBuffReceived = true;
47  }
48 
49  // compute checksum
50  U32 sum = 0;
51  for (U32 byte = 0; byte < size; byte++) {
52  sum += testData[byte];
53  }
54  // check checksum
55  if (sum != csum) {
56  // increment error count
57  this->m_stats.set_BuffErr(++this->m_errBuffs);
58  // send error event
59  this->log_WARNING_HI_PacketChecksumError(id);
60  // update stats
61  this->m_stats.set_PacketStatus(PacketRecvStatus::PACKET_STATE_ERRORS);
62  }
63  // update sensor values
64  this->m_sensor1 += 5.0;
65  this->m_sensor2 += 1.2;
66  // update channels
67  this->tlmWrite_Sensor1(this->m_sensor1);
68  this->tlmWrite_Sensor2(this->m_sensor2);
69  this->tlmWrite_PktState(this->m_stats);
70 }
71 
72 void RecvBuffImpl::parameterUpdated(FwPrmIdType id) {
73  this->log_ACTIVITY_LO_BuffRecvParameterUpdated(id);
74  Fw::ParamValid valid;
75  switch (id) {
76  case PARAMID_PARAMETER1: {
77  U32 val = this->paramGet_parameter1(valid);
78  this->tlmWrite_Parameter1(val);
79  break;
80  }
81  case PARAMID_PARAMETER2: {
82  I16 val = this->paramGet_parameter2(valid);
83  this->tlmWrite_Parameter2(val);
84  break;
85  }
86  default:
87  FW_ASSERT(0, id);
88  break;
89  }
90 }
91 
92 } // namespace Ref
Serialization/Deserialization operation was successful.
PlatformSizeType FwSizeType
SerializeStatus deserializeTo(U8 &val, Endianness mode=Endianness::BIG) override
Deserialize an 8-bit unsigned integer value.
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
Enum representing parameter validity.
#define FW_ASSERT(...)
Definition: Assert.hpp:14