/******************************************************************************
** 文件名:  AxisAssertManageAPI.h
** 描 述:   计轴故障诊断模块，计轴故障诊断模块简称aam
*******************************************************************************/

#ifndef AXIS_ASSERT_MANAGE_API_H_
#define AXIS_ASSERT_MANAGE_API_H_

#include "AxisAssertDefine.h"
#include "EnvelopeDefine.h"


/**
 * @brief 计轴故障诊断模块初始化
 * @return CI_ERROR 初始化成功
           CI_SUCCESS 初始化失败
 * @note 
 */
UINT8 aam_Init(void);


/**
 * @brief 计轴故障诊断模块处理主函数
 * @param[in] 
 * @param[out]
 * @return 
 * @note 
 */
void aam_MainProcess(void);


/**
 * @brief 对外接口：设置计轴区段列车进入类型
 * @param[in] UINT8 flag 列车进入类型
 * @param[in] UINT16 supicTrainid 可疑车id
 * @param[in] UINT16 acID 计轴id
 * @param[in] UINT16 trainid 列车ID
 * @return 无
 * @note 无
 */
void aam_SetEnvelopeEnterFlag(UINT8 flag,UINT16 supicTrainid, UINT16 acID,UINT16 trainId);

/**
 * @brief 对外接口：获取计轴故障诊断状态
 * @param[in] UINT16 ACID 
 * @param[out]
 * @return 
 * @note 
 */
UINT8 aam_GetACAssertStatus(UINT16 ACID);

/**
 * @brief 对外接口：获取计轴关联的物理区段的故障诊断状态
 * @param[in] UINT16 phyID 物理区段ID
 * @param[out]
 * @return AAM_API_AC_ARB 物理区段ARB
           UINT8_MAX 物理区段非ARB
 * @note 物理区段关联的计轴区段占用且都为ARB时，则返回ARB，否则返回UT
 */
UINT8 aam_GetPhyIsARB(UINT16 phyID);

/**
 * @brief 对外接口：获取计轴好车通过标志
 * @param[in] 
 * @param[out]
 * @return 
 * @note 
 */
UINT8 aam_GetACPassTrainFlag(UINT16 ACID);

/**
 * @brief 对外接口：获取计轴对应的诊断信息地址
 * @param[in] 
 * @param[out]
 * @return 
 * @note 
 */
const AxisAsserStruct* aam_GetAxisAssertInfoPtr(UINT16 ACID);


/**
 * @brief 对外接口：跟随计轴诊断模块数据
 * @param[out] UINT8 *pDataBuff 跟随数据的存储地址指针
 * @param[in] UINT32 curIndex 跟随数据的索引地址
 * @return 跟随数据的长度
 * @note 无
 */
UINT32 aam_GetTransferData(OUT UINT8 *pDataBuff,UINT32 curIndex);

/**
 * @brief 对外接口：拷贝计轴诊断模块数据
 * @param[in] const UINT8 *pDatabuff 跟随数据的存储地址指针
 * @param[in] UINT32 curIndex 跟随数据的索引地址
 * @param[in] UINT32 len 跟随数据的长度
 * @return 截取数据索引
 * @note 
 */
UINT32 aam_SetTransferData(IN const UINT8 *pDatabuff,UINT32 curIndex,UINT32 len);


/**
 * @brief 对外接口：清除计轴好车通过标志
 * @param[in] UINT16 ACID 计轴ID
 * @param[out]
 * @return 
 * @note 
 */
UINT8 aam_ClearACPassTrainFlag(UINT16 ACID);


/**
 * @brief 对外接口：清除计轴好车通过信息
 * @param[in] UINT16 ACID 计轴ID
 * @param[in] UINT16 trainID 列车ID
 * @param[out] 无
 * @return 无
 * @note 无
 */
void aam_ClearACEnvelopeEnterInfo(UINT16 ACID,UINT16 trainID);

/**
* @brief 对外接口：获取计轴关联的物理区段是否存在好车通过计轴区段
* @param[in] UINT16 acID
* @param[out] 无
* @return AAM_CT_PASS 物理区段好车通过
AAM_UT_PASS 物理区段坏车通过
* @note 物理区段关联的计轴区段有好车通过标志则认为该物理区段好车通过
*所有区段均无好车通过标志，则物理区段坏车通过
*/
UINT8 aam_GetACRelPhyPassTrainFlag(UINT16 acID);



/**
 * @brief 对外接口：查询计轴接近车类型
 * @param[in] UINT16 baseACID 基准计轴
 * @param[in] UINT8 Dir 查询方向
 * @param[in] UINT8 acCnt 相邻计轴区段数量
 * @param[in] UINT16 acID[AC_MAXCNT_IN_SWITCH] 相邻计轴区段ID
 * @param[out]
 * @return 
 * @note 
 */
UINT8 aam_SearchNearbyTrainType(UINT16 baseACID, UINT8 Dir, UINT8 acCnt, UINT16 acID[AC_MAXCNT_IN_SWITCH]);


/**
 * @brief 对外接口：设置计轴进入冗余状态
 * @param[in] UINT16 ACID 计轴ID
 * @param[out] 无
 * @return  无
 * @note 无
 */
void aam_SetACEnterRedun(UINT16 ACID);


/**
* @brief 对外接口：检查计轴是否进入冗余状态
* @param[in] UINT16 ACID 计轴ID
* @param[out] 无
* @return  
* @note 
*/
UINT8 aam_CheckACEnterRedun(UINT16 ACID);

/**
* 功能：查询物理区段邻近范围内无坏车占用
* 输入参数：UINT16 ACID 计轴区段
* 返回值：CI_ERROR 判断时间和距离范围内有坏车   CI_SUCCESS 检查通过
* Create:  fan 2024/08/22
*/
UINT8 aam_CheckNearbyTrainType(UINT16 ACID);

/**
* 函数功能：计轴子系统通信中断ARB处理
* 输入参数：无
* 返回值：无
* Create By LQ 2025.02.23
*/
void aam_AxisCommBadArbPro(void);

/**
* 函数功能：计轴子系统通信中断ARB处理——列车条件检查
* 输入参数：无
* 返回值：CI_SUCCESS 1 成功
*         CI_ERROR 0 失败
* Create By LQ 2025.02.23
*/
UINT8 aam_AxisCommBadArbTrainCheck(void);

/**
* 函数功能：计轴子系统通信中断ARB处理——区段条件检查
* 输入参数：无
* 返回值：CI_SUCCESS 1 成功
*         CI_ERROR 0 失败
* Create By LQ 2025.02.23
*/
UINT8 aam_AxisCommBadArbSecCheck(void);

/*
* 功能描述：设置集中区内计轴区段ARB
* 参数说明：无
* 返 回 值：无
*/
void SetRcAxleArb(void);

/**
* @brief 对外接口：获取计轴诊断状态接口
* @param[in] UINT16 计轴ID
* @param[out]
* @return UINT8 计轴诊断状态
* Creat fan 20250310
*/
UINT8 aam_GetAxisStatusAPI(UINT16 ACID);

/**
* 函数功能：检查计轴所在物理区段均无故障车
* 输入参数：UINT16 ACID 计轴区段id
* 返回值：CI_SUCCESS 无故障车
*         CI_ERROR 存在故障车
* Create By fan 2025.06 18
*/
UINT8 aam_CheckPhyTrain(UINT16 ACID);

/*
* 函数功能：ARB区段连续占用检查
* 输入参数：UINT16 wAcId 计轴区段ID
*           UINT8 cNearAcNum 相邻计轴区段数量
*           UINT16 pNearAcId[AC_MAXCNT_IN_SWITCH] 相邻计轴区段ID
* 返 回 值：CI_SUCCESS 1 成功
*           CI_ERROR 0 失败
* Created By LQ 2025.08.07
*/
UINT8 aam_ArbContinuousOccCheck(UINT16 wAcId, UINT8 cNearAcNum, UINT16 pNearAcId[AC_MAXCNT_IN_SWITCH]);


/**
* 功能：查询计轴区段邻近范围内包络类型
* 输入参数：UINT16 ACID 计轴区段
* @param[in] UINT16 ACID 基准计轴ID
* @param[in] UINT8 dir 查询方向
* @param[in] UINT16 arACID[AC_MAXCNT_IN_SWITCH] 相邻计轴ID
* @param[in] UINT8 DirectionPointFlag  是否有方向变化点 DIRECTIONPOINT_FLAG_VALID
AAM_NO_TRAIN_NEAR 无车接近
AAM_BAD_NEAR 坏车
AAM_GOOD_OCC 好车占用
AAM_SLEEP_OCC 休眠车
AAM_GOOD_FAR_AWAY 好车远离
AAM_GOOD_NEAR 好车接近
* Create:  fan 2026/04/11
*/
UINT8 aam_CheckNearbyTrainEnvelopeType(UINT16 baseACID, UINT8 Dir, UINT8 acCnt, UINT16 acID[AC_MAXCNT_IN_SWITCH], UINT8 DirectionPointFlag);


/**
* 功能：更新路线上更有风险的列车类型结果
* 输入参数：UINT8 chPreType当前记录类型  UINT8 chAfterType比较的更新列车类型
* 返回值：
AAM_NO_TRAIN_NEAR 无车接近
AAM_BAD_NEAR 坏车
AAM_GOOD_OCC 好车占用
AAM_SLEEP_OCC 休眠车
AAM_GOOD_FAR_AWAY 好车远离
AAM_GOOD_NEAR 好车接近
* Create:  fan 2026/04/11
*/
UINT8 GetWorseNearbyTrainType(UINT8 chPreType, UINT8 chAfterType);
#endif /*AXIS_ASSERT_MANAGE_API_H_*/
