/firmware/nRF51_SDK_10.0.0/examples/ble_peripheral/iky_sswitch_3btn/lib/protocol.c

https://bitbucket.org/dvhai08/android-tdx · C · 206 lines · 176 code · 28 blank · 2 comment · 32 complexity · 82e25f8ad05e6167fa15cdaa7edb1047 MD5 · raw file

  1. #include <stdint.h>
  2. #include "fcs.h"
  3. #include "protocol.h"
  4. #define PROTO_BUFFER_SIZE 128
  5. #define PROTO_Info(...) //PrintfDebug(__VA_ARGS__)
  6. uint8_t PROTO_InitParser(PROTO_PARSER *parser, PROTO_PARSE_CALLBACK *completeCallback, uint8_t *buf, uint16_t bufSize)
  7. {
  8. parser->buf = buf;
  9. parser->bufSize = bufSize;
  10. parser->dataLen = 0;
  11. parser->callback = completeCallback;
  12. parser->isEsc = 0;
  13. return 0;
  14. }
  15. uint8_t PROTO_ParseByte(PROTO_PARSER *parser, uint8_t value)
  16. {
  17. uint16_t fcs;
  18. uint16_t rxFcs;
  19. switch(value){
  20. case 0x7D:
  21. parser->isEsc = 1;
  22. break;
  23. case 0x7E:
  24. parser->dataLen = 0;
  25. parser->isEsc = 0;
  26. break;
  27. case 0x7F:
  28. if(parser->dataLen >= 4)
  29. {
  30. fcs = FCS_Get(parser->buf, parser->dataLen - 2);
  31. rxFcs = ((uint16_t)parser->buf[parser->dataLen-1]<<8) | parser->buf[parser->dataLen-2];
  32. parser->dataLen -= 2;
  33. if(fcs == rxFcs)
  34. {
  35. if(parser->callback != NULL)
  36. parser->callback(parser);
  37. parser->dataLen = 0;
  38. parser->isEsc = 0;
  39. return 1;
  40. }
  41. }
  42. parser->dataLen = 0;
  43. parser->isEsc = 0;
  44. break;
  45. default:
  46. if(parser->isEsc){
  47. parser->buf[parser->dataLen++] = value ^ 0x20;
  48. parser->isEsc = 0;
  49. }else
  50. parser->buf[parser->dataLen++] = value;
  51. if(parser->dataLen >= parser->bufSize)
  52. {
  53. parser->dataLen = 0;
  54. parser->isEsc = 0;
  55. return 0;
  56. }
  57. break;
  58. }
  59. return 0;
  60. }
  61. uint8_t PROTO_ParseByteUnFcs(PROTO_PARSER *parser, uint8_t value)
  62. {
  63. switch(value){
  64. case 0x7D:
  65. parser->isEsc = 1;
  66. break;
  67. case 0x7E:
  68. parser->dataLen = 0;
  69. parser->isEsc = 0;
  70. break;
  71. case 0x7F:
  72. if(parser->dataLen >= 2)
  73. {
  74. if(parser->callback != NULL)
  75. parser->callback(parser);
  76. parser->dataLen = 0;
  77. parser->isEsc = 0;
  78. return 1;
  79. }
  80. parser->dataLen = 0;
  81. parser->isEsc = 0;
  82. break;
  83. default:
  84. if(parser->isEsc){
  85. parser->buf[parser->dataLen++] = value ^ 0x20;
  86. parser->isEsc = 0;
  87. }else
  88. parser->buf[parser->dataLen++] = value;
  89. if(parser->dataLen >= parser->bufSize)
  90. {
  91. parser->dataLen = 0;
  92. parser->isEsc = 0;
  93. return 0;
  94. }
  95. break;
  96. }
  97. return 0;
  98. }
  99. uint8_t PROTO_Parse(PROTO_PARSER *parser, uint8_t *value, uint16_t len)
  100. {
  101. while(len--)
  102. PROTO_ParseByte(parser, *value++);
  103. return 0;
  104. }
  105. uint16_t PROTO_Add(uint8_t *buf,uint8_t *packet, uint16_t bufSize,uint16_t len)
  106. {
  107. uint16_t i = 2,fcs;
  108. uint8_t c;
  109. if(bufSize < 1) return 0;
  110. // perform CRC16 checksum on the packet
  111. fcs = FCS_Get((uint8_t *)packet, len);
  112. len += 2;
  113. *buf++ = 0x7E;
  114. bufSize --;
  115. while(len--)
  116. {
  117. if(len == 1)
  118. c = fcs & 0xFF;
  119. else if(len == 0)
  120. c = (fcs >> 8) & 0xFF;
  121. else
  122. {
  123. c = *packet;
  124. packet++;
  125. }
  126. switch(c)
  127. {
  128. case 0x7D:
  129. case 0x7E:
  130. case 0x7F:
  131. if(bufSize < 2) return 0;
  132. *buf++ = 0x7D;
  133. *buf++ = c ^ 0x20;
  134. i += 2;
  135. bufSize -= 2;
  136. break;
  137. default:
  138. if(bufSize < 1) return 0;
  139. *buf++ = c;
  140. i ++;
  141. bufSize --;
  142. break;
  143. }
  144. }
  145. if(bufSize < 1) return 0;
  146. *buf++ = 0x7F;
  147. return i;
  148. }
  149. uint16_t PROTO_AddUnFcs(uint8_t *buf, uint8_t *packet, uint16_t bufSize,uint16_t packetLen)
  150. {
  151. uint16_t i = 2;
  152. if(bufSize < 1) return 0;
  153. // perform CRC16 checksum on the packet
  154. *buf++ = 0x7E;
  155. bufSize --;
  156. while(packetLen--){
  157. switch(*packet){
  158. case 0x7D:
  159. case 0x7E:
  160. case 0x7F:
  161. if(bufSize < 2) return 0;
  162. *buf++ = 0x7D;
  163. *buf++ = *packet++ ^ 0x20;
  164. i += 2;
  165. bufSize -= 2;
  166. break;
  167. default:
  168. if(bufSize < 1) return 0;
  169. *buf++ = *packet++;
  170. i ++;
  171. bufSize --;
  172. break;
  173. }
  174. }
  175. if(bufSize < 1) return 0;
  176. *buf++ = 0x7F;
  177. return i;
  178. }