HDLC-Daemon
HdlcdPacketCtrl.h
Go to the documentation of this file.
1 
37 #ifndef HDLCD_PACKET_CTRL_H
38 #define HDLCD_PACKET_CTRL_H
39 
40 #include "HdlcdPacket.h"
41 #include <memory>
42 
44 public:
45  // Types of control packets
46  typedef enum {
52  } E_CTRL_TYPE;
53 
54  static std::shared_ptr<HdlcdPacketCtrl> CreateDeserializedPacket() {
55  // Called on reception: evaluate type field
56  auto l_PacketCtrl(std::shared_ptr<HdlcdPacketCtrl>(new HdlcdPacketCtrl));
57  l_PacketCtrl->m_eDeserialize = DESERIALIZE_BODY; // Next: read body including the packet type byte
58  l_PacketCtrl->m_BytesRemaining = 2;
59  return l_PacketCtrl;
60  }
61 
62  //
63  static HdlcdPacketCtrl CreatePortStatusRequest(bool a_bLockSerialPort) {
64  HdlcdPacketCtrl l_PacketCtrl;
65  l_PacketCtrl.m_eCtrlType = CTRL_TYPE_PORT_STATUS;
66  l_PacketCtrl.m_bLockSerialPort = a_bLockSerialPort;
67  return l_PacketCtrl;
68  }
69 
70  static HdlcdPacketCtrl CreatePortStatusResponse(bool a_bIsAlive, bool a_bIsLockedByOthers, bool a_bIsLockedBySelf) {
71  HdlcdPacketCtrl l_PacketCtrl;
72  l_PacketCtrl.m_eCtrlType = CTRL_TYPE_PORT_STATUS;
73  l_PacketCtrl.m_bAlive = a_bIsAlive;
74  l_PacketCtrl.m_bLockedByOthers = a_bIsLockedByOthers;
75  l_PacketCtrl.m_bLockedBySelf = a_bIsLockedBySelf;
76  return l_PacketCtrl;
77  }
78 
80  HdlcdPacketCtrl l_PacketCtrl;
81  l_PacketCtrl.m_eCtrlType = CTRL_TYPE_ECHO;
82  return l_PacketCtrl;
83  }
84 
86  HdlcdPacketCtrl l_PacketCtrl;
87  l_PacketCtrl.m_eCtrlType = CTRL_TYPE_KEEP_ALIVE;
88  return l_PacketCtrl;
89  }
90 
92  HdlcdPacketCtrl l_PacketCtrl;
93  l_PacketCtrl.m_eCtrlType = CTRL_TYPE_PORT_KILL;
94  return l_PacketCtrl;
95  }
96 
97  // Getters
99  assert(m_eDeserialize == DESERIALIZE_FULL);
100  return m_eCtrlType;
101  }
102 
103  bool GetIsAlive() const {
104  assert(m_eCtrlType == CTRL_TYPE_PORT_STATUS);
105  assert(m_eDeserialize == DESERIALIZE_FULL);
106  return m_bAlive;
107  }
108 
109  bool GetIsLockedByOthers() const {
110  assert(m_eCtrlType == CTRL_TYPE_PORT_STATUS);
111  assert(m_eDeserialize == DESERIALIZE_FULL);
112  return m_bLockedByOthers;
113  }
114 
115  bool GetIsLockedBySelf() const {
116  assert(m_eCtrlType == CTRL_TYPE_PORT_STATUS);
117  assert(m_eDeserialize == DESERIALIZE_FULL);
118  return m_bLockedBySelf;
119  }
120 
121  bool GetDesiredLockState() const {
122  assert(m_eCtrlType == CTRL_TYPE_PORT_STATUS);
123  assert(m_eDeserialize == DESERIALIZE_FULL);
124  return m_bLockSerialPort;
125  }
126 
127 private:
128  // Private CTOR
129  HdlcdPacketCtrl(): m_bAlive(false), m_bLockedByOthers(false), m_bLockedBySelf(false), m_bLockSerialPort(false),
130  m_eCtrlType(CTRL_TYPE_UNSET), m_eDeserialize(DESERIALIZE_FULL) {
131  }
132 
133  // Internal helpers
134  E_HDLCD_PACKET GetHdlcdPacketType() const { return HDLCD_PACKET_CTRL; }
135 
136  // Serializer
137  const std::vector<unsigned char> Serialize() const {
138  assert(m_eDeserialize == DESERIALIZE_FULL);
139  std::vector<unsigned char> l_Buffer;
140  l_Buffer.emplace_back(0x10);
141 
142  // Prepare control field
143  unsigned char l_Control = 0x00;
144  switch (m_eCtrlType) {
146  l_Control = 0x00;
147  if (m_bAlive) { l_Control |= 0x04; }
148  if (m_bLockedByOthers) { l_Control |= 0x02; }
149  if (m_bLockedBySelf) { l_Control |= 0x01; }
150  if (m_bLockSerialPort) { l_Control |= 0x01; } // for requests
151  break;
152  case CTRL_TYPE_ECHO:
153  l_Control = 0x10;
154  break;
156  l_Control = 0x20;
157  break;
158  case CTRL_TYPE_PORT_KILL:
159  l_Control = 0x30;
160  break;
161  default:
162  assert(false);
163  } // switch
164 
165  l_Buffer.emplace_back(l_Control);
166  return l_Buffer;
167  }
168 
169  // Deserializer
170  bool Deserialize() {
171  // All requested bytes are available
172  switch (m_eDeserialize) {
173  case DESERIALIZE_BODY: {
174  // Deserialize the control byte
175  assert(m_Buffer.size() == 2);
176  if (m_Buffer[0] != HDLCD_PACKET_CTRL) {
177  // Wrong control field
178  m_eDeserialize = DESERIALIZE_ERROR;
179  return false;
180  } // if
181 
182  const unsigned char &l_Control = m_Buffer[1];
183  m_Buffer.clear();
184  switch (l_Control & 0xF0) {
185  case 0x00: {
186  m_eCtrlType = CTRL_TYPE_PORT_STATUS;
187  // For both requests and responses
188  if (l_Control & 0x08) {
189  // The reserved bit was set... abort
190  m_eDeserialize = DESERIALIZE_ERROR;
191  return false;
192  } // if
193 
194  m_bAlive = (l_Control & 0x04);
195  m_bLockedByOthers = (l_Control & 0x02);
196  m_bLockedBySelf = (l_Control & 0x01);
197  m_bLockSerialPort = (l_Control & 0x01); // for requests
198  break;
199  }
200  case 0x10: {
201  m_eCtrlType = CTRL_TYPE_ECHO;
202  break;
203  }
204  case 0x20: {
205  m_eCtrlType = CTRL_TYPE_KEEP_ALIVE;
206  break;
207  }
208  case 0x30: {
209  m_eCtrlType = CTRL_TYPE_PORT_KILL;
210  break;
211  }
212  default:
213  m_eDeserialize = DESERIALIZE_ERROR;
214  return false;
215  } // switch
216 
217  // Read of control packet completed
218  m_eDeserialize = DESERIALIZE_FULL;
219  break;
220  }
221  case DESERIALIZE_ERROR:
222  case DESERIALIZE_FULL:
223  default:
224  assert(false);
225  } // switch
226 
227  // No error
228  return true;
229  }
230 
231  // Members
232  bool m_bAlive;
233  bool m_bLockedByOthers;
234  bool m_bLockedBySelf;
235  bool m_bLockSerialPort;
236 
237  E_CTRL_TYPE m_eCtrlType;
238  typedef enum {
239  DESERIALIZE_ERROR = 0,
240  DESERIALIZE_BODY = 1,
241  DESERIALIZE_FULL = 2
242  } E_DESERIALIZE;
243  E_DESERIALIZE m_eDeserialize;
244 };
245 
246 #endif // HDLCD_PACKET_CTRL_H
bool GetIsAlive() const
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
This file contains the header declaration of class HdlcdPacket.
static HdlcdPacketCtrl CreateEchoRequest()
static HdlcdPacketCtrl CreatePortKillRequest()
A control packet of the HDLCd access protocol.
Definition: HdlcdPacket.h:52
static HdlcdPacketCtrl CreatePortStatusRequest(bool a_bLockSerialPort)
static std::shared_ptr< HdlcdPacketCtrl > CreateDeserializedPacket()
bool GetDesiredLockState() const
static HdlcdPacketCtrl CreatePortStatusResponse(bool a_bIsAlive, bool a_bIsLockedByOthers, bool a_bIsLockedBySelf)
std::vector< unsigned char > m_Buffer
The buffer containing partly received frames or higher-layer payload.
Definition: Frame.h:154
E_CTRL_TYPE GetPacketType() const
static HdlcdPacketCtrl CreateKeepAliveRequest()
bool GetIsLockedBySelf() const
bool GetIsLockedByOthers() const