#ifndef PROTOCOL_H #define PROTOCOL_H #include "comm.h" // 文件传输控制结构 #define LEN_RSV_BMP MAX_EXDP_LEN // 位图大小 #define MAX_FILE_SIZE (LEN_RSV_BMP*MAX_EXDP_LEN*8) // 最大文件字节数 按位图大小设定 #define PARA_NUM 256 // 传输文件类型 #define FILE_TYPE_DAT 0x00 // 数据文件 #define FILE_TYPE_PGM 0x02 // 升级文件 #define FILE_TYPE_PLOT 0x06 // 喷墨数据 #define MCPARA_MACH 0 // 机器参数 #define MCPARA_WORK 1 // 工作参数 // 传输有效标志定义 #define TRANS_NONE 0x00 // 无效 #define TRANS_ACTIVE 0x5A // 有效 // 传输结果代码定义 #define TRANS_NOT_BEG 0x00 // 没有收到启动命令 #define TRANS_READY 0x01 // 准备好接收 #define TRANS_DOING 0x02 // 正在接收 #define TRANS_DONE 0x03 // 接收完成 #define TRANS_REQUEST 0x04 // 请求传输模式 // 上位机发送命令 #define UCMD_GET_MC_INFO 0x0001 // 读取机器信息 #define UCMD_GET_MC_STATUS 0x0002 // 读取机器状态 #define UCMD_GET_MC_PARAS 0x0003 // 读取机器参数 #define UCMD_GET_TRANS_RESULT 0x0007 // 读取传输结果 #define UCMD_SET_MC_STATUS 0x0102 // 设置机器状态 #define UCMD_SET_MC_PARAS 0x0103 // 设置机器参数 #define UCMD_SET_MEM_DATA 0x0104 // 设置内存数据 #define UCMD_SET_FILE_PARAS 0x0105 // 设置文件参数 #define UCMD_SET_EXEC_PROGRESS 0x0106 // 设置执行进度 #define UCMD_SET_INSTALLMENT 0x0107 // 设置分期密码 #define UCMD_SET_ELAPSED_TIME 0x0108 // 设置经过的时间 #define UCMD_SET_DEF_PARA 0x0109 // 设置默认参数 #define UCMD_SET_FILE_EXDATA 0x010F // 设置文件扩展数据 #define UCMD_ACT_BYHAND 0x0201 // 手动控制命令 #define UCMD_MC_WORK 0x0202 // 机器工作命令 #define UCMD_MOVE_TO 0x0203 // 移动XY到坐标 #define UCMD_MOVE_OFST 0x0205 // XY移动偏移量 #define UCMD_START_TRANS 0x0301 // 启动文件传输 #define UCMD_TRANS_FILE_DATA 0x0302 // 文件传输命令 #define UCMD_SET_FILE_LIST 0x0304 // 设置文件列表 #define UCMD_MC_UPDATE 0x0401 // 下位机升级 // 下位机发送命令 #define DCMD_REQUEST_DAT 0x8000 // 请求文件数据 #define DCMD_SEND_MC_INFO 0x8001 // 发送机器信息 #define DCMD_SEND_MC_STATUS 0x8002 // 发送机器状态 #define DCMD_SEND_MC_PARAS 0x8003 // 发送机器参数 #define DCMD_SEND_FILE_INFO 0x8006 // 发送文件信息 #define DCMD_SEND_TRANS_RESULT 0x8007 // 发送传输结果 #define DCMD_SEND_DEBUG_INFO 0x8010 // 调试信息发送 // 状态码定义如下-设置 #define MC_STA_CLENA_ERR 0x0000 // 清除错误 #define MC_STA_EN_WORK 0x0001 // 允许工作(状态) #define MC_STA_DIS_WORK 0x0002 // 禁止工作(状态) #define MC_STA_EN_TIME 0x0003 // 允许工作(时间) #define MC_STA_DIS_TIME 0x0004 // 禁止工作(时间) #define MC_CLEAN_COUNT 0x0005 // 产量计数清零 #define MC_STA_MANUAL 0x0006 // 手动工作状态 #define MC_STA_AUTO 0x0007 // 自动工作状态 #define MC_FILE_SWITCH 0x0008 // 文件切换 #define MC_INVALID_FILE 0x0009 // 文件失效命令 // 工作控制功能 #define WORK_START 0x0001 // 启动工作 #define WORK_PAUSE 0x0002 // 暂停工作 #pragma pack(1)//设定为1字节对齐 // 喷墨图像按照黑白位图的格式存储 // 将整个喷墨图像位图分割为 (墨盒数量*300) 个像素宽度的块 // 每个块按照一个文件传输 // 数据列表, 描述整个位图 typedef struct { // 0 u32 fileId; // 文件标识 // 1 u32 totalWidth; // 位图宽度,以像素为单位 u32 totalHeight; // 位图高度,以像素为单位 // 3 u32 blkNums; // 分块个数 u32 blkWidth; // 分块位图宽度,以像素为单位 // 5 u32 rev[16-5]; }__attribute__ ((packed)) PlotFileList; // 压缩位图文件头 typedef struct { // 0 u32 fileId; // 整个位图文件标识 u32 blkIdx; // 当前位图块号(位图分块后的编号) u32 datSize; // 本块位图数据区的大小(字节数) u32 biWidth; // 本块位图有效宽度,以像素为单位 u32 biHeight; // 本块位图有效高度,以像素为单位 u32 dataChecksum; // 本块位图数据累加校验和 u32 begPosY; // 本块位图起始位置(像素单位) u32 endPosY; // 本块位图结束位置(像素单位) // 32 u16 compDir; // 本块位图压缩方向, =0, 从上到下; =1, 从下到上;(喷墨方向) u16 compSegWidth; // 分段宽度(0,默认整个宽度,分段宽度必须能被本块位图有效宽度整除) u16 compSegHeight; // 分段高度(0,默认1行的高度) u16 compFillWidth; // 压缩填充位数 u8 compType[4]; // 本块位图压缩类型, =0, 不压缩; =1, 按字节压缩(分段压缩); u32 compSegOffset[4]; // 分段数据起始位置 #if (1) // 60 u8 rev[128-2-60]; // 保留 #else // 保存原图中BMP头文件(算法测试用) // 60 u8 rev[64-60]; // 保留 // 64 u16 identifier; // 类型 一般为 "BM" u32 fileSize; // 文件大小 u32 reserved; // 保留 u32 bitDatOffset; // 位图数据偏移,一般为 0x3E // 78 u32 biSize; // 位图信息头大小, 一般为 0x28 u32 biWidth2; // 位图宽度,以像素为单位 u32 biHeight2; // 位图高度,以像素为单位 u16 biPlanes; // 位图的位面数,必须为1 // 92 u16 biBitPerPixel; // 每个像素的位数, =1, 单色位图; =4, 16色; = 8, 256色; = 24 真彩色 u32 biCompression; // 位图压缩类型, =0, 不压缩(BI_RGB); =1, BI_RLE8; = 2, BI_RLE4; = 3 BI_BITFIELDS; = 4, BI_JPEG; = 5, BI_PNG u32 biBitmapDatSize;// 位图数据区的大小(字节数), 必须是4的整数倍 // 102 u32 biHResolution; // 水平分辨率, 像素/米 u32 biVResolution; // 垂直分辨率, 像素/米 u32 biColors; // 颜色数 u32 biImpColors; // 重要颜色数 // 118 BmpRgbQuad palette[2]; // 调色板 // 126 //u8 rev2[128-2-126]; // 保留 #endif // 126 u16 checkCrc; // 前面字段的CRC校验 }__attribute__ ((packed)) CompBmpHead; // 机器信息结构定义 typedef struct { // 0 char softwareVerStr[32]; // 软件版本 // 32 char rev[1024-32]; } __attribute__ ((packed)) MCInfo; typedef struct { u32 buf[PARA_NUM]; } __attribute__ ((packed)) ParaStruct; // 升级文件头 typedef struct { // 0x00 char fileName[32]; // 文件名称 // 0x20 u32 dataSize; // 数据字节数 u32 dataChecksum; // 数据累加校验和 // 0x28 u8 reserved1[0x30-0x28]; // 保留区1 // 0x30 u8 reserved2[0x64-0x30]; // 保留区1 // 0x64 u8 reserved3[0x80-0x64]; // 保留区2 // 0x80 u8 reserved4[0x100-0x80]; }__attribute__ ((packed)) AppFileHead; typedef struct { int transphase; int filetransing; int waitcount; u8 transActive; // 传输结构有效 u8 transflag; // 接收进度标志 = 0, 接收未开始; = 1, 正在接收; = 2,接收完成。 u8 fileType; // 文件类型 u8 fileIdx; // 为文件编号,最多支持16个文件 u16 fileId; // 文件ID u16 packetSize; // 包的大小 u32 packetNum; // 包的个数 AppFileHead * pAppHead; CompBmpHead * pBmpHead; u8 * pDatBuff; u16 lenBmp; // 位图有效长度 u8 rsvBitmap[LEN_RSV_BMP]; // 文件接收进度标志位图 }FileTransCtrl; // 机器状态数据结构定义 typedef struct { // 0 u32 workStatus; // 工作状态位图 // .0 允许时限。=0,使用时限已到,不允许下位机工作;=1,允许下位机工作; // .1 允许状态。=0,界面钳制,不允许下位机工作;=1,允许下位机工作; // .2 机器状态。=0,手动工作状态; =1,自动工作状态 // .3 钥匙状态。=0,关闭状态; =1,打开状态 // .4 文件接收标志。= 0,初始状态。= 1,收到了文件 // .5 参数接收标志。= 0,初始状态。= 1,收到了参数 // .6 正在忙标志。= 0,空闲(可以接收文件和参数)。= 1,工作中(不会接收文件和参数) // .7 上料状态。=0,手动上料状态; =1,自动上料状态 // .8 参数更新标志。 =1,下位机更新了参数 // .9 模拟工作标志。=1, 处于模拟工作状态 // .10 允许扫描条码状态。=1, 允许 // .11 允许拍照状态。=1, 允许 // .12 正在工作标志 // .13 传感信号扫描中标志 // .14 相机校准模式中标志 // .15 // .16 // .17 // .18 // .19 取模板框状态 // .20 放模板框状态 // .21 匹绣, 0:退出匹绣,主轴归零 1:进入匹绣,扎针,允许移框 // .22 断线检测, 0:退出断线检测状态, 1:进入断线检测状态 // 1 u32 errorCode; // 错误代码 u32 fileIdx; // 文件序号 u32 dataIdx; // 数据索引 u32 runSpeed; // 运动速度 主轴转速 u32 runAction; // 执行动作代码 * u32 runSteps; // 当前执行步骤 * u32 outCounter; // 产量计数 } __attribute__ ((packed)) MCStatus; //OperPacket typedef union { DataPacket packet; struct { u8 sync[DP_SYNC_LEN]; u16 cmdCode; u16 toggle; u8 rev[6]; u16 crc; } __attribute__ ((packed)) getMcInfo; // 读取机器信息 struct { u8 sync[DP_SYNC_LEN]; u16 cmdCode; u16 paraType; u16 paraId; u8 rev[4]; u16 crc; } __attribute__ ((packed)) getMcParas; // UCMD_GET_MC_PARAS 读取机器参数 struct { u8 sync[DP_SYNC_LEN]; u16 cmdCode; u8 fileType; u8 fileIdx; u8 rev[6]; u16 crc; } __attribute__ ((packed)) getFileInfo; // UCMD_GET_FILE_INFO 读取文件信息 struct { u8 sync[DP_SYNC_LEN]; u16 cmdCode; u16 fileId; u8 rev[6]; u16 crc; } __attribute__ ((packed)) getTransResult; // UCMD_GET_TRANS_RESULT 读取传输结果 struct { u8 sync[DP_SYNC_LEN]; u16 cmdCode; u16 upObj; u16 upFileID; u32 checksum; u16 crc; } __attribute__ ((packed)) mcUpdate; // UCMD_MC_UPDATE 系统升级 struct { u8 sync[DP_SYNC_LEN]; u16 cmdCode; u16 staCode; u16 para; u8 rev[4]; u16 crc; } __attribute__ ((packed)) setMcStatus; // UCMD_SET_MC_STATUS 设置机器状态 struct { u8 sync[DP_SYNC_LEN]; u16 cmdCode; u16 exLen; u16 exCrc; u16 paraType; u16 paraId; u16 crc; u8 exData[MAX_EXDP_LEN]; } __attribute__ ((packed)) setParas; // UCMD_SET_MC_PARAS 设置下位机参数 struct { u8 sync[DP_SYNC_LEN]; u16 cmdCode; u16 exLen; u16 exCrc; u8 fileType; u8 fileIdx; u16 fileId; u16 crc; u8 exData[MAX_EXDP_LEN]; } __attribute__ ((packed)) startTrans; // UCMD_START_TRANS 启动文件传输 struct { u8 sync[DP_SYNC_LEN]; u16 cmdCode; u16 exLen; u16 exCrc; u16 pktIdx; u16 fileId; u16 crc; u8 exData[MAX_EXDP_LEN]; } __attribute__ ((packed)) transFileData; // UCMD_TRANS_FILE_DATA 文件数据传输 struct { u8 sync[DP_SYNC_LEN]; u16 cmdCode; u16 exLen; u16 exCrc; u32 fileIdxMap; u16 crc; u8 exData[MAX_EXDP_LEN]; } __attribute__ ((packed)) setFilesList; // 设置文件列表 UCMD_SET_FILE_LIST //---------------------------------- // 下位机发送命令 struct { u8 sync[DP_SYNC_LEN]; u16 cmdCode; u8 fileType; u8 fileIdx; u16 fileId; u32 datBlockIdx; // 数据包索引(每个包1024字节) u16 crc; u8 exData[MAX_EXDP_LEN]; } __attribute__ ((packed)) dRequestDatBlock; // DCMD_REQUEST_DAT 请求文件数据 struct { u8 sync[DP_SYNC_LEN]; u16 cmdCode; u16 exLen; u16 exCrc; u16 toggle; u8 rev[2]; u16 crc; u8 exData[MAX_EXDP_LEN]; } __attribute__ ((packed)) dSendMcInfo; // DCMD_SEND_MC_INFO 发送机器信息 struct { u8 sync[DP_SYNC_LEN]; u16 cmdCode; u16 exLen; u16 exCrc; u16 toggle; u8 rev[2]; u16 crc; u8 exData[MAX_EXDP_LEN]; } __attribute__ ((packed)) dSendMcStatus; // DCMD_SEND_MC_STATUS 发送机器状态 struct { u8 sync[DP_SYNC_LEN]; u16 cmdCode; u16 exLen; u16 exCrc; u16 paraType; u16 paraId; u16 crc; u8 exData[MAX_EXDP_LEN]; } __attribute__ ((packed)) dSendMcParas; // DCMD_SEND_MC_PARAS 发送机器参数 struct { u8 sync[DP_SYNC_LEN]; u16 cmdCode; u16 exLen; u16 exCrc; u8 fileType; u8 fileIdx; u8 rev[2]; u16 crc; u8 exData[MAX_EXDP_LEN]; } __attribute__ ((packed)) dSendFileInfo; // DCMD_SEND_FILE_INFO 发送文件信息 struct { u8 sync[DP_SYNC_LEN]; u16 cmdCode; u16 exLen; u16 exCrc; u16 fileId; u8 active; u8 result; u16 crc; u8 exData[MAX_EXDP_LEN]; } __attribute__ ((packed)) dSendTransResult; // DCMD_SEND_TRANS_RESULT 发送传输结果 struct { u8 sync[DP_SYNC_LEN]; u16 cmdCode; u16 workCode; u32 para1; u16 para2; u16 crc; } __attribute__ ((packed)) mcWork; // UCMD_MC_WORK 机器工作命令 }OperPacket; #endif // PROTOCOL_H