#include "GCMotion.h"
#include "string.h"
#include <windows.h>
#include <math.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) {
		MessageBox::Show(Convert::ToString(rtn));
		return rtn;		// 指令执行错误
	}
}

/*****************************************************************
* Function Name : 数据采集例程
* Description   : 略
* Date			: 2022年8月3日
* Auther		: LWH
******************************************************************/
short gc_example(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);

	unsigned long addr[8];
	short len[8];
	rtn = NMC_CollectOnOff(devHandle, 0);					//关闭采集
	gc_rtn_error(rtn);
	rtn = NMC_ClearCollectSts(devHandle);					//清除采集状态
	gc_rtn_error(rtn);
	//读取采集变量地址，采集轴规划位置和命令速度
	rtn = NMC_GetCollectDataAddr(devHandle, 0, COLLECT_ADDRESS_PRF_POS, &addr[0], &len[0]);
	gc_rtn_error(rtn);
	rtn = NMC_GetCollectDataAddr(devHandle, 0, COLLECT_ADDRESS_CMD_VEL, &addr[1], &len[1]);
	gc_rtn_error(rtn);
	TCollectCfg g_cltCfg;
	memset(&g_cltCfg, 0, sizeof(TCollectCfg));
	//采集两个数据，间隔ms
	g_cltCfg.count = 2;
	g_cltCfg.interval = 0;
	g_cltCfg.address[0] = addr[0];
	g_cltCfg.length[0] = len[0];
	g_cltCfg.address[1] = addr[1];
	g_cltCfg.length[1] = len[1];
	TCollectTrig cltTrig;
	memset(&cltTrig, 0, sizeof(TCollectTrig));
	cltTrig.mode = COLLECT_MODE_NONE;
	rtn = NMC_ConfigCollect(devHandle, &g_cltCfg, &cltTrig);		//采集模式无条件采集
	gc_rtn_error(rtn);
	rtn = NMC_CollectOnOff(devHandle, 1);							// 开始采集
	gc_rtn_error(rtn);
	rtn = NMC_MtMovePtpAbs(axisHandle, 1, 1, 0, 0, 10, 0, 10000);	//启用一个PTP运动
	gc_rtn_error(rtn);
	short cltSts;
	long dataLen;
	short axisSts;
	short getLen;
	double data[8192];
	while (1)
	{
		rtn = NMC_MtGetSts(axisHandle, &axisSts);
		gc_rtn_error(rtn);
		if ((axisSts & BIT_AXIS_BUSY) != BIT_AXIS_BUSY)
		{
			break;
		}
		_sleep(10);
	}
	rtn = NMC_CollectOnOff(devHandle, 0);// 运动停止关闭采集
	gc_rtn_error(rtn);
	getLen = 0;
	rtn = NMC_GetCollectSts(devHandle, &cltSts, &dataLen);//读取采集的数据量
	gc_rtn_error(rtn);
	short count = dataLen / 1440;
	//一次最多读取个字节超过需要分次读取
	for (int i = 0; i < count; i++)
	{
		rtn = NMC_GetCollectData(devHandle, 1440, (unsigned char*)(data + i * 180));
		gc_rtn_error(rtn);
	}
	rtn = NMC_GetCollectData(devHandle, dataLen % 1440, (unsigned char*)(data + count * 180));
	gc_rtn_error(rtn);

	return 0; 
}
