#include "GCMotion.h"
#include "windows.h"

using namespace System;
using namespace System::Windows::Forms;

/*****************************************************************
* Function Name : 指令返回值
* Description   : 返回错误值 rtn
* Date			: 2022年8月3日
* Auther		: LWH
******************************************************************/
short gc_rtn_error(short rtn)
{
	if (rtn != RTN_CMD_SUCCESS) {
		return rtn;		// 指令执行错误
	}
}

/*****************************************************************
* Function Name : 位置比较例程(一维)
* Description   : 略
* Date			: 2022年8月3日
* Auther		: LWH
******************************************************************/
short gc_example_comp_linear3(void)
{
	short rtn;					// 指令返回值
	short devNum;				// 设备序号，从0开始
	short axisNum;				// 轴号，从0开始
	HAND devHandle;				// 设备句柄
	HAND axisHandle;			// 轴句柄
	HAND crdHandle;				// 坐标系句柄
	rtn = NMC_DevOpen(devNum, &devHandle);				//打开控制器
	gc_rtn_error(rtn);
	rtn = NMC_MtOpen(devHandle, axisNum, &axisHandle);	//打开轴,并获得轴句柄
	gc_rtn_error(rtn);
	rtn = NMC_MtSetSvOn(axisHandle);					//打开轴使能(根据实际情况使用)
	gc_rtn_error(rtn);

	short ch = 0;
	long startPos[2] = { 1000,1000 };
	short dataCount = 11;
	TCompXDimensParam cmdXDPrm;
	memset(&cmdXDPrm, 0, sizeof(TCompXDimensParam));
	cmdXDPrm.dimens = 1;			// 一维
	cmdXDPrm.axMask = 0x2;			// 轴为第二轴
	cmdXDPrm.src = 0;				// 位置源为规划位置
	cmdXDPrm.outCnts = 3;			// 一路
	cmdXDPrm.outIndex[0] = 0;		// 输出通道1的序号为DO0
	cmdXDPrm.outIndex[1] = 1;		// 输出通道2的序号为DO1
	cmdXDPrm.outIndex[2] = 2;		// 输出通道2的序号为DO2
	cmdXDPrm.outType[0] = 0;		// 输出类型为脉冲方式
	cmdXDPrm.outType[1] = 0;
	cmdXDPrm.outChnType[0] = 0;		// 输出IO类型为通用输出
	cmdXDPrm.outChnType[1] = 0;
	cmdXDPrm.outStLevel[0] = 1;
	cmdXDPrm.outStLevel[1] = 1;
	cmdXDPrm.outStLevel[2] = 1;
	cmdXDPrm.outGateTime[0] = 250;	// 脉冲宽度为1000毫秒
	cmdXDPrm.outGateTime[1] = 350;	// 脉冲宽度为500毫秒
	cmdXDPrm.outGateTime[2] = 350;	// 脉冲宽度为500毫秒
	cmdXDPrm.errZone = 50;			// 容差半径为50个脉冲
	rtn = NMC_CompXDimensSetParam(devHandle, &cmdXDPrm, ch);	// 参数设置
	gc_rtn_error(rtn);
	int _2dPos[1024];											// 位置数据设置
	for (int i = 0; i < 50; i++)
	{
		_2dPos[i] = (i + 1) * 1000 + 100;
	}
	rtn = NMC_CompXDimensSetData(devHandle, (long*)_2dPos, dataCount, ch);
	gc_rtn_error(rtn);
	rtn = NMC_CompXDimensSetCmpOutMode(devHandle, 1, ch);		// 输出模式：轮循输出模式
	gc_rtn_error(rtn);
	rtn = NMC_CompXDimensOnoff(devHandle, 1, ch);				// 启动输出
	gc_rtn_error(rtn);
	// 启动第一个轴的运动后（启动第二轴或者坐标系先这两个轴的插补也是一样），gate信号有信号输出
	NMC_MtOpen(devHandle, 1, &axisHandle);
	rtn = NMC_MtMovePtpAbs(axisHandle, 1, 1, 0, 0, 5, 0, 100000);
	gc_rtn_error(rtn);
	return rtn;
}