HDLC-Daemon
HdlcdPacketData.h
Go to the documentation of this file.
1 
37 #ifndef HDLCD_PACKET_DATA_H
38 #define HDLCD_PACKET_DATA_H
39 
40 #include "HdlcdPacket.h"
41 #include <memory>
42 
44 public:
45  static HdlcdPacketData CreatePacket(const std::vector<unsigned char> a_Payload, bool a_bReliable, bool a_bInvalid = false, bool a_bWasSent = false) {
46  // Called for transmission
47  HdlcdPacketData l_PacketData;
48  l_PacketData.m_Buffer = std::move(a_Payload);
49  l_PacketData.m_bReliable = a_bReliable;
50  l_PacketData.m_bInvalid = a_bInvalid;
51  l_PacketData.m_bWasSent = a_bWasSent;
52  return l_PacketData;
53  }
54 
55  static std::shared_ptr<HdlcdPacketData> CreateDeserializedPacket() {
56  // Called on reception: evaluate type field
57  auto l_PacketData(std::shared_ptr<HdlcdPacketData>(new HdlcdPacketData));
58  l_PacketData->m_eDeserialize = DESERIALIZE_HEADER; // Next: read header including the packet type byte
59  l_PacketData->m_BytesRemaining = 3;
60  return l_PacketData;
61  }
62 
63  const std::vector<unsigned char>& GetData() const {
64  assert(m_eDeserialize == DESERIALIZE_FULL);
65  return m_Buffer;
66  }
67 
68  bool GetReliable() const {
69  assert(m_eDeserialize == DESERIALIZE_FULL);
70  return m_bReliable;
71  }
72 
73  bool GetInvalid() const {
74  assert(m_eDeserialize == DESERIALIZE_FULL);
75  return m_bInvalid;
76  }
77 
78  bool GetWasSent() const {
79  assert(m_eDeserialize == DESERIALIZE_FULL);
80  return m_bWasSent;
81  }
82 
83 private:
84  // Private CTOR
85  HdlcdPacketData(): m_bReliable(false), m_bInvalid(false), m_bWasSent(false), m_eDeserialize(DESERIALIZE_FULL) {
86  }
87 
88  // Internal helpers
89  E_HDLCD_PACKET GetHdlcdPacketType() const { return HDLCD_PACKET_DATA; }
90 
91  // Serializer
92  const std::vector<unsigned char> Serialize() const {
93  assert(m_eDeserialize == DESERIALIZE_FULL);
94  std::vector<unsigned char> l_Buffer;
95 
96  // Prepare type field
97  unsigned char l_Type = 0x00;
98  if (m_bReliable) { l_Type |= 0x04; }
99  if (m_bInvalid) { l_Type |= 0x02; }
100  if (m_bWasSent) { l_Type |= 0x01; }
101  l_Buffer.emplace_back(l_Type);
102 
103  // Prepare length field
104  l_Buffer.emplace_back((m_Buffer.size() >> 8) & 0xFF);
105  l_Buffer.emplace_back((m_Buffer.size() >> 0) & 0xFF);
106 
107  // Add payload
108  l_Buffer.insert(l_Buffer.end(), m_Buffer.begin(), m_Buffer.end());
109  return l_Buffer;
110  }
111 
112  // Deserializer
113  bool Deserialize() {
114  // All requested bytes are available
115  switch (m_eDeserialize) {
116  case DESERIALIZE_HEADER: {
117  // Deserialize the length field
118  assert(m_Buffer.size() == 3);
119 
120  // Deserialize the control byte
121  const unsigned char &l_Control = m_Buffer[0];
122  if (l_Control & 0x08) {
123  // The reserved bit was set... abort
124  m_eDeserialize = DESERIALIZE_ERROR;
125  return false;
126  } // if
127 
128  m_bReliable = (l_Control & 0x04);
129  m_bInvalid = (l_Control & 0x02);
130  m_bWasSent = (l_Control & 0x01);
131 
132  // Parse length field
133  m_BytesRemaining = ntohs(*(reinterpret_cast<const uint16_t*>(&m_Buffer[1])));
134  m_Buffer.clear();
135  if (m_BytesRemaining) {
136  m_eDeserialize = DESERIALIZE_BODY;
137  } else {
138  // An empty data packet... may happen
139  m_eDeserialize = DESERIALIZE_FULL;
140  } // else
141 
142  break;
143  }
144  case DESERIALIZE_BODY: {
145  // Read of payload completed
146  m_eDeserialize = DESERIALIZE_FULL;
147  break;
148  }
149  case DESERIALIZE_ERROR:
150  case DESERIALIZE_FULL:
151  default:
152  assert(false);
153  } // switch
154 
155  // No error
156  return true;
157  }
158 
159  // Members
160  bool m_bReliable;
161  bool m_bInvalid;
162  bool m_bWasSent;
163  typedef enum {
164  DESERIALIZE_ERROR = 0,
165  DESERIALIZE_HEADER = 1,
166  DESERIALIZE_BODY = 2,
167  DESERIALIZE_FULL = 3
168  } E_DESERIALIZE;
169  E_DESERIALIZE m_eDeserialize;
170 };
171 
172 #endif // HDLCD_PACKET_DATA_H
Class HdlcdPacket.
Definition: HdlcdPacket.h:64
E_HDLCD_PACKET
The enum E_HDLCD_PACKET to specify all possible HDLCd packet types.
Definition: HdlcdPacket.h:50
static HdlcdPacketData CreatePacket(const std::vector< unsigned char > a_Payload, bool a_bReliable, bool a_bInvalid=false, bool a_bWasSent=false)
bool GetReliable() const
static std::shared_ptr< HdlcdPacketData > CreateDeserializedPacket()
This file contains the header declaration of class HdlcdPacket.
const std::vector< unsigned char > & GetData() const
bool GetInvalid() const
A data packet of the HDLCd access protocol.
Definition: HdlcdPacket.h:51
std::vector< unsigned char > m_Buffer
The buffer containing partly received frames or higher-layer payload.
Definition: Frame.h:154
bool GetWasSent() const
size_t m_BytesRemaining
The amount of bytes required to finalize frame assembly during reception.
Definition: Frame.h:155