/******************************************************************************
** 文件名:  as_api.h  ( link排序处理,外部调用函数 )
** 描 述:   link排序处理模块
*******************************************************************************/
#ifndef INC_AS_API_INC
#define INC_AS_API_INC

#include "AxisSort_define.h"
#include "AxisSort.h"
#include "TrainOnAcManage.h"


/* 模块主逻辑 */
/*
 * @brief AS模块初始化
 */
void as_Init(void);

/*************************************************************
* @name  as_CycleInit
* @brief 周期初始化
* @param[in] void
* @return void
* @note
*************************************************************/
void as_CycleInit(void);

/*****************************************************************************
* @name        as_MainProcess
* @brief       AS模块主函数
* @param[in]   无
* @return      无
* @note        无
*****************************************************************************/
void as_MainProcess(void);



/*
 * @brief 通信车排序
 *        正常通信列车: 根据列车包络刷新通信车序列；
 *        本周期丢失位置的通信列车: 在序列中转为故障车，从通信车序列中移除；
 *        本周期新出现的位置报告列车: 添加到通信车序列和link序列中。
 */
void as_SortCT(void);

/*
 * @brief 非通信车排序
 *        故障车，序列中添加故障车；
 *        无车的UT计轴，添加故障车到序列；
 */
void as_SortUT(void);

/*****************************************************************************
* @name        as_SortBaseEnveLope
* @brief       根据所有的包络排序，落到AC和link上（未处理筛选无效车）
* @param[in]   无
* @return      无
* @note        无
*****************************************************************************/
void as_SortBaseEnveLope(void);

/*-
 * @brief 获取Link上第一列车的信息
 * @param[in] u16LinkID LinkID
 * @return 第一列车的列车序列信息
 * @note "第一列车"指电子地图方向起点端列车
 *       Link不在本ZC控区/Link排序异常/Link无车时，调用本函数将返回一个故障车
 *       和as_GetLinkTrainNum()结合使用
 */
TRAIN_SEQUANCE_s as_GetLinkFirstTrain(IN UINT16 u16LinkID);

/*-
 * @brief 获取Link上最后一列车的信息
 * @param[in] u16LinkID LinkID
 * @return 最后一列车的列车序列信息
 * @note "最后一列车"指电子地图方向的终点端的列车
 *       Link不在本ZC控区/Link排序异常/Link无车时，调用本函数将返回一个故障车
 *       和as_GetLinkTrainNum()结合使用
 */
TRAIN_SEQUANCE_s as_GetLinkLastTrain(IN UINT16 u16LinkID);

/*-
 * @brief 获取Link上的列车数量
 * @param[in] u16LinkID LinkID
 * @return 列车数量
 * @note Link不在本ZC控区/Link排序异常时，函数将返回1，输出一个故障车
 */
UINT8 as_GetLinkTrainNum(IN UINT16 u16LinkID);

/*-
 * @brief 获取Link上的列车序列
 * @param[in] u16LinkID LinkID
 * @param[out] TrainList 列车序列
 * @param[in] u32MaxTrainNum 列车序列的数量上限(SIZE_MAX_TRAINOFAC(20U))
 * @return 列车数量
 * @note TrainList[]沿电子地图方向从起点向终点排列，即TrainList[0]是电子地图起点端列车
 *       Link不在本ZC控区/Link排序异常/传入的列车序列空间过小时，函数将返回一个故障车
 */
UINT8 as_GetLinkTrainList(IN UINT16 u16LinkID, OUT TRAIN_SEQUANCE_s TrainList[SIZE_MAX_TRAINOFAC], IN UINT32 u32MaxTrainNum);

/* 辅助查询API */
/*-
* @brief 列车序列搜索
* @param[in] u16TrainID  列车ID
* @param[in] u8TrainNum  列车序列数量
* @param[in] TrainList   列车序列列表
* @return 正常 在列车序列中的角标
*         异常 INVALID_8（0xFFU）
*/
UINT8 as_SeqSearch(IN UINT16 u16TrainID, IN UINT8 u8TrainNum, IN const TRAIN_SEQUANCE_s TrainList[SIZE_MAX_TRAINOFAC]);


/*****************************************************************************
* @name        as_GetACTrainEnevelopList
* @brief       获取计轴上的包络序列
* @param[in]   u16ACID 计轴ID
* @param[out]  TrainList 列车序列
* @param[in]   u32MaxTrainNum 列车序列的数量上限
* @return      列车数量
* @note        TrainList[]沿电子地图方向从起点向终点排列，即TrainList[0]是电子地图起点端列车
*              计轴不在本ZC控区/计轴排序异常(有对向列车)/传入的列车序列空间过小时，函数将返回1个故障车
*              注意：AC上的序列只针对包络排序，不包括ct车头尾筛选无效的隐藏车
*****************************************************************************/
UINT8 as_GetACTrainEnevelopList(UINT16 u16ACID, TRAIN_SEQUANCE_s TrainList[], UINT32 u32MaxTrainNum);

/**
* @brief 比较两个包络的前后关系
* @param[in] const EnvelopeStruct* pEnvelopeA 包络A
* @param[in] const EnvelopeStruct* pEnvelopeB 包络B
* @return 0x01 包络A在包络B前
0x02 包络B在包络A前
0x00 无法比较位置关系
* @note 无
*/
UINT8 as_CalcEnvelopeOrder(IN const EnvelopeStruct* pEnvelopeA, IN const EnvelopeStruct* pEnvelopeB);



/******以下是从其他接口模块获取,as和ssp模块需要***************************/

/*
* @name        TrainManage_GetTrainLocValid
* @brief       获取列车位置是否有效
* @param[in]   UINT16 TrainID
* @return      列车位置是否有效,通信车则返回FLAG_SET
* @note        从列车管理模块获取
***/
UINT8 TrainManage_GetTrainLocValid(IN UINT16 TrainID);


/**
* @name        TrainManage_GetTrainDir
* @brief       获取列车运行方向（最小安全后端指向车头）
* @param[in]   UINT16 TrainID
* @return     0: 获取数据失败
*			  0x55:与逻辑方向同向
*			  0xAA: 与逻辑方向反向
*			  0xFF: 无效
* @note        从列车管理模块获取
***/
UINT8 TrainManage_GetTrainDir(IN UINT16 TrainID);


/***
* @name        TrainManage_GetTrainSafeLoc
* @brief       获取列车安全位置（即安全包络的前后端）
* @param[in]   要获取的安全位置类型 FINDHEADSAFEFLAG 安全车头 ；FINDTAILSAFEFLAG 安全车尾
* @param[in]   列车ID
* @param[out]  安全车头/车尾所处link
* @param[out]  安全车头/车尾所处偏移
* @return      查询成功；0 查询失败
* @note         从列车管理模块获取
**/
UINT8 TrainManage_GetTrainSafeLoc(IN UINT8 u8SafelocType, IN UINT16 u16TrainID, OUT UINT16 *pu16Link, OUT UINT32 *pu32Offset, OUT UINT8 *pu8Dir);

/*****************************************************************************
* @name        as_GetTrainsferData
* @brief       获取跟随数据
* @param[in]   UINT32 curIndex 当前索引
* @param[OUT]  UINT8 * pDataBuff 数据存储缓冲区
* @return      计算后的索引  ret>curIndex 获取成功
* @note        无
*****************************************************************************/
UINT32 as_GetTransferData(OUT UINT8 * pDataBuff, IN UINT32 curIndex);

/*****************************************************************************
* @name        as_SetTrainsferData
* @brief       设置跟随数据
* @param[in]   UINT32 curIndex 当前索引
* @param[IN]   UINT8 * pDataBuff 数据存储缓冲区
* @return      计算后的索引  ret>curIndex 获取成功
* @note        无
*****************************************************************************/
UINT32 as_SetTransferData(IN UINT8 * pDataBuff, IN UINT32 curIndex);

/**
* @brief 比较两个列车的前后关系
* @param[in] const EnvelopeStruct* pEnvelopeA 包络A
* @param[in] const EnvelopeStruct* pEnvelopeB 包络B
* @return 0x01 包络A电子地图方向在左
0x02 包络B在电子地图方向左
0x00 无法比较位置关系
* @note 无
*/
UINT8 as_CalcAreaOrder(IN const TrainLocStruct* pTrainA, IN const TrainLocStruct* pTrainB);

/*****************************************************************************
* @name        TrainManage_GetTrainSleepState
* @brief       获取列车休眠状态
* @param[in]   UINT16 TrainID
* @return     0: 获取数据失败
*			  0x55:列车处于休眠状态
*			  0xAA:列车未处于休眠状态
* @note        从列车管理模块获取
* by cgh 20240726
*****************************************************************************/
UINT8 TrainManage_GetTrainSleepState(IN UINT16 TrainID);

#endif /* INC_AS_API_INC */



