///******************************************************************
//
// Moudle Name  :   mtn_lib20_ecat.h
// Abstract     :   GaoChuan Motion 2.0 ethercat 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_ECAT_H_
#define _H_MTN_LIB20_ECAT_H_
#include "mtn_lib20.h"

#ifdef __cplusplus
extern "C" {
#endif
 

// 启动Ethercat主站
MTN_API Int16  __stdcall NMC_EcatStart(HAND devHandle);

// 停止Ethercat主站
MTN_API Int16  __stdcall NMC_EcatStop(HAND devHandle);

// 获取当前在线的从站数量
// pSlaveCnt:从站的总数
// pDriverCnt:驱动器数量
// pIoCnt:IO类型从站数量
MTN_API Int16  __stdcall NMC_EcatGetResource(HAND devHandle,Int16 *pSlaveCnt,Int16 *pDriverCnt,Int16 *pIoCnt);


// 获取从站信息结构体
typedef struct TEcatSlvInfo
{
	UInt32 vendor_id;        //厂商ID
    UInt32 product_id;      //设备ID
	UInt16 devType;         //设备类型：1：驱动器，2：IO，3：其他
	UInt16 dcCode;          // dc码
	UInt16 txPdoCnt;        // txPdo数量
	UInt16 rxPdoCnt;        // rxPdo数量
    Int16  reserved[4];     // 保留
    #ifdef MTN_ST_INIT_EN
    TEcatSlvInfo(){
     reserved[0] = reserved[1] = reserved[2] = reserved[3] =0;
     vendor_id = 0;
     product_id = 0;
     devType = 0;
     devType = 0;
     txPdoCnt = 0;
     rxPdoCnt = 0;
    }
    #endif
}TEcatSlvInfo;
// 获取从站信息
MTN_API Int16  __stdcall NMC_EcatGetSaveInfoEx(HAND devHandle,Int16 masterIdx,Int16 slvIdx,TEcatSlvInfo *pInfo);

// 获取从站信息（用户下载的配置信息）
MTN_API Int16  __stdcall NMC_EcatGetSaveInfoEx2(HAND devHandle,Int16 masterIdx,Int16 slvIdx,TEcatSlvInfo *pInfo);

// 获取主站状态
// pSts:返回状态码
//        bit0-bit7:主站状态（取值：0x01,0x02,0x03,0x04,0x08）
//                  0x01: INIT
//                  0x02: PREOP
//                  0x03: BOOT
//                  0x04: SAFEOP
//                  0x0: OP
//        bit8-bit11:状态机步骤
MTN_API Int16  __stdcall NMC_EcatGetSts(HAND devHandle,UInt16 *pSts);

// 设置从站驱动器的工作模式，用户一般不需要调用
// mode: Control Mode : CSP:8 CSV:9  CST:10
// axisHandle:轴句柄，通过NMC_MtOpen获取，ethercat从站轴的编号从16开始
MTN_API Int16  __stdcall NMC_EcatAxisSetMode(HAND axisHandle,UInt8 mode);

// 获取从站驱动器的工作模式
// axisHandle:轴句柄，通过NMC_MtOpen获取，ethercat从站轴的编号从16开始
MTN_API Int16  __stdcall NMC_EcatAxisGetMode(HAND axisHandle,UInt8 *pMode);

// 获取从站驱动器的错误代码
// axisHandle:轴句柄，通过NMC_MtOpen获取，ethercat从站轴的编号从16开始
MTN_API Int16  __stdcall NMC_EcatAxisGetErrorCode(HAND axisHandle,UInt16 *pError);

// 获取从站驱动器的数字量输入状态
// axisHandle:轴句柄，通过NMC_MtOpen获取，ethercat从站轴的编号从16开始
MTN_API Int16  __stdcall NMC_EcatAxisGetDi(HAND axisHandle,Int32 *pDiVal);

// 获取从站驱动器的编码器
MTN_API Int16  __stdcall NMC_EcatAxisGetEncPos(HAND axisHandle,Int32 *pEncPos);

// 启动回零，回零状态可以通过NMC_MtGetHomeSts查询
// method:回零方式，根据标准，只支持402要求必须实现的，具体请参考驱动器相关的说明
// velSwitch:找原点速度command/s
// velZero:找index脉冲速度command/s
// acc:加速度command/s^2
// prmEx:保留
// axisHandle:轴句柄，通过NMC_MtOpen获取，ethercat从站轴的编号从16开始
MTN_API Int16  __stdcall NMC_EcatStartHome(HAND axisHandle,Int32 method,double velSwitch,double velZero,double acc,double prmEx);

// 获取驱动器的回零状态
MTN_API Int16  __stdcall NMC_EcatGetHomeSts(HAND axisHandle,UInt8 *pStatus);

// 终止回零 
// axisHandle:轴句柄，通过NMC_MtOpen获取，ethercat从站轴的编号从16开始
MTN_API Int16  __stdcall NMC_EcatStopHome(HAND axisHandle);

// Ethercat SDO 读
// devId:从站号
// idx:SDO的Index
// sub_idx:SDO的SubIndex
// len:数据长度
// val:数据内容
// abort_code:错误码
MTN_API Int16  __stdcall NMC_EcatSdoRead(HAND devHandle,Int16 devId,UInt16 idx, UInt8 sub_idx, UInt32 len, UInt8 *val, UInt32 *abort_code);

// Ethercat SDO 写
// devId:从站号
// idx:SDO的Index
// sub_idx:SDO的SubIndex
// len:数据长度
// val:数据内容
// abort_code:错误码
MTN_API Int16  __stdcall NMC_EcatSdoWrite(HAND devHandle,Int16 devId,UInt16 idx, UInt8 sub_idx, UInt32 len, UInt8 *val, UInt32 *abort_code);

// 下载Ethercat配置文件（配置文件通过配置工具生成）
// gmlFileName:配置工具路径
// masterIdx:主站序号，保留，写0
MTN_API Int16  __stdcall NMC_EcatLoadConfigFromFile(HAND devHandle,Int8 *gmlFileName,Int16 masterIdx);
 
// Ehercat:设置目标转矩，对应PDO序号0x6071
// slv:从轴号，取值范围[0,n)
// tgtTorque:目标转矩，参数范围及单位请参考对应的伺服驱动器手册
MTN_API Int16  __stdcall NMC_EcatAxisTorqSetTgt(HAND devHandle,Int16 slv,Int32 tgtTorque);
MTN_API Int16  __stdcall NMC_EcatAxisTorqGetTgt(HAND devHandle,Int16 slv,Int32 *pTgtTorque);

// Ehercat:设置最大转矩，对应PDO序号0x6072
// slv:从轴号，取值范围[0,n)
// maxTorque:最大转矩，参数范围及单位请参考对应的伺服驱动器手册
MTN_API Int16  __stdcall NMC_EcatAxisTorqSetMax(HAND devHandle,Int16 slv,Int32 maxTorque);
MTN_API Int16  __stdcall NMC_EcatAxisTorqGetMax(HAND devHandle,Int16 slv,Int32 *pMaxTorque);

// Ehercat:设置转矩斜坡值，对应PDO序号0x6087
// slv:从轴号，取值范围[0,n)
// torqueSlope:转矩斜坡值，参数范围及单位请参考对应的伺服驱动器手册
MTN_API Int16  __stdcall NMC_EcatAxisTorqSetSlope(HAND devHandle,Int16 slv,Int32 torqueSlope);
MTN_API Int16  __stdcall NMC_EcatAxisTorqGetSlope(HAND devHandle,Int16 slv,Int32 *pTorqueSlope);

// Ehercat:设置转矩偏移值，对应PDO序号0x60B2
// slv:从轴号，取值范围[0,n)
// torqueOffset:转矩偏移值，参数范围及单位请参考对应的伺服驱动器手册
MTN_API Int16  __stdcall NMC_EcatAxisTorqSetOffset(HAND devHandle,Int16 slv,Int32 torqueOffset);
MTN_API Int16  __stdcall NMC_EcatAxisTorqGetOffset(HAND devHandle,Int16 slv,Int32 *pTorqueOffset);

// Ehercat:设置转矩正向的限定值，对应PDO序号0x60E0
// slv:从轴号，取值范围[0,n)
// torquePosLmt:转矩正向的限定值，参数范围及单位请参考对应的伺服驱动器手册
MTN_API Int16  __stdcall NMC_EcatAxisTorqSetPosLmt(HAND devHandle,Int16 slv,Int32 torquePosLmt);
MTN_API Int16  __stdcall NMC_EcatAxisTorqGetPosLmt(HAND devHandle,Int16 slv,Int32 *pTorquePosLmt);

// Ehercat:设置转矩负向的限定值，对应PDO序号0x60E1
// slv:从轴号，取值范围[0,n)
// torquePosLmt:转矩负向的限定值，参数范围及单位请参考对应的伺服驱动器手册
MTN_API Int16  __stdcall NMC_EcatAxisTorqSetNegLmt(HAND devHandle,Int16 slv,Int32 torqueNegLmt);
MTN_API Int16  __stdcall NMC_EcatAxisTorqGetNegLmt(HAND devHandle,Int16 slv,Int32 *pTorqueNegLmt);

// Ehercat:设置伺服的最大电机速度，对应PDO序号0x6080
// slv:从轴号，取值范围[0,n)
// maxMotorVel:最大电机速度，参数范围及单位请参考对应的伺服驱动器手册
MTN_API Int16  __stdcall NMC_EcatAxisSetMaxMotorVel(HAND devHandle,Int16 slv,Int32 maxMotorVel);
MTN_API Int16  __stdcall NMC_EcatAxisGetMaxMotorVel(HAND devHandle,Int16 slv,Int32 *pMaxMotorVel);

// Ehercat:设置伺服的最大规划速度，对应PDO序号0x607F
// slv:从轴号，取值范围[0,n)
// maxPrfVel:最大规划速度，参数范围及单位请参考对应的伺服驱动器手册
MTN_API Int16  __stdcall NMC_EcatAxisSetMaxPrfVel(HAND devHandle,Int16 slv,Int32 maxPrfVel);
MTN_API Int16  __stdcall NMC_EcatAxisGetMaxPrfVel(HAND devHandle,Int16 slv,Int32 *pMaxPrfVel);


#ifdef __cplusplus
}
#endif

#endif	// _H_MTN_LIB20_ECAT_H_
