///******************************************************************
//
// Moudle Name  :   mtn_lib20_oem.h
// Abstract     :   GaoChuan Motion 2.0 oem user header 
// Note :			1.结构体定义中所有的‘reservedxxx’的成员都是保留参数,为保持兼容性,请设置为0
//					2.无特别说明,所有API返回RTN_CMD_SUCCESS（即0值）表示执行成功,其他则表示错误代码
//					3.所有的API参数中,无特别说明,axisHandle表示操作轴的句柄,devHandle表示目标控制器的句柄,crdHandle表示目标坐标系组句柄
//                  4.mtn_lib20中所有的结构体都是以四字节对齐方式编译，为了避免结构体对齐引起的问题，请将编译环境设置为四字节对齐
// Modification History :
///******************************************************************
#ifndef _H_MTN_LIB20_OEM_H_
#define _H_MTN_LIB20_OEM_H_
#include "mtn_lib20.h"

#ifdef __cplusplus
extern "C" {
#endif

// 设置PTP的高级参数
// minEvenTime:最小匀速时间
// param1:保留
MTN_API short  __stdcall OEM_MtSetMinEventTime(HAND axisHandle,short minEvenTime,short param1,short param2,short param3);

// 读取PTP的高级参数
MTN_API short  __stdcall OEM_MtGetMinEventTime(HAND axisHandle,short *minEvenTime,short *param1,short *param2,short *param3);

// 多轴同步运动
// mask:轴掩码
// pPosArray:位置数组
MTN_API short  __stdcall OEM_PtpSync(HAND devHandle,short mask,long *pPosArray);


typedef struct
{
	long xStart;			// X起点
	long yStart;			// Y起点
	long xIntv;				// X间距
	long yIntv;				// Y间距
	long cnt;				// 数量
	long reserved;
} TComp2DimensDataGroup;

// 功能：设置二维比较数据
// pArrayGroup:比较数组地址
// count:位置点数,count=0表示清除已经缓存的数据。一次性最多压入128组数据
// group:组号,0 或者1
// chn:保留,设为0
MTN_API short __stdcall OEM_Comp2DimensSetDataGroup(HAND devHandle,short group,TComp2DimensDataGroup *pArrayGroup,short count,short chn);


// 功能：设置双头运动中的第二个头相对第一个头的参数
// 参数：offsetX:双头回原点后，在X方向，第2个头的原点相对第1个头的原点的偏置量
//			 offsetY:双头回原点后，在Y方向，第2个头的原点相对第1个头的原点的偏置量
//			 pAxisNo:[0]第二个头的X轴对应的轴号  [1]第二个头的Y轴对应的轴号
MTN_API short __stdcall NMC_CrdSetDoubleHeadPara(HAND crdHandle,long offsetX,long offsetY,short *pAxisNo);

// 功能：读取双头运动中的第二个头相对第一个头的参数
// 参数：pOffsetX:双头回原点后，在X方向，第2个头的原点相对第1个头的原点的偏置量
//			 pOffsetY:双头回原点后，在Y方向，第2个头的原点相对第1个头的原点的偏置量
//			 pAxisNo:[0]第二个头的X轴对应的轴号  [1]第二个头的Y轴对应的轴号
MTN_API short __stdcall NMC_CrdGetDoubleHeadPara(HAND crdHandle,long *pOffsetX,long *pOffsetY,short *pAxisNo);

// 功能：实现第二个点胶头的图元切换动作,在没加工完一个图元后，切换到另外一个图元需要配合调用该指令
// 参数：	rotX,rotY:下一个图元的旋转中心（一般为相机拍照的位置）
//			tgtPosX,tgtPosY:是下一个图元的起始点位置XY的坐标 
//			deltaX、deltaY和theta:是下一个图元的中心相对第一个图元中心的偏移和旋转量。
//			deltaX、deltaY单位为脉冲，theta单位为度
//			vel,acc:第二个点胶头移动到起点的速度和加速度
// 注：没有对deltaX deltaY以及theta进行判断，后续根据第二号头的XY行程增加判断。
MTN_API short __stdcall NMC_CrdBufObjectSwitch(HAND crdHandle, long segNo,long rotX,long rotY, 
	long tgtPosX,long tgtPosY, long deltaX,long deltaY,double theta,double vel,double acc);

// 功能：建立2号头的与1号头的同步运动关系
MTN_API short __stdcall NMC_CrdBufSecondHeadSyncMoveOn(HAND crdHandle, long segNo);

// 功能：结束2号头的与1号头的同步运动关系
MTN_API short __stdcall NMC_CrdBufSecondHeadSyncMoveOff(HAND crdHandle, long segNo);

#define LASER_PARAM_TAB_UNIT_MAX	64		// 最大的激光参数表数量
typedef struct
{
	// SHIO模式下的参数
	double gateTime; 		// 设置gate 打开时间,单位：s（内部最小值：1/36us ）,取值范围(0,0.0009)
	long minFrq;			// 最低频率，单位HZ
	short gateDistance; 	// 固定模式下的位置间隔 单位：pulse
    short k;				// 低频过渡系数          
	short startDot; 	    // 启动时出光打点
	short lowFrqRange; 		// 低频范围：0：100k，1：1M,2:9M
	short accLowFrqOnVel;	// 加速段低频功能的启用速度值
	short decLowFrqOffVel;	// 减速段低频功能的关闭速度值
	short yCoe;				// Y向补偿，取值范围[0,255],实际比例为0~2的比例，coe*256后设到这个变量
	short yAng;				// 光斑的旋转角度
	
	// 普通模式下的参数
	long onDelay;		//开光延时,单位us,取值范围[0,65535]
	long offDelay;		//关光延时,单位us,取值范围[0,65535]
	long minValue;		//最小输出值，DA输出时，范围[0,32767],占空比输出时，范围[0,100],频率输出时，范围[0,2000000]
	long maxValue;		//最大输出值，DA输出时，范围[0,32767],占空比输出时，范围[0,100],频率输出时，范围[0,2000000]
	long standbyPower;	//待机能量,为0表示取消待机能量输出功能
	double overRide;	//跟随倍率,为0表示取消激光能量跟随
	short followType;	//跟随类型,0：跟随规划速度,1：跟随实际速度
	short reserved[7];	// 保留

}TLaserParamTableUnit;


MTN_API short  __stdcall OEM_CrdBufLaserSetParamTableIdx( HAND crdHandle,long segNo,short tableIdx,short laserCh);
MTN_API short  __stdcall OEM_LaserSetParamTableIdx( HAND devHandle,short tableIdx,short laserCh);
MTN_API short  __stdcall OEM_LaserSetParamTableUnit( HAND devHandle,short tableIdx,TLaserParamTableUnit *pParamUnit);
MTN_API short  __stdcall OEM_LaserGetParamTableUnit( HAND devHandle,short tableIdx,TLaserParamTableUnit *pParamUnit);

//------------------------------------------------------------------------------------------------------------
//
//         多段速运动
//
//------------------------------------------------------------------------------------------------------------
// 高速变低速
typedef struct
{
	double startVel;	// 第一段起跳速度
	double highVel;		// 高速段最大速度
	double highAcc;		// 高速段加速度
	double highDec;		// 高速段减速度
	double lowVel;		// 低速段最大速度
	double lowDec;		// 低速段减速度
	long highDist;		// 高速段目标位置
	long lowDist;		// 低速段目标位置
	short smooth;		// 平滑系数，取值[0,50]
	short reseved[3];	// 保留字段
}TPvtMoveHighToLow;

// 多段速：高速变低速
MTN_API short  __stdcall OEM_MtPvtMoveHighToLow(HAND axisHandle,TPvtMoveHighToLow *pPrm);

// 低速变高速
typedef struct
{
	double startVel;	// 第一段起跳速度
	double highVel;		// 高速段最大速度
	double highAcc;		// 高速段加速度
	double highDec;		// 高速段减速度
	double lowVel;		// 低速段最大速度
	double lowAcc;		// 低速段加速度
	long highDist;		// 高速段目标位置
	long lowDist;		// 低速段目标位置
	short smooth;		// 平滑系数，取值[0,50]
	short reseved[3];	// 保留字段
}TPvtMoveLowToHigh;

// 多段速：低速变高速
MTN_API short  __stdcall OEM_MtPvtMoveLowToHigh(HAND axisHandle,TPvtMoveLowToHigh *pPrm);

// 三段速运动（高低高）
typedef struct
{
 	double startVel;	//起跳速度
 	double vel1;		//第1段匀速运动的速度（单位：脉冲/毫秒）
 	double acc1;		//第1段加速度（单位：脉冲/毫秒^2）
 	double dec1;		//第1段减速度（单位：脉冲/毫秒^2）
 	double vel2;		//第2段匀速运动的速度（单位：脉冲/毫秒）
	double vel3;		//第3段匀速运动速度
 	double acc3;		//第3段加速到第3段的加速度
 	double dec3;		//第3段减速度

	long dist1;			//第1段行程（单位：脉冲）
 	long dist2;			//第2段行程（单位：脉冲）
 	long dist3;			//第3段行程
 	long reserved2;		// 保留
	short smooth;		// 平滑系数，取值[0,50]
	short reseved[3];	// 保留字段
} TPvtMove3Stage;

// 多段速：三段速运动（高低高）
MTN_API short  __stdcall OEM_MtPvt3Stage(HAND axisHandle,TPvtMove3Stage *pPrm);


//------------------------------------------------------------------------------------------------------------
//
//         坐标系的速度，补偿激光
//
//------------------------------------------------------------------------------------------------------------
// 根据坐标系的速度，补偿激光输出的相关控制量
#define LASER_CRDVELCOMP_PT_MAX			64
#define LASER_CRDVELCOMP_GROUP_MAX		4
typedef struct
{
	short count;								// 实际点数
	short mode;									// 补偿对象，0：补偿option值，1：补偿输出能量 2:更新能量跟随倍率
	short src;									// 跟随类型,0:编码器速度，1：规划速度
	short reserved[5];							// 保留
	float vel[LASER_CRDVELCOMP_PT_MAX];			// 速度表
	float comp[LASER_CRDVELCOMP_PT_MAX];		// 补偿值
}TLaserCrdVelCompTable;

// 配置坐标系速度补偿表
// pCompTable：补偿表
// group:补偿表格的序号，取值范围[0,LASER_CRDVELCOMP_GROUP_MAX)
MTN_API short  __stdcall OEM_LaserSetCrdVelCompTable(HAND devHandle, TLaserCrdVelCompTable *pCompTable,short group);
MTN_API short  __stdcall OEM_LaserGetCrdVelCompTable(HAND devHandle, TLaserCrdVelCompTable *pCompTable,short group);

// 启用或关闭速度补偿功能
// crdNo: 坐标系编号，[0,1]
// onOff：启用或关闭，0：关闭补偿功能，1：启用补偿功能
// group:补偿表格的序号，取值范围[0,LASER_CRDVELCOMP_GROUP_MAX)
// laserCh:激光通道号
MTN_API short  __stdcall OEM_LaserCrdVelCompOnOff(HAND devHandle, short crdNo,short onOff,short group,short laserCh);

// 启用或关闭速度补偿功能,缓冲区指令
// onOff：启用或关闭，0：关闭补偿功能，1：启用补偿功能
// group:补偿表格的序号，取值范围[0,LASER_CRDVELCOMP_GROUP_MAX)
// laserCh:激光通道号
MTN_API short  __stdcall OEM_CrdBufLaserCrdVelCompOnOff( HAND crdHandle,long segNo,short onOff,short group,short laserCh);

// 读取单轴急停DI的触发状态
// pTrigSts:是否触发，1表示已经触发。NMC_MtSetEstopDIMask/NMC_MtSetEstopDI指令会复位触发状态。
// pTrigIndex:本次触发的di序号。NMC_MtSetEstopDIMask/NMC_MtSetEstopDI指令会复位触发状态。
MTN_API short  __stdcall OEM_MtGetEstopDITrigSts(HAND axisHandle, short *pTrigSts ,short *pTrigIndex);

// 缓冲区启动单轴PTP二段速运动
// segNo:段号
// axisNo：轴号，取值[0,n),非坐标系内轴
// tgtPos：目标位置
// blockEn:0:非阻塞非同步，1：阻塞
// 二段速的参数参考TPtpTwoStagePrm定义
MTN_API short __stdcall OEM_CrdBufSetPtpTwoStage(HAND crdHandle, long segNo,short axisNo,long tgtPos,short inType,
			short inIndex,short inTrigLevel,short action,double prm1,double prm2,double prm3,double prm4,short blockEn);

// 缓冲区单轴移动参数设置
// segNo:段号
// axisNo：轴号,[0,n]
// vel:运动速度
// acc:运动加速度
// dec:运动减加速度
// velS:运动启动速度
// velE:运动终点速度
// smoothCoef:平滑系数
MTN_API short __stdcall OEM_CrdBufSetPtpMoveParaEx(HAND crdHandle, long segNo,short axisNo,double vel,double acc,double dec,double velS,double velE,short soomthCoef);




///////////////////////////////////////////// UART
//奇偶校验位选项
#define UART_PARITY_N                       0		// 无校验
#define UART_PARITY_O                       1		// 奇校验
#define UART_PARITY_E                       2		// 偶校验

//停止位
#define UART_STOP_BITS_10                   0		// 停止位为1
#define UART_STOP_BITS_15                   1		// 停止位为1.5
#define UART_STOP_BITS_20                   2		// 停止位为2

typedef struct
{
	long baudrate;			// 波特率
	short mode;				// 端口的工作模式:0:默认，扩展模块工作模式，1:自由协议模式
	short dataBits;			// 数据位,取值范围[7,8]
	short stopBits;			// 停止位,取值范围[0,2]，参考宏定义，如UART_STOP_BITS_10等
	short parity;			// 校验方式，如UART_PARITY_N等
	short rxBufLen;			// 接收缓存长度，默认128
	short txBufLen;			// 发送缓存长度，默认128
	short reserved[4];		// 保留
}TUartPara;		

// 配置Uart端口在自由模式下的通讯参数
// pParam:参数
// ch:保留，请写0
MTN_API short __stdcall OEM_DevUartSetPara( HAND devHandle, TUartPara  *pParam,short ch);

// 获取Uart端口的参数
MTN_API short __stdcall OEM_DevUartGetPara( HAND devHandle, TUartPara  *pParam,short ch);

// 打开或关闭UART
// onOff:0：关闭，1：打开
// ch:保留，请写0
MTN_API short __stdcall OEM_DevUartOnOff( HAND devHandle, short onOff,short ch );

// 读Uart端口
// onOff:0：关闭，1：打开
// pBuf:读数据接收缓存区
// readLen:需要读取的数据长度，byte,一次最多读256字节
// retLen:实际读到的数据长度，byte
// ch:保留，请写0
MTN_API short __stdcall OEM_DevUartRead( HAND devHandle, void *pBuf,short readLen,short *retLen ,short ch);

// 写Uart端口
// onOff:0：关闭，1：打开
// pBuf:写数据
// writeLen:写的数据长度，byte,一次最多写256字节
// writedLen:实际写出的数据长度，byte
// ch:保留，请写0
MTN_API short __stdcall OEM_DevUartWrite( HAND devHandle, void *pBuf,short writeLen,short *writedLen ,short ch);

// 清除接收缓存
MTN_API short __stdcall OEM_DevUartClrRx( HAND devHandle,short ch);

// 获取当前串口收到的数据长度
// pOnOff:打开状态
// pLen:缓存的数据长度
// ch:保留，请写0
MTN_API short __stdcall OEM_DevUartGetRxLen( HAND devHandle,short *pOnOff,long *pLen,short ch);

// 带减速度的单轴停止功能,
// dec:减速度,单位：pulse/ms^2
// 注意：1.仅对PTP及Jog运动有效，对于其他运动模式，等同于NMC_MtStop
//       2.如果指定的减速度太小，则自动按照合适的减速度减速为0
MTN_API short __stdcall OEM_MtStopEx( HAND axisHandle,double dec);





#ifdef __cplusplus
}
#endif






#endif	// _H_MTN_LIB20_OEM_H_
