
#ifndef __HEADCONTROL_H__
#define	__HEADCONTROL_H__

#include "controlbus.h"

#if (CONTROL_BUS == COMM_CAN)
/*
	机头板控制板

*/

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

typedef struct
{
	u8 nodeTye;		// 节点类型
	u8 nodeId;		// 节点ID

	CtrlBusPacket ctrlCmd;		// 发给外围板的控制命令
	CtrlBusPacket exbSta;		// 外围板返回的状态命令
	CtrlBusPacket busSta;		// 外围板返回的总线状态命令
	CtrlBusPacket traCmd;		// 发给外围板的遍历命令
	BoardRegVal regVal;			// 外围板寄存器值
	CtrlBusPacket rdReg;		// 读取外围板寄存器值

	u8 cmdFlag;				// 有新命令标志		N5--接收到控制命令

	u8 staFlag;				// 有新状态标志		N5--发送BN_CMD_EXSTA
	u8 refSta;				// 刷新状态标志		N5--接收BN_CMD_EXSTA

	u8 traFlag;				// 有新命令标志		N5--接收到遍历命令
	u8 busFlag;				// 有新状态标志		N5--发送BN_CMD_BUSSTA

	u8 refVer;
	u8 verFlag;

	u8 transFlag;			// 数据传输标志		发送数据
	u8 exbupdateFlag;		// 外围板程序升级标志

	u8 refNvPara;			// 刷新非易失性参数
	u8 nvParaFlag;			// 接收到非易失性参数标志

	u8 refHeadPara;			// 刷新机头参数
	u8 headParaFlag;		// 接收机头参数标志

}HeadControl;

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

typedef union
{
	u8 buff[CAN_DATA_LEN];

	struct
	{
		u16 cmd;
		u8 subcmd;
		u8 para[5];
	} __attribute__ ((packed)) headCtrl;	// 机头板控制

	struct
	{
		u16 cmd;
		u8 needleNums;	// 针杆数量
		u8 currentNP;	// 当前针位
		u8 rev[4];		// 保留
	} __attribute__ ((packed)) headPara;	// 机头板参数

	struct
	{
		u16 cmd;			// 子命令
		u8 parablockID;		// 参数块ID
		u8 paraID;			// 参数ID
		s32	paraval;		// 参数值
	} __attribute__ ((packed)) headNvPara;	// 非易失性参数

	struct
	{
		u32 staBits;	// 状态位
		u8 setedNP;		// 设置的当前针位
		u16 potValue;	// 电位器数值(毛巾提升电机)
		s8 curHoistLevel;	// 提升电机当前档位
	} __attribute__ ((packed)) headSta;		// 状态命令

	struct
	{
		u32 staBits;	// 状态位
		u8 setedNP;		// 设置的当前针位
		s16 footmotopos;	// 压脚电机位置
		u8 rev;
	} __attribute__ ((packed)) footHeadSta;		// 状态命令(独立压脚)

	struct
	{
		u16 cmd;
		u8 validFlag;	// 有效标志
		u16 msang;		// 主轴角度
		u8 nodetype;	// 20220523 为了在原有基础上兼容毛巾控制,同时考虑后续增加的缠绕等..
						// 节点类型(平绣机头,毛巾机头,缠绕机头)
		u8 para[2];		// 参数
	} __attribute__ ((packed)) setmsang;	// 设置主轴角度

	struct
	{
		u16 cmd;
		u8 para[6];
	} __attribute__ ((packed)) chenillePara;	// 毛巾参数

	struct
	{
		u16 cmd;
		u8 subcmd;
		u8 para1;
		s32 para2;
	} __attribute__ ((packed)) coilMCtrl;	// 缠绕M轴控制

	struct
	{
		u16 cmd;
		u8 currentNP;	// 当前针位
		u16 mrotCtnAng;	// M轴旋转持续角度
		u8 rev[3];		// 保留
	} __attribute__ ((packed)) coilheadPara;	// 缠绕机头板参数

	struct
	{
		u32 staBits;	// 状态位
		s16 footmotopos;	// 压脚电机位置
		s16 swmotopos;		// 摆嘴电机位置
	} __attribute__ ((packed)) wireHeadSta;		// 状态命令(布线机)

}HeadCommand;

//-------------------------------------------------------------------------------
// 控制命令定义

#define	CTRL_CMD_EMB_HEAD_CTRL			0x1000		// 平绣机头板控制
#define	CTRL_CMD_EMB_HEAD_PARA			0x1001		// 平绣机头板参数设置
#define CTRL_CMD_HEAD_NVPARA			0x1002		// 平绣机头非易失性参数设置

#define	CTRL_CMD_CHENILLE_HEAD_CTRL		0x1010		// 毛巾机头板控制
#define	CTRL_CMD_CHENILLE_HEAD_PARA		0x1011		// 毛巾机头板参数设置
#define CTRL_CMD_CHENILLE_NVPARA		0x1012		// 毛巾机头非易失性参数设置

#define	CTRL_CMD_COIL_HEAD_CTRL			0x1020		// 缠绕机头板控制
#define	CTRL_CMD_COIL_HEAD_PARA			0x1021		// 缠绕机头板参数设置
#define CTRL_CMD_COIL_NVPARA			0x1022		// 缠绕机头非易失性参数设置

#define	CTRL_CMD_PUNCH_HEAD_CTRL		0x1030		// 冲孔机头板控制
#define	CTRL_CMD_PUNCH_HEAD_PARA		0x1031		// 冲孔机头板参数设置
#define CTRL_CMD_PUNCH_NVPARA			0x1032		// 冲孔机头非易失性参数设置

#define CTRL_CMD_HEAD_MSANG				0x1050		// 设置主轴角度

/*
#define	CTRL_CMD_COLOR_CTRL				0x1100		// 控制命令
#define	CTRL_CMD_COLOR_PARA				0x1101		// 参数设置命令
#define CTRL_CMD_COLOR_NVPARA			0x1102		// 非易失性参数设置
*/

//-------------------------------------------------------------------------------
// 子控制命令定义

#define	CTRL_SUBCMD_DISABLE				0x00		// 机头控制功能关闭
#define	CTRL_SUBCMD_ENABLE				0x01		// 机头控制功能打开
#define	CTRL_SUBCMD_MS_ACTIVE			0x02		// 主轴动态
#define	CTRL_SUBCMD_MS_STATIC			0x03		// 主轴静态
#define	CTRL_SUBCMD_LOCK_NEEDLE			0x04		// 锁定针杆
#define	CTRL_SUBCMD_UNLOCK_NEEDLE		0x05		// 解锁针杆
#define	CTRL_SUBCMD_TBD_ENABLE			0x06		// 断检允许
#define	CTRL_SUBCMD_TBD_DISABLE			0x07		// 断检禁止
#define	CTRL_SUBCMD_TBD_RESET			0x08		// 断检复位
#define CTRL_SUBCMD_TBD_DETE			0x09		// 断线检测测试
#define	CTRL_SUBCMD_HOOK_THREAD			0x0A		// 面线勾线
#define CTRL_SUBCMD_HOOK_TEST			0x0B		// 勾刀测试功能
#define	CTRL_SUBCMD_TRD_LOOSE_ON		0x0C		// 面线松线开（放松）
#define	CTRL_SUBCMD_TRD_LOOSE_OFF		0x0D		// 面线松线关（夹持）
#define CTRL_SUBCMD_MEND_BEGIN			0x0E		// 开始补绣
#define CTRL_SUBCMD_MEND_END			0x0F		// 结束补绣
#define	CTRL_SUBCMD_MEND_PAUSE			0x10		// 暂停补绣

#define CTRL_SUBCMD_BUS_DECT_BEG		0x11		// 总线检测开始(灭灯)
#define CTRL_SUBCMD_BUS_DECTING			0x12		// 总线检测中(亮灯)
#define CTRL_SUBCMD_BUS_DECT_END		0x13		// 总线检测结束(根据状态进行亮灭灯)

#define CTRL_SUBCMD_SCATBEAD_PUSH_ON	0x14		// 散珠出珠
#define	CTRL_SUBCMD_SCATBEAD_PUSH_OFF	0x15		// 散珠收珠
#define	CTRL_SUBCMD_SCATBEAD_GET		0x16		// 散珠取珠
#define CTRL_SUBCMD_SCATBEAD_CHCO		0x17		// 散珠换色,换到哪个(附带取珠动作)
#define CTRL_SUBCMD_SCBE_CHCOZERO		0x18		// 散珠换色找零
#define CTRL_SUBCMD_SCATBEAD_LIFT		0x19		// 散珠升降,1下降, 0升起
#define CTRL_SUBCMD_SCATBEAD_RESET		0x1A		// 散珠复位
#define CTRL_SUBCMD_SCATBEAD_STA		0x1B		// 散珠状态
#define	CTRL_SUBCMD_SCATBEAD_FEED		0x1C		// 散珠上料

#define CTRL_SUBCMD_SEQUIN_PARA			0x1D		// 亮片参数设置
#define CTRL_SUBCMD_SEQUIN_ONCE			0x1E		// 亮片出片
#define CTRL_SUBCMD_SEQUIN_PUSH			0x1F		// 拨片
#define CTRL_SUBCMD_SEQUIN_CHCO			0x20		// 亮片换色,换到哪个
#define CTRL_SUBCMD_SEQUIN_CHCOZERO		0x21		// 亮片换色找零
#define CTRL_SUBCMD_SEQUIN_LIFT			0x22		// 亮片升降,1下降, 0升起
#define CTRL_SUBCMD_SEQUIN_CUT			0x23		// 亮片切片

#define CTRL_SUBCMD_BEADSEQ_CHANGE		0x24		// 珠片切换

#define CTRL_SUBCMD_EASY_CHENILLE_LIFT	0x25		// 简易毛巾升降
#define CTRL_SUBCMD_EASY_CHENILLE_CTRL	0x26		// 简易毛巾控制

#define CTRL_SUBCMD_TRACK_LIFT			0x27		// 跟踪绳绣升降
#define CTRL_SUBCMD_TRACK_TO_POS		0x28		// 跟踪绳绣旋转去某位置
#define CTRL_SUBCMD_TRACK_CHECK			0x29		// 跟踪绳绣检测
#define CTRL_SUBCMD_TRACK_RESET			0x2A		// 跟踪绳绣复位

#define CTRL_SUBCMD_LASERLIGHT_ON		0x30		// 激光定位灯开
#define CTRL_SUBCMD_LASERLIGHT_OFF		0x31		// 激光定位灯关
#define CTRL_SUBCMD_LASER_ON			0x32		// 激光出光
#define CTRL_SUBCMD_LASER_OFF			0x33		// 激光关光
#define CTRL_SUBCMD_LASERBLOW_ON		0x34		// 激光吹气开
#define CTRL_SUBCMD_LASERBLOW_OFF		0x35		// 激光吹气关

#define CTRL_SUBCMD_HOIST_CTRL			0x40		// 毛巾提升电机控制
#define CTRL_SUBCMD_CUT_CTRL			0x41		// 毛巾剪线控制
#define CTRL_SUBCMD_SET_WORK_LEVEL		0x42		// 设置提升电机工作档位
#define CTRL_SUBCMD_GOTO_WORK_LEVEL		0x43		// 提升电机去工作档

#define CTRL_SUBCMD_MAXIS_CTRL			0x50		// 缠绕M轴控制
#define CTRL_SUBCMD_MAXIS_RUN			0x51		// 缠绕M轴运动
#define CTRL_SUBCMD_FOOT_CTRL			0x52		// 压脚控制
#define CTRL_SUBCMD_ZIGZAG_CTRL			0x53		// 锯齿控制
#define CTRL_SUBCMD_COIL_CTRL			0x54		// 缠绕控制

// 布线机
#define CTRL_SUBCMD_CLIPWIRE_CTRL		0x60		// 夹电阻丝控制
#define CTRL_SUBCMD_UPLINE_CTRL			0x61		// 夹面线控制
#define CTRL_SUBCMD_PRESSWIRE_CTRL		0x62		// 压电阻丝控制
#define CTRL_SUBCMD_UPCUT_CTRL			0x63		// 上剪线控制
#define CTRL_SUBCMD_WIREALARM_DECT		0x64		// 扎线报警检测
#define CTRL_SUBCMD_WIREALARM_RESET		0x65		// 扎线报警复位
#define	CTRL_SUBCMD_STFED_ENABLE		0x66		// 起针检测送线允许
#define	CTRL_SUBCMD_STFED_DISABLE		0x67		// 起针检测送线禁止
#define	CTRL_SUBCMD_STFED_RESET			0x68		// 起针检测送线复位
#define CTRL_SUBCMD_HOLE_CTRL			0x69		// 打孔控制
#define CTRL_SUBCMD_HOLE_LIFT_CTRL		0x6A		// 打孔升降控制
#define CTRL_SUBCMD_LIFT_CTRL			0x6B		// 机头升降控制
// 换色电机
#define	CTRL_SUBCMD_CON_SWITCH_NEEDLE	0x70		// 换色到针位
//-------------------------------------------------------------------------------
// 状态位定义

#define	HDSTA_HEAD_LOCK			0x00000001		// 锁头状态标志（无论按钮锁头或软件锁头）
#define	HDSTA_THREAD_BREAK		0x00000002		// 面线断线状态标志
#define	HDSTA_DTHREAD_BREAK		0x00000004		// 底线断线状态标志
#define HDSTA_MEND_EMB			0x00000008		// 补绣状态
#define HDSTA_MEND_PAUSE		0x00000010		// 补绣暂停
#define HDSTA_MEND_WORK			0x00000020		// 补绣工作模式
#define HDSTA_CUT_POS			0x00000040		// 剪刀不在回位
#define HDSTA_SCBE_ALARM		0x00000080		// 散珠报警
#define HDSTA_TRACK_ALARM		0x00000100		// 跟踪绳绣报警
#define HDSTA_FOOT_DOWN			0x00000200		// 压脚下位
#define HDSTA_FOOT_UP			0x00000400		// 压脚上位
#define HDSTA_CUT_WORKPOS		0x00000800		// 剪刀出位(布线机)
#define	HDSTA_WIRE_ALARM		0x00001000		// 扎线报警(布线机)
#define HDSTA_FEEDWIRE_TIMEOUT	0x00002000		// 送线超时(布线机)
#define HDSTA_FEEDWIRE_ALARM	0x00004000		// 卡线(布线机)
#define HDSTA_FEEDWIRE_NULL		0x00008000		// 起针未送线(布线机)
#define HDSTA_HOLE_LIFT_UP		0x00010000		// 打孔升降高位(布线机)
#define HDSTA_HOLE_LIFT_DOWN	0x00020000		// 打孔升降低位(布线机)
#define HDSTA_LASER_ALM			0x00040000		// 激光报警(布线机)
#define HDSTA_LIFT_UP			0x00080000		// 机头高位(布线机)
#define HDSTA_LIFT_DOWN			0x00100000		// 机头低位(布线机)

//-------------------------------------------------------------------------------
// 机头类型定义

#define FLAT_EMB_HEAD			0x01		// 平绣机头
#define CHENILLE_HEAD			0x02		// 毛巾(上)机头
#define COIL_HEAD				0x03		// 缠绕机头
#define CHENILLE_DN_HEAD		0x04		// 毛巾下机头
#define LASER_HEAD				0x05		// 激光机头

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

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

void InitHeadControl(HeadControl * pCtrl);

void SendHeadCommand(HeadControl * pCtrl, HeadCommand * pCmd);

void RequestHeadStatus(HeadControl * pCtrl);

void RequestHeadVersion(HeadControl * pCtrl);

void RequestHeadNvPara(HeadControl * pCtrl);

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




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

#endif

#endif
