#ifndef __DATADEF_H__
#define	__DATADEF_H__

#include "typedef.h"
#include "config.h"
//-------------------------------------------------------------------------

#define PATTERN_LARGE_NEEDLES 1280000

#pragma pack(1)//设定为1字节对齐

// 绝对位置数据
typedef struct
{
    u8 ctrl;	//控制字节
    u8 attr;	//属性字节
    WORD action;//控制动作
    double ax;	//X位置
    double ay;	//Y位置
    double ar;  //R角度

}__attribute__ ((packed)) DsAbsItem;


// 画图格式数据
typedef struct
{
    u8 ctrl;//控制字节
    u8 attr;//属性字节

    u8 action[2];	//附加动作
    s16 bx, by;//绘制起点
    s16 ex, ey;//绘制终点
    s16 ar;//角度
    u32 rgb;

}__attribute__ ((packed)) DispItem;

// 执行数据定义
typedef struct
{
    u8 ctrl;	// 控制字节
    u8 attr;	// 属性字节
    s16 dx;		// X偏移
    s16 dy;		// Y偏移
    s16 dr;		// R偏移
    u16 len;	// xy分量合成长度
    u8 action[2];	//附加动作

    u8 rev[4];	// 保留

}__attribute__ ((packed)) DataItem, Ds16Item;

// ds8格式
typedef struct
{
    u8 ctrl;	// 控制字节
    u8 attr;	// 属性字节
    s16 dx;		// X偏移
    s16 dy;		// Y偏移
    s16 dr;		// R偏移

}__attribute__ ((packed)) Ds8Item;

// 兼容dsr格式
typedef struct
{
    u8 ctrl;	// 控制字节
    u8 attr;	// 属性字节
    u8 dx;		// X偏移
    u8 dy;		// Y偏移

}__attribute__ ((packed)) DsrItem, Ds4Item;


// 双字节压缩格式
typedef struct
{
    s8 cdx;		// X数据
    s8 cdy;		// Y数据

    /*
    格式定义
    cdx x分量控制数据
    cdy y分量控制数据

    每个字节的最低位为控制位，高7个位为数据位。数据位的最高位是符号位。

    两个控制位合在一起形成4种控制数据，定义如下:
    cdx.0  cdy.0
      0      0      缝纫数据，数据范围从-128 -- +126, 只有偶数可用（精度0.2mm），单位0.1mm
      0      1      空走数据，数据范围从-128 -- +126, 只有偶数可用（精度0.2mm），单位0.1mm
      1      0      大步空走数据，数据范围从-128 -- +126, 只有偶数可用（精度2mm），单位1mm
      1      1      控制数据，数据位定义为控制码和参数 cdx 为控制码, cdx 为参数

*/
}__attribute__ ((packed)) ToBItem, Ds2Item;

#define BEADRADIUS 150    //散珠或亮片半径(用于绘制图形)
#define TOWELRADIUS 200    //毛巾半径(用于绘制图形)

// ctrl 定义
// 控制字节, 作为功能码，定义如下

#define	DATA_NULL		0x00	// 文件结束
#define	DATA_SEWING		0x01	// 缝纫数据, 该数据需要缝纫机针扎一次（主轴可以转动多圈(如果有跳针功能的话)), 同时 X, Y，R 偏移运动dx,dy,dr， 框步进式运动或连续运动
#define	DATA_OFFSET		0x02	// 偏移数据, 该数据只移动 X, Y，R 偏移 dx,dy,dr，连续运动
#define	DATA_CUTTING	0x03	// 切刀数据, 该数据需要切刀先运转，同时 X, Y，R 偏移 dx,dy,dr，根据切刀类型选择动框方式
#define	DATA_LASER		0x04	// 激光数据, 该数据需要激光出光, 同时X, Y，R偏移 dx,dy,dr，框连续运动，激光强度和运动线速度有关系
#define	DATA_DRAWING	0x05	// 记号数据, 该数据需要记号笔先放下来, 同时X, Y，R偏移dx,dy,dr，框连续运动
#define	DATA_SEWING_R	0x06	// 右机头缝纫，该数据需要缝纫机针扎一次（主轴可以转动多圈(如果有跳针功能的话)), 同时 X, Y，R 偏移运动dx,dy,dr， 框步进式运动或连续运动

#define	DATA_SECF_SEW	0x11	// 第二框缝纫
#define	DATA_SECF_OFST	0x12	// 第二框偏移

#define	DATA_SECF_SEW_R	0x16	// 第二框右机头缝纫，该数据需要缝纫机针扎一次（主轴可以转动多圈(如果有跳针功能的话)), 同时 X, Y，R 偏移运动dx,dy,dr， 框步进式运动或连续运动

// 兼容DSR控制码
#define	DATA_SYNCSEW	0x07	// 同步缝纫数据， 该数据需要缝纫机针扎一次, 同时 X, Y，R 偏移运动 dx,dy,dr，X2, Y2 也运动 dx,dy，框步进式运动或连续运动
#define	DATA_PAUSE_OLD	0x08	// 暂停
#define	DATA_ANGLE_OLD	0x09	// 拐点
#define	DATA_CUT_OLD	0x0A	// 剪线
#define	DATA_END_OLD	0x10	// 结束码

#define	DATA_JUMP		0x0B	// 跳针数据，该数据要求缝纫机主轴不动, 但 X, Y，R 偏移运动 dx,dy,dr， 框步进式运动或连续运动
#define	DATA_PUNCH		0x0C	// 冲孔数据, 该数据需要冲孔主轴运转一圈，同时 X, Y，R 偏移 dx,dy,dr，
#define	DATA_EMB		0x0D	// 绣花数据，该数据需要平绣针扎一次, 同时 X, Y，偏移运动dx,dy， 框步进式运动
#define	DATA_CHGND_OLD	0x0E	// 换色功能码                lxs 20220628添加
#define	DATA_SYNCOFST	0x0F	// 同步偏移数据

#define	DATA_MILLING	0x21	// 铣刀数据
#define	DATA_DRILL		0x22	// 钻孔数据
#define	DATA_RKNIFE		0x23	// 圆刀数据, 该数据需要震刀先运转，同时 X, Y，R 偏移 dx,dy,dr，
#define	DATA_SKNIFE		0x24	// 震刀数据, 该数据需要震刀先运转，同时 X, Y，R 偏移 dx,dy,dr，

#define	DATA_CHENILLE	0x41	// 毛巾绣的环式数据
#define	DATA_CHAIN		0x42	// 毛巾绣的链式数据
#define	DATA_TOWELHIGH	0x43	// 毛巾绣的高度数据
#define	DATA_COIL		0x44	// 缠绕数据
#define	DATA_SAWTOOTH	0x45	// 锯齿数据
#define	DATA_RIBBON		0x46	// 盘带数据

#define	DATA_END		0x80	// 结束码
#define	DATA_PAUSE		0x81	// 暂停功能码
#define	DATA_CHGND		0x82	// 绣花换针杆功能码（换色）
#define	DATA_CUTTRD		0x83	// 剪线功能码
#define	DATA_ANGLE		0x89	// 拐点

#define	DATA_OPEN_SEQUIN	0xFE	// 开关亮片功能码(中转数据)
#define	DATA_UNKNOW			0xFF	// 未定义(中转数据)

// atrr, 属性字节，作为运动属性字节
// 缝纫针步的属性定义：
// dx, x向偏移值, 有符号数, 范围为 -32768--32767, 单位为 0.01mm
// dy, y向偏移值, 有符号数, 范围为 -32768--32767, 单位为 0.01mm
// dr, r向偏移值, 有符号数, 范围为 -32768--32767, 单位为 0.0001 弧度
// len, xy 分量的合成长度,无符号数,范围0--65535, 单位为 0.01mm

#define HEAD_NAME_STR_LEN        0x20
#define HEAD_FIX_INFO_LEN           0x32
#define BEADSEQUINTYPE               0x20   //珠片码的种类，31种，第一个为预留

// 数据文件头
typedef struct
{
    // 0x00
    char fileName[32];		// 文件名称
    // 0x20
    u32 dataSize;			// 数据字节数
    u32 itemNums;			// 数据项个数
    u16 bytesPerItem;		// 每项占的字节数
    u16 bytesPerBlk;		// 数据内容划分块大小
    u32 dataChecksum;		// 数据累加校验和
    // 0x30
    u16 checkCrc;			// 前面6个字段的CRC校验，（6个字段分别为：文件名称，字节数，项个数，每项字节数，每块字节数，数据累加和的CRC校验值）
    // 0x32
    u8 begHead;    //以哪种类型的机头定点  之前是u8
    u8 reserved0;
    // 0x34   52
    u32 fileid;				// 文件唯一标识符，识别是否为同一个文件
    // 0x38
    u8	reserved1[0x40-0x38];  // 保留区
    // 0x40   64
    s32 anchorX;			// 定位点坐标X
    s32 anchorY;			// 定位点坐标Y
    // 0x48
    s32 beginX;				// 数据起点坐标X
    s32 beginY;				// 数据起点坐标Y
    s32 beginR;				// 数据起点坐标Z
    // 0x54  //84
    s32 minX;
    s32 maxX;
    s32 minY;
    s32 maxY;				// 轮廓范围

    //用于存储适用于下位机的反复绣设置，需要7个字节
    //0x64
    u8 mcXRepeatNum;//x向反复次数
    //0x65
    s16 mcXRepeatSpace;//x向反复间距
    //0x67
    u8 mcYRepeatNum;//y向反复次数
    //0x68
    s16 mcYRepeatSpace;//y向反复间距
    //0x6A
    u8 mcPriority;//反复优先级

    // 0x6B
    u8 reserved2[0x74-0x6B];        // 保留区
   // 0x74    116
    s32 coloLockrNeedle;  //换色锁针针数
    // 0x78   120
    s32 jumpNeedleChange;               // 跳针变越框锁针针数(用于跳针前后加锁针)
    // 0x7C   124
    s32 minStep; //合并小针步时的针步大小(过滤)
    // 0x80    128
    s32 rotateStyle;    //旋转式样
    //132
    s32 horizontalStyle;    //水平翻转式样
    //136
    s32 verticalStyle;    //垂直翻转式样
    //140
    s32 rotateAngle;    //旋转角度
    //144
    s32 xZoom;          //X向倍率
    //148
    s32 yZoom;          //Y向倍率
    //152
    s32 repeatStyle;    //反复方式
    //156
    s32 priority;       //优先次序
    //160
    s32 xRepeatNum;     //X向反复次数
    //164
    s32 yRepeatNum;     //Y向反复次数
    //168
    s32 xRepeatSpace;   //X向反复间距
    //172
    s32 yRepeatSpace;   //Y向反复间距
    //176
    s32 stepCompensation;  //针步补偿
    //180
    s32 xCompensate;    //X向补偿
    //184
    s32 yCompensate;    //Y向补偿
    //188

    s32 lockNeedlesNum;   //锁针次数
    //192
    s32 lockNeedlesStepNum;    //锁针步数
    //196
    s32 lockNeedlesStepLength;    //锁针针步长度
   //200
    s32 combineMode;    //双头组合模式
   //204
    s32 breakLineParkNum;  //断线停车次数
    //绣花机中需要插入跳针的针步大小，不用计入参数id，
    //因为此值变化数据步数会变，从而改变了fileid
    //208   //0xD0
    u16 convertJumpStepSize;
    //210   //0xD2
    u16 jumpStepSize;
    //212 //0xD4
    u16 pleatedMode;//是否为褶绣模式
    //214 //0xD6
    u8 reserved3[0x118-0xD6];//保留
    //280  0x118
    u32 offsetEn;	// bit0,偏移点X向允许	0,不允许	1,允许
    //                            // bit1,偏移点Y向允许	0,不允许	1,允许
    //                            // bit2,平绣数据有无	0,无	1,有
    //                            // bit3,激光数据有无	0,无	1,有
    //                            // bit4,毛巾链式数据有无	0,无	1,有
    //                            // bit5,缠绕锯齿盘带数据有无	0,无	1,有
    // 284  //0x11C
    s32 offsetX;            // 偏移点X
    // 288 // 0x120
    s32 offsetY;
    //292 0x124
    s32 threeCombineMode;    //三头组合模式
    //296   0x128
    u8 reserved4[0x1E0-0x128];//保留               //原来是0xD0

    //0x1E0
    u8 beadSequinTable[BEADSEQUINTYPE];          // 珠片码与散珠/亮片动作码对应表

    // 0x200
    u8 switchTable[0x400-0x200];      // 色序设定表, 支持512个色序设定

}__attribute__ ((packed)) DataFileHead;//中间数据(fcg)

//ds16头文件
typedef struct
{
    // 0x00
    char fileName[32];		// 文件名称
    // 0x20
    u32 dataSize;			// 数据字节数
    u32 itemNums;			// 数据项个数
    u16 bytesPerItem;		// 每项占的字节数
    u16 bytesPerBlk;		// 数据内容划分块大小
    u32 dataChecksum;		// 数据累加校验和
    // 0x30
    u16 checkCrc;			// 前面6个字段的CRC校验，（6个字段分别为：文件名称，字节数，项个数，每项字节数，每块字节数，数据累加和的CRC校验值）
    // 0x32
    u8 begHead;    //以哪种类型的机头定点  之前是u8
    u8 reserved0;
    // 0x34
    u32 fileid;				// 文件唯一标识符，识别是否为同一个文件

    // 0x38
    u32 jumpNeedleNum;               // 跳针数（绣花机）
    u16 colorNum;                    // 颜色数（绣花机）
    u16 towelHighNum;                    // 毛巾高度数
    // 0x40
    s32 anchorX;			// 定位点坐标X
    s32 anchorY;			// 定位点坐标Y
    // 0x48
    s32 beginX;				// 数据起点坐标X
    s32 beginY;				// 数据起点坐标Y
    s32 beginR;				// 数据起点坐标Z
    // 0x54  //84
    s32 minX;
    s32 maxX;
    s32 minY;
    s32 maxY;				// 轮廓范围
    // 0x64
    u32 sizeX;
    u32 sizeY;				// 裁片大小
    // 0x6C
    s32	anchorX2;			// 定位点坐标X2
    s32	anchorY2;			// 定位点坐标Y2
    s32	beginX2;			// 数据起点坐标X2
    s32	beginY2;			// 数据起点坐标Y2
    s32	beginR2;			// 数据起点坐标Z2
    // 0x80
    u32	runAct;				// 附加动作,
                                       // bit0:	0:完成后不拍照 	1:完成后拍照
    // 132//0X84
    u32 offsetEn;	// bit0,偏移点X向允许	0,不允许	1,允许
    //                            // bit1,偏移点Y向允许	0,不允许	1,允许
    //                            // bit2,平绣数据有无	0,无	1,有
    //                            // bit3,激光数据有无	0,无	1,有
    //                            // bit4,毛巾链式数据有无	0,无	1,有
    //                            // bit5,缠绕锯齿盘带数据有无	0,无	1,有
    //                            // bit6,反复优先级	0,X向优先 1,Y向优先
    // 136  //0x88
    s32 offsetX;            // 偏移点X
    // 140 // 0x8C
    s32 offsetY;
    // 0x90
    u8 xRepeatNums;			// X向反复次数,范围0-99,默认0
    u8 yRepeatNums;			// Y向反复次数
    s32 xRepeatDistance;	// X向反复距离,单位mm,精度0.01,范围-100000-100000,默认0
    s32 yRepeatDistance;	// Y向反复距离

    // 0x9A
    u8 reserved3[0x100-0x9A];
    // 0x100
    u8 reserved4[0x200-0x100];
    // 0x200
    u8 switchTable[0x400-0x200];      // 色序设定表, 支持512个色序设定
}__attribute__ ((packed)) DataDs16FileHead;//下发给主控的ds16文件头

typedef struct
{
    // 0
    char HMIVerStr[16];		// 界面版本

    // 4
    u32 machineNumber;  // 机器编号

    // 5
    u16 motorNum;   //电机个数
    u16   debugProgress;       //调试进度
    // 6
    char fileName[32];		// 文件名称

#if(0)
    // 52
    char sensorStartBtn;     // 启动按钮1
    char sensorStopBtn;     // 暂停按钮1
    char sensorJogBtn;      // 点动按钮1
    char sensorMainFrameXZeroPos;     // 主框架X零位
    char sensorMainFrameYZeroPos;     // 主框架Y零位
    char sensorMainFrameXNegLimit;    // 主框架X负限位
    char sensorMainFrameYNegLimit;    // 主框架Y负限位
    char sensorMainFrameXPosLimit;    // 主框架X正限位
    char sensorMainFrameYPosLimit;    // 主框架Y正限位
    char sensorScissorsReturn;            // 剪刀回位
#endif

    //14
    char deliveryTime[32];       //交付日期

    //22
    u32 workProgress;        //机器工作进度（花样执行进度）

    //26
    u32 workState; //工作状态

    //27
    u32 startPins; //开始针数

    //28
    u32 endPins; //结束针数

    //29
    quint64 startTime; //开始时间

    //31
    quint64 endTime; //结束时间

    //33
    u32 outCounter; //产量统计

    //34
    u32 rev2[256-34];

} __attribute__ ((packed)) HMILotData;	// 界面物联网数据

//-------------------------------------------------------------------------

#define HEADBUF 8192 //512x16
#define PATCHCOLORBUF 512 //512(u16)
#define PATCHNEEDLEBUF 10
#define TOWELHIGHBUF 1024

//贴布绣按针参数结构体
struct NeedlePatch
{
    u32 needleIdx;
    u16 move;
};

// 数据文件头
typedef struct
{
    DataFileHead fileHead;  // 数据文件头
    u8 colorOrderEmbHead[HEADBUF];   // 隔头 每个色序对应的16个机头是否开启
    //    u8 ifPatch;//是否设置了贴布绣
    u16 patchColorEmb[PATCHCOLORBUF];   // 贴布绣 每个色序对应的设置位置
    NeedlePatch patchNeedleEmb[PATCHNEEDLEBUF]; // 贴布绣 针数索引对应的设置位置
}__attribute__ ((packed)) cfgDataFileHead;

//开位线绣节点坐标
struct OpenLineNode
{
    int nodeX;
    int nodeY;
};

typedef struct
{
    s32 rotateStyle;    //旋转式样
    s32 rotateAngle;    //旋转角度
    s32 xZoom;          //X向倍率
    s32 yZoom;          //Y向倍率
    s32 repeatStyle;    //反复方式
    s32 priority;       //优先次序
    s32 xRepeatNum;     //X向反复次数
    s32 yRepeatNum;     //Y向反复次数
    s32 xRepeatSpace;   //X向反复间距
    s32 yRepeatSpace;   //Y向反复间距

    s32 lockNeedlesNum;     //锁针次数
    s32 lockNeedlesStepNum;   //锁针针步
    s32 lockNeedlesStepLength;   //锁针针步长度

    s32 xCompensate;    //X向补偿
    s32 yCompensate;    //Y向补偿
}  __attribute__ ((packed)) PatternParaStruct;

//-------------------------------------
// 花样参数类型定义


// 升级文件头
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
{
    // 0x00
    char fileName[32];		// 文件名称
    // 0x20
    u32 dataSize;			// 数据字节数
    u32	dataChecksum;		// 数据累加校验和

    u8 protocol;			// 文件要发给的协议类型
    u8 nodeid;				// 文件要发给的节点ID,0为广播
    u8 fileType;			// 文件类型
    u8 nodeType;			// 文件要发给的节点类型  -rq

   // 0x2C
    u8	reserved1[0x30-0x2C];	// 保留区1

    // 0x30
    u8	reserved2[0x64-0x30];	// 保留区2

    // 0x64
    u8	reserved3[0x80-0x64];	// 保留区3

    // 0x80
    u8	reserved4[0x100-0x80];	// 保留区4
}__attribute__ ((packed)) BoardFileHead;

// 文件参数结构
typedef struct
{
    // 0x00
    u8 hdIdenti[0x40];

    // 0x40
    s32	anchorX;			// 定位点坐标X
    s32	anchorY;			// 定位点坐标Y
    // 0x48
    s32	beginX;				// 数据起点坐标X
    s32	beginY;				// 数据起点坐标Y
    s32	beginR;				// 数据起点坐标Z

    // 0x54
    s32 minX;
    s32 maxX;
    s32 minY;
    s32 maxY;				// 轮廓范围

    // 0x64
    u32 sizeX;
    u32 sizeY;				// 裁片大小

    // 0x6C
    s32	anchorX2;			// 定位点坐标X2
    s32	anchorY2;			// 定位点坐标Y2
    s32	beginX2;			// 数据起点坐标X2
    s32	beginY2;			// 数据起点坐标Y2
    s32	beginR2;			// 数据起点坐标Z2

    // 0x80
    u8 reserved3[0x200-0x80];
    // 0x200
    u8 switchNeedleTable[0x400-0x200];      // 色序设定表, 支持512个色序设定

}__attribute__ ((packed)) DataFilePara;


typedef struct
{
    s32	anchorX;			// 定位点坐标X
    s32	anchorY;			// 定位点坐标Y
    s32	beginX;				// 数据起点坐标X
    s32	beginY;				// 数据起点坐标Y

}__attribute__ ((packed)) DataFilePos;
//-------------------------------------------------------------------------

// 文件执行参数结构
typedef struct
{
    u32 newIdx;
    s32 newXPos;
    s32 newYPos;
    s32 newRPos;
    u32 newColorIdx;	// 新针位
    u32 newHighIdx;		// 新高度(绣花机毛巾高度)
    u32 mvFrameFlag;	// 移框标志

    u32 rev[256-7];
}__attribute__ ((packed)) FileExecPara;

//-------------------------------------------------------------------------

//参数文件头
struct ParaFile
{
    unsigned char   s_head[4] ; // 默认 PARA
    int             s_type    ; // 默认 0
    int             s_len     ; // 数据 默认 4096

    unsigned int    s_para_buff[1024] ; //工作 参数体

    unsigned short  s_crc ; //参数体的CRC

    unsigned short  rev ;   //预留 保持 结构体四字节对齐
};

// 组合文件的文件头
typedef struct strCombHead
{
    // 0x00 - 0x03
    u32 totalFilesNum;  //组合的总的文件数

    // 0x04
    u32 fileByte[0x100-0x04];	//用于保存每个文件的字节数
}__attribute__ ((packed)) CombHead;
//-------------------------------------------------------------------------
//#pragma pack(1)//设定为1字节对齐

//-------------------------------------------------------------------------

#endif


