#ifndef _PARSE_PACK_GW_DATA_H_
#define _PARSE_PACK_GW_DATA_H_
#include "CommonTypes.h"
#include "Convert.h"
#include "ParsePackDefine.h"
#include "ParsePackCommon.h"

#define MSG_TYPE_WLB_REPORT			((UINT8)111u)	/*汇报全线列车紧急制动信息*/
#define MSG_TYPE_WLB_SET_FIRST		((UINT8)112u)	/*全线列车紧急制动设置一次*/
#define MSG_TYPE_WLB_CONFIRM_FIRST	((UINT8)113u)	/*全线列车紧急制动首次确认*/
#define MSG_TYPE_WLB_SET_SECOND		((UINT8)114u)	/*全线列车紧急制动设置二次*/
#define MSG_TYPE_WLB_CONFIRM_SECOND	((UINT8)115u)	/*全线列车紧急制动二次确认*/
#define MSG_TYPE_DA_REPORT			((UINT8)116u)	/*脱轨防护区汇报信息*/
#define MSG_TYPE_DA_CANCLE_FIRST	((UINT8)117u)	/*脱轨防护区取消首次消息*/
#define MSG_TYPE_DA_CONFIRM_FIRST	((UINT8)118u)	/*脱轨防护区首次确认消息*/
#define MSG_TYPE_DA_CANCLE_SECOND	((UINT8)119u)	/*脱轨防护区取消再次消息*/
#define MSG_TYPE_DA_CONFIRM_SECOND	((UINT8)120u)	/*脱轨防护区再次确认消息*/
#define MSG_TYPE_REPORT				((UINT8)121u)	/*汇报远程筛选列车信息*/
#define MSG_TYPE_REQUEST_FIRST		((UINT8)122u)	/*首次消息*/
#define MSG_TYPE_CONFIRM_FIRST		((UINT8)123u)	/*首次确认*/
#define MSG_TYPE_REQUEST_SECOND		((UINT8)124u)	/*再次消息*/
#define MSG_TYPE_CONFIRM_SECOND		((UINT8)125u)	/*再次确认*/
#define MSG_TYPE_EA_REPORT			((UINT8)126u)	/*区间疏散汇报信息*/
#define MSG_TYPE_EA_CANCLE_FIRST	((UINT8)127u)	/*区间疏散取消首次消息*/
#define MSG_TYPE_EA_CONFIRM_FIRST	((UINT8)128u)	/*区间疏散首次确认消息*/
#define MSG_TYPE_EA_CANCLE_SECOND	((UINT8)129u)	/*区间疏散取消再次消息*/
#define MSG_TYPE_EA_CONFIRM_SECOND	((UINT8)130u)	/*区间疏散再次确认消息*/
#define MSG_TYPE_TRIAN_INFO_REPORT  ((UINT8)131u)	/*TIOC给ATS发送列车信息*/
#define MSG_TYPE_TRAIN_FLY_INFO ((UINT8)132u)	/*TIOC给ATS发送飞车宕机报警信息*/

#define CONFIRM_UNKNOWN			((UINT8)0u)		/*未知*/
#define CONFIRM_FIRST_SUCCESS	((UINT8)1u)		/*首次确认成功*/
#define CONFIRM_FIRST_REPEAT	((UINT8)2u)		/*重复确认*/
#define CONFIRM_FIRST_TRAINID	((UINT8)3u)		/*刷新列车*/
#define CONFIRM_FIRST_LGCID		((UINT8)4u)		/*确认逻辑区段*/
#define CONFIRM_FIRST_OTHER_DEV_OP		((UINT8)14U)		/*其它操作站正在操作*/
#define CONFIRM_SECOND_SUCCESS	((UINT8)1u)		/*二次确认成功*/
#define CONFIRM_SECOND_CRC		((UINT8)2u)		/*信息帧校验失败*/
#define CONFIRM_SECOND_TRAINID	((UINT8)3u)		/*刷新列车*/
#define CONFIRM_SECOND_LGCID	((UINT8)4u)		/*确认逻辑区段*/
#define CONFIRM_SECOND_FIRST	((UINT8)5u)		/*首次筛选确认失败*/
#define CONFIRM_SECOND_DIFF		((UINT8)6u)		/*二次消息与一次不一致*/

#define CONFIRM_FIRST_NOT_EA	((UINT8)7u)		/*列车未进入疏散*/
#define CONFIRM_TRAIN_IN_EA		((UINT8)9u)		/*列车正在疏散*/

#define CONFIRM_EA_SECOND_CRC	((UINT8)3u)		/*信息帧校验失败*/
#define CONFIRM_EA_SECOND_FIRST ((UINT8)4u)		/*未执行一次命令*/
#define CONFIRM_SECOND_NOT_EA	((UINT8)5u)	/*列车未进入疏散*/
#define CONFIRM_SECOND_EA_TRAINID ((UINT8)8u)	/*与首次列车编号不一致*/
#define CONFIRM_SECOND_TIOC		((UINT8)10u)	/*相邻控区通信中断*/
#define CONFIRM_EALINE_DIFFERENT ((UINT8)11U)	/*取消防护区域上下行属性与已建立防护区域上下行属性不一致*/
#define CONFIRM_EA_SND_LINE_DIFF ((UINT8)11U)	/*取消区间疏散一二次命令的线路上下行属性不一致*/

#define MSG_TYPE_WLB_SET		((UINT8)0xaau)	/*全线列车紧急制动设置*/
#define MSG_TYPE_WLB_CANCEL		((UINT8)0x55u)	/*全线列车紧急制动取消*/

#define WLB_TYPE_RC				((UINT8)2u)	/*全线列车紧急制动*/
#define WLB_TYPE_PHYSEC			((UINT8)3u)	/*物理区段紧急制动*/

#define CONFIRM_WLB_FST_UNKNOWN	((UINT8)0u)	/*首次回复未知*/
#define CONFIRM_WLB_FST_SUCCESS	((UINT8)1u)	/*首次回复成功*/
#define CONFIRM_WLB_FST_REPEAT	((UINT8)2u)	/*首次回复重复设置*/
#define CONFIRM_WLB_FST_UNSET	((UINT8)5u)	/*首次回复未设置*/

#define CONFIRM_WLB_SND_UNKNOWN	((UINT8)0u)	/*二次回复未知*/
#define CONFIRM_WLB_SND_SUCCESS	((UINT8)1u)	/*二次回复成功*/
#define CONFIRM_WLB_SND_CRC		((UINT8)3u)	/*信息帧校验失败*/
#define CONFIRM_WLB_SND_FIRST	((UINT8)4u)	/*二次回复未执行首次确认*/
#define CONFIRM_WLB_SND_INFO_DIFF	((UINT8)8u)	/*一二次命令信息不一致*/

#define CONFIRM_DA_FST_UNKNOWN	((UINT8)0u) /*取消脱轨防护区首次回复未知*/
#define CONFIRM_DA_FST_SUCCESS	((UINT8)1u)	/*取消脱轨防护区首次回复成功*/
#define CONFIRM_DA_FST_UNSET	((UINT8)7u)	/*取消脱轨防护区首次回复未设置*/
#define CONFIRM_DA_FST_DERAIL	((UINT8)9u)	/*取消脱轨防护区首次回复当前列车处于脱轨状态*/

#define CONFIRM_DA_SND_UNKNOWN	((UINT8)0u)	/*取消脱轨防护区再次回复未知*/
#define CONFIRM_DA_SND_SUCCESS	((UINT8)1u)	/*取消脱轨防护区再次回复成功*/
#define CONFIRM_DA_SND_CRC		((UINT8)3u)	/*取消脱轨防护区再次回复信息帧校验失败*/
#define CONFIRM_DA_SND_FIRST	((UINT8)4u)	/*取消脱轨防护区再次回复未执行首次*/
#define CONFIRM_DA_SND_DIFF		((UINT8)8u)	/*取消脱轨防护区再次回复列车ID与一次不一致*/
#define CONFIRM_DA_SND_DERAIL	((UINT8)9u)	/*取消脱轨防护区再次回复列车当前处于脱轨状态*/
#define CONFIRM_DA_SND_LINE_DIFF	((UINT8)11U)	/*取消脱轨防护一二次命令线路属性不一致*/

#define DA_AREA_UP				((UINT8)0x55u)	/* 上行区域 */
#define DA_AREA_DOWN			((UINT8)0xaau)	/* 下行区域 */
#define DA_AREA_ALL				((UINT8)0xffu)	/* 上行和下行区域 */

#define ATS_DA_CMD_TYPE_CANCEL	((UINT8)0x55u)	/* ATS取消脱轨防护区命令类型 */

#define CONFIRM_TIMEOUT_CC		((UINT16)400u)	/*首次消息等待二次消息超时时间*/

#define GATE_WAY_PRTCL_VER		((UINT32)101u)	/*协议版本号*/
#define GATE_WAY_APP_PRTCL_VER	((UINT16)3001u)	/*应用协议版本号*/

#define ATS_GATEWAY_CI_TRAIN_MAX	((UINT8)0xFEU)	/*ATS TO CI 列车数量最大值*/

#define ATS_EA_CMD_TYPE_CANCEL		((UINT8)0x55u)	/* ATS取消区间疏散命令类型 */

#define EA_AREA_UP					((UINT8)0x55u)	/* 上行区域 */
#define EA_AREA_DOWN				((UINT8)0xaau)	/* 下行区域 */
#define EA_AREA_ALL					((UINT8)0xffu)	/* 上行和下行区域 */
/* 远程筛选列车信息结构体 */
typedef struct
{
	UINT32 dwTrainId;		/*列车编号*/
	UINT16 wLgcId;			/*逻辑区段ID*/
}AtsScreenTrainInfoStru;

/* ATS远程筛选首次消息结构体 */
typedef struct
{
	UINT8 chFlag;			/*首次消息接收状态*/
	UINT32 dwCycle;			/*首次消息接收周期号*/
	UINT8 chAtsId;			/*ATS编号*/
	UINT8 chStation;		/*车站编号*/
	UINT16 wIndex;			/*操作站编号*/
	UINT8 chTiocId;			/*TIOC编号*/
	UINT32 dwTime;			/*时间*/
	UINT8 chTrainNum;		/*列车数量*/
	AtsScreenTrainInfoStru strTrainInfo[TRAIN_SUM_MAX]; /*列车信息*/
}AtsScreenMsgFstStru;

/* ATS远程筛选确认结构体 */
typedef struct
{
	UINT8 chFlag;			/*消息有效性*/
	UINT8 chTiocId;			/*TIOC编号*/
	UINT8 chStation;		/*车站编号*/
	UINT16 wIndex;			/*操作站编号*/
	UINT32 dwTime;			/*时间*/
	UINT8 chOpStatus;		/*操作结果*/
	UINT32 dwCrc32;			/*CRC*/
}AtsMsgCfmStru;

/* ATS远程筛选二次消息结构体 */
typedef struct
{
	UINT8 chFlag;			/*首次消息接收状态*/
	UINT32 dwCycle;			/*首次消息接收周期号*/
	UINT8 chAtsId;			/*ATS编号*/
	UINT8 chStation;		/*车站编号*/
	UINT16 wIndex;			/*操作站编号*/
	UINT8 chTiocId;			/*TIOC编号*/
	UINT32 dwTime;			/*时间*/
	UINT8 chTrainNum;		/*列车数量*/
	AtsScreenTrainInfoStru strTrainInfo[TRAIN_SUM_MAX]; /*列车信息*/
	UINT32 dwCrc32;			/*CRC值*/
}AtsScreenMsgSndStru;

/* ATS取消区间疏散信息结构体 */
typedef struct
{
	UINT8 chFlag;			/*消息接收状态*/
	UINT32 dwCycle;			/*消息接收周期号*/
	UINT8 chAtsId;			/*ATS编号*/
	UINT8 chStation;		/*车站编号*/
	UINT16 wIndex;			/*操作站编号*/
	UINT8 chTiocId;			/*TIOC编号*/
	UINT32 dwEaTrainId;		/*列车互联互通编号*/
	UINT32 dwTime;			/*时间*/
	UINT8 chType;			/*建立/取消*/
	UINT8 chLine;			/*线路*/
	UINT32 dwCrc32;			/*CRC值*/
}AtsEaMsgStru;

/* ATS设置/取消全线列车紧急制动信息结构体 */
typedef struct
{
	UINT8 chFlag;			/*消息接收状态*/
	UINT32 dwCycle;			/*消息接收周期号*/
	UINT8 chAtsId;			/*ATS编号*/
	UINT8 chStation;		/*车站编号*/
	UINT16 wIndex;			/*操作站编号*/
	UINT8 chTiocId;			/*TIOC编号*/
	UINT32 dwTime;			/*时间*/
	UINT8 chType;			/*设置/取消*/
	UINT32 dwCrc32;			/*CRC值*/
	UINT8 chBrakeType;		/*制动类型*/
	UINT8 chBrakeCount;		/*数量*/
	UINT16 wBrakeIndex;		/*制动ID*/
}AtsWlbMsgStru;

/* ATS取消脱轨防护区信息结构体 */
typedef struct
{
	UINT8 chFlag;			/*消息接收状态*/
	UINT32 dwCycle;			/*消息接收周期号*/
	UINT8 chAtsId;			/*ATS编号*/
	UINT8 chStation;		/*车站编号*/
	UINT16 wIndex;			/*操作站编号*/
	UINT8 chTiocId;			/*TIOC编号*/
	UINT32 dwDaTrainId;		/*列车互联互通编号*/
	UINT32 dwTime;			/*时间*/
	UINT8 chType;			/*建立/取消*/
	UINT8 chLine;			/*线路*/
	UINT32 dwCrc32;			/*CRC值*/
}AtsDaMsgStru;

/*******************************全局变量声明*******************************/
extern AtsScreenMsgFstStru g_strAtsMsgFst;
extern AtsMsgCfmStru g_strAtsCfmFst;
extern AtsScreenMsgSndStru g_strAtsMsgSnd;
extern AtsMsgCfmStru g_strAtsCfmSnd;

extern AtsEaMsgStru g_strAtsEaMsgFst;
extern AtsMsgCfmStru g_strAtsEaCfmFst;
extern AtsEaMsgStru g_strAtsEaMsgSnd;
extern AtsMsgCfmStru g_strAtsEaCfmSnd;

extern AtsWlbMsgStru g_strAtsWlbMsgFst;
extern AtsMsgCfmStru g_strAtsWlbCfmFst;
extern AtsWlbMsgStru g_strAtsWlbMsgSnd;
extern AtsMsgCfmStru g_strAtsWlbCfmSnd;

extern AtsDaMsgStru g_strAtsDaMsgFst;
extern AtsMsgCfmStru g_strAtsDaCfmFst;
extern AtsDaMsgStru g_strAtsDaMsgSnd;
extern AtsMsgCfmStru g_strAtsDaCfmSnd;

extern AtsMsgCfmStru g_strSndAtsCfmFst;			/*第二个ATS的远程筛选首次确认*/
extern AtsMsgCfmStru g_strSndAtsEaCfmFst;			/*第二个ATS的取消区间疏散首次确认*/
extern AtsMsgCfmStru g_strSndAtsWlbCfmFst;		/*第二个ATS的设置/取消全线列车紧急制动首次确认*/
extern AtsMsgCfmStru g_strSndAtsDaCfmFst;			/*第二个ATS的取消脱轨防护区首次确认*/


/**
* @brief 获取远程筛选ATS首次消息
* @param 无
* @return 远程筛选ATS首次消息
*/
extern AtsScreenMsgFstStru * GetAtsMsgFst(void);

/**
* @brief 获取远程筛选ATS二次消息
* @param 无
* @return 远程筛选ATS二次消息
*/
extern AtsScreenMsgSndStru * GetAtsMsgSnd(void);

/**
* @brief 获取远程筛选首次确认消息
* @param 无
* @return 远程筛选首次确认消息
*/
extern AtsMsgCfmStru * GetAtsCfmFst(void);

/**
* @brief 获取远程筛选二次确认消息
* @param 无
* @return 远程筛选二次确认消息
*/
extern AtsMsgCfmStru * GetAtsCfmSnd(void);

/**
* @brief 获取远程筛选二次确认消息
* @param 无
* @return 远程筛选二次确认消息
*/
extern UINT8 PackTiocToGateWayData(const UINT8 deviceId, const UINT8 targetDevType);


/**
* @brief 解析网关数据帧
* @param const UINT8* dataBuf, 数据缓冲区
* @param const UINT16 dataLength, 数据长度
* @return CI_SUCCESS:成功；CI_ERROR:失败
*/
extern UINT8 ParseGateWayToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength);

/**
* @brief 清除1次ATS筛选信息
* @param void
* @return void
*/
void ClearAtsMsgFirst(void);

/**
* @brief 清除2次ATS筛选信息
* @param void
* @return void
*/
void ClearAtsMsgSecond(void);

/**
* @brief 获取ATS取消区间疏散首次消息
* @param 无
* @return ATS取消区间疏散首次消息
*/
AtsEaMsgStru * GetAtsEaMsgFst(void);

/**
* @brief 获取ATS取消区间疏散二次消息
* @param 无
* @return ATS取消区间疏散二次消息
*/
AtsEaMsgStru * GetAtsEaMsgSnd(void);

/**
* @brief 获取ATS取消区间疏散首次确认
* @param 无
* @return ATS取消区间疏散首次确认
*/
AtsMsgCfmStru * GetAtsEaCfmFst(void);

/**
* @brief 获取ATS取消区间疏散二次确认
* @param 无
* @return ATS取消区间疏散二次确认
*/
AtsMsgCfmStru * GetAtsEaCfmSnd(void);

/**
* @brief 清除1次ATS区间疏散信息
* @param void
* @return void
*/
void ClearAtsEaMsgFirst(void);

/**
* @brief 清除2次ATS区间疏散信息
* @param void
* @return void
*/
void ClearAtsEaMsgSecond(void);

/**
* @brief 获取ATS设置/取消全线列车紧急制动首次消息
* @param 无
* @return ATS设置/取消区间疏散首次消息
*/
AtsWlbMsgStru * GetAtsWlbMsgFst(void);

/**
* @brief 获取ATS取消全线列车紧急制动二次消息
* @param 无
* @return ATS取消全线列车紧急制动二次消息
*/
AtsWlbMsgStru * GetAtsWlbMsgSnd(void);

/**
* @brief 获取ATS设置/取消全线列车紧急制动首次确认
* @param 无
* @return ATS设置/取消全线列车紧急制动首次确认
*/
AtsMsgCfmStru * GetAtsWlbCfmFst(void);

/**
* @brief 获取ATS取消全线列车紧急制动二次确认
* @param 无
* @return ATS取消全线列车紧急制动二次确认
*/
AtsMsgCfmStru * GetAtsWlbCfmSnd(void);

/**
* @brief 清除1次ATS设置/取消全线列车紧急制动信息
* @param void
* @return void
*/
void ClearAtsWlbMsgFirst(void);

/**
* @brief 清除2次ATS取消全线列车紧急制动信息
* @param void
* @return void
*/
void ClearAtsWlbMsgSecond(void);

/**
* @brief 获取ATS取消脱轨防护区首次消息
* @param 无
* @return ATS取消脱轨防护区首次消息
*/
AtsDaMsgStru * GetAtsDaMsgFst(void);

/**
* @brief 获取ATS取消脱轨防护区二次消息
* @param 无
* @return ATS取消脱轨防护区二次消息
*/
AtsDaMsgStru * GetAtsDaMsgSnd(void);

/**
* @brief 获取ATS取消脱轨防护区首次确认
* @param 无
* @return ATS取消脱轨防护区首次确认
*/
AtsMsgCfmStru * GetAtsDaCfmFst(void);

/**
* @brief 获取ATS取消脱轨防护区二次确认
* @param 无
* @return ATS取消脱轨防护区二次确认
*/
AtsMsgCfmStru * GetAtsDaCfmSnd(void);

/**
* @brief 清除1次ATS取消脱轨防护区信息
* @param void
* @return void
*/
void ClearAtsDaMsgFirst(void);

/**
* @brief 清除2次ATS取消脱轨防护区信息
* @param void
* @return void
*/
void ClearAtsDaMsgSecond(void);

/**
* @brief 全线紧急制动紧急ID校验
* @param const UINT8 cDeviceType 设备类型
* @param const UINT16 wDeviceId 设备ID
* @return 1 成功
		  0 失败
*/
UINT8 WlbUrgentIdCheck(const UINT8 cDeviceType, const UINT16 wDeviceId);

/**
* @brief 清除第二个ATS的远程筛选一次确认信息
* @param 无
* @return 无
* @note Created By LQ 2025.05.29
*/
void ClearSndAtsScreenFstCfmMsg(void);

/**
* @brief 清除第二个ATS的取消区间疏散一次确认信息
* @param 无
* @return 无
* @note Created By LQ 2025.05.29
*/
void ClearSndAtsEaFstCfmMsg(void);

/**
* @brief 清除第二个ATS的全线紧急制动一次确认信息
* @param 无
* @return 无
* @note Created By LQ 2025.05.29
*/
void ClearSndAtsWlbFstCfmMsg(void);

/**
* @brief 清除第二个ATS的取消脱轨防护一次确认信息
* @param 无
* @return 无
* @note Created By LQ 2025.05.29
*/
void ClearSndAtsDaFstCfmMsg(void);

#endif