
#ifndef __DATADEF_H__
#define	__DATADEF_H__

#include "config.h"

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

// 执行数据定义
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;

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

}__attribute__ ((packed)) Ds8Item;

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;

// 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	// 换色功能码

#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_TAPE_OFST	0x25	// 织带偏移数据

#define	DATA_WHEEL		0x26	// 压轮数据
#define	DATA_PRESSURE	0x27	// 压料数据
#define	DATA_OPTI		0x28	// 吐丝数据

#define DATA_BASE1		0x2A	// 基座1数据
#define DATA_BASE2		0x2B	// 基座2数据
#define DATA_BASE3		0x2C	// 基座3数据

#define DATA_EKNIFE1	0x2D	// 偏心刀1数据
#define DATA_EKNIFE2	0x2E	// 偏心刀2数据

#define DATA_CHENILLE	0x41	// 毛巾数据
#define DATA_CHAIN		0x42	// 链式数据
#define DATA_HIGHT		0x43	// 高度数据(毛巾绣)
#define DATA_COIL		0x44	// 缠绕数据
#define DATA_ZIGZAG		0x45	// 锯齿数据
#define DATA_RIBBON		0x46	// 盘带数据

#define	DATA_END		0x80	// 结束码
#define	DATA_PAUSE		0x81	// 暂停功能码
#define	DATA_CHGND		0x82	// 绣花换针杆功能码（换色）
#define	DATA_CUTTRD		0x83	// 剪线功能码
#define	DATA_CUT_TAPE	0x84	// 剪织带功能码
#define	DATA_MOVE_PHOTO	0x85	// 移动到拍照点功能码
#define	DATA_GET_IMAGE	0x86	// 拍照功能码

#define	DATA_ANGLE		0x89	// 拐点

// atrr, 属性字节，作为运动属性字节

// 缝纫针步的属性定义：

// attr.7, 夹线力度等级H
// attr.6, 夹线力度等级L
// attr.5, 保留
// attr.4, 缝纫回针标志
// attr.3, 右针杆不落针标志(=0，落针=1，不落针)
// attr.2, 左针杆不落针标志(=0，落针=1，不落针)
// attr.1, 速度等级H
// attr.0, 速度等级L

#define	ATTR_CLAMP_LV	0xC0	// 夹线力度等级
#define	ATTR_RESEW		0x10	// 回针标志
#define	ATTR_FOOT_LV	0x60	// 压脚高度等级
#define	ATTR_R_TOUP		0x08	// 右针杆不落针标志(=0，落针=1，不落针)
#define	ATTR_L_TOUP		0x04	// 左针杆不落针标志(=0，落针=1，不落针)
#define	ATTR_SPD_LV		0x03	// 速度等级


// 绣花针步的属性定义：
// attr.5, 跳针标志

#define	ATTR_JUMP		0x20	// 跳针标志


#define EMB_ACTION		0x20	// 刺绣附加动作
// 刺绣附加动作
// 亮片
#define ACT_SEQUIN1			0x01
#define ACT_SEQUIN2			0x02
#define ACT_SEQUIN3			0x03
#define ACT_SEQUIN4			0x04
#define ACT_SEQUIN5			0x05
#define ACT_SEQUIN6			0x06
#define ACT_SEQUIN7			0x07
#define ACT_SEQUIN8			0x08
#define ACT_SEQUIN9			0x09
#define ACT_SEQUIN10		0x0A
#define ACT_SEQUIN11		0x0B
#define ACT_SEQUIN12		0x0C

// 散珠
#define ACT_SCBEAD1			0x11
#define ACT_SCBEAD2			0x12
#define ACT_SCBEAD3			0x13
#define ACT_SCBEAD4			0x14
#define ACT_SCBEAD5			0x15
#define ACT_SCBEAD6			0x16

// 简易毛巾
#define ACT_EASYCHENILLE	0x20


#define WIRE_ACTION			0x40	// 布线机附加动作

#define ACT_ZIGZAGL			0x01	// 左 远离上位
#define ACT_ZIGZAGR			0x02	// 右 靠近上位

// 铣刀的属性定义：

// attr.7, 保留
// attr.6, 保留
// attr.5, 保留
// attr.4, 保留
// attr.3, 刀压深度HH
// attr.2, 刀压深度HL
// attr.1, 刀压深度LH
// attr.0, 刀压深度LL

#define	ATTR_HIGH_MARK		0x0F	// 铣刀刀压深度调整掩码


// dx, x向偏移值, 有符号数, 范围为 -32768--32767, 单位为 0.01mm
// dy, y向偏移值, 有符号数, 范围为 -32768--32767, 单位为 0.01mm
// dr, r向偏移值, 有符号数, 范围为 -32768--32767, 单位为 0.0001 弧度
// len, xy 分量的合成长度,无符号数,范围0--65535, 单位为 0.01mm

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

#ifndef PULSE_PER_MM
#define	PULSE_PER_MM		(100)		// 每毫米脉冲数
#endif

#define	RADIAN_ACCURACY		10000	// 万分之一弧度

//-------------------------------------------------------------------------
// 换色常量
#define	MAX_SWITCH_NEEDLE		512		// 最大换色数（换色表个数）

// 针杆常量
// 平绣
#define	EMB_NEEDNO_MIN			1
#define	EMB_NEEDNO_MAX			32		// 平绣绣花 1 -- 32 针杆

// 冲孔
#define	PUNCH_NEEDNO_MIN		33
#define	PUNCH_NEEDNO_MAX		48		// 多针冲孔 33 -- 48 针杆

// 缝纫
#define	SEW_NEEDNO_MIN			49
#define	SEW_NEEDNO_MAX			50

// 盘带
#define RIBBON_NEEDNO_MIN		51
#define RIBBON_NEEDNO_MAX		52

#define RIBBON_NEEDNO_MODE1		51		// 盘带模式1	正常盘带
#define RIBBON_NEEDNO_MODE2		52		// 盘带模式2	褶绣

// 毛巾
#define CHENILLE_NEEDNO_MIN		53
#define CHENILLE_NEEDNO_MAX		68

// 链式
#define CHAIN_NEEDNO_MIN		69
#define CHAIN_NEEDNO_MAX		84

// 缠绕
#define COIL_NEEDNO_MIN			85
#define COIL_NEEDNO_MAX			100

#define COIL_NEEDNO_L1			85		// 缠绕左旋1
#define COIL_NEEDNO_L2			86		// 缠绕左旋2
#define COIL_NEEDNO_L3			87		// 缠绕左旋3
#define COIL_NEEDNO_L4			88		// 缠绕左旋4
#define COIL_NEEDNO_R1			89		// 缠绕右旋1
#define COIL_NEEDNO_R2			90		// 缠绕右旋2
#define COIL_NEEDNO_R3			91		// 缠绕右旋3
#define COIL_NEEDNO_R4			92		// 缠绕右旋4
#define COIL_EMB_NEEDNO			93		// 缠绕平绣(使用缠绕机头绣作平绣)

// 锯齿
#define SAWTOOTH_NEEDNO_MIN			101
#define SAWTOOTH_NEEDNO_MAX			112

#define SAWTOOTH_NEEDNO_MODE1		101	// 锯齿模式1
#define SAWTOOTH_NEEDNO_MODE2		102	// 锯齿模式2
#define SAWTOOTH_NEEDNO_MODE3		103	// 锯齿模式3
#define SAWTOOTH_NEEDNO_MODE4		104	// 锯齿模式4
#define SAWTOOTH_NEEDNO_MODE5		105	// 锯齿模式5
#define SAWTOOTH_NEEDNO_MODE6		106	// 锯齿模式6

// 激光,不同色序代表不同的切割速度,由低到高
#define LASER_NEEDNO_MIN			113
#define LASER_NEEDNO_MAX			122

#define LASER_NEEDNO_SPEED1			113
#define LASER_NEEDNO_SPEED2			114
#define LASER_NEEDNO_SPEED3			115
#define LASER_NEEDNO_SPEED4			116
#define LASER_NEEDNO_SPEED5			117
#define LASER_NEEDNO_SPEED6			118
#define LASER_NEEDNO_SPEED7			119
#define LASER_NEEDNO_SPEED8			120
#define LASER_NEEDNO_SPEED9			121
#define LASER_NEEDNO_SPEED10		122

// 裁切
#define CUT_NEEDNO					123
// 打孔
#define HOLE_NEEDNO					124

// 暂停
#define	PAUSE_SW_CODE				255


// 数据文件头
//-------------------------------------------------------------------------
typedef union
{
	u8 buff[0x400];

	struct
	{
	// 0x00
		u8 hdIdenti[0x40];
		u8 fileparas[0x400 - 0x40];
	} __attribute__ ((packed)) headparts;		// 

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

	// 0x38
		u8	reserved1[0x40-0x38];	// 保留区1
									// 20221114 因绣花机界面问题,占用此8字节,绣花机主控不能使用

	// 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;			// 数据起点坐标R2

	// 0x80
		u32	runAct;				// 附加动作,
								// bit0:	0:完成后不拍照 	1:完成后拍照

	// 0x84
		u32 EnFlag;				//
								// bit0,偏移点X向允许	0,不允许	1,允许
								// bit1,偏移点Y向允许	0,不允许	1,允许
								// bit2,
								// bit3,
								// bit4,
								// bit5,
								// bit6,反复优先级	0,X向优先	1,Y向优先

		s32 offsetX;			// 偏移点X
		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
		u16 pressureHigh2;		// 刀压2, 	范围 0--65.000，单位0.001mm
		u16 pressureHigh3;		// 刀压3, 	范围 0--65.000，单位0.001mm
		u16 pressureHigh5;		// 刀压5, 	范围 0--65.000，单位0.001mm
		u16 pressureHigh6;		// 刀压6, 	范围 0--65.000，单位0.001mm
		u16 pressureHigh7;		// 刀压7, 	范围 0--65.000，单位0.001mm
		u16 pressureHigh8;		// 刀压8, 	范围 0--65.000，单位0.001mm
		u16 pressureHigh9;		// 刀压9, 	范围 0--65.000，单位0.001mm

	// 0xA8
		u8 reserved2[0x200-0xA8];

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

	} __attribute__ ((packed)) fileHead;		// 文件头

}DataFileHead;

typedef struct
{
    s32	anchorX;
    s32	anchorY;

    s32	beginX;
    s32	beginY;

}__attribute__ ((packed)) DataFilePara;    // 文件参数，

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

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


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

void ReSetFileParaOld(DataFilePara * pNewPara);
void ReSetFilePara(DataFileHead * pNewPara);

u16 GetFileParaCheckCrc(void);

//-------------------------------------------------------------------------
#ifndef MAX_EX_SW_ND
#define MAX_EX_SW_ND				512		// 最大扩展换色数
#endif

#define TEMP_DATA1				0x01
#define TEMP_DATA2				0x02
#define TEMP_DATA3				0x03
#define TEMP_DATA4				0x04

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

#endif


