#ifndef _OPTICAL_H_
#define _OPTICAL_H_

#include "config.h"

#if (CUR_MACHINE == MACH_OPTICAL)

#include "movectrl.h"
#include "operator.h"
#include "debug.h"
#include "inout.h"
#include "buttons.h"
#include "datadef.h"
#include "delay.h"
#include "controlbus.h"
#include "extendboards.h"
#include "error.h"
#include "trigger.h"
#include "shell.h"
#include "opticalpara.h"
#include "workctrl.h"
//----------------------------------------工作控制参数定义------------------------------------

typedef struct
{
	u32 fanStatus;				// 风机目标状态			0:关 1:低速 2:高速
	s32 sendLength;				// 送料总长度
	u32 sendCount;				// 已送布料计数

	int cutter1filesta;
	int cutter2filesta;
	//---------
	u32 fanCloseCounter;		// 风机关闭计数器
	//----------
	//吐丝
	u32	onceflag;                //一次性执行标记
	u32 motoRunFlag;            //已吐丝标志
	u32 motopreFlag;            //已铺光纤标志
	int offsetToOpit;			//偏移去吐丝标志
	int isEndOfSpinFlag;		//光纤尾部吐丝标志
	u32 cutingFlag;				// 可以剪线标志  =0:不能剪线		=1:可以剪线
	u32 lowingFlag;				// 需要下降机头标志
	u32 tsIdx;					// 吐丝数据索引(归零时使用)
	//-----------------------

	//补偿
	u8 runSteps1;				//
	s16 oldXCompenAfterTurn;		// oldX拐弯之后的补偿
	s16 oldYCompenAfterTurn;		// oldY拐弯之后的补偿
	s16 xCompenAfterTurn;		// x拐弯之后的补偿
	s16 yCompenAfterTurn;		// y拐弯之后的补偿
	s32 begainRBeforeWiring;	// 布线起始角度
	u8 compenFlag1;				// 可以补偿标志

	//-----------------------
	//料有无
	u8 runSteps2;
	u8 runSteps3;
	s32 IsNoMaterialScanLen;	// 断线检测扫描长度
	u8 IsNoMaterialFlag;		// 断线标志 =0断线
	u8 IsNoMaterialEn;			// 断线检测扫描启动
	//-----------------------
	s32	encoder1Vale;			// 编码器1值
	s32	encoder2Vale;			// 编码器2值

	u32 opticalSta;				// 机器状态

	u8 	silkRetreat;			// 布线后吐丝
	s32 opitPosx;				// 吐丝位置x
	s32 opitPosy;				// 吐丝位置y
	s8 opitPosDirx;				// 吐丝方向
	s8 opitPosDiry;				// 吐丝方向

	u8 usecomx;					// 使用反向运行补偿
	u8 usecomy;					// 使用反向运行补偿
	u8 useGapCorx;				// 使用反向对接间隙补偿
	u8 useGapCory;				// 使用反向对接间隙补偿
	int spinLenOffset;			// 偏移长度

}OptWorkCtrl;

OptWorkCtrl		g_optWorkCtrl;

//u32 opticalSta;				// 机器状态
//#define

typedef struct
{
	s32 xNegaBorder;				// x负限位位置
	s32 xPosiBorder;				// x正限位位置
	s32 yNegaBorder;				// y负限位位置
	s32 yPosiBorder;				// y正限位位置

}OptBorder;

OptBorder		g_optBorder;
//----------------------------------------------------------------------------



//-------------------------------功能模块配置------------------------------------------

#if (1)

#define	MATERIAL_SCAN		1		// 无料检测（断线检测）

#define	AFTERTURN_COMPEN	0		// 拐角补偿

#define XY_GAP_CONVERT		0		// 间隙补偿

#define	MODULE_X			1		// X电机模块
#define X_FINDZERO_DIR		1		// = -1, X向负方向找零位传感器;		= 1, X向正方向找零位传感器;


#define	MODULE_Y			1		// Y电机模块

#define	MODULE_FEED_LL		0		// 进料模块

#define MOTO_LIFT			1		// 电机升降
#define LIFT_U1				1		// 提升1模块
#define LIFT_U2				0		// 提升2模块
#define LIFT_U3				0		// 提升3模块

#define AIR_LIFT			0		// 气动升降

#define MOTO_TURN			1		// 电机旋转跟踪
#define TURN_R1				1		// 旋转1模块
#define TURN_R2				0		// 旋转2模块
#define TURN_R3				0		// 旋转3模块

#define	MODULE_SEND			1		//送料电机模块
#define	MODULE_PULL			1		//拉料电机模块
#define	MODULE_LOOSE        1       //松料电机模块


#define	POS_EN_NONE		0x0000
#define	POS_EN_X		0x0001
#define	POS_EN_Y		0x0002
#define	POS_EN_XY		0x0003

#endif
//---------------------------------------------------------------------------------------------------



//-------------------------------------------输入输出信号---------------------------------------------
//输入信号
	// J1
#define IsXZeroPos					GetInput1Status		// X零位
#define CORE_INPUT1_IDX				DSS2_F1_ZERO_POS
#define CORE_INPUT1_BIT				DSS2_F1_X
	// J2
#define IsYZeroPos					GetInput2Status		// Y零位
#define CORE_INPUT2_IDX				DSS2_F1_ZERO_POS
#define CORE_INPUT2_BIT				DSS2_F1_Y
	// J3
#define IsU1ZeroPos					GetInput3Status		// U零位
#define CORE_INPUT3_IDX				DSS2_UD_SP1U1_POS
#define CORE_INPUT3_BIT				DSS_HEAD_01
	// J4
#define IsR1ZeroPos					GetInput4Status		// R零位
#define CORE_INPUT4_IDX				DSS_DEF_IDX
#define CORE_INPUT4_BIT				DSS_DEF_BIT
	// J5
#define IsStartButton				GetInput5Status		// 启动按钮
#define	CORE_INPUT5_IDX				DSS1_B_START_BT
#define	CORE_INPUT5_BIT				DSS_BIT1
	// J6
#define IsStopButton				GetInput6Status		// 暂停按钮
#define	CORE_INPUT6_IDX				DSS1_B_PAUSE_BT
#define	CORE_INPUT6_BIT				DSS_BIT1
	// J7
#define UpClipMatClipCylinderPlaceOn		GetInput7Status		// 上夹料气缸-出位
#define	CORE_INPUT7_IDX				DSS2_UD_SP2D1_POS
#define	CORE_INPUT7_BIT				DSS_BIT1
	// J8
#define UpClipMatClipCylinderPlaceOff		GetInput8Status		// 上夹料气缸-回位
#define	CORE_INPUT8_IDX				DSS2_UD_SP2D1_POS
#define	CORE_INPUT8_BIT				DSS_BIT2
	// J9
#define DownClipMatClipCylinderPlaceOn		GetInput9Status		// 下夹料气缸-出位
#define	CORE_INPUT9_IDX				DSS2_UD_SP2D1_POS
#define	CORE_INPUT9_BIT				DSS_BIT3
	// J10
#define DownClipMatClipCylinderPlaceOff	GetInput10Status	// 下夹料气缸-回位
#define	CORE_INPUT10_IDX			DSS2_UD_SP2D1_POS
#define	CORE_INPUT10_BIT			DSS_BIT4
	// J11
#define IsOptStoringLow1			GetInput11Status	// 光纤储料低位1
#define	CORE_INPUT11_IDX			DSS2_UD_SP2D1_POS
#define	CORE_INPUT11_BIT			DSS_BIT5
	// J12
#define IsOptStoringLow2			GetInput12Status	// 光纤储料低位2
#define	CORE_INPUT12_IDX			DSS2_UD_SP2D1_POS
#define	CORE_INPUT12_BIT			DSS_BIT6
	// J13
#define IsEmptyMaterial				GetInput13Status	// 无料检测
#define	CORE_INPUT13_IDX			DSS2_UD_SP2D1_POS
#define	CORE_INPUT13_BIT			DSS_BIT7
	// J14
#define IsOptStoringHigh2			GetInput14Status	// 传感器已删
#define	CORE_INPUT14_IDX			DSS2_UD_SP2D1_POS
#define	CORE_INPUT14_BIT			DSS_BIT8
	// J15
#define IsOptPreLiftUp				GetInput15Status	// 光纤压料抬起到位
#define	CORE_INPUT15_IDX			DSS2_UD_SP2D2_POS
#define	CORE_INPUT15_BIT			DSS_BIT1
	// J16
#define GetInputNull				GetInput16Status
#define CORE_INPUT16_IDX			DSS_DEF_IDX
#define CORE_INPUT16_BIT			DSS_DEF_BIT

// J16
#define IsBlowingCylinderPlaceOn()	GetExInput(1)
#define CORE_INPUT17_IDX			DSS_DEF_IDX
#define CORE_INPUT17_BIT			DSS_DEF_BIT

//输出信号
	// H1
#define	UpClipMatClipCylinderOn	    Output1On			// 上夹料气缸控制开
#define	UpClipMatClipCylinderOff    Output1Off			// 上夹料气缸控制关
	// H2
#define	DownClipMatClipCylinderOn	Output2On			// 下夹料气缸控制开
#define	DownClipMatClipCylinderOff	Output2Off			// 下夹料气缸控制关
	// H3
#define	PreMatCylinderOn()		    do{Output3On();}while(0)	// 压料气缸控制开
#define	PreMatCylinderOff()		    do{Output3Off();}while(0)	// 压料气缸控制关
	// H4
#define	IsBlowingCylinderOn()		if(IsOptPreLiftUp() == SENSOR_ON){Output4On();}			// 送料气缸伸出
#define	IsBlowingCylinderOff	  	Output4Off			// 送料气缸收回
	// H5
#define	TrimmingCylinderOn()		do{Output5On();}while(0)		// 剪线气缸控制开
#define	TrimmingCylinderOff()		Output5Off()		// 剪线气缸控制关
	// H6
#define	LooseMotorRevOn				Output6On			// 松料电机运转开
#define	LooseMotorRevOff			Output6Off			// 松料电机运转关
	// H7
#define	Fan1MotoOn		   		    Output7On			// 风机正转开
#define	Fan1MotoOff				    Output7Off			// 风机正转关

#define FixMatCylinderOn()			do{SetExOutput(1,0);}while(0)//顶料气缸开
#define FixMatCylinderOff()			do{SetExOutput(1,1);}while(0)//顶料气缸关
//输入输出信号名称
static const char g_opticalInputName[INPUT_NUM][INPUT_STR_LEN] =
{
	"X零位",
	"Y零位",
	"U零位",
	"R零位",
	"启动按钮",
	"停止按钮",
	"上夹料气缸-出位",
	"上夹料气缸-回位",
	"下夹料气缸-出位",
	"下夹料气缸-回位",
	"光纤储料低位1",
	"光纤储料低位2",
	"光纤储料高位1",
	"光纤储料高位2",
	"光纤压料抬起到位",
	"",
};
static const char g_opticalOutputName[OUTPUT_NUM][OUTPUT_STR_LEN] =
{
		"上夹料气缸控制",
		"下夹料气缸控制",
		"压料气缸控制",
		"送料气缸控制",
		"剪线气缸控制",
		"松料电机运",
		"风机正转",
		"",
};
//#if (1)
//// 防止程序报错
//// 输入
#ifndef IsAutoManualSelSwitch
#define IsAutoManualSelSwitch		GetInputNullOn		// 手自动按钮
#endif

#ifndef IsAirPressureOk
#define IsAirPressureOk				GetInputNullOn		// 气压保护
#endif

#ifndef IsPullingCylinderOff
#define IsPullingCylinderOff				GetInputNullOn		// 气压保护
#endif

#ifndef IsPullingCylinderOn
#define IsPullingCylinderOn				GetInputNullOn		// 气压保护
#endif

#ifndef IsBlowingCylinderPlaceOff
#define IsBlowingCylinderPlaceOff				GetInputNullOn		// 气压保护
#endif


// 输出
#ifndef OilOff
#define OilOff						SetOutputNull		// 加油
#endif

#ifndef AlarmRedLightOn
#define AlarmRedLightOn				SetOutputNull		// 三色灯-红
#endif

#ifndef AlarmRedLightOff
#define AlarmRedLightOff			SetOutputNull		// 三色灯-红
#endif

#ifndef AlarmGreenLightOn
#define AlarmGreenLightOn			SetOutputNull		// 三色灯-绿
#endif

#ifndef AlarmGreenLightOff
#define AlarmGreenLightOff			SetOutputNull		// 三色灯-绿
#endif

#ifndef AlarmYelloLightOn
#define AlarmYelloLightOn			SetOutputNull		// 三色灯-黄
#endif

#ifndef AlarmYelloLightOff
#define AlarmYelloLightOff			SetOutputNull		// 三色灯-黄
#endif

#ifndef AlarmBeeOn
#define AlarmBeeOn					SetOutputNull		// 三色灯-蜂鸣器
#endif

#ifndef AlarmBeeOff
#define AlarmBeeOff					SetOutputNull		// 三色灯-蜂鸣器
#endif
//
//#endif // 防止程序报错
//
//#if (1)
#ifndef	PanDownOn
#define	PanDownOn				OutputNull		// 画笔放下
#endif
#ifndef	PanDownOff
#define	PanDownOff				OutputNull		// 画笔抬起
#endif

#ifndef	Cutter1StartOn
#define	Cutter1StartOn			OutputNull		// 龙门1启动开
#endif
#ifndef	Cutter1StartOff
#define	Cutter1StartOff			OutputNull		// 龙门1启动关
#endif

#ifndef	Cutter1StopOn
#define	Cutter1StopOn			OutputNull		// 龙门1停止开
#endif
#ifndef	Cutter1StopOff
#define	Cutter1StopOff			OutputNull      // 龙门1停止关
#endif

#ifndef	Cutter2StartOn
#define	Cutter2StartOn			OutputNull		// 龙门2启动开
#endif
#ifndef	Cutter2StartOff
#define	Cutter2StartOff			OutputNull      // 龙门2启动关
#endif

#ifndef	Cutter2StopOn
#define	Cutter2StopOn			OutputNull		// 龙门2停止开
#endif
#ifndef	Cutter2StopOff
#define	Cutter2StopOff			OutputNull      // 龙门2停止关
#endif
//------------------------------------------------------------------------------------------------------------




//---------------------------------------------------电机-----------------------------------------------

// X 电机:
#define	MTX_IDX					0			// X 电机	（横向）
#define	MTX_CFG					MOTOEN_CFG
#define	MTX_OTP					POUT_CWCCW
#define	MTX_MOD					0x01
// Y 电机:
#define	MTY_IDX					1			// Y 电机
#define	MTY_CFG					MOTOEN_CFG
#define	MTY_OTP					POUT_CWCCW
#define	MTY_MOD					0x02
// U1 电机:
#define	MTU1_IDX				2			// U1 右刀升降
#define	MTU1_CFG				MOTOEN_CFG
#define	MTU1_OTP				POUT_CWCCW
#define	MTU1_MOD				0x04
// R1 跟踪 电机:
#define	MTR1_IDX				3			// 跟踪电机
#define	MTR1_CFG				MOTOEN_CFG
#define	MTR1_OTP				POUT_CWCCW
#define	MTR1_MOD				0x08
// 送料电机:
#define	MTS1_IDX				4			// 送料电机
#define	MTS1_CFG				MOTOEN_CFG
#define	MTS1_OTP				POUT_CWCCW
#define	MTS1_MOD				0x10
// 拉料电机:
#define	MTP1_IDX				5			// 拉料电机（步进电机,未接驱动器报警线）
#define	MTP1_CFG				(CONFIG_EN|POUT_EN)
#define	MTP1_OTP				POUT_PLSDIR
#define	MTP1_MOD				0x20


// 每段脉冲数
#define	OPTICAL_PULSE_PER_SEGMENT	1000

// 支持分段数
#define	OPTICAL_SUPPORT_SEGMENT		1

// 送料电机
#define	MTS1_PULSE_CIRCLE		100							// 每圈脉冲数
#define	MVS1BH_MVMT				(MTS1_PULSE_CIRCLE * 10000)	// 手动移动
//----------------------------------------------------------------------------------------------------




//-------------------------------------------通讯命令定义-------------------------------------------

// 归零和手动移动和电机使能的 控制参数1 定义
#define	MT_LX					0x0001	// X向移动电机
#define	MT_LY					0x0002	// Y向移动电机

#define	MT_LU1					0x0003	// 刀座1升降电机
#define	MT_LU2					0x0004	// 刀座2升降电机

#define	MT_LR1					0x0005	// 刀座1跟踪电机
#define	MT_LR2					0x0006	// 刀座2跟踪电机


#define	MT_LBF					0x0014	// 传送带(送料电机)
#define	MT_PBF					0x0015	// 拉料电机
#define	MT_MBF			   		0x0016	// 松料电机


// 输出控制的 控制参数1 定义
#define	OT_POINT				0x0105	// 去定位点
#define	OT_PULLINGCYLINDER		0x0106	// 拉料气缸控制  开/关
#define	OT_BLOWING			    0x0108	// 放料气缸控制  开/关
#define	OT_FEED			        0x010A	// 送料电机控制  开/关
#define	OT_LOOSE			    0x010B	// 松料电机控制  开/关
#define	OT_PULL			        0x010C	// 拉料电机控制  开/关
#define	OT_FAN1_CTRL			0x000D	// 吸风控制      开/关
#define	OT_PRESS_M_POLE			0x010E	// 压料气缸控制  升/降
#define	OT_TRIMMING			    0x010F	// 剪线控制      开/关
#define	OT_OWNCLIP    			0x0110	// 下夹料气缸控制   开/关
#define	OT_UPCLIP		        0x0111	// 上夹料气缸控制   开/关
#define	OT_HEAD_SPIN			0x0112	// 机头旋转控制

#define OT_RESERVE1   		    0x0113  // 预留1
#define	OT_RESERVE2			    0x0114  // 预留2

#define	OT_HEAD_UPDOWN			0x0119	// 机头升降控制

//联动:布线测试
#define	OT_HEAD_DOWN			0x011A	// 机头下降到位
#define	OT_GO_PRESS			    0x011B	// 压料
#define	OT_REACH_TRIM			0x011C	// 剪线(剪线及回位)
#define	OT_REACH_FEED			0x011D	// 送料电机送料
#define	OT_PULL_FEED	        0x011E	// 拉料电机送料
#define	OT_RETURN_TRIM			0x011F	// 剪线气缸回位
#define	OT_RETURN_UP_CLAMP		0x0120	// 上夹料气缸回位
#define	OT_RETURN_LOEER_CLAMP	0x0121	// 下夹料气缸回位
#define	OT_RETURN_BLOW			0x0122	// 放料气缸回位

#define	OT_RETURN_PULL			0x0123	// 拉料气缸回位
#define	OT_OUTROLL_DOWN			0x0024	// 出料压辊控制 升/降

#define	OT_ALLHEAD_DOWN			0x0125	// 机头升降控制 升/降
#define	OT_PULLFRM_DOWN			0x0026	// 压料框升降控制 升/降

#define	OT_OUTROLL_DOWN1	    0x0027  // 控制
#define	OT_LEFT_ALIGN_ON1       0x0028	// 控制
#define	OT_LEFT_ALIGN_ON		0x0029	// 进料左对边气缸 升/降
#define	OT_RIGHT_ALIGN_ON		0x002A	// 进料右对边气缸 升/降

// 输出参数2
#define	UP_OPEN_ON				0x0001	// 上升、打开、吸风、吸尘
#define	DOWN_CLOSE_OFF			0x0002	// 下降、关闭
//--------------------------------------------------------------------------------------------------------



//---------------------------------------框架函数回调--------------------------------------------------
//初始化
void InitAppCallback(void);								// 初始化
void CheckSensorAndPos(void);							// 检测传感器和位置,自动归零
void RefreshParas(int flag);							// 参数刷新,上电或设置参数时刷新参数
void RefreshStatus(void);								// 状态刷新
void SensorsStatus(int mode, u8 * buf);					// 传感器信号

//花版相关
int GetWorkPosFromIndex(void);


//手动控制命令
void MotoToZero(u16 obj);								// 电机归零
void MoveMotoByHand(u16 obj, u16 dir, u16 spd);			// 电机手动移动
void OutputByHand(u16 obj, u16 act, u16 para);			// 输出控制
void MotosServoCtrl(u16 obj, u16 onoff);				// 电机伺服开关控制
void ManualActionCtrl(u16 obj, u16 para2, u16 para3);	// 手动动作


//机器工作命令
int OpticalStartWork(void);							// 启动工作
void AllToReset(void);								// 流程复位
void AllToZero(void);								// 全部归零
int GotoStartPos(void);								// 回起绣点
int GotoAnchorPos(void);							// 回定位点
int GotoOffsetPos(void);							// 回偏移点
void SetOffsetPos(void);							// 定偏移点
int CheckFrame(void);								// 边框检查
int FastJump(u32 idx);								// 前进回退
int GotoWorkPos(void);								// 回工作点
int GotoFinishPos(void);							// 回结束点
int GotoFrameZeroPos(void);							// 回零点位(回绣框原点)
void ChangeRpm(int rpm);							// 转速改变
void WorkRpmToPara(void);							// 工作转速参数改变
int GotoFeedPos(void);								// 回上料点
void SetFeedPos(void);								// 定上料点

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

#endif// (CUR_MACHINE == MACH_OPTICAL)
#endif /*_OPTICAL_H_ */
