#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   : mtn_lib提供封装好的回零API，这里演示为如何使用回零API；如果用户特殊，
*				  也可以通过mtn_lib的捕获功能实现回零过程。
* Date			: 2022年8月3日
* Auther		: LWH
******************************************************************/
short gc_example(void)
{	
	short rtn;					// 指令返回值
	short devNum;				// 设备序号，从0开始
	short axisNum;				// 轴号，从0开始
	HAND devHandle;				// 设备句柄
	HAND axisHandle;			// 轴句柄
	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);

	THomeSetting homeSetup;			// 回零参数设置(根据自身机构特点配置)
	homeSetup.mode = HM_MODE1;		// 回零模式(HM_MODE1单原点回零)
	homeSetup.dir = 0;				// 搜寻零点方向（必须）, 0:负向,1：正向,其它值无意义
	homeSetup.offset = 0;			// 原点偏移
	homeSetup.scan1stVel = 5;		// 基本搜寻速度
	homeSetup.scan2ndVel = 0;		// 二次回零时使用，低速(建议小于10p/ms)，与参数reScanEn一起使用
	homeSetup.acc = 0.5;			// 加速度
	homeSetup.reScanEn = 0;			// 二次搜寻零点，与参数scan2ndVel一起使用
	homeSetup.homeEdge = 0;			// 原点，触发沿,下降沿
	homeSetup.lmtEdge = 0;			// 限位,触发沿(默认下降沿)
	homeSetup.zEdge = 0;			// Z相位,触发沿(默认下降沿)
	homeSetup.iniRetPos = 0;		// 起始反向运动距离（可选,不用时设为0）
	homeSetup.retSwOffset = 0;		// 反向运动时离开开关距离（可选,不用时设为0）
	homeSetup.safeLen = 0;			// 安全距离,回零时最远搜寻距离（可选,不用时设为0,不限制距离）
	homeSetup.usePreSetPtpPara = 0;	//当usePreSetPtpPara=0时，回零运动的
									//减加速度默认等于acc,起跳速度、终点速度、平滑系数默认为0
	rtn = NMC_MtSetHomePara(axisHandle, &homeSetup);	// 设置回零参数
	gc_rtn_error(rtn);
	rtn = NMC_MtHome(axisHandle);	// 启动回零
	gc_rtn_error(rtn);
	/****************************** 查询回零过程 ****************************/
	short homeSts;
	while (true)
	{
		rtn = NMC_MtGetHomeSts(axisHandle, &homeSts);	//读取回零状态
		gc_rtn_error(rtn);
		if ((homeSts & BIT_AXHOME_OK) != 0)
		{
			break;						// 对应轴原点信号被触发，回零完成
		}
		if (((homeSts & BIT_AXHOME_FAIL) != 0)
			|| ((homeSts & BIT_AXHOME_ERR_MV) != 0)
			|| ((homeSts & BIT_AXHOME_ERR_SWT) != 0))
		{
			return 1;					// 回零过程出现错误
		}
	}
	return rtn;
}