一天写了个Carlife 协议数据分流器

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. typedef unsigned char uint8_t;
  5. typedef unsigned int uint32_t;
  6.  
  7. void print_array_data(uint8_t* data, size_t len)
  8. {
  9. int i;
  10. char log_buffer[];
  11. strcpy(log_buffer," ");
  12. for(i=;i<len;i++)
  13. {
  14. char num_buffer[];
  15. sprintf(num_buffer,"%02x ",data[i]);
  16. strncat(log_buffer,num_buffer,);
  17. if(strlen(log_buffer) > ) break;
  18. }
  19. printf("%s\n",log_buffer);
  20. }
  21.  
  22. class MsgReceiver
  23. {
  24. public:
  25. void processData(uint8_t channel, uint8_t* buf, size_t size)
  26. {
  27. printf("channel %d, data is ", channel);
  28. print_array_data(buf,size);
  29. }
  30. };
  31.  
  32. class MsgDispatch
  33. {
  34. public:
  35. MsgDispatch(){
  36. itsBufferData = new uint8_t[*];
  37. itsCachedBufferSize = ;
  38. itsMode = eParseHeader;
  39. itsChannel = ;
  40. itsCachedHeaderSize = ;
  41. itsHeaderData = new uint8_t[MSG_HEADER_SIZE];
  42. itsMsgRecv = new MsgReceiver;
  43. }
  44. ~MsgDispatch(){
  45. delete [] itsBufferData;
  46. delete [] itsHeaderData;
  47. delete itsMsgRecv;
  48. }
  49. void dispatch(uint8_t* buf, size_t size)
  50. {
  51. uint32_t curProcessIndex = ;
  52. //printf("dispatch mode = %d, buffer size %lu, buffer data is ",itsMode,size);
  53. //print_array_data(buf,size);
  54. if(itsMode == eParseHeader)
  55. {
  56. if(size >= MSG_HEADER_SIZE) /* we can process header size */
  57. {
  58. if(isValidHeader(buf))
  59. {
  60. uint8_t channel = buf[];
  61. uint32_t dataLen = readBig32(buf + );
  62.  
  63. curProcessIndex += MSG_HEADER_SIZE;
  64. if (curProcessIndex + dataLen <= size)
  65. {
  66. itsMsgRecv -> processData(channel, buf + curProcessIndex, dataLen);
  67. curProcessIndex += dataLen;
  68. }
  69. else /* we need to cache data */
  70. {
  71. cacheData(buf + curProcessIndex, size - curProcessIndex, dataLen, channel);
  72. itsMode = eReadData;
  73. curProcessIndex = size;
  74. }
  75. }
  76. else /* header is not correct, shift one byte */
  77. {
  78. curProcessIndex++;
  79. }
  80. }
  81. else /* process data is less than header size, cache header */
  82. {
  83. memcpy(itsHeaderData,buf,size);
  84. itsCachedHeaderSize = size;
  85. curProcessIndex = size;
  86. itsMode = eReadHeader;
  87. }
  88. }
  89. else if (itsMode == eReadData) /* read data */
  90. {
  91. if(size >= itsNeedReadSize) /* we can read all data from current buf */
  92. {
  93. memcpy(itsBufferData + itsCachedBufferSize, buf, itsNeedReadSize);
  94. itsCachedBufferSize += itsNeedReadSize;
  95. itsMsgRecv -> processData(itsChannel, itsBufferData, itsCachedBufferSize);
  96. itsMode = eParseHeader;
  97. curProcessIndex = itsNeedReadSize;
  98. }
  99. else /* can't read all data from current buffer, put all data to cache buffer */
  100. {
  101. memcpy(itsBufferData + itsCachedBufferSize, buf, size);
  102. itsCachedBufferSize += size;
  103. itsNeedReadSize -= size;
  104. curProcessIndex = size;
  105. }
  106. }
  107. else /* read header */
  108. {
  109. uint8_t needReadHeaderSize = MSG_HEADER_SIZE - itsCachedHeaderSize;
  110. if(needReadHeaderSize < size) /* we can read header from current buffer */
  111. {
  112. memcpy(itsHeaderData+itsCachedHeaderSize,buf,needReadHeaderSize);
  113. if(isValidHeader(itsHeaderData))
  114. {
  115. uint8_t channel = itsHeaderData[];
  116. uint32_t dataLen = readBig32(itsHeaderData+);
  117.  
  118. curProcessIndex = needReadHeaderSize;
  119. if (curProcessIndex + dataLen <= size) /* we read data from current buffer */
  120. {
  121.  
  122. itsMsgRecv -> processData(channel, buf + curProcessIndex, dataLen);
  123. itsMode = eParseHeader;
  124. curProcessIndex += dataLen;
  125. }
  126. else /* we need to cache data */
  127. {
  128. cacheData(buf + curProcessIndex, size - curProcessIndex, dataLen, channel);
  129. curProcessIndex = size;
  130. itsMode = eReadData;
  131. }
  132. }
  133. else /* error header, shift one byte */
  134. {
  135. memcpy(itsHeaderData,itsHeaderData + ,MSG_HEADER_SIZE - );
  136. itsCachedHeaderSize = MSG_HEADER_SIZE - ;
  137. curProcessIndex = needReadHeaderSize;
  138. }
  139. }
  140. else /* can't fill a header size */
  141. {
  142. memcpy(itsHeaderData+itsCachedHeaderSize,buf,size);
  143. itsCachedHeaderSize += size;
  144. curProcessIndex = size;
  145. }
  146. }
  147. if(curProcessIndex < size)
  148. {
  149. this->dispatch(buf+curProcessIndex,size-curProcessIndex);
  150. }
  151. else { } /* data process Done */
  152. }
  153. private:
  154. uint32_t readBig32(uint8_t* ptr)
  155. {
  156. return ( (uint32_t)( \
  157. ( ( (uint32_t)( (uint8_t *)(ptr))[ ] ) << ) | \
  158. ( ( (uint32_t)( (uint8_t *)(ptr))[ ] ) << ) | \
  159. ( ( (uint32_t)( (uint8_t *)(ptr))[ ] ) << ) | \
  160. ( (uint32_t)( (uint8_t *)(ptr))[ ] ) ) );
  161. }
  162.  
  163. bool isValidHeader(uint8_t* buf)
  164. {
  165. return (buf[] == 0x00 && buf[] == 0x00 && buf[] == 0x00 && buf[] < 0x07);
  166. }
  167.  
  168. void cacheData(uint8_t* buf, size_t cachedSize, size_t totalDataLen, uint8_t channel)
  169. {
  170. memcpy(itsBufferData,buf,cachedSize);
  171. itsCachedBufferSize = cachedSize;
  172. itsNeedReadSize = totalDataLen - itsCachedBufferSize;
  173. itsChannel = channel;
  174. }
  175.  
  176. enum {
  177. MSG_HEADER_SIZE = ,
  178. };
  179. enum {
  180. eParseHeader,
  181. eReadHeader,
  182. eReadData,
  183. };
  184. uint8_t itsChannel;
  185. uint8_t* itsBufferData;
  186. size_t itsCachedBufferSize;
  187. size_t itsNeedReadSize;
  188. uint8_t itsMode;
  189.  
  190. uint8_t* itsHeaderData;
  191. uint8_t itsCachedHeaderSize;
  192. MsgReceiver* itsMsgRecv;
  193. };
  194.  
  195. int main()
  196. {
  197. uint8_t muti_msg_buf[] = {0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x04, 0x01,0x02,0x03,0x04, \
  198. 0x00,0x00,0x00,0x02, 0x00,0x00,0x00,0x02, 0x02,0x02,\
  199. 0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x03, 0x05,0x06,0x07};
  200. uint8_t small_msg_buf_1[] = {0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x05, 0x09,0x08,0x07,0x06};
  201. uint8_t small_msg_buf_2[] = {0x05, 0x00,0x00,0x00,0x02, 0x00,0x00,0x00,0x02, 0x01,0x01};
  202. uint8_t small_msg_buf_3[] = {0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x0A, 0x01,0x02,0x03};
  203. uint8_t small_msg_buf_4[] = {0x04,0x05,0x06};
  204. uint8_t small_msg_buf_5[] = {0x07,0x08,0x09,0x0A,0x00};
  205. uint8_t small_msg_buf_6[] = {0x00,0x00,0x04, 0x00,0x00,0x00,0x03, 0x07,0x07,0x07, 0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x03};
  206. uint8_t small_msg_buf_7[] = {0x09,0x09,0x09};
  207. uint8_t error_msg_buf_1[] = {0x01,0x00,0x00,0x00,0x06, 0x00,0x00,0x00,0x01, 0x01,0x02};
  208. uint8_t error_msg_buf_2[] = {0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x02, 0x02,0x03};
  209. uint8_t error_msg_buf_3[] = {0x00,0x00,0x00,0x04, 0x00,0x00,0x00,0x01, 0x04,0x05,0x05};
  210. uint8_t error_msg_buf_4[] = {0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x02, 0x05,0x06};
  211. uint8_t error_msg_buf_5[] = {0x00,0x00,0x00,0x02, 0x00,0x00,0x00,0x01, 0x07,0x06,0x05,0x06,0x08,0x00,0x00,0x00};
  212. uint8_t error_msg_buf_6[] = {0x01, 0x00,0x00,0x00,0x03, 0x08,0x09,0x0A, 0x10,0x11};
  213. uint8_t error_msg_buf_7[] = {0x01, 0x04,0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x04, 0x0B,0x0C,0x0D,0x0E};
  214. uint8_t header_msg_buf_1[] = {0x01,0x00,0x00,0x00,0x06, 0x00,0x00,0x00,0x01, 0x01,0x00};
  215. uint8_t header_msg_buf_2[] = {0x00, 0x00, 0x01, 0x00, 0x00};
  216. uint8_t header_msg_buf_3[] = {0x00, 0x03, 0x01, 0x02, 0x03, 0x01,0x00,0x00,0x00,0x06, 0x00,0x00,0x00,0x01, 0x11};
  217.  
  218. MsgDispatch mds;
  219. printf("test muti\n");
  220. mds.dispatch(muti_msg_buf,sizeof(muti_msg_buf));
  221.  
  222. printf("test small\n");
  223. mds.dispatch(small_msg_buf_1,sizeof(small_msg_buf_1));
  224. mds.dispatch(small_msg_buf_2,sizeof(small_msg_buf_2));
  225. mds.dispatch(small_msg_buf_3,sizeof(small_msg_buf_3));
  226. mds.dispatch(small_msg_buf_4,sizeof(small_msg_buf_4));
  227. mds.dispatch(small_msg_buf_5,sizeof(small_msg_buf_5));
  228. mds.dispatch(small_msg_buf_6,sizeof(small_msg_buf_6));
  229. mds.dispatch(small_msg_buf_7,sizeof(small_msg_buf_7));
  230.  
  231. printf("test error\n");
  232. mds.dispatch(error_msg_buf_1,sizeof(error_msg_buf_1));
  233. mds.dispatch(error_msg_buf_2,sizeof(error_msg_buf_2));
  234. mds.dispatch(error_msg_buf_3,sizeof(error_msg_buf_3));
  235. mds.dispatch(error_msg_buf_4,sizeof(error_msg_buf_4));
  236. mds.dispatch(error_msg_buf_5,sizeof(error_msg_buf_5));
  237. mds.dispatch(error_msg_buf_6,sizeof(error_msg_buf_6));
  238. mds.dispatch(error_msg_buf_7,sizeof(error_msg_buf_7));
  239. printf("test header\n");
  240. mds.dispatch(header_msg_buf_1,sizeof(header_msg_buf_1));
  241. mds.dispatch(header_msg_buf_2,sizeof(header_msg_buf_2));
  242. mds.dispatch(header_msg_buf_3,sizeof(header_msg_buf_3));
  243. return ;
  244. }

输出:

  1. test muti
  2. channel 1, data is 01 02 03 04
  3. channel 2, data is 02 02
  4. channel 1, data is 05 06 07
  5. test small
  6. channel 1, data is 09 08 07 06 05
  7. channel 2, data is 01 01
  8. channel 5, data is 01 02 03 04 05 06 07 08 09 0a
  9. channel 4, data is 07 07 07
  10. channel 5, data is 09 09 09
  11. test error
  12. channel 6, data is 01
  13. channel 5, data is 02 03
  14. channel 4, data is 04
  15. channel 3, data is 05 06
  16. channel 2, data is 07
  17. channel 1, data is 08 09 0a
  18. channel 3, data is 0b 0c 0d 0e
  19. test header
  20. channel 6, data is 01
  21. channel 1, data is 01 02 03
  22. channel 6, data is 11

Msg DisPatch的更多相关文章

  1. 【单页应用之通信机制】view之间应该如何通信

    前言 在单页应用中,view与view之间的通信机制一直是一个重点,因为单页应用的所有操作以及状态管理全部发生在一个页面上 没有很好的组织的话很容易就乱了,就算表面上看起来没有问题,事实上会有各种隐忧 ...

  2. 开源免费跨平台opengl opencv webgl gtk blender, opengl贴图程序

    三维图形的这是opengl的强项,大型3D游戏都会把它作为首选.图像处理,是opencv的锁定的目标,大多都是C的api,也有少部分是C++的,工业图像表现,图像识别,都会考虑opencv的.webg ...

  3. unity 3D + Google Play In-app Billing (IAB)(转) 热度 3

    最近由于工作需要,研究unity如何接入Google Play以实现游戏内购买.目前IAB的实现,prime31做的插件比较好,各平台的IAB均有,但费用相对过高(几乎都是70刀左右,可怜穷小子).在 ...

  4. [译]NeHe教程 - 创建一个OpenGL窗体

    原文: Setting Up An OpenGL Window 欢迎阅读我的OpenGL教程.我是一个热爱OpenGL的普通码农!我第一次听到OpenGL是在3Dfx刚发布他们给Voodoo I显卡的 ...

  5. opengl加载多个3ds模型失败记

    VC6 下载 http://blog.csdn.net/bcbobo21cn/article/details/44200205 opengl环境配置 http://blog.csdn.net/bcbo ...

  6. OPENGL4_变换

    几种变换的几何意义说明 http://blog.csdn.net/onafioo/article/details/22094247 变换的执行顺序问题 正常顺序 1 视图(观察)变换 2 模型变换 3 ...

  7. OPENGL2_基本框架

    一些概念 HDC:设备描述句柄(窗口着色描述表句柄),是WINDOWS的一种数据类型,HDC定义的变量指向一块内存,这块内存用来描述一个设备的相关的内容(设备描述表). HGLRC:OpenGL渲染环 ...

  8. Nehe OpenGL教程第一课-创建一个OpenGL窗口(Win32)

       原文英文地址为:Creating an OpenGL Window (Win32),翻译的chm中文格式文档下载地址为:OpenGL教程电子书(chm格式)中文版,源代码在官网上也可以下载到,每 ...

  9. mosquitto/openssl 在RK3288上的编译以及MQTT客户端的代码示例

    1,依赖库openssl 的交叉编译 (1)配置编译器信息 setarch i386 ./config no-asm shared --cross-compile-prefix=arm-linux-a ...

随机推荐

  1. 面向对象的CSS

    原文 简书原文:https://www.jianshu.com/p/cb5e9f56ddcc 大纲 1.面向对象的CSS(OOCSS)概念 2.面向对象的CSS的作用 3.面向对象的CSS的注意事项 ...

  2. NSArray NSDictionary一些用法

    //从字符串分割到数组- componentsSeparatedByString: NSString *str = [NSString alloc] initWithString:@"a,b ...

  3. 深度学习 Deep Learning UFLDL 最新Tutorial 学习笔记 4:Debugging: Gradient Checking

    1 Gradient Checking 说明 前面我们已经实现了Linear Regression和Logistic Regression.关键在于代价函数Cost Function和其梯度Gradi ...

  4. stm32四种输入

    1.          上拉输入(GPIO_Mode_IPU)   上拉输入就是信号进入芯片后加了一个上拉电阻,再经过施密特触发器转换成0.1信号,读取此时的引脚电平为高电平:   2.       ...

  5. Android系统开发(1)——GCC编译器的编译和安装过程

    GCC编译器介绍 GCC编译器(GNG C Compiler)是GNU项目中符合ANSI C标准的编译系统,能够编译C  C++  Object C等语言编写的程序,同时GCC也是一个交叉编译器,特别 ...

  6. 神奇校车 = topsage

    https://post.smzdm.com/p/6356/ 适合6岁至99岁的小盆友看的<The Magic School Bus> (神奇校车) http://club.topsage ...

  7. java连接MongoDB查询导出为excel表格

    背景 因为项目需求.每一个星期须要统计每一个公众号7天的訪问数,月底就须要统计一个月的訪问数,40多个公众号.每次手动统计都须要花费1个小时,总之是一项无技术耗时耗神的手工活. 于是.想写个程序来统计 ...

  8. SpringMVC+Spring+Mybatis+Mysql项目搭建

    眼下俺在搭建一个自己的个人站点玩玩.一边练习.一边把用到的技术总结一下,日后好复习. 站点框架大致例如以下图所看到的: 眼下仅仅用到了SpringMVC+Spring+Mybatis+Mysql.把它 ...

  9. Zookeeper实战之嵌入式执行Zookeeper集群模式

    非常多使用Zookeeper的情景是须要我们嵌入Zookeeper作为自己的分布式应用系统的一部分来提供分布式服务.此时我们须要通过程序的方式来启动Zookeeper.此时能够通过Zookeeper ...

  10. AngularJS之ng-class指令

    ng-class是AngularJS预设的一个指令,用于动态自定义dom元素的css class name. 在angular中为我们提供了3种方案处理class: 1:scope变量绑定. < ...