/****************************************************************************************************
* 文件名   :  APP_LinkManage.h
* 版权说明 :  交控科技股份有限公司
* 版本号   :  1.0
* 创建时间 :  2022.02.28
* 作者     :  TIOC组
* 功能描述 :  LINK数据管理头文件
* 使用注意 :
*
* 修改记录 :
*
**************************************************************************************************/
#ifndef _LINK_CONFIG_DATA_MANAGE_H_
#define _LINK_CONFIG_DATA_MANAGE_H_

#ifdef __cplusplus
extern "C"
{
#endif

#include "Commontypes.h"
#include "dsuStruct.h"
#include "SectionDefine.h"
#include "dquQuery.h"


/* 相对于LINK逻辑方向 */
#define DIR_SAME				0x55u		/* 与逻辑方向相同 */
#define DIR_CONVERT				0xAAu		/* 与逻辑方向相反 */
#define DIR_INVALID				0xFFU		/*方向无效*/

#define FLAG_SET				0x55u		/* 置位 */
#define FLAG_UNSET				0xAAu		/* 未置位 */

#define FIND_FRONT_PROTECT_POINT_TIME	20U	/* 查找前方防护点循环次数 */
#define MAX_POINT_IN_AREA		50u     /*区域中包含的最大道岔数量*/
#define USE_DSU_TWOPOINT_LINK_SIZE		100				/*调用查询两点之间距离时link数组容量*/

#define DIRECTIONPOINT_FLAG_VALID	0x55U		/*方向变换标志 有效*/
#define DIRECTIONPOINT_FLAG_INVALID	0xAAU		/*方向变换标志 无效*/

/*====================link端点或者基于link中的一点进行偏移================================*/
typedef enum OFFSET_BASE_TYPE_EU
{
	POINT_START = 0x00U,     /*link沿行进方向的起点*/
	POINT_END = 0x01U,       /*link沿行进方向的终点*/
	OFFEST_FOWARD = 0x02U,   /*link中的沿行进方向向前偏移*/
	OFFEST_BACK = 0x03U,     /*link中的沿行进方向向后偏移*/
}eu_OffestBaseType;

/*定义道岔link所属位置*/
typedef enum SWITCH_LINK_NAME_EU
{
	SW_DEFAUT_LINK = 0U,             /*非道岔link*/
	SW_CON_LINK = 1U,				/*汇合link*/
	SW_MAIN_LINK = 2U,				/*定位link*/
	SW_SIDE_LINK = 3U,				/*反位link*/

}eu_SwLinkName;

typedef struct
{
	UINT16  wId;					/*link编号*/
	UINT32  dwLength;				/*link长度（cm）*/
	UINT16  wLinkLine;              /*Link所处线路的上下行信息*/
	UINT16  wOrgnPointType;			/*link起点端点类型*/
	UINT16  wOrgnPointId;			/*link起点端点编号*/
	UINT16  wOrgnJointMainLkId;		/*link起点相连接的相邻正线link编号*/
	UINT16  wOrgnJointSideLkId;		/*link起点相连接的相邻侧线link编号*/
	UINT16  wTmnlPointType;			/*link终点端点类型*/
	UINT16  wTmnlPointId;			/*link终点端点编号*/
	UINT16  wTmnlJointMainLkId;		/*link终点相连接的相邻正线link编号*/
	UINT16  wTmnlJointSideLkId;		/*link终点相连接的相邻侧线link编号*/

	UINT16  wBelongPlatformId;		/*Link所属站台ID*/
	UINT16  wManageTioc;			/*所属TIOC区域编号*/

	UINT8 chLogicLineRelation;		/*系统定义逻辑方向与上下行方向的关系*/
	UINT8 chLogicDirChanged;		/*Link逻辑方向变化点*/
	UINT16 wRelatedPhySec;			/*关联物理区段*/
	UINT8 chSwTrack;				/*休眠唤醒轨属性*/
	UINT16 wStopAreaId;				/*link停车区域编号*/
	UINT8 chPlatform;				/*站台轨属性*/
	UINT16 wPlatformId;				/*逻辑站台ID(默认0，需link为站台轨才为有效值，仅供RRM使用)*/
	UINT8 chRevertArea;             /* 折返属性 */
	UINT8 chLinkTgEvacuateDir;		/*脱轨及区间疏散防护线路上下行属性*/
	UINT8 chLinkLinXian;			/*Link临线属性*/
	UINT8 chRelPhySecIsAGorBG;		/*Link关联物理区段为AG/BG：0x55 AG;0xAA BG;0xFF 非AG非BG*/
	UINT8 chExistRelCGFlag;         /*LINK是否存在关联CG标志*/
	UINT16 wBGLinkRelAGLink;        /*BGlink关联的AGlink*/
	UINT16 wLinkSpecialEa;          /*LINK特殊防护区域属性*/
	UINT32 dwFrontDis;  /*LINK车头向前延伸最大防护距离*/
	UINT32 dwBehindDis;  /*LINK车尾向后延伸最大防护距离*/
}LinkDataConfigStru;

typedef struct
{
	UINT16 wLinkId;		/* LINK编号 */
	UINT16 wPointType;	/* 端点类型 */
	UINT16 wPointId;	/* 端点编号 */
	UINT16 wMainLinkId;	/* 相邻正线link编号 */
	UINT16 wSideLinkId;	/* 相邻侧线link编号 */
}LinkPointDataStru,*pLinkPointData;

/*位置信息结构体*/
typedef struct
{
	UINT16  wLinkId;				/*Link编号*/
	UINT32  dwOffset;				/*Link偏移量*/
}struct_PathPoint, *p_strPathPoint;

/* 路径信息 */
typedef struct PATH_LINK_INFO_STRU
{
	UINT8  cLinkCnt;                                     /*link数量*/
	UINT16 szLinkId[LINK_SUM_MAX];                      /*路径ID*/
}str_PathLinkInfo, *p_StrPathLinkInfo;

/*列车占压区域*/
typedef struct ZONE_STRU
{
	UINT8 Dir;
	struct_PathPoint pStart;
	struct_PathPoint pEnd;
	str_PathLinkInfo pLinkSeq;
}str_Zone, *p_StrZone;

/*定义路径中道岔信息*/
typedef struct AREA_OF_POINT_INFO_STRU
{
	UINT16 pointID;     /*道岔ID*/
	UINT8 status;       /*道岔状态*/
}str_AreaOfPointInfo, *p_strAreaOfPointInfo;

/*定义路径中的道岔信息*/
typedef struct POINT_IN_AREA_STRU
{
	UINT8 SwitchNum;
	str_AreaOfPointInfo SwitchInfo[MAX_POINT_IN_AREA];
}str_PointInArea, *p_strPointInArea;

extern LinkDataConfigStru g_szLinkConfigData[LINK_SUM_MAX];
extern UINT16 g_linkNum;

/**
* @brief GetLinkNum 获取LINK数量
* @param void
* @return LINK数量
*/
extern UINT16 GetLinkNum(void);

/**
* @brief GetLinkData 获取LINK数据
* @param void
* @return LINK数据
*/
extern LinkDataConfigStru * GetLinkData(void);

/**
* @brief GetLinkDataById 根据ID获取LINK数据
* @param linkId 编号
* @return LINK数据
*/
extern LinkDataConfigStru * GetLinkDataById(const UINT16 linkId);

/**
* @brief GetLinkDataByIndex 根据索引获取LINK数据
* @param linkIndex 索引
* @return LINK数据
*/
extern LinkDataConfigStru * GetLinkDataByIndex(const UINT16 linkIndex);

/**
* @brief GetLinkIndexById 根据编号获取索引
* @param linkId 编号
* @return LINK索引
*/
extern UINT16 GetLinkIndexById(const UINT16 linkId);

/**
* @brief GetLinkLengthById 获取LINK长度
* @param linkId 编号
* @return LINK长度
*/
extern UINT32 GetLinkLengthById(const UINT16 linkId);

#if 0
/**
* @brief GetLinkPointType 获取LINK端点类型
* @param linkId 编号
* @return LINK长度
*/
extern UINT8 GetLinkPointType(const UINT16 linkId, UINT8 * pOrgnPointType, UINT8 * pTmnlPointType);
#endif
/**
* @brief GetLinkLineById 获取LINK上下行信息
* @param linkId 编号
* @return LINK上下行信息 0x55:上行，0xaa:下行
*/
extern UINT16 GetLinkLineById(const UINT16 linkId);

/**
* @brief GetLinkOrgnPointTypeId 获取LINK起点端点类型
* @param linkId 编号
* @return LINK起点端点类型
*/
extern UINT16 GetLinkOrgnPointTypeById(const UINT16 linkId);

/**
* @brief GetLinkOrgnPointIdById 获取LINK起点端点编号
* @param linkId 编号
* @return LINK起点端点编号
*/
extern UINT16 GetLinkOrgnPointIdById(const UINT16 linkId);

/**
* @brief GetLinkOrgnJointMainLkIdById 获取LINK起点相连接的相邻正线link编号
* @param linkId 编号
* @return LINK起点相连接的相邻正线link编号
*/
extern UINT16 GetLinkOrgnJointMainLkIdById(const UINT16 linkId);

/**
* @brief GetLinkOrgnJointSideLkIdById 获取LINK起点相连接的相邻侧线link编号
* @param linkId 编号
* @return LINK起点相连接的相邻侧线link编号
*/
extern UINT16 GetLinkOrgnJointSideLkIdById(const UINT16 linkId);

/**
* @brief GetLinkTmnlPointTypeById 获取LINK终点端点类型
* @param linkId 编号
* @return LINK终点端点类型
*/
extern UINT16 GetLinkTmnlPointTypeById(const UINT16 linkId);

/**
* @brief GetLinkTmnlPointIdById 获取LINK终点端点编号
* @param linkId 编号
* @return LINK终点端点编号
*/
extern UINT16 GetLinkTmnlPointIdById(const UINT16 linkId);

/**
* @brief GetLinkTmnlJointMainLkById 获取LINK终点相连接的相邻正线link编号
* @param linkId 编号
* @return LINK终点相连接的相邻正线link编号
*/
extern UINT16 GetLinkTmnlJointMainLkById(const UINT16 linkId);

/**
* @brief GetLinkTmnlJointSideLkById 获取LINK终点相连接的相邻侧线link编号
* @param linkId 编号
* @return LINK终点相连接的相邻侧线link编号
*/
extern UINT16 GetLinkTmnlJointSideLkById(const UINT16 linkId);

/**
* @brief GetLinkManageOcById 获取LINK所属TIOC区域编号
* @param linkId 编号
* @return LINK所属OC区域编号
*/
extern UINT16 GetLinkManageTiocById(const UINT16 linkId);

/**
* @brief GetLinkLogicDirChangedById 获取LINK逻辑方向变化点
* @param linkId 编号
* @return LINK逻辑方向变化点
*/
extern UINT8 GetLinkLogicDirChangedById(const UINT16 linkId);

/**
* @brief 获取link逻辑方向与上下行方向的关系
* @param linkId 编号
* @return LINK逻辑方向与上下行方向的关系
*/
extern UINT8 GetLinkLogicLineReleationById(const UINT16 linkId);

/**
* @brief  获取LINK端点信息
* @param chDir 方向
* @param wLinkId LINK编号
* @param pLinkPoint 端点信息
* @return OC_SUCCESS:成功；OC_ERROR:失败
*/
extern UINT8 GetLinkPointInfo(UINT8 chDir, UINT16 wLinkId, pLinkPointData pLinkPoint);

/**
* @brief 根据查询方向获取link端点偏移量
* @param wLinkId link编号
* @return OC_SUCCESS:成功；OC_ERROR_:失败
*/
extern UINT8 GetLinkOffsetByDir(struct_PathPoint* pPoint, UINT8 chDir, UINT8 chPointType, UINT32 dwDistance);

/*函数功能：获取道岔区域相邻两Link连接时期望的道岔状态*/
extern UINT8 dsuSwitchStatusBtwLink(UINT16 wSwitchID, UINT16 wlinkA, UINT16 wlinkB, UINT8 *exSwitchStatus);

/**
* @brief 判断link编号有效性
* @param wId 编号
* @return OC_ERROR:无效 OC_SUCCESS:有效
*/
extern UINT8 IsLinkIdValid(UINT16 wId);

/**
* @brief 校验linkID与偏移量是否有效
* @param wLinkId：link编号 dwOffest：偏移量
* @param dwLinkOffset
* @return CI_ERROR:无效；CI_SUCCESS:有效
*/
extern UINT8 CheckLinkValid(UINT16 wLinkId, UINT32 dwOffest);

/**
* @brief 查询某一位置沿指定方向移动指定距离后的新位置及查找过程中遇到的道岔信息
* @param struct_PathPoint pStart 起点
* @param UINT32 dwDistance 距离
* @param UINT8 chDir 方向
* @param struct_PathPoint *pEnd 查询到的终点
* @param UINT16 * pSwitchId 不连通的道岔ID
* @return 0：查询失败；1：查询到线路终端；2：道岔不连通；3：查询成功；4：道岔不连通且岔区占用
*/
extern UINT8 dsuNewLocAndObsByOffsetDis(IN struct_PathPoint pStart, IN UINT32 dwDistance, IN UINT8 chDir, OUT struct_PathPoint *pEnd, OUT UINT16 * pSwitchId);

/**
* @brief 查询当前link的相邻link,由于道岔原因导致查询失败时，返回道岔的编号信息
* @param UINT16 wCurrentLinkId 当前link编号
* @param UINT8 chDirection 查询方向
* @param UINT16 *pSwitchId 道岔编号
* @return 下一link编号 失败：UINT16_MAX；线路终点：0u
*/
extern UINT16 FindAdjacentLinkIDSafe(UINT16 wCurrentLinkId, UINT8 chDirection, UINT16* pSwitchId, UINT8* directionPointFlag);

/**
* @brief 在两个link通过道岔相连时，判断连接关系与当前的道岔状态是否匹配。
* @param UINT16 wStartLinkId link编号
* @param UINT8 chDir 方向
* @param UINT16 *pSwitchId 道岔编号
* @return CI_SUCCESS匹配；CI_ERROR不匹配
*/
extern UINT8 dsuCheckLinkFitPointSafe(UINT16 wStartLinkId, UINT8 chDir, UINT16 *pSwitchId);

/**
* @brief 查询A点是否与B点的位置关系（只适应同一link上两点的位置比较或者两点重合）
* @param p_strPathPoint pPointA
* @param p_strPathPoint pPointB
* @param UINT8 dir
* @return 查询失败：CI_ERROR；两点重合：CI_SUCCESS；A点在B点前：FLAG_SET；B点在A点钱：FLAG_UNSET
*/
extern UINT8 dsuJudgeLinkAandLinkBPosition(p_strPathPoint pPointA, p_strPathPoint pPointB, UINT8 dir);

/**
* @brief 获取区域在指定link上的占压范围
* @param p_StrZone pZone 区域
* @param UINT16 wLinkId	link编号
* @param p_strPathPoint pStartPoint 在link占压起点
* @param p_strPathPoint pEndPoint 在link占压终点
* @return CI_ERROR失败 CI_SUCCESS成功
*/
extern UINT8 dsuZoneStartEndPointInLink(p_StrZone pZone, IN const UINT16 wLinkId, OUT p_strPathPoint pStartPoint, OUT p_strPathPoint pEndPoint);

/**
* @brief 判断点是否处于区域中
* @param strPoint 点信息
* @param strZone 区域信息
* @return CI_SUCCESS不在；CI_ERROR在
*/
extern UINT8 IsPointInPath(struct_PathPoint strPoint, str_Zone strZone);

/**
* @brief 通过起终点link和两link中道岔信息查询两link间的link序列。
* @param UINT16 linkA
* @param UINT16 linkB
* @param UINT8 chDir 方向
* @param p_strPointInArea pSwInfo 道岔信息
* @param p_StrPathLinkInfo pLinkSeq link序列
* @return CI_ERROR失败 CI_SUCCESS成功
*/
extern UINT8 dsuLinkSeqBtwLinkBaseSwitchInfo(UINT16 linkA, UINT16 linkB, UINT8 chDir, IN p_strPointInArea pSwInfo, OUT p_StrPathLinkInfo pLinkSeq);

/**
* @brief 通过两点和两点中的道岔信息查询两间的link序列。
* @param struct_PathPoint pStart 起点
* @param struct_PathPoint pEnd 终点
* @param UINT8 chDir 方向
* @param p_strPointInArea pSwInfo 道岔信息
* @param p_StrPathLinkInfo pLinkSeq link序列
* @return CI_ERROR失败 CI_SUCCESS成功
*/
extern UINT8 dsuLinkSeqInAreaBaseSwitchInfo(struct_PathPoint pStart, struct_PathPoint pEnd, UINT8 chDir, IN p_strPointInArea pSwInfo, OUT p_StrPathLinkInfo pLinkSeq);

/**
* @brief 查询A点到B点的距离。
* @param p_strPathPoint pAPoint
* @param p_strPathPoint pBPoint
* @param UINT8 *pDir
* @return 距离 查询失败：UINT32_MAX
*/
extern UINT32 DsuAPointToBPoint(p_strPathPoint pAPoint, p_strPathPoint pBPoint, UINT8 *pDir);

/**
* @brief 查询link属于道岔的位置。
* @param UINT16 wLinkID
* @param UINT16 wSwitchId
* @param UINT8 *p_LinkInSW
* @return CI_ERROR:查询失败；CI_SUCCESS:查询成功
*/
extern UINT8 dsuLinkofSwitchPos(UINT16 wLinkID, UINT16 wSwitchId, UINT8 *p_LinkInSW);

/**
* @brief 获取LINK关联物理区段编号
* @param linkId 编号
* @return LINK关联物理区段编号
*/
extern UINT16 GetLinkRelatedPhySec(const UINT16 linkId);

/**
* @brief 查询A点到B点间的link序列。
* @param p_strPathPoint pAPoint
* @param p_strPathPoint pBPoint
* @param UINT8 *pDir
* @param UINT16 * pLinkNum LINK数量
* @param UINT16 * pLinkIdBuf LINK编号缓存区
* @return CI_ERROR:查询失败；CI_SUCCESS:查询成功
*/
extern UINT8 DsuLinkSeqBtwPoints(p_strPathPoint pAPoint, p_strPathPoint pBPoint, OUT UINT8 *pDir, OUT UINT16 * pLinkNum, OUT UINT16 * pLinkIdBuf);

/**
* @brief 获取link在当前线路拓扑关系中所属计轴区段ID
* @param wLinkId
* @return link在当前线路拓扑关系中所属计轴区段ID
*/
extern UINT16 GetLinkBelongAcId(UINT16 wLinkId);

/************************************************************************
函数功能：将位置信息进行转换
入口参数: UINT16 wLinkSrc, UINT32 dwOffsetSrc
出口参数: UINT16* wLinkDst, UINT32* dwOffsetDst
返回值:  查询失败或查询到线路终端或输入位置不为link端点:  CI_ERROR;        查询成功: CI_SUCCESS
************************************************************************/
extern UINT8 dsuCheckSameLoc(UINT16 wLinkSrc, UINT32 dwOffsetSrc, UINT16* wLinkDst, UINT32* dwOffsetDst);

/**
* @brief 查询A点是否与B点的位置关系（任意link）
* @param p_strPathPoint pPointA
* @param p_strPathPoint pPointB
* @param UINT8 dir
* @return 查询失败：CI_ERROR；两点重合：CI_SUCCESS；A点在B点前：FLAG_SET；B点在A点钱：FLAG_UNSET
*/
extern UINT8 dsuJudgePointAandPointBPosition(p_strPathPoint pPointA, p_strPathPoint pPointB, UINT8 dir);

/*********************************************
函数功能：根据link序列获得记轴区段编号序列
输入参数：linkId 序列首地址，LinkNum link个数
输出参数：AxleSgmtId 记轴区段编号数组地址
AxleSgmtNum 数组长度
返回值：CI_ERROR失败，CI_SUCCESS成功
**********************************************/
extern UINT8 GetAxisSeqFromLinkSeq(UINT16* linkId, UINT16 LinkNum, UINT16 *AxleSgmtId, UINT16 * AxleSgmtNum,UINT16 maxSize);

/**
* @brief 通过起终点link和两link中link序列信息查询两link间的道岔信息。
* @param UINT16 linkA
* @param UINT16 linkB
* @param UINT8 chDir
* @param IN p_StrPathLinkInfo pLinkSeq
* @param OUT p_strPointInArea pSwInfo
* @return CI_ERROR:失败；CI_SUCCESS:成功
*/
extern UINT8 dsuSwitchInfoBtwLinkBaseLinkSeq(UINT16 linkA, UINT16 linkB, UINT8 chDir, IN p_StrPathLinkInfo pLinkSeq, OUT p_strPointInArea pSwInfo);

/**
* @brief 获取点所处逻辑区段
* @param struct_PathPoint strPoint 点
* @return 逻辑区段ID
*/
extern UINT16 GetPointBelongLogSec(struct_PathPoint strPoint);

/**
* @brief 获取两点间所有逻辑区段
* @param struct_PathPoint strPoint 点
* @return 逻辑区段ID
*/
extern UINT8 GetLogSecBtwTwoPoints(struct_PathPoint strStart, struct_PathPoint strEnd, UINT16 * pLogSecNum, UINT16 szLogId[]);

/**
* @brief 判断两个区域是否相交
* @param p_StrZone pZoneA
* @param p_StrZone pZoneB
* @return CI_ERROR 区域相交 ；CI_SUCCESS 区域不相交
*/
extern UINT8 CheckZoneIsCrossing(p_StrZone pZoneA, p_StrZone pZoneB);

/**
* @brief 判断点是否在本控区内
* @param wLink
* @param dwOffset
* @return CI_ERROR 在本控区内 ；CI_SUCCESS 不在本控区内
*/
extern UINT8 IsPointManaged(const UINT16 wLink, const UINT32 dwOffset);

/**
* @brief 判断LINK是否为休眠唤醒轨
* @param linkId 编号
* @return CI_SUCCESS:link为休眠唤醒轨；CI_ERROR:link不为休眠唤醒轨
*/
extern UINT8 IsLinkSwTrack(const UINT16 linkId);

/**
* @brief 判断LINK是否为折返区域
* @param linkId 编号
* @return CI_SUCCESS:link为折返区域；CI_ERROR:link不为折返区域
*/
extern UINT8 IsLinkRevertArea(const UINT16 linkId);

/**
* @brief 获取LINK停车区域编号
* @param linkId 编号
* @return LINK停车区域编号
*/
extern UINT16 GetLinkStopAreaId(const UINT16 linkId);

/*********************************************
函数功能：获取计轴区段序列中符合道岔位置中的一个
输入参数：szAxisId 序列首地址，wAxisNum wAxisNum个数
输出参数：无

返回值：0失败，其他 AxisID成功
**********************************************/
extern UINT16 GetAxisIdFromAxisSeqSafeSw(UINT16* szAxisId, UINT16 wAxisNum);

/**
* @brief 获取点所处公里标
* @param wLinkId
* @param dwLinkOffset
* @return 公里标
*/
extern UINT32 GetPointKm(UINT16 wLinkId, UINT32 dwLinkOffset);

/**
* @brief 判断LINK是否为站台
* @param linkId 编号
* @return CI_SUCCESS:link为站台；CI_ERROR:link不为站台
*/
extern UINT8 IsLinkPlatform(const UINT16 linkId);

/**
* @brief 获取点所处逻辑区段
* @param struct_PathPoint strPoint 点
* @param UINT16 * pLgcIdBuf 输出的逻辑区段ID
* @return 逻辑区段数量
* @note
*/
extern UINT8 GetPointBelongLogSecEx(struct_PathPoint strPoint, UINT16 * pLgcIdBuf);

/**
* @brief 获取link逻辑站台编号
* @param linkId 编号
* @return link逻辑站台编号;0:link不为站台轨
*/
extern UINT16 GetLinkPlatfrm(const UINT16 linkId);

/**
* @brief 获取ATS逻辑站台所属tioc编号
* @param const UINT16 wLgcStation
* @return ATS逻辑站台所属tioc编号
* @note
*/
extern UINT16 GetAtsLgcStationBelongTioc(const UINT16 wLgcStation);

/**
* @brief 获取站台关联的Link编号
* @param const UINT16 wLgcStation
* @return 站台关联Link编号
* @note
*/
UINT16 GetLinkIDBelongPlatForm(const UINT16 wPlatform);

/**
* @brief 判断LINK是否封锁
* @param const UINT16 wLinkId link编号
* @return CI_ERROR:link封锁；CI_SUCCESS:link未封锁
* @note
*/
extern UINT8 IsLinkFlock(const UINT16 wLinkId);

/**
* @brief 运营方向转换为逻辑方向
* @param const UINT8 chDir 运营方向
* @return DIR_SAME:与link逻辑方向相同；
DIR_CONVERT:与link逻辑方向相反；
DIR_INVALID:输入参数无效
* @note
*/
extern UINT8 ConvertDirectionToLogic(const UINT8 chDir);

/**
* @brief 逻辑方向转换为运营方向
* @param const UINT8 chDir 逻辑方向
* @return 0x55:上下
*		  0xaa:下行
*		  0xff:无效
*/
UINT8 ConvertLogicDirToRun(const UINT8 chDir);

/*
* 功能描述： 将当前逻辑方向取反
* 参数说明：
*			const UINT8 chTrainDir 列车运行方向
* 返回值  ： 取反运行方向
*/
extern UINT8 ConvertTrainDir(UINT8 chTrainDir);

/**
* @brief 根据方向变化点转换标志转换方向
* @param UINT8 wFlag	方向变换标志位
* @param UINT8 wPointDir 查询方向
* @param UINT8* wPointCnt 方向变换点数量（出参）
* @return 变换后的方向
*/
UINT8 TransDirectionPointDir(UINT8 wFlag, UINT8 wPointDir, UINT8* wPointCnt);

/**
* @brief 判断两点方向是否相同(可用作列车同向、对向行驶判断)
* @param[in] const LOD_STRU strPointA  A点
* @param[in] const LOD_STRU strPointB  B点
* @param[out] 无
* @return CI_ERROR:处理失败；FLAG_SET:同向；FLAG_UNSET:反向
*/
extern UINT8 IsPointABSameDir(const LOD_STRU strPointA, const LOD_STRU strPointB);

/*
* 功能描述： 根据方向变换点数量的奇偶改换方向
* 参数说明：UINT8 Dir, 方向
*			UINT8 wChangeNum	方向变换点数量
* 返回值  ： 0: 获取数据失败
*           >0: 方向
*/
extern UINT8 TransDirByChangeNum(UINT8 Dir, UINT8 wChangeNum);

/*
* 功能描述： 查询站台link外方第一逻辑区段
 * @param[in] UINT16 wLinkId 站台LinkID
 * @param[in] UINT8 chDir 查询方向
 * @param[out] UINT16 * pLgcIdBuf 逻辑区段ID缓冲区
 * @return 逻辑区段数量，UINT8_MAX失败，0线路终端
*/
UINT8 FindPlatFormLinkOutLog(UINT16 wLinkId, UINT8 chDir, UINT16 * pLgcIdBuf);

/**
* @brief 获取link脱轨及区间疏散防护线路上下行属性
* @param wLinkId 编号
* @return  0  失败
		   >0 link脱轨及区间疏散防护线路上下行属性
* by cgh 20240105
*/
UINT8 GetLinkTgEvacuateDir(const UINT16 wLinkId);

/**
* @brief 获取link 关联的所有逻辑区段
* @param  IN UINT16 *pLinkId linkID    UINT8 linkNum  link数量
* @param OUT UINT16 *pLgcSum 输出的逻辑区段数量
* @param OUT UINT16  pLgcIdBuf[SIZE_MAX_SECTION_BT_TRAIN] 输出的逻辑区段ID
* @return CI_ERROR 失败 CI_SUCCESS 成功
* @note
*/
UINT8 GetLinkRelLgcId(UINT8 linkNum, UINT16 *pLinkId, UINT16  *pLgcSum, UINT16  *pLgcIdBuf);

/**
* @brief 获取计轴区段序列中符合道岔位置中所有计轴区段
* @param  szAxisId 序列首地址
		  wAxisNum 计轴区段个数
* @param OUTchOutAxisSecSum 输出满足条件的计轴区段数目
		 szOutAxisSecIdBuf 输出的满足条件的计轴区段数组
* @return 符合的计轴区段数目
* @note by cgh 20240514
*/
UINT8 GetAllAxisFromAxisSeqSafeSw(UINT16* szAxisId, UINT16 wAxisNum, UINT16* szOutAxisSecIdBuf);

/**
* @brief 判断成员是否在序列内
* @param const UINT16 wMem 成员值
* @param const UINT8 chNum 序列成员数量
* @param UINT16 * pSeq 序列
* @return CI_ERROR:成员不在序列内；CI_SUCCESS:成员在序列内
*/
UINT8 IsMenberOfSeq(const UINT16 wMem, const UINT8 chNum, UINT16 * pSeq);

/*
* @brief 获取link关联物理区段的AG/BG属性
* @param wLinkId 编号
* @return 0x55 AG
*		  0xAA BG
*		  0xFF 非AG非BG
* Created By LQ 20240815
*/
UINT8 GetLinkRelPhySecAGorBGAttr(const UINT16 wLinkId);

/*
* @brief 获取BGlink关联的AGlink（用于BG1）
* @param const UINT16 wBGLinkId BGlink编号
* @return BGlink关联的AG link ID
* Created By LQ 20240815
*/
UINT16 GetBGLinkRelAGLinkId(const UINT16 wBGLinkId);

/*
* @brief 获取link起点关联计轴区段采集占用状态
* @param wLinkId 编号
* @return 0x55 空闲
*         0xAA 占用
* Created By LQ 20240815
*/
UINT8 GetLinkOrgAxleSecOccSta(const UINT16 wLinkId);

/*
* @brief 获取link终点关联计轴区段采集占用状态
* @param wLinkId 编号
* @return 0x55 空闲
*         0xAA 占用
* Created By LQ 20240815
*/
UINT8 GetLinkTmlAxleSecOccSta(const UINT16 wLinkId);

/*
* @brief 获取AG LINK是否存在关联CG标志
* @param wLinkId 编号
* @return LINK_EXIST_REL_CG_DEFAULT *Link不需要关联CG属性
*		  LINK_EXIST_REL_CG_YES  存在
*		  LINK_EXIST_REL_CG_NO   不存在
* by cgh 20240821
*/
UINT8 GetAgLinkExistRelCgFlag(const UINT16 wLinkId);

/*
* @brief 获取link特殊防护区域属性
* @param wLinkId 编号
* @return 0 不具备特殊防护区域属性
*         >0 特殊防护区域属性
* by cgh 20250818
*/
UINT16 GetLinkSpecialEaAttr(const UINT16 wLinkId);

/*
* @brief 获取link特殊防护区域车头向前延伸最大防护距离
* @param wLinkId 编号
* @return 0 失败
*         >0 车头向前延伸最大防护距离
* by cgh 20250818
*/
UINT32 GetLinkSpecialEaFrontDis(const UINT16 wLinkId);

/*
* @brief 获取link特殊防护区域车尾向后延伸最大防护距离
* @param wLinkId 编号
* @return 0 失败
*         >0 车尾向后延伸最大防护距离
* by cgh 20250818
*/
UINT32 GetLinkSpecialEaBehindDis(const UINT16 wLinkId);

/**
* @brief 根据查询方向获取link剩余偏移量
* @param struct_PathPoint pPoint LINK信息
* @param UINT8 chDir 查询方向
* @return UINT32_MAX 获取失败
*		  其它取值 link剩余偏移量
* by cgh 20250819
*/
UINT32 GetRelDirLinkOffset(struct_PathPoint pPoint, UINT8 chDir);

#ifdef __cplusplus
}
#endif

#endif // !_LINK_CONFIG_DATA_MANAGE_H_
