#pragma once
#include <vector>
#include <iostream>
#include <map>
#include <string>
#include <list>



// 宏定义
#define  MDLN_MAXLEN					20
#define  SOFTREV_MAXLEN					20

// 控制状态模型
enum CONTROL_MODE
{
	eCONTROL_MODE_OFFLINE = 0,				/* 离线 */
	eCONTROL_MODE_ONLINE_LOCAL,				/* 本地在线*/
	eCONTROL_MODE_ONLINE_REMOTE,			/* 远程在线*/
};

// 控制状态
enum CONTROL_STATE
{
	eCONTROL_OFFLINE_EQUIPMENT = 1,      /* 离线：设备 */
	eCONTROL_OFFLINE_ATTEMPT_ONLINE, 	 /* 离线：积极等待在线 */
	eCONTROL_OFFLINE_HOST, 				 /* 离线：主机 */
	eCONTROL_ONLINE_LOCAL,				 /* 在线：本地 */
	eCONTROL_ONLINE_REMOTE,				 /* 在线：远程 */
};

// 连接状态
enum CONNECT_STATE
{
	eCONNECT_DISCONNECT = 0,		/* 断开连接 */	
	eCONNECT_LISTEN,				/* 倾听,回调不能阻塞调用 */
	eCONNECT_CONNECT,				/* 连接上,回调不能阻塞调用 */
	eCONNECT_SELECT,				/* 选择成功 */
	eCONNECT_COMMUNICATING,			/* 通讯上 */
};

// 通讯状态
enum COMM_STATE
{
	eCOMM_DISABLED = 0,					/* 没有启用通讯 */	
	eCOMM_ENABLED_NOT_COMMUNICATING,	/* 启用，没有通讯 */
	eCOMM_COMMUNICATING, 				/* 通讯着 */
};

// 远程控制反馈
enum REMOTE_REPLY
{	
	eCOMMAND_PERFORMED = 0,				/* 执行 */
	eCOMMAND_NOT_EXIST,					/* 命令不存在 */
	eCOMMAND_CANNOT_PERFORM_NOW,		/* 命令现在不能执行 */
	eCOMMAND_PARAMETER_IS_INVALID,		/* 至少一个参数无效 */
	eCOMMAND_ACK_AND_WITH_SIGNAL,		/* 确认，命令将在事件完成后通过信号通知完成 */
	eCOMMAND_REJECTED,					/* 拒绝，虽然已经满足命令所需状态 */
	eCOMMAND_NO_SUCH_OBJECT_EXIST,		/* 不存在此类对象 */
	eCOMMAND_OTHER,						/* 其他 */
	eCOMMAND_THIS_IS_YOUR_DEFINE,		/* 你可以自定义，非上边的正整数即可 */

};

// 终端消息反馈
enum TERMINAL_REPLY
{	
	eDISPLAY_IN_WINDOW = 0,				/* 显示在窗口 */
	eMESSAGE_WILL_NOT_BE_DISPLAY,		/* 消息不会显示 */
	eTERMINAL_NOT_AVAILABLE,			/* 终端不可用，没有该功能 */
};

// pp 格式化处理
// 扩展功能
enum PP_FORMAT_CMD
{
	eLOAD_TMP_PPID,						/* 加载PPID，存在PPID则返回字符0 */
	eGET_PPID_VALUE,					/* 获取的PPID的值，返回值的字符串 */
	eGET_PPID_VALUE_FINSH,				/* 获取的PPID的值，完成 */
	eSET_PPID_VALUE_BEGIN,				/* 设置的PPID的值开始，附带PPID参数 */
	eSET_PPID_VALUE,					/* 设置的PPID的值，附带Code和值 */
	eSET_PPID_VALUE_FINSH,				/* 设置的PPID的值完成*/
};

// PP处理模式
// 扩展功能
enum PP_HANDLE_MODE
{
	eSystemBuiltIn = 0,			// SECS系统内置方法
	eCostomizeHandle,			// 自定义处理
	//	eCostomizeHandlePpidList,	// 自定义处理:PPID列表问题.
};

// PP自定义功能:PP处理事件枚举
enum PP_HANDLE_EVENT
{
	ePPEventDelete = 0,		// 删除单个ppid
	ePPEventDeleteAll,		// 删除全部ppid
	ePPEventLoadData,		// 获取数据
	ePPEventDownData,		// 下载数据
	ePPEventLoadInquire,	// 下载允许确认
};

// PP自定义功能:处理结果返回值
enum PP_HANDLE_REPLY
{
	ePPSuccess = 0,				// 处理成功
	ePPPermissionNotGranted,	// 权限不够
	ePPLengthError,				// 长度错误
	ePPMatrixOverflow,			// 数据错误
	ePPRecipeNameNotFound,		// 程式名称没有找到
	ePPModeUnsupported,			// 不支持	
	ePPOtherError,				// 其他错误	
};

// PP发生改变通知事件
enum PP_CHANGE_NOTIFY
{
	ePPDeleteChangeNotify = 0,		// PP发生事件：已经删除了recipe
	ePPDownChangeNotify,			// PP发生事件：已经下载了recipe
	ePPLoadChangeNotify,			// PP发生事件：已经上传了recipe
};


// 警报事件通知模式
enum ALARM_NOTIFY_EVENT_MODE
{
	eAlarmNotEvent = 0,			// 警报发生后，没有事件通知
	eAlarmUnifyEvent,			// 警报发生后，统一一个事件通知
	eAlarmEveryEvent,			// 警报发生后，每个警报一个事件通知
	eAlarmEveryAndUnifyEvent,	// 警报发生后，每个警报一个事件通知，同时也统一事件通知
};

// PP Format处理模式
enum PP_FORMAT_MODE
{
	ePPFormatFixedCode = 0,				// 固定CCode
	ePPFormatDynamicCode,				// 动态CCode
};


// 警报类别
enum ALARM_CATEGORY
{
	eCategoryNoUser = 0,						// 不使用类别划分
	eCategoryPersonalSafety = 1,				// 会对人造成危险
	eCategoryEquipmentSafety = 2,				// 会对设备造成损坏
	eCategoryParameterControlWarning = 3,		// 超出参数预设限制，可能损坏产品	
	eCategoryParameterControlError = 4,			// 超出合理的控制值的参数变化，可能造成设备故障
	eCategoryIrrecoverableError = 5,			// 不可恢复故障，需要人为干预
	eCategoryEquipmentStatusWarning = 6,		// 设备发生意外情况，但操作可以继续
	eCategoryAttentionFlags = 7,				// 注意标志，设备作业指示已经到达特定步骤
	eCategoryDataIntegrity = 8,					// 可能发生数据丢失
};


// 物料ID类型
namespace MATERIAL_ID_TYPE
{
	enum ENUM 
	{
		Wafer = 0,
		WaferCassette = 1,		
		FilmFrame = 2,		// wafer放在薄膜铁框上		
	};
}

// 晶圆的平边、凹角相对底部的顺时针角度
namespace WAFER_FLAT_NOTCH_ANGLE
{
	enum ENUM 
	{
		ANGLE0 = 0,			// 朝下
		ANGLE90,			// 朝左
		ANGLE180,			// 朝上
		ANGLE270,			// 朝右
	};
}

// 晶圆的平边、凹角相对"铁框的缺角"的顺时针角度
namespace WAFER_FILM_FRAME_ANGLE
{
	enum ENUM 
	{
		ANGLE0 = 0,			// 朝下
		ANGLE90,			// 朝左
		ANGLE180,			// 朝上
		ANGLE270,			// 朝右
	};
}

namespace WAFER_MAP_FT
{
	enum ENUM 
	{
		Row = 0,
		Array = 1,
		Coordinate = 2
	};
}

// map坐标系原点位置
namespace ORIGIN_LOCATION
{
	enum ENUM 
	{
		Center = 0,
		UpperRight = 1,
		UpperLeft = 2,
		LowerLeft = 3,
		LowerRight = 4,
	};
}

// 处理轴
namespace PROCESS_AXIS
{
	enum ENUM 
	{
		XAxisTopIncreasing = 0,
		XAxisTopDecreasing = 1,
		XAxisBottomIncreasing = 2,
		XAxisBottomDecreasing = 3,
		YAxisLeftIncreasing = 4,
		YAxisLeftDecreasing = 5,
		YAxisRightIncreasing = 6,
		YAxisRightDecreasing = 7,
	};
}

// 错误枚举
namespace S9_ERROR
{
	enum ENUM 
	{
		UnrecognizedStreamType = 2,		// 不支持Stream
		UnrecognizedFunctionType = 3,	// 不支持Function
		IllegalData = 4,
		TransactionTimerTimeout = 5,	// 会话超时
		DataTooLong = 6,				// 数据太大
		ConversationTimeout = 7,		// 会话超时
	};
}

//////////////////////////////////////////////////////////////////////////
// 存放数据结构的头文件

struct EVENT_DATA
{
	int nCEID;
	std::string pName;
	std::string pDescription;

	EVENT_DATA();
};


// 变量内容
// DVVAL, SV, ECV
struct VARIABLE_DATA
{
	std::string VID;
	std::string VarName;			// 名称	
	std::string Description;		// 描述
	std::string Value;				// 数值
	std::string Type;				// 数值类型	
	std::string VarClass;			// 变量类型
	std::string Units;				// 单位
	std::string MinValue;			// 最小值
	std::string MaxValue;			// 最大值
	std::string DefValue;			// 默认值
	bool bInside;					// 内置的数据

	VARIABLE_DATA();
};



// Alarm内容
struct ALARM_DATA
{
	std::string ALID;
	std::string ALTX;			// 名称
	std::string SetCEID;			// 设置事件
	std::string ClearCEID;		// 清除事件
	int nCategory;			// 警报类别
	bool bEnable;			// 启用	
	bool bSet;				// 使能


	ALARM_DATA();
	ALARM_DATA(const ALARM_DATA& des);
	void operator = (const ALARM_DATA& des);
	void copy(const ALARM_DATA& des);

};

// 错误代码和描述
struct ERROR_CODE_DESCRIPTION
{
	int nCode;
	std::string pDescription;

	ERROR_CODE_DESCRIPTION();
	ERROR_CODE_DESCRIPTION(int nCode, std::string pDescription);
};

// 远程控制信息, 新方法
// 可用 string recipe = svParam["recipe"] 提取方法对应变名的值
struct REMOTE_DATA
{
	std::string pRCMD;
	std::map<std::string, std::string> mapParam;	
	std::list<ERROR_CODE_DESCRIPTION> listErrorCode;
	
	// 获取参数值，返回空代表没有该参数
	const char* GetValue(std::string pName);
	void AddErrorCode(int nCode, std::string pDescription);
};


// 远程控制参数信息
struct REMOTE_PARAM_DATA
{
	std::string pName;
	std::string pValue;
};

// 远程控制信息,旧模式
// 修改只需如下：
// 有一个 REMOTE_DATA 的变量rd到来
// REMOTE_DATA_OLD rdo = rd; 即可转换回原来的模式
struct REMOTE_DATA_OLD
{
	std::string pRCMD;
	std::vector<REMOTE_PARAM_DATA> svParam;	
	
	REMOTE_DATA_OLD(){}
	REMOTE_DATA_OLD(REMOTE_DATA_OLD& rdo);
	REMOTE_DATA_OLD(REMOTE_DATA& rd);

};

// 终端消息数据
struct TERMINAL_DATA
{
	int nTid;			// 指定显示设备，基本不用。
	int nSize;			// 消息长度
	const char* pText;	// 消息文本，兼容多字节中文和ASCII
	
	// 中文其他编码时候需要跟Host协商
	// ASCII字符可以直接用 string text = pText; 提取，忽略nSize	
};

// 自定义的pp处理的数据
struct PP_HANDLE_DATA
{
	PP_HANDLE_EVENT nEvent;		// 处理类型
	const char* pPPID;			// PP数据
	const char* pPPData;		// PP数据
	int nLength;				// 长度
	PP_HANDLE_REPLY nAck;		// 答复

	PP_HANDLE_DATA();
};



// pp 格式化处理的数据
struct PP_FORMAT_HANDLE
{
	PP_FORMAT_CMD nEvent;					// 处理类型
	std::string pPPID;						// PP名称（recipe名称）
	std::string pCCode;						// PP的CCODE代码
	std::vector<std::string> vecParamValue;	// PP参数数据值
	PP_HANDLE_REPLY nAck;					// 答复, Host发送设置PP值时候才需要答复

	PP_FORMAT_HANDLE();
};

// pp 格式化处理的数据
struct PP_FORMAT_PARAMENT
{
	std::string pType;		// 值的类型
	std::string pValue;		// PP参数数据值	

	PP_FORMAT_PARAMENT();
	PP_FORMAT_PARAMENT(std::string pType, std::string pValue);
};

// pp 格式化处理的数据
struct PP_FORMAT_DYNAMIC_HANDLE
{
	std::string pCCode;							// PP的CCODE代码
	std::vector<PP_FORMAT_PARAMENT> vecParam;	// PP参数数据值	
};

// pp 格式化处理的数据，扩展版
struct PP_FORMAT_HANDLE_EX
{	
	std::string pPPID;									// PP名称（recipe名称）
	std::map<std::string, std::vector<std::string>> mapParamValue;		// PP的CCODE代码，PP参数数据值
	PP_HANDLE_REPLY nAck;							// 答复, Host发送设置PP值时候才需要答复

	PP_FORMAT_HANDLE_EX();
};

struct WAFER_MAP_REFERENCE_POINT
{
	int nX;
	int nY;
};

struct WAFER_MAP
{
	std::string pMID;								// 物料ID，如条码、二维码
	MATERIAL_ID_TYPE::ENUM nIDTYP;					// 物料的类型
	WAFER_FLAT_NOTCH_ANGLE::ENUM nFNLOC;			// Wafer平边/缺口的角度
	WAFER_FILM_FRAME_ANGLE::ENUM nFFROT;			// 铁框旋转角度,如果没有铁框则为0
	ORIGIN_LOCATION::ENUM nORLOC;					// 原点位置
	int nRPSEL;										// 参考位置，一般0
	std::vector<WAFER_MAP_REFERENCE_POINT> listReferPoint;		// wafer map 的2D物料数据
	std::string pDUTMS;								// 测量的晶粒单位(um、mm、nm等)
	double dbXDies;									// 晶粒X轴长度
	double dbYDies;									// 晶粒Y轴长度
	int nROWCT;										// 晶粒行个数
	int nCOLCT;										// 晶粒列个数
	std::string pNULBC;								// map空值
	std::string pMapBin;							// 晶圆等级，1~X为等级。X由客户定义优差级别。S12F3、S12F4的BCEQU值、S12F9的BINLT
	std::string pBINLT;	
	int nPRDCT;										// 已经处理的芯片计数
	PROCESS_AXIS::ENUM nPRAXI;						// 处理轴
	int nMLCL;

	WAFER_MAP();
};

struct STRIP_MAP
{
	std::string pMID;
	std::string pMapDataByXml;		// 数据，XML格式
};



//////////////////////////////////////////////////////////////////////////
// 回调函数

class CSecsEquip;

// 定义回调类型在高层SECS事件
// 基础必要功能
typedef void (SecsStateChangeProc)(CSecsEquip*, const char* pStateType, int nState);			// 状态改变：通讯状态、控制状态、连接状态
typedef TERMINAL_REPLY (SecsTerminalProc)(CSecsEquip*, TERMINAL_DATA td);						// 终端通知
typedef REMOTE_REPLY (SecsRemoteProc)(CSecsEquip*, REMOTE_DATA* pRD);							// 远程控制,改为指针：需要回传listErrorCode错误信息

// 更多功能
typedef const char* (SecsVarValueProc)(CSecsEquip*, int nVarID);								// 变量值获取
typedef const char* (SecsConstantValueProc)(CSecsEquip*, int nECID);							// 常量值获取
typedef void (SecsConstantsChangeProc)(CSecsEquip*, int nID, const char* pValue);				// 常量改变,host修改了值
typedef void (SecsPPChangeNotifyProc)(CSecsEquip*, PP_CHANGE_NOTIFY nEvent, const char* ppid);	// 处理程序改变通知
typedef void (SecsPPFormatValueProc)(CSecsEquip*, PP_FORMAT_HANDLE* pPpFormat);					// PP格式化数据：主机获取值
typedef void (SecsPPFormatChangeProc)(CSecsEquip*, PP_FORMAT_HANDLE* pPpFormat);				// PP格式化数据：主机修改PP的值
typedef void (SecsClockProc)(CSecsEquip*, const char* second_offset, SYSTEMTIME time);				// 时间改变


// 特殊情形使用
typedef void (SecsRemoteProcEx)(CSecsEquip*, std::string pReplyMailbox, REMOTE_DATA rd);		// 远程控制扩展型,自行答复结果,二选一
typedef std::list<std::string> (SecsPPNameListProc)(CSecsEquip*);								// PP列表获取,初期添加
typedef void (SecsPPEventProc)(CSecsEquip*, PP_HANDLE_DATA* pPpHandle);							// 自定义的PP处理
typedef PP_HANDLE_REPLY (SecsPPFormatValueDynamicProc)(CSecsEquip*, const char* pPPID, std::list<PP_FORMAT_DYNAMIC_HANDLE>& listParam);		// PP格式化数据：主机获取值,动态的
typedef PP_HANDLE_REPLY (SecsPPFormatChangeDynamicProc)(CSecsEquip*, const char* pPPID, std::list<PP_FORMAT_DYNAMIC_HANDLE>& listParam);	// PP格式化数据：主机更新值,动态的

// S9出错，SDK内部处理完成后，通知用户
typedef void (SecsS9ErrorNotifyProc)(CSecsEquip*, S9_ERROR::ENUM nType);	// 自定义的PP处理

// WaferMap
typedef STRIP_MAP (SecsWaferMapSubstrateProc)(CSecsEquip*, const char* pID);	// StripMap

















