#ifndef _EVACUATION_AREA_MANAGE_H_
#define _EVACUATION_AREA_MANAGE_H_

#include "TrainDefine.h"

#define EA_CFG_SUM_MAX 50u						/* 防护区域配置最大数量 */
#define EA_BD_LINK_SUM_MAX 10u					/* 起、终点边界点最大数量 */
#define EA_MODE_DIS 0x55u						/* 防护区域建立方式：按距离 */
#define EA_MODE_SEC 0xAAu						/* 防护区域建立方式：两站一区间不含站台 */
#define EA_MODE_PLATION 0x33u					/* 防护区域建立方式：两站一区间含站台 */
#define EA_STATION_MODE_DIS 0x01u				/* 站台防护区域建立方式：按距离 */
#define EA_STATION_MODE_PLAT 0x02u				/* 站台防护区域建立方式：仅站台 */

#define EA_OUT_ONE		1u						/* 防护区域按距离计算（需要向上取） */
#define EA_OUT_TWO		2u						/* 防护区域仅站台（站台包含防护区域） */
#define EA_OUT_THREE	3u						/* 两站一区间需要添加区间起点关联站台 */
#define EA_OUT_FOUR	    4u						/* 两站一区间需要添加区间终点关联站台 */
#define EA_OUT_FIVE	    5u						/* 两站一区间不需要添加区间关联站台 */
#define EA_OUT_SIX	    6u						/* 两站一区间需要添加区间及两侧关联站台 */
#define EA_OUT_SEVEN	7u						/* 仅出入段线特殊防护区域 */

#define EA_DST_ALLOWED_YES	0x55u				/* 跨控区时，目标TIOC允许 */
#define EA_DST_ALLOWED_NO	0xaau				/* 跨控区时，目标TIOC不允许 */

#define PA_TYPE_EA	0x55u						/* 区间疏散防护区域 */
#define PA_TYPE_DA	0xaau						/* 脱轨防护区域 */

typedef struct
{
	UINT16 wId;									/* 电子地图防护区域配置表编号 */
	UINT8 chStartLinkNum;						/* 起点边界数量 */
	UINT16 szStartLinkId[EA_BD_LINK_SUM_MAX];	/* 起点边界link编号 */
	UINT8 szStartLinkDir[EA_BD_LINK_SUM_MAX];	/* 起点边界查询终点的逻辑方向 */
	UINT8 chEndLinkNum;							/* 终点边界数量 */
	UINT16 szEndLinkId[EA_BD_LINK_SUM_MAX];		/* 终点边界link编号 */
	UINT8 szEndLinkDir[EA_BD_LINK_SUM_MAX];		/* 终点边界查询起点的逻辑方向 */
	UINT32 dwMinKm;								/* 一区间最小公里标 */
	UINT32 dwMaxKm;								/* 一区间最大公里标 */
	UINT8 chEaConfigLinkSum;                       /*疏散防护分区包含LINK数目*/
	UINT16 wSzEaConfigLinkId[EA_SECTION_MAX_NUM];  /*疏散防护分区包含LINK数组*/
	UINT8 chStartStationLinkSum;                 /*起点对应站台LINK数目*/
	UINT16 wSzStartStationLinkId[EA_BD_LINK_SUM_MAX]; /*起点对应站台LINK数组*/
	UINT8 chEndStationLinkSum;                       /*终点对应站台LINK数目*/
	UINT16 wSzEndStationLinkId[EA_BD_LINK_SUM_MAX];   /*终点对应站台LINK数组*/
}EaConfigStru;

/* 对象结构体 */
typedef struct
{
	UINT8 chObjNum;								/* 对象数量 */
	UINT16 szObjId[EA_SECTION_MAX_NUM];			/* 对象编号 */
}EaObjStru;

/* 疏散区域结构体 */
typedef struct
{
	UINT16 wTrainId;							/* 区间疏散列车ID */
	UINT8 chBuildedFlag;						/* 建立标志 0x55：已建立；0xAA：未建立 */
	EaObjStru strLinkInfo;						/* 区间疏散防护区域包含link信息 */
	EaObjStru strAcInfo;						/* 区间疏散防护区域包含计轴区段信息 */
	EaObjStru strLgcInfo;						/* 区间疏散防护区域包含逻辑区段信息 */
	UINT32 dwMidLine;							/* 疏散列车中轴线公里标 */
	UINT8 chSrcTiocId;							/* 疏散区域跨控区时，源TIOC编号 */
	UINT8 chDstTiocId;							/* 疏散区域跨控区时，目标TIOC编号 */
	UINT8 chDstAllowed;							/* 疏散区域跨控区时，目标TIOC允许状态 */
	UINT8 chPaType;								/* 防护区域类型：0x55区间疏散防护区域；0xaa脱轨防护区域 */
	UINT8 chEaConfigId;                         /* 区间疏散方式为两站一区间时，对应的防护区间ID  不向相邻联锁与车发送*/
	UINT8 chEaAreaLinkType;						/* 防护区域上下行区域类型*/
	UINT32 dwEaBuildCycNum;						/*疏散建立时源Tioc的周期号*/
}EaDataStru, *pEaData;


/**
* @brief 初始化函数
* @param 无
* @return CI_ERROR 初始化失败   CI_SUCCESS 初始化成功
* by cgh 20250310
*/
UINT8 EaConfigInit(void);

/**
* @brief 获取指定正在疏散的列车ID
* @param chIndex 下标
* @return 列车ID
*/
extern UINT16 GetEvacuatingTrainIdByIndex(UINT8 chIndex);

/**
* @brief 获取区间疏散区域建立标志位
* @param chIndex 下标
* @return DEFAULT_ZERO默认值；EA_IS_BUILDED已建立；EA_IS_NOT_BUILDED未建立
*/
extern UINT8 GetEaBuildedFlag(UINT8 chIndex);

/**
* @brief 获取区间疏散区域包含link数量
* @param chIndex 下标
* @return 区间疏散区域包含link数量
*/
extern UINT8 GetEaLinkNum(UINT8 chIndex);

/**
* @brief 获取区间疏散区域包含link编号
* @param chIndex 下标
* @return 区间疏散区域包含link编号
*/
extern UINT16 * GetEaLinkBuff(UINT8 chIndex);

/**
* @brief 获取需要建立的区间疏散区域个数
* @param 无
* @return 需要建立的区间疏散区域个数
*/
extern UINT8 GetEaNum(void);

/**
* @brief 区间疏散主处理函数
* @return OC_ERROR失败；OC_SUCCESS成功
*/
extern void EvacuationAreaProcess(void);

/**
* @brief 获取防护区域逻辑区段数量
* @param const UINT8 chIndex 防护区域索引
* @return 防护区域逻辑区段数量
*/
extern UINT8 EaGetLgcNum(const UINT8 chIndex);

/**
* @brief 获取防护区域逻辑区段编号
* @param const UINT8 chIndex 防护区域索引
* @return 防护区域逻辑区段编号
*/
extern UINT16 * EaGetLgcId(const UINT8 chIndex);

/**
* @brief 获取防护区域疏散列车中轴线公里标
* @param const UINT8 chIndex 防护区域索引
* @return 防护区域疏散列车中轴线公里标
*/
extern UINT32 EaGetMidLine(const UINT8 chIndex);

/*
* 功能描述： 获取区间疏散跟随数据
* 参数说明： pData 数据地址
*			 dwIndex 数据索引
* 返回值  ： 写入后的数据索引
*/
extern UINT32 GetEaTransferData(UINT8* pData, UINT32 dwIndex);

/*
* 功能描述： 设置区间疏散跟随数据
* 参数说明： pData 数据地址
*			 dwIndex 数据索引
* 返回值  ： 解析后的数据索引
*/
extern UINT32 SetEaTransferData(UINT8* pData, UINT32 dwIndex);

/**
* @brief 获取指定索引防护区域建立TIOC编号
* @param chIndex 下标
* @return 防护区域建立TIOC编号
*/
extern UINT8 GetEaSrcTiocByIndex(UINT8 chIndex);

/**
* @brief 获取指定索引防护区域目标TIOC编号
* @param chIndex 下标
* @return 防护区域目标TIOC编号
*/
extern UINT8 GetEaDstTiocByIndex(UINT8 chIndex);

/**
* @brief 获取指定索引防护区域目标TIOC同意标识
* @param chIndex 下标
* @return 防护区域目标TIOC同意标识
*/
extern UINT8 GetEaDstAllowedByIndex(UINT8 chIndex);

/**
* @brief 相邻控区输入的防护区域更新
* @param EaDataStru * pEaDataSt 相邻控区输入的防护区域
* @return 无
*/
extern void EaNeighborUpdata(EaDataStru * pEaDataSt);

/**
* @brief 相邻控区输入的防护区域更新
* @param EaDataStru * pEaData 相邻控区输入的防护区域
* @return 无
*/
extern void EaSetNeighborAllowFlag(UINT16 wTrainId, UINT8 chSrcTioc, UINT8 chDstTioc, UINT8 chFlag,UINT32 dwBuildCyc);

/*
* 功能描述： 相邻TIOC通信良好，疏散防护区域处理
* 参数说明： UINT8 chTiocId 相邻TIOC编号
* 返回值  ： 无
*/
extern void NeighborGoodEaProc(UINT8 chTiocId);

/**
* @brief 判断link是否处于防护区域内
* @param const UINT16 wLinkId link编号
* @return CI_ERROR:link处于防护区域内；CI_SUCCESS:link不处于防护区域内
*/
extern UINT8 IsLinkInEa(const UINT16 wLinkId);

/**
* @brief 脱轨防护区域取消处理
* @param 无
* @return 无
*/
extern void DaAtsCancleProc(void);

/**
* @brief 取消脱轨防护区首次处理
* @param 无
* @return 无
*/
extern void DaAtsCancleFst(void);

/**
* @brief 取消脱轨防护区二次处理
* @param 无
* @return 无
*/
extern void DaAtsCancleSnd(void);

/**
* @brief 获取指定防护区域类型
* @param chIndex 下标
* @return 防护区域类型
*/
extern UINT8 GetPaTypeByIndex(UINT8 chIndex);

/**
* @brief 获取防护区域对应数据表的ID
* @param chIndex 下标
* @return 防护区域ID
*/
UINT8 GetEaConfigID(UINT8 chIndex);

/**
* @brief 获取防护区域link数量
* @param const UINT8 chIndex 防护区域索引
* @return 防护区域link数量
*/
extern UINT8 EaGetLinkNum(const UINT8 chIndex);

/**
* @brief 获取防护区域link编号
* @param const UINT8 chIndex 防护区域索引
* @return 防护区域link编号
*/
extern UINT16 * EaGetLinkId(const UINT8 chIndex);

/**
* @brief 获取防护区域计轴区段数量
* @param const UINT8 chIndex 防护区域索引
* @return 防护区域计轴区段数量
*/
extern UINT8 EaGetAcNum(const UINT8 chIndex);

/**
* @brief 获取防护区域计轴区段编号
* @param const UINT8 chIndex 防护区域索引
* @return 防护区域计轴区段编号
*/
extern UINT16 * EaGetAcId(const UINT8 chIndex);

/**
* @brief 判断逻辑区段是否处于防护区域内
* @param const UINT16 wLgcId 逻辑区段编号
* @return CI_ERROR:逻辑区段处于防护区域内；CI_SUCCESS:逻辑区段不处于防护区域内
*/
extern UINT8 IsLgcInEa(const UINT16 wLgcId);

/*
* 功能描述： 计轴区段是否为防护区域检查
* 参数说明：const UINT16 wAxisSecId 计轴区段ID
*           const UINT8 chSetAreaType 防护区域建立类型
*           const UINT16 wTrainId 列车ID
* 返回值  ： CI_ERROR 检查不通过
*            CI_SUCCESS 检查通过
* by cgh 20240105
*/
UINT8 AxisSecAddProAreaCheck(const UINT16 wAxisSecId, const UINT8 chSetAreaType, const UINT16 wTrainId);

/**
* @brief 获取防护区域上下行区域类型
* @param chIndex 下标
* @return EA_AREA_UP	  上行区域
*		  EA_AREA_DOWN	  下行区域
*		  EA_AREA_ALL	  上行和下行区域
* by cgh 20240321
*/
UINT8 GetEaAreaLineType(UINT8 chIndex);

/**
* @brief 清理防护区域内被取消的区段信息
* @param const UINT8 chEaIndex 防护区域索引ID
* @return 无
* by cgh 20240326
*/
void ClearEaSecData(const UINT8 chEaIndex);

/**
* @brief 更新防护区域的线路上下行属性
* @param const UINT8 chEaIndex 防护区域索引ID
* @return 无
* by cgh 20240402
*/
void RefreshEaLineType(const UINT8 chEaIndex);

/*
* 功能描述： 获取指定ID计轴区段所属TIOC编号（可查询全线计轴）
* 参数说明： const UINT16 axisSectionId, 计轴区段ID
* 返回值  ： 0: 获取数据失败
*			>0: 计轴区段所属TIOC编号
*/
UINT16 GetAxisBelongTiocAllLine(const UINT16 wAcId);

/*
* 功能描述：获取防护区域的建立周期号
* 参数说明：UINT8 chIndex 防护区域索引
* 返回值  ： UINT32 建立Tioc的周期号
*/
UINT32 EaGetBuildCycNum(const UINT8 chIndex);

/*
* 功能描述：根据防护区域编号获取防护区域的索引
* 参数说明：UINT16 wEaId 防护区域编号
* 返回值  ： 0< 防护区域的索引
*	         0  数据获取失败
* by cgh 20250311
*/
UINT16 GetEaIndex(const UINT16 wEaId);

#endif