embkernel
 All Classes Functions Variables Typedefs Groups Pages
LibPktHandler.cpp
1 //------------------------------------------------------------------------------
2 //This file is part of embKernel.
3 //See license.txt for the full license governing this code.
4 //------------------------------------------------------------------------------
5 
6 #include "LibPktHandler.hpp"
7 #include <stdlib.h>
8 
9 LibPktHandler::LibPktHandler() {
10  mCurrentPkt = 0;
11  mCurrentPosition = 0;
12  mIsError = false;
13 }
14 
15 LibPktHandler::RESULT LibPktHandler::recvPkt(LibStreamIn& stream, PKT** pkt, Rtos::TICK timeout) {
16  *pkt = 0;
17 
18  while (true) {
19  if (mCurrentPosition == 0) {
20  uint8_t value;
21  if (stream.read(&value, 1, timeout) > 0) {
22  mCmd = value;
23  mCurrentPosition = 1;
24  }
25  else {
26  return RES_TIMEOUT;
27  }
28  }
29  else if (mCurrentPosition == 1) {
30  uint8_t value;
31  if (stream.read(&value, 1, timeout) > 0) {
32  mCmd += ((uint16_t) value) << 8;
33  mCurrentPosition = 2;
34  }
35  else {
36  return RES_TIMEOUT;
37  }
38  }
39  else if (mCurrentPosition == 2) {
40  uint8_t value;
41  if (stream.read(&value, 1, timeout) > 0) {
42  mDataLen = value;
43  mCurrentPosition = 3;
44  }
45  else {
46  return RES_TIMEOUT;
47  }
48  }
49  else if (mCurrentPosition == 3) {
50  uint8_t value;
51  if (stream.read(&value, 1, timeout) > 0) {
52  mDataLen += ((uint16_t) value) << 8;
53  mCurrentPkt = (PKT*) malloc(mDataLen + 4);
54  if (mCurrentPkt) {
55  mCurrentPkt->hdr.cmd = mCmd;
56  mCurrentPkt->hdr.dataLen = mDataLen;
57 
58  }
59  mCurrentPosition = 4;
60  }
61  else {
62  return RES_TIMEOUT;
63  }
64  }
65  else if (mCurrentPosition > 3) {
66  if (mDataLen <= 0) {
67  if (mCurrentPkt) {
68  *pkt = mCurrentPkt;
69  mCurrentPkt = 0;
70  mCurrentPosition = 0;
71  return RES_SUCCESS;
72  }
73  else {
74  return RES_PKT_DROPPED;
75  }
76  }
77  int read;
78  if (mCurrentPkt) {
79  read = stream.read(&mCurrentPkt->data[mCurrentPosition - 4], mDataLen, timeout);
80  }
81  else {
82  read = stream.skip(mDataLen, timeout);
83  }
84  if (read <= 0) {
85  return RES_TIMEOUT;
86  }
87  mCurrentPosition += read;
88  mDataLen -= read;
89  }
90  }
91 }
92 
93 void LibPktHandler::freePkt(PKT** pkt) {
94  if (*pkt != 0) {
95  free(*pkt);
96  }
97 }
98 
99 LibPktHandler::RESULT LibPktHandler::sendPkt(LibStreamOut& stream, uint16_t cmd, uint16_t dataLen, const void* data, Rtos::TICK timeout) {
100  PKT_HDR hdr = {
101  cmd, dataLen };
102 
103  int written = stream.write(&hdr, 4, timeout);
104  if (written != 4) {
105  return RES_TIMEOUT;
106  }
107  written = stream.write(data, dataLen, timeout);
108  if (written != dataLen) {
109  return RES_TIMEOUT;
110  }
111  return RES_SUCCESS;
112 }
113 
114 void LibPktHandler::reset() {
115  mCurrentPosition = 0;
116  freePkt(&mCurrentPkt);
117  mIsError = false;
118 }
119