///******************************************************************
// Moudle Name  :   gc_scpt_itf.h
// Abstract     :   高川脚本用户接口库函数 
// Note         :   1.结构体定义中所有的‘reservedxxx’的成员都是保留参数，请不要修改他们
//					2.无特别说明，所有API返回RTN_CMD_SUCCESS（即0值）表示执行成功，其他则表示错误代码	
// Modification History :
///******************************************************************
#pragma once

// 接口宏
#define SCPT_API	extern "C" int __stdcall

// 最大允许的实例数
#define MAX_INSTANCE 8

// Scpt初始化
// idx:实例序号，取值范围[0,MAX_INSTANCE]
// devIdx:控制器编号，取值范围[0,n]
// runtimeMode:运行模式，0：下位机模式，1：上位机模式
// commTimeOuts : 通讯超时，单位：ms
// commReties : 通讯重试次数
SCPT_API ScptItf_Init(int idx, int devIdx,int runtimeMode, int commTimeOuts, int commReties);

// Scpt初始化
// idx:实例序号，取值范围[0,MAX_INSTANCE]
// hDev:控制器句柄，用户通过NMC_DevOpen等获取
// runtimeMode:运行模式，0：下位机模式，1：上位机模式
// commTimeOuts : 通讯超时，单位：ms
// commReties : 通讯重试次数
SCPT_API ScptItf_InitByHandle(int idx, unsigned short hDev, int runtimeMode, int commTimeOuts, int commReties);

// 下载运行文件
// idx:实例序号，取值范围[0,MAX_INSTANCE]
// autoRun:1下载的工程将自动配置未自动运行，0：不会自动运行
// binFileName:运行文件路径
SCPT_API ScptItf_Download(int idx, char *binFileName, short autoRun);

// 下载运行文件(带上传密码)
// idx:实例序号，取值范围[0,MAX_INSTANCE]
// autoRun:1下载的工程将自动配置未自动运行，0：不会自动运行
// binFileName:运行文件路径
// pUploadPassword:上传密码，字符串长度0~15个字节
SCPT_API ScptItf_DownloadEx(int idx, char *binFileName, short autoRun,char *pUploadPassword);

// 配置上电自启动
// idx:实例序号，取值范围[0,MAX_INSTANCE]
// autoRunEn:是否自启动，1：开机自启动，0：开机不自启动
// autoRunDisGPIIndex: 开机自启动跳过DI（开机时，此di有输入，则跳过自启动）, 取值范围[0, 16]，0表示不设置该选项，
// otherFlag:保留，请设为0
SCPT_API ScptItf_CfgAutoRun(int idx, short autoRunEn, short autoRunDisGPIIndex,short otherFlag);

// 运行控制字
#define RUN_CTRL_RUN        1		// 启动运行
#define RUN_CTRL_STOP       2		// 停止运行
#define RUN_CTRL_PAUSE      3		// 暂停
#define RUN_CTRL_HOME       4		// 回零
#define RUN_CTRL_EMG        5		// 急停
#define RUN_CTRL_RESET      6		// 复位控制器
#define RUN_CTRL_CLR		7		// 清除错误状态

// 运行控制
// idx:实例序号，取值范围[0,MAX_INSTANCE]
// flag:运行控制字
SCPT_API ScptItf_RunControl(int idx, int flag);

// run state
#define Run_State_None	0
#define Run_State_Stop	1
#define Run_State_Run	2
#define Run_State_Err	3
#define Run_State_Pause	4

// 控制器状态
#define RS_MAX_AXIS_NUM 16
typedef struct TScptStsUser
{
    // controller status
    float axisPos[RS_MAX_AXIS_NUM];		// 电机位置
    float encPos[RS_MAX_AXIS_NUM];
    short axisSts[RS_MAX_AXIS_NUM];		// 电机状态
    short motionIO[RS_MAX_AXIS_NUM];		// 专用IO状态
    long di1;						// 数字量输入组1的状态
    long di2;						// 数字量输入组2的状态
    long do1;						// 数字量输出组1的状态
    long do2;						// 数字量输出组3的状态

    // run status
    short runState;         //脚本runtime的运行状态
    short errCode;          // 错误代码
    short bitFlag;          //标志位，是否回零、是否配置等
    short currentLine;	    //当前运行的行号
    short errLine;		    // 当前出错的行号
    short watchVLen;	    // watch变量值的长度
    short outputLen;	    // output的长度
    short reserve;
    char data[512];
}TScptStsUser;

// 读取状态
// idx:实例序号，取值范围[0,MAX_INSTANCE]
SCPT_API ScptItf_GetStatus(int idx, TScptStsUser *pSts);

// 读用户变量
// idx:实例序号，取值范围[0,MAX_INSTANCE]
// varType	变量类型，0 : double, 1 : float, 2 : Int32, 3 : Int16
// varIdx	变量序号, 取值范围[1, max]
// val	读回的数值
SCPT_API ScptItf_UserVarRead(int idx, short varType, short varIdx, double *val);

// 写用户变量
SCPT_API ScptItf_UserVarWrite(int idx, short varType, short varIdx, double val);

// 读用户变量(多个)
// count:读取的变量数量
// val:存入地址指针
// 注意：数据总长度不能超过960个字节
SCPT_API ScptItf_UserVarReadEx(int idx, short varType, short varIdx, short count, void *val);

// 写用户变量(多个)
// count:写入的变量数量，
// val:数据来源指针,注意：这个指针要根据实际的数据类型来定义
// 比如，如果写Int16区域，则应该定义Int16的数据或者数组，然后传入该数据或数组的地址
// 注意：数据总长度不能超过960个字节
SCPT_API ScptItf_UserVarWriteEx(int idx, short varType, short varIdx, short count, void *val);


// 任务运行状态
#define TASK_RUN_STS_DIS	-1		// not active
#define TASK_RUN_STS_STOP	0		// stopped
#define TASK_RUN_STS_RUN	1		// running
#define TASK_RUN_STS_ERR	2		// error

typedef struct TScptTaskSts
{
	short runState;         // 脚本runtime的运行状态，如上宏定义
	short errCode;          // 错误代码
	long  runLine;			// 运行行数
	short reserved[4];		// 保留
}TScptTaskSts;

// 获取任务运行状态
// taskIdx:任务变化，取值范围[0,8)
// pSts:指定任务的状态
SCPT_API ScptItf_GetTaskSts(int idx, short taskIdx, TScptTaskSts *pSts);

// 设置全局变量的数值()
// pVarName:全局变量名，不区分大小写
// value:要设置的数值
SCPT_API ScptItf_SetGlobalNumVarValue(int idx, char *pVarName, double value);

// 获取全局变量的数值
// pVarName:全局变量名，不区分大小写
// pValue: 当前变量的数值
SCPT_API ScptItf_GetGlobalNumVarValue(int idx, char *pVarName, double *pValue);

// 带掩码的启动运行接口
// taskMask:需要运行的任务掩码
SCPT_API ScptItf_RunEx(int idx, int taskMask);

// 带掩码的暂停运行接口
// taskMask:需要暂停的任务掩码
SCPT_API ScptItf_PauseEx(int idx, int taskMask);

// 带掩码的暂停恢复运行接口
// taskMask:需要恢复的任务掩码
SCPT_API ScptItf_ResumeEx(int idx, int taskMask);

// 带掩码的停止任务
// taskMask:需要停止的任务掩码
SCPT_API ScptItf_StopTaskMask(int idx, int taskMask);


