#pragma once


#ifndef SECS_PORT_EXTERN
#define SECS_PORT_EXTERN

// 使用C++ Builder 编译器
// #define __CPP_BUILDER__
#ifdef __CPP_BUILDER__
#define SECS_DLLEXPORT
#endif


// 定义导出宏定义
#ifdef SECS_DLLEXPORT
#define SP_DLLEXPORT __declspec(dllexport)
#else
#define SP_DLLEXPORT __declspec(dllimport)
#endif

#ifdef __cplusplus
#   define SP_EXTERN extern "C" SP_DLLEXPORT
#else
#   define SP_EXTERN extern SP_DLLEXPORT
#endif

#ifndef CALL_TYPE
#define STDCALL
#ifdef STDCALL
#define CALL_TYPE	__stdcall
#else
#define CALL_TYPE	__cdecl
#endif
#endif

/* IMC指针 */
#ifdef SECS_PORT_BUILD
typedef class CSecsPort300Ex* IMCHandle;
#else
typedef void* IMCHandle;
#endif

// 适应不同编译器:VC6,VS2010,VS2015	
// 适应 c\c++\c#\vb

typedef unsigned __int8					u8;	
typedef unsigned __int16				u16;	
typedef unsigned __int32				u32;	
typedef unsigned __int64				u64;	

typedef signed __int8					int8;	
typedef signed __int16					int16;	
typedef signed __int32					int32;	
typedef signed __int64					int64;	

typedef unsigned char					uchar;
/* 统一使用int64 64位整形，兼容x64,x86*/

enum LOCKER_TYPE
{
	eLocker=0,
};

// 定义授权
// 产品类型
#define JNG_PRODUCT_NOT_EXIST					0		// 不存在产品类型
#define JNG_PRODUCT_SECS_DRIVER					1001	// SECS Driver 版本
#define JNG_PRODUCT_SECS_GEM_DEMO				1010	// SECS/GEM demo 版本
#define JNG_PRODUCT_SECS_GEM_DATA				1011	// SECS/GEM 数据版,仅读数据(终端数据采集)
#define JNG_PRODUCT_SECS_GEM_STANDRAD			1020	// SECS/GEM 标准版
#define JNG_PRODUCT_SECS_GEM_PREMINUM			1030	// SECS/GEM 高级版
#define JNG_PRODUCT_SECS_GEM_300MM				1100	// SECS/GEM 300 通讯


/*
** 定义回调事件处理
*/
/* 这是 Connected() 事件
** 发生在成功初始化后
*/
typedef void (IMCConnectedProc) (IMCHandle);

/* 
** 与服务器断开通讯时发生
*/
typedef void (IMCDisconnectedProc) (IMCHandle);

/* 错误处理
*/
typedef void (IMCErrorProc) (IMCHandle, int64 errnum, const char *text);

/* 断开通讯
*/
typedef void (IMCShutdownProc) (IMCHandle, int64 *StayAlive); 

/* 
** 追溯功能
** 出错或者关键步骤通知
*/
typedef void (IMCTraceLogProc) (IMCHandle, int64 nCode, const char* pText);

// pDestination ：消息发送目的地
// Data ： 数据
// ClientData : 客户传进来的参数
typedef void (WhenProc) (IMCHandle imc, const char* pDestinationMailbox, const char *pReplyMailbox, 
	const char *Data, void *ClientData);

// SECS消息接收处理
typedef void (SecsMessageReceiveProc)(IMCHandle *, int64 stream, int64 function, bool send_reply, 
	int64 transactionID, const char* TSN_data, const char* header, void *clientData);


typedef void (IMCStateChangeProc)(IMCHandle, const char* pType, __int64 nState);				// 状态改变
typedef void (IMCTerminalProc)(IMCHandle, __int64 nTid, __int64 nSize, const char* pText);		// 终端消息
typedef void (IMCRemoteProc)(IMCHandle, const char* pText, const char** pName, const char** pValue, __int64 pCount);	// 远程命令							// 远程控制


/* 构造一个连接对象 */
/* guname: 全局唯一名称 */
SP_EXTERN IMCHandle imc_new();


/* 断开一个连接（如果需要断开连接）和释放资源 */
SP_EXTERN void imc_destroy(IMCHandle handle);

/* 设置输出语言信息 */
/* pHandle可以为空 */ 
SP_EXTERN void imc_language(IMCHandle pHandle, int64 nType);

/* 开始 */
SP_EXTERN int64 imc_start(IMCHandle handle, const char* pServerAddr, int64 nPort);

/* 停止 */
SP_EXTERN void imc_stop(IMCHandle handle);

/* 禁用/启用SECS */
SP_EXTERN void imc_secsEnable(IMCHandle handle, bool bEnable);


// 启用通信
SP_EXTERN int64 imc_communicationEnable(IMCHandle handle);

// 关闭通信
SP_EXTERN int64 imc_communicationDisable(IMCHandle handle);

// 通讯是否启用
SP_EXTERN int64 imc_communicationIsEnable(IMCHandle handle, bool &bEnable);

// 通信状态获取
SP_EXTERN int64 imc_getCommunicationState(IMCHandle handle, int64& nState);

// 加载Csv文件数据
// pFileDir 为空则认为在配置目录中
SP_EXTERN int64 imc_loadDataByCsvFile(IMCHandle pHandle, const char* pFileDir);

// 加载SECS配置
SP_EXTERN int64 imc_loadSecsConfig(IMCHandle pHandle, const char* pFileDir);

// 添加处理对象
SP_EXTERN int64 imc_messageTypeAdd(IMCHandle, int64 stream, int64 function, SecsMessageReceiveProc* pCallback, void* pClientData);

// 删除处理对象
SP_EXTERN void imc_messageTypeRemote(IMCHandle, int64 stream, int64 function);

// 处理指定返回的消息
SP_EXTERN int64 imc_wheneverAdd(IMCHandle, const char* receiveMailbox, WhenProc* whenmsgProc, void* clientData = NULL);

// 移除处理
SP_EXTERN void imc_wheneverRemove(IMCHandle, const char* receiveMailbox);

// 答复同步消息
SP_EXTERN int64 imc_relpy(IMCHandle, const char* receiveMailbox, const char* data);

// 获取授权数据点的数量
SP_EXTERN int64 imc_getLicenseLevel(__int32& nLevel);				// 获取许可授权级别
SP_EXTERN int64 imc_getMaxRunCount(__int32& nCount);				// 获取允许运行个数
SP_EXTERN int64 imc_getMaxRunDataPoint(__int32& nDataPoint);		// 获取允许运行数据点(变量、事件、警报分别计算)



/* 你能够设置一个值，在事件回调的时候，将会附带该值*/
SP_EXTERN void* imc_getClientData(IMCHandle);
SP_EXTERN void* imc_setClientData(IMCHandle, void* pClientData);


/* 设置回调方法 */
SP_EXTERN void imc_setConnectedProc(IMCHandle, IMCConnectedProc *);
SP_EXTERN void imc_setDisconnectedProc(IMCHandle, IMCDisconnectedProc *);
SP_EXTERN void imc_setErrorProc(IMCHandle, IMCErrorProc *);				
SP_EXTERN void imc_setShutdownProc(IMCHandle, IMCShutdownProc *);
SP_EXTERN void imc_setTraceProc(IMCHandle, IMCTraceLogProc*);				

// 回调 
SP_EXTERN void imc_setStateChangeProc(IMCHandle, IMCStateChangeProc*);				
SP_EXTERN void imc_setTerminalProc(IMCHandle, IMCTerminalProc*);	
SP_EXTERN void imc_setRemoteProc(IMCHandle, IMCRemoteProc*);	

// 获取追溯设置类型
// 返回当前值
SP_EXTERN void imc_enableTrace(IMCHandle, bool bEnable);	


// 设置超时时间
// pTx代表 "T1","T2" ... "T8"
SP_EXTERN int64 imc_setTn(IMCHandle, const char* pTn, int64 nTimeout);	

// 设置参数，
// list列举出来
SP_EXTERN int64 imc_setParameter(IMCHandle, const char** type, const char** param, int64 nCount);	

// 设置超时时间
// 0: OFF-LINE
// 1: ON-LINE LOCAL
// 2: ON-LINE REMOTE
SP_EXTERN int64 imc_setControlMode(IMCHandle, int64 nControlMode);	
SP_EXTERN int64 imc_setControlModeForce(IMCHandle, int64 nControlMode);	

// 获取控制状态, 分为5种
SP_EXTERN int64 imc_getControlState(IMCHandle, int64& nControlState);

// 主动请求在线
SP_EXTERN int64 imc_activeRequestOnline(IMCHandle);


// 获取代码的错误信息
SP_EXTERN char* imc_GetErrorByCode(int64 nCode);	

/////////////////////////////////////////////////////////////////////
// 报警操作

// 添加报警
SP_EXTERN int64 imc_alarmAdd(IMCHandle, int64 nALID, const char* pALTX, int64 nAlarmSetCEID, int64 nAlarmClearCEID, 
	bool bEnable, int64 nCategory, bool bAddEvent);	

// 启用报警
SP_EXTERN int64 imc_alarmEnable(IMCHandle, int64 nALID, bool bEnable);	
SP_EXTERN int64 imc_alarmEnableByName(IMCHandle, const char* pALTX, bool bEnable);	

// 设置报警
SP_EXTERN int64 imc_alarmSet(IMCHandle, int64 nALID, bool bSet);	
SP_EXTERN int64 imc_alarmSetByName(IMCHandle, const char* pALTX, bool bSet);		// 设置报警：通过名称识别 
SP_EXTERN int64 imc_alarmSetAll(IMCHandle, bool bSet);	

// 警报发生后，事件通知方式	
SP_EXTERN __int64 imc_alarmNotifyEventMode(IMCHandle, __int64 nMode);		

// 获取报警列表
SP_EXTERN char* imc_alarmGetList(IMCHandle);	


/////////////////////////////////////////////////////////////////////
// 变量操作

// 变量增加
SP_EXTERN int64 imc_variableAdd(IMCHandle pHandle, int64 varID, const char* varName, const char* description, 
	const char* valueType, const char* initValue, const char* units, const char* varClass);

// 设置变量新值           
SP_EXTERN int64 imc_variableSet(IMCHandle pHandle, int64 varID, const char* newValue);
SP_EXTERN int64 imc_variableSetByName(IMCHandle pHandle, const char* varName, const char* newValue);


// 获取变量的值 
// 失败值为空
// 值需要释放
SP_EXTERN char* imc_variableGet(IMCHandle pHandle, int64 varID);

// 获取变量信息列表
// 失败值为空
// 值需要释放
SP_EXTERN char* imc_variableGetList(IMCHandle pHandle);

// 设置处理方法    
SP_EXTERN int64 imc_variableSetMethod(IMCHandle pHandle, int64 varID, bool enable);


/////////////////////////////////////////////////////////////////////

// 常量数值获取
// 常量获取
// 失败值为空
// 值需要释放
SP_EXTERN int64 imc_constantsGet(IMCHandle pHandle, int64 nECID, char** pValue);

// 常量设置
SP_EXTERN int64 imc_constantsSet(IMCHandle pHandle, int64 nECID, const char* newValue);

// 添加常量
SP_EXTERN int64 imc_constantsAdd(IMCHandle pHandle, int64 nECID, const char* name, const char* description,
	const char* Type, const char* Units, const char* MinValue, const char* MaxValue, const char* DefValue);

// 常量信息获取
// 常量获取
// 失败值为空
// 值需要释放
SP_EXTERN int64 imc_constantsInfoGet(IMCHandle pHandle, char** pValue);


// 设置处理方法    
SP_EXTERN int64 imc_constantsSetMethod(IMCHandle pHandle, int64 nECID, bool enable);


// 启用/禁用常量改变发送事件
SP_EXTERN int64 imc_constantChangeSendEventEnable(IMCHandle pHandle, bool bEnable);		


/////////////////////////////////////////////////////////////////////
// 事件操作

// 事件添加
SP_EXTERN int64 imc_eventAdd(IMCHandle pHandle, int64 CEID, const char* description, const char* eventName, bool bEnable);

// 事件发送:CEID
SP_EXTERN int64 imc_eventPos(IMCHandle pHandle, int64 CEID, bool bWaitReply);

// 事件发送： 事件名称
SP_EXTERN int64 imc_eventPosByName(IMCHandle pHandle, const char* EventName, bool bWaitReply);

// 事件启用/禁用
SP_EXTERN int64 imc_eventEnable(IMCHandle pHandle, int64 CEID, bool bEnable);

// 事件查询启用/禁用
SP_EXTERN int64 imc_eventIsEnable(IMCHandle pHandle, int64 CEID, bool& bEnable);

// 获取全部事件数据列表
// 失败值为空
// 值需要释放
SP_EXTERN char* imc_eventGetList(IMCHandle pHandle);

// event dvval 映射,通过名称
SP_EXTERN int64 imc_eventDvvalByName(IMCHandle pHandle, const char* pEventName, const char* pDvvalNameList);

// event dvval 映射
SP_EXTERN int64 imc_eventDvval(IMCHandle pHandle, int64 nCEID, const char* pDvvalList);

// 事件S6,F3发送:CEID	
SP_EXTERN int64 imc_eventDiscreteVarPos(IMCHandle pHandle, int64 nCEID, bool bWait);	

//报告

// 事件-报表关联
SP_EXTERN int64 imc_eventReportLink(IMCHandle pHandle, int64 nECID, const char* report);				

// 事件-报表取消关联
SP_EXTERN int64 imc_eventReportUnlink(IMCHandle pHandle, int64 nECID);									

// 报表定义
SP_EXTERN int64 imc_reportDefine(IMCHandle pHandle, int64 rptID, const char* varID);			

// 获取报表定义
SP_EXTERN int64 imc_reportDefineGet(IMCHandle pHandle, int64 rptID, char** varID);			

// 删除报表
SP_EXTERN int64 imc_reportDelete(IMCHandle pHandle, int64 rptID);			

// 清除报表所有与之相关的事件
SP_EXTERN int64 imc_reportUnlink(IMCHandle pHandle, int64 rptID);					

// 清除所有报告定义，并且清除所有事件与报告之间的并联
SP_EXTERN int64 imc_reportClear(IMCHandle pHandle);		

// 报告严格按照标准规范处理：E5标准的处理及返回值
SP_EXTERN __int64 imc_reportStrictlyFollowStandard(IMCHandle pHandle, bool bFollow);						

// 报告保存服务器配置到本地
SP_EXTERN __int64 imc_reportAutoSaveHostLinkConfig(IMCHandle pHandle, bool bEnable);						


/////////////////////////////////////////////////////////////////////
// 时间同步

// 主动请求主机时间进行同步
SP_EXTERN int64 imc_hostTimeSynchronizeRequest(IMCHandle pHandle);


/////////////////////////////////////////////////////////////////////
// 终端操作

// 发送单一终端消息
// 返回错误代码
SP_EXTERN int64 imc_sendSingleTerminal(IMCHandle pHandle, const char* content);

/////////////////////////////////////////////////////////////////////
// PP 处理程序

// 允许主机下载
SP_EXTERN int64 imc_ppAllowHostDowmload(IMCHandle pHandle, bool bAllow);

// PP处理模式
SP_EXTERN int64 imc_ppHandleMode(IMCHandle pHandle, int64 nMode);

////////
// 内置功能

// 设置程式目录
SP_EXTERN void imc_setRecipeDirectory(IMCHandle pHandle, const char* dir);

// 上传	
SP_EXTERN int64 imc_processProgramUpload(IMCHandle pHandle, const char* ppid);


// 下载
SP_EXTERN int64 imc_processProgramDownload(IMCHandle pHandle, const char* ppid);


// 设置PP是文件夹目录
SP_EXTERN int64 imc_ppIsFolderDir(IMCHandle pHandle, bool bFolder);

// 设置winrar目录
SP_EXTERN int64 imc_setWinrarPath(IMCHandle pHandle, const char* path);

// PP设置扩展名
SP_EXTERN int64 imc_ppSetFilenameExtension(IMCHandle pHandle, const char* pFileExten);


SP_EXTERN int64 imc_ppFormatAdd(IMCHandle pHandle, const char* pCmdCode, const char* pName, const char* pValueType);	// PP序列化对象添加
SP_EXTERN int64 imc_ppFormatSend(IMCHandle pHandle, const char* ppid);					// PP序列化上传
SP_EXTERN int64 imc_ppFormatRequest(IMCHandle pHandle, const char* ppid);				// PP序列化下载
SP_EXTERN int64 imc_ppFormatSetCodeMode(IMCHandle pHandle, int nMode);					// PP序列化设置模式

// wafer map

// 晶圆图上传
SP_EXTERN int64 imc_waferMapUpload(IMCHandle pHandle, const char* pWaferMap);

// 晶圆图下传请求
SP_EXTERN int64 imc_waferMapDownload(IMCHandle pHandle, const char* pRequstInfo, char** pWaferMap);

// 条带图下传请求
SP_EXTERN int64 imc_stripMapDownload(IMCHandle pHandle, const char* pRequstInfo, char** pStripMap);


///////
// 扩展型功能

/////////////////////////////////////////////////////////////////////
// 主动发送消息

// 发送一个F0终止消息
SP_EXTERN void imc_sendAbort(IMCHandle pHandle, int64 stream, int64 primaryFunction);

// 发送SECS答复
SP_EXTERN void imc_sendReply(IMCHandle pHandle, int64 stream, int64 function, int64 transactionID, const char *TSN_data);

// 发送SECS错误消息
SP_EXTERN void imc_sendS9(IMCHandle pHandle, int64 function, const char* header);

// 发送SECS消息
// 主动发送，只返回数据
SP_EXTERN int64 imc_sendSecsMsg(IMCHandle pHandle, int64 stream, int64 function, bool replyWanted, 
	const char *TSN_data, char** replyData, bool waitForReply);

// 发送SECS消息 
// 如果要接受消息，可以通过messageTypeAdd()添加，或者内置处理机制.
// nMsgID是关联ID
SP_EXTERN __int64 imc_sendSecsMsgAsync(IMCHandle pHandle, int64 stream, int64 function, 
	bool replyWanted, int64& nMsgID, const char *TSN_data = "");


/////////////////////////////////////////////////////////////////////////////////////
// 字符操作

// 输入TclList
// 成功时候返回 rc = 0
// 成功时候必须调用 imc_free释放argv
// 拆分后的列表argc, argv
//
// 返回结果：
// 0：成功
// 1：大括号中的list元素后跟非空格
// 2：引号中的list元素后跟非空格
// 3: 不匹配的开环数组
// 4: 不匹配的支撑数组
SP_EXTERN int64 imc_listSplit(const char* pList, int64* argc, char** argv[]);

// 该函数为了适应C#、JAVA等其他语言提取数据
// 返回值不需要释放
SP_EXTERN char* imc_listSplitDataGetRow(int64 row, char **argv);

// 把元素加入链表
// 需要调用imc_free()释放 
SP_EXTERN char* imc_listJoin(int64 argc, const char* argv[]);


// 需要调用imc_free()释放
SP_EXTERN char* imc_listAppend(const char* pList, const char* argv[], int64 argc);
SP_EXTERN char* imc_listAppendOne(const char *pList, const char* e1, const char* e2, const char* e3, 
	const char* e4, const char* e5, const char* e6);		// 为适应C#乱码问题


// 获取列表中第index1个元素，再从获取值获取index2个元素,再从获取值获取index3个元素
// -1 代表不起作用
// 需要调用imc_free()释放
SP_EXTERN char* imc_listElement(const char *pDataList, int64 index1, int64 index2, int64 index3);


// 开辟内存
SP_EXTERN void* imc_malloc(__int64 nSize);

// 释放内存
SP_EXTERN void imc_free(void* ptr);

///////////////////////////////////////
// 锁操作

// 创建锁
SP_EXTERN void* imc_createLocker(int64 locker_type);

// 释放锁
SP_EXTERN void imc_releaseLocker(void* pObject);

// 锁
SP_EXTERN void imc_locker(void* pObject);

// 解锁
SP_EXTERN void imc_unlocker(void* pObject);


// 其他辅助函数


// 16进制转10进制
SP_EXTERN unsigned char imc_hexToDec(char cHightHex, char cLowHex);

// 10进制转16进制
SP_EXTERN void imc_decToHex(const unsigned char nDec, char& cHightHex, char& cLowHex);

#endif




