#include "GCMotion.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_linear(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 dimens = 1;			// 一维
	short axisMask = 0x03;		//轴掩码0x3(第一个轴和第二轴)
	short src = 1;				//位置源为规划位置
	short cmpMode = 0;			//按输出数组位置比较
	double gateTime = 0.0009;	//输出的脉冲宽度
	short chn = 0;				//输出通道 目前只支持0
	rtn = NMC_LinearCompSetParam(devHandle, dimens, axisMask, src, cmpMode, gateTime, chn);
	gc_rtn_error(rtn);
	long cmpPos[100];			// 位置数组，100个单元
	for (int i = 0; i < 100; i++)
	{
		cmpPos[i] = i*1000;		// 间隔位置为1000个脉冲
	}
	long startPos[2] = { 0,0 };
	rtn = NMC_LinearCompSetData(devHandle, startPos, cmpPos, 100, 0);
	gc_rtn_error(rtn);
	rtn = NMC_LinearCompOnOff(devHandle, 1, 0);// 启动线性位置比较输出
	gc_rtn_error(rtn);
	// 启动第一个轴的运动后(启动第二轴或者坐标系先这两个轴的插补也是一样)，gate信号有信号输出
	rtn = NMC_MtMovePtpAbs(axisHandle, 1, 1, 0, 0, 5, 0, 100000);
	gc_rtn_error(rtn);
	return rtn;
}