Satellite-Gateway
GatewayFrameData.h
Go to the documentation of this file.
1 
24 #ifndef GATEWAY_FRAME_DATA_H
25 #define GATEWAY_FRAME_DATA_H
26 
27 #include "GatewayFrame.h"
28 #include <memory>
29 
31 public:
32  static GatewayFrameData Create(uint16_t a_SerialPortNbr, const std::vector<unsigned char> &a_Payload) {
33  GatewayFrameData l_GatewayFrameData;
34  l_GatewayFrameData.m_SerialPortNbr = a_SerialPortNbr;
35  l_GatewayFrameData.m_Buffer = std::move(a_Payload);
36  return l_GatewayFrameData;
37  }
38 
39  static std::shared_ptr<GatewayFrameData> CreateDeserializedFrame() {
40  auto l_GatewayFrameData(std::shared_ptr<GatewayFrameData>(new GatewayFrameData));
41  l_GatewayFrameData->m_eDeserialize = DESERIALIZE_HEADER;
42  l_GatewayFrameData->m_BytesRemaining = 4; // Next: read length field and serial port number
43  return l_GatewayFrameData;
44  }
45 
46  // Getter
47  uint16_t GetSerialPortNbr() const {
48  assert(m_eDeserialize == DESERIALIZE_FULL);
49  return m_SerialPortNbr;
50  }
51 
52  const std::vector<unsigned char>& GetPayload() const {
53  assert(m_eDeserialize == DESERIALIZE_FULL);
54  return m_Buffer;
55  }
56 
57 private:
58  // Private CTOR
59  GatewayFrameData(): m_SerialPortNbr(0), m_eDeserialize(DESERIALIZE_FULL) {
60  }
61 
62  // Internal helpers
63  E_GATEWAY_FRAME GetGatewayFrameType() const { return GATEWAY_FRAME_DATA; }
64 
65  // Serializer
66  const std::vector<unsigned char> Serialize() const {
67  assert(m_eDeserialize == DESERIALIZE_FULL);
68  std::vector<unsigned char> l_Buffer;
69 
70  // Prepare length field, serial port number, and payload
71  uint16_t l_NbrOfBytes = (2 + m_Buffer.size());
72  l_Buffer.emplace_back((l_NbrOfBytes >> 8) & 0xFF);
73  l_Buffer.emplace_back((l_NbrOfBytes >> 0) & 0xFF);
74  l_Buffer.emplace_back((m_SerialPortNbr >> 8) & 0xFF);
75  l_Buffer.emplace_back((m_SerialPortNbr >> 0) & 0xFF);
76  l_Buffer.insert(l_Buffer.end(), m_Buffer.begin(), m_Buffer.end());
77  return l_Buffer;
78  }
79 
80  // Deserializer
81  bool Deserialize() {
82  // All requested bytes are available
83  switch (m_eDeserialize) {
84  case DESERIALIZE_HEADER: {
85  // Deserialize the header
86  assert(m_Buffer.size() == 4);
87  m_BytesRemaining = ntohs(*(reinterpret_cast<const uint16_t*>(&m_Buffer[0])));
88  m_SerialPortNbr = ntohs(*(reinterpret_cast<const uint16_t*>(&m_Buffer[2])));
89  m_Buffer.clear();
90 
91  // Check length of payload
92  if (m_BytesRemaining < 2) {
93  // Error!
94  m_eDeserialize = DESERIALIZE_ERROR;
95  return false;
96  } else {
97  m_eDeserialize = DESERIALIZE_DATA;
98  m_BytesRemaining -= 2;
99  if (m_BytesRemaining == 0) {
100  // An empty data frame?!... Ok...
101  m_eDeserialize = DESERIALIZE_FULL;
102  } // if
103  } // else
104 
105  break;
106  }
107  case DESERIALIZE_DATA: {
108  // Read of payload completed
109  m_eDeserialize = DESERIALIZE_FULL;
110  break;
111  }
112  case DESERIALIZE_ERROR:
113  case DESERIALIZE_FULL:
114  default:
115  assert(false);
116  } // switch
117 
118  // No error
119  return true;
120  }
121 
122  // Members
123  uint16_t m_SerialPortNbr;
124  typedef enum {
125  DESERIALIZE_ERROR = 0,
126  DESERIALIZE_HEADER = 1,
127  DESERIALIZE_DATA = 2,
128  DESERIALIZE_FULL = 3
129  } E_DESERIALIZE;
130  E_DESERIALIZE m_eDeserialize;
131 };
132 
133 #endif // GATEWAY_FRAME_DATA_H
static GatewayFrameData Create(uint16_t a_SerialPortNbr, const std::vector< unsigned char > &a_Payload)
uint16_t GetSerialPortNbr() const
static std::shared_ptr< GatewayFrameData > CreateDeserializedFrame()
const std::vector< unsigned char > & GetPayload() const
std::vector< unsigned char > m_Buffer
The buffer containing partly received frames or higher-layer payload.
Definition: Frame.h:154
E_GATEWAY_FRAME
Definition: GatewayFrame.h:29
size_t m_BytesRemaining
The amount of bytes required to finalize frame assembly during reception.
Definition: Frame.h:155