Msg DisPatch
一天写了个Carlife 协议数据分流器
- #include <stdio.h>
- #include <string.h>
- typedef unsigned char uint8_t;
- typedef unsigned int uint32_t;
- void print_array_data(uint8_t* data, size_t len)
- {
- int i;
- char log_buffer[];
- strcpy(log_buffer," ");
- for(i=;i<len;i++)
- {
- char num_buffer[];
- sprintf(num_buffer,"%02x ",data[i]);
- strncat(log_buffer,num_buffer,);
- if(strlen(log_buffer) > ) break;
- }
- printf("%s\n",log_buffer);
- }
- class MsgReceiver
- {
- public:
- void processData(uint8_t channel, uint8_t* buf, size_t size)
- {
- printf("channel %d, data is ", channel);
- print_array_data(buf,size);
- }
- };
- class MsgDispatch
- {
- public:
- MsgDispatch(){
- itsBufferData = new uint8_t[*];
- itsCachedBufferSize = ;
- itsMode = eParseHeader;
- itsChannel = ;
- itsCachedHeaderSize = ;
- itsHeaderData = new uint8_t[MSG_HEADER_SIZE];
- itsMsgRecv = new MsgReceiver;
- }
- ~MsgDispatch(){
- delete [] itsBufferData;
- delete [] itsHeaderData;
- delete itsMsgRecv;
- }
- void dispatch(uint8_t* buf, size_t size)
- {
- uint32_t curProcessIndex = ;
- //printf("dispatch mode = %d, buffer size %lu, buffer data is ",itsMode,size);
- //print_array_data(buf,size);
- if(itsMode == eParseHeader)
- {
- if(size >= MSG_HEADER_SIZE) /* we can process header size */
- {
- if(isValidHeader(buf))
- {
- uint8_t channel = buf[];
- uint32_t dataLen = readBig32(buf + );
- curProcessIndex += MSG_HEADER_SIZE;
- if (curProcessIndex + dataLen <= size)
- {
- itsMsgRecv -> processData(channel, buf + curProcessIndex, dataLen);
- curProcessIndex += dataLen;
- }
- else /* we need to cache data */
- {
- cacheData(buf + curProcessIndex, size - curProcessIndex, dataLen, channel);
- itsMode = eReadData;
- curProcessIndex = size;
- }
- }
- else /* header is not correct, shift one byte */
- {
- curProcessIndex++;
- }
- }
- else /* process data is less than header size, cache header */
- {
- memcpy(itsHeaderData,buf,size);
- itsCachedHeaderSize = size;
- curProcessIndex = size;
- itsMode = eReadHeader;
- }
- }
- else if (itsMode == eReadData) /* read data */
- {
- if(size >= itsNeedReadSize) /* we can read all data from current buf */
- {
- memcpy(itsBufferData + itsCachedBufferSize, buf, itsNeedReadSize);
- itsCachedBufferSize += itsNeedReadSize;
- itsMsgRecv -> processData(itsChannel, itsBufferData, itsCachedBufferSize);
- itsMode = eParseHeader;
- curProcessIndex = itsNeedReadSize;
- }
- else /* can't read all data from current buffer, put all data to cache buffer */
- {
- memcpy(itsBufferData + itsCachedBufferSize, buf, size);
- itsCachedBufferSize += size;
- itsNeedReadSize -= size;
- curProcessIndex = size;
- }
- }
- else /* read header */
- {
- uint8_t needReadHeaderSize = MSG_HEADER_SIZE - itsCachedHeaderSize;
- if(needReadHeaderSize < size) /* we can read header from current buffer */
- {
- memcpy(itsHeaderData+itsCachedHeaderSize,buf,needReadHeaderSize);
- if(isValidHeader(itsHeaderData))
- {
- uint8_t channel = itsHeaderData[];
- uint32_t dataLen = readBig32(itsHeaderData+);
- curProcessIndex = needReadHeaderSize;
- if (curProcessIndex + dataLen <= size) /* we read data from current buffer */
- {
- itsMsgRecv -> processData(channel, buf + curProcessIndex, dataLen);
- itsMode = eParseHeader;
- curProcessIndex += dataLen;
- }
- else /* we need to cache data */
- {
- cacheData(buf + curProcessIndex, size - curProcessIndex, dataLen, channel);
- curProcessIndex = size;
- itsMode = eReadData;
- }
- }
- else /* error header, shift one byte */
- {
- memcpy(itsHeaderData,itsHeaderData + ,MSG_HEADER_SIZE - );
- itsCachedHeaderSize = MSG_HEADER_SIZE - ;
- curProcessIndex = needReadHeaderSize;
- }
- }
- else /* can't fill a header size */
- {
- memcpy(itsHeaderData+itsCachedHeaderSize,buf,size);
- itsCachedHeaderSize += size;
- curProcessIndex = size;
- }
- }
- if(curProcessIndex < size)
- {
- this->dispatch(buf+curProcessIndex,size-curProcessIndex);
- }
- else { } /* data process Done */
- }
- private:
- uint32_t readBig32(uint8_t* ptr)
- {
- return ( (uint32_t)( \
- ( ( (uint32_t)( (uint8_t *)(ptr))[ ] ) << ) | \
- ( ( (uint32_t)( (uint8_t *)(ptr))[ ] ) << ) | \
- ( ( (uint32_t)( (uint8_t *)(ptr))[ ] ) << ) | \
- ( (uint32_t)( (uint8_t *)(ptr))[ ] ) ) );
- }
- bool isValidHeader(uint8_t* buf)
- {
- return (buf[] == 0x00 && buf[] == 0x00 && buf[] == 0x00 && buf[] < 0x07);
- }
- void cacheData(uint8_t* buf, size_t cachedSize, size_t totalDataLen, uint8_t channel)
- {
- memcpy(itsBufferData,buf,cachedSize);
- itsCachedBufferSize = cachedSize;
- itsNeedReadSize = totalDataLen - itsCachedBufferSize;
- itsChannel = channel;
- }
- enum {
- MSG_HEADER_SIZE = ,
- };
- enum {
- eParseHeader,
- eReadHeader,
- eReadData,
- };
- uint8_t itsChannel;
- uint8_t* itsBufferData;
- size_t itsCachedBufferSize;
- size_t itsNeedReadSize;
- uint8_t itsMode;
- uint8_t* itsHeaderData;
- uint8_t itsCachedHeaderSize;
- MsgReceiver* itsMsgRecv;
- };
- int main()
- {
- uint8_t muti_msg_buf[] = {0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x04, 0x01,0x02,0x03,0x04, \
- 0x00,0x00,0x00,0x02, 0x00,0x00,0x00,0x02, 0x02,0x02,\
- 0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x03, 0x05,0x06,0x07};
- uint8_t small_msg_buf_1[] = {0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x05, 0x09,0x08,0x07,0x06};
- uint8_t small_msg_buf_2[] = {0x05, 0x00,0x00,0x00,0x02, 0x00,0x00,0x00,0x02, 0x01,0x01};
- uint8_t small_msg_buf_3[] = {0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x0A, 0x01,0x02,0x03};
- uint8_t small_msg_buf_4[] = {0x04,0x05,0x06};
- uint8_t small_msg_buf_5[] = {0x07,0x08,0x09,0x0A,0x00};
- uint8_t small_msg_buf_6[] = {0x00,0x00,0x04, 0x00,0x00,0x00,0x03, 0x07,0x07,0x07, 0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x03};
- uint8_t small_msg_buf_7[] = {0x09,0x09,0x09};
- uint8_t error_msg_buf_1[] = {0x01,0x00,0x00,0x00,0x06, 0x00,0x00,0x00,0x01, 0x01,0x02};
- uint8_t error_msg_buf_2[] = {0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x02, 0x02,0x03};
- uint8_t error_msg_buf_3[] = {0x00,0x00,0x00,0x04, 0x00,0x00,0x00,0x01, 0x04,0x05,0x05};
- uint8_t error_msg_buf_4[] = {0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x02, 0x05,0x06};
- uint8_t error_msg_buf_5[] = {0x00,0x00,0x00,0x02, 0x00,0x00,0x00,0x01, 0x07,0x06,0x05,0x06,0x08,0x00,0x00,0x00};
- uint8_t error_msg_buf_6[] = {0x01, 0x00,0x00,0x00,0x03, 0x08,0x09,0x0A, 0x10,0x11};
- uint8_t error_msg_buf_7[] = {0x01, 0x04,0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x04, 0x0B,0x0C,0x0D,0x0E};
- uint8_t header_msg_buf_1[] = {0x01,0x00,0x00,0x00,0x06, 0x00,0x00,0x00,0x01, 0x01,0x00};
- uint8_t header_msg_buf_2[] = {0x00, 0x00, 0x01, 0x00, 0x00};
- uint8_t header_msg_buf_3[] = {0x00, 0x03, 0x01, 0x02, 0x03, 0x01,0x00,0x00,0x00,0x06, 0x00,0x00,0x00,0x01, 0x11};
- MsgDispatch mds;
- printf("test muti\n");
- mds.dispatch(muti_msg_buf,sizeof(muti_msg_buf));
- printf("test small\n");
- mds.dispatch(small_msg_buf_1,sizeof(small_msg_buf_1));
- mds.dispatch(small_msg_buf_2,sizeof(small_msg_buf_2));
- mds.dispatch(small_msg_buf_3,sizeof(small_msg_buf_3));
- mds.dispatch(small_msg_buf_4,sizeof(small_msg_buf_4));
- mds.dispatch(small_msg_buf_5,sizeof(small_msg_buf_5));
- mds.dispatch(small_msg_buf_6,sizeof(small_msg_buf_6));
- mds.dispatch(small_msg_buf_7,sizeof(small_msg_buf_7));
- printf("test error\n");
- mds.dispatch(error_msg_buf_1,sizeof(error_msg_buf_1));
- mds.dispatch(error_msg_buf_2,sizeof(error_msg_buf_2));
- mds.dispatch(error_msg_buf_3,sizeof(error_msg_buf_3));
- mds.dispatch(error_msg_buf_4,sizeof(error_msg_buf_4));
- mds.dispatch(error_msg_buf_5,sizeof(error_msg_buf_5));
- mds.dispatch(error_msg_buf_6,sizeof(error_msg_buf_6));
- mds.dispatch(error_msg_buf_7,sizeof(error_msg_buf_7));
- printf("test header\n");
- mds.dispatch(header_msg_buf_1,sizeof(header_msg_buf_1));
- mds.dispatch(header_msg_buf_2,sizeof(header_msg_buf_2));
- mds.dispatch(header_msg_buf_3,sizeof(header_msg_buf_3));
- return ;
- }
输出:
- test muti
- channel 1, data is 01 02 03 04
- channel 2, data is 02 02
- channel 1, data is 05 06 07
- test small
- channel 1, data is 09 08 07 06 05
- channel 2, data is 01 01
- channel 5, data is 01 02 03 04 05 06 07 08 09 0a
- channel 4, data is 07 07 07
- channel 5, data is 09 09 09
- test error
- channel 6, data is 01
- channel 5, data is 02 03
- channel 4, data is 04
- channel 3, data is 05 06
- channel 2, data is 07
- channel 1, data is 08 09 0a
- channel 3, data is 0b 0c 0d 0e
- test header
- channel 6, data is 01
- channel 1, data is 01 02 03
- channel 6, data is 11
Msg DisPatch的更多相关文章
- 【单页应用之通信机制】view之间应该如何通信
前言 在单页应用中,view与view之间的通信机制一直是一个重点,因为单页应用的所有操作以及状态管理全部发生在一个页面上 没有很好的组织的话很容易就乱了,就算表面上看起来没有问题,事实上会有各种隐忧 ...
- 开源免费跨平台opengl opencv webgl gtk blender, opengl贴图程序
三维图形的这是opengl的强项,大型3D游戏都会把它作为首选.图像处理,是opencv的锁定的目标,大多都是C的api,也有少部分是C++的,工业图像表现,图像识别,都会考虑opencv的.webg ...
- unity 3D + Google Play In-app Billing (IAB)(转) 热度 3
最近由于工作需要,研究unity如何接入Google Play以实现游戏内购买.目前IAB的实现,prime31做的插件比较好,各平台的IAB均有,但费用相对过高(几乎都是70刀左右,可怜穷小子).在 ...
- [译]NeHe教程 - 创建一个OpenGL窗体
原文: Setting Up An OpenGL Window 欢迎阅读我的OpenGL教程.我是一个热爱OpenGL的普通码农!我第一次听到OpenGL是在3Dfx刚发布他们给Voodoo I显卡的 ...
- opengl加载多个3ds模型失败记
VC6 下载 http://blog.csdn.net/bcbobo21cn/article/details/44200205 opengl环境配置 http://blog.csdn.net/bcbo ...
- OPENGL4_变换
几种变换的几何意义说明 http://blog.csdn.net/onafioo/article/details/22094247 变换的执行顺序问题 正常顺序 1 视图(观察)变换 2 模型变换 3 ...
- OPENGL2_基本框架
一些概念 HDC:设备描述句柄(窗口着色描述表句柄),是WINDOWS的一种数据类型,HDC定义的变量指向一块内存,这块内存用来描述一个设备的相关的内容(设备描述表). HGLRC:OpenGL渲染环 ...
- Nehe OpenGL教程第一课-创建一个OpenGL窗口(Win32)
原文英文地址为:Creating an OpenGL Window (Win32),翻译的chm中文格式文档下载地址为:OpenGL教程电子书(chm格式)中文版,源代码在官网上也可以下载到,每 ...
- mosquitto/openssl 在RK3288上的编译以及MQTT客户端的代码示例
1,依赖库openssl 的交叉编译 (1)配置编译器信息 setarch i386 ./config no-asm shared --cross-compile-prefix=arm-linux-a ...
随机推荐
- 面向对象的CSS
原文 简书原文:https://www.jianshu.com/p/cb5e9f56ddcc 大纲 1.面向对象的CSS(OOCSS)概念 2.面向对象的CSS的作用 3.面向对象的CSS的注意事项 ...
- NSArray NSDictionary一些用法
//从字符串分割到数组- componentsSeparatedByString: NSString *str = [NSString alloc] initWithString:@"a,b ...
- 深度学习 Deep Learning UFLDL 最新Tutorial 学习笔记 4:Debugging: Gradient Checking
1 Gradient Checking 说明 前面我们已经实现了Linear Regression和Logistic Regression.关键在于代价函数Cost Function和其梯度Gradi ...
- stm32四种输入
1. 上拉输入(GPIO_Mode_IPU) 上拉输入就是信号进入芯片后加了一个上拉电阻,再经过施密特触发器转换成0.1信号,读取此时的引脚电平为高电平: 2. ...
- Android系统开发(1)——GCC编译器的编译和安装过程
GCC编译器介绍 GCC编译器(GNG C Compiler)是GNU项目中符合ANSI C标准的编译系统,能够编译C C++ Object C等语言编写的程序,同时GCC也是一个交叉编译器,特别 ...
- 神奇校车 = topsage
https://post.smzdm.com/p/6356/ 适合6岁至99岁的小盆友看的<The Magic School Bus> (神奇校车) http://club.topsage ...
- java连接MongoDB查询导出为excel表格
背景 因为项目需求.每一个星期须要统计每一个公众号7天的訪问数,月底就须要统计一个月的訪问数,40多个公众号.每次手动统计都须要花费1个小时,总之是一项无技术耗时耗神的手工活. 于是.想写个程序来统计 ...
- SpringMVC+Spring+Mybatis+Mysql项目搭建
眼下俺在搭建一个自己的个人站点玩玩.一边练习.一边把用到的技术总结一下,日后好复习. 站点框架大致例如以下图所看到的: 眼下仅仅用到了SpringMVC+Spring+Mybatis+Mysql.把它 ...
- Zookeeper实战之嵌入式执行Zookeeper集群模式
非常多使用Zookeeper的情景是须要我们嵌入Zookeeper作为自己的分布式应用系统的一部分来提供分布式服务.此时我们须要通过程序的方式来启动Zookeeper.此时能够通过Zookeeper ...
- AngularJS之ng-class指令
ng-class是AngularJS预设的一个指令,用于动态自定义dom元素的css class name. 在angular中为我们提供了3种方案处理class: 1:scope变量绑定. < ...