/******************************************************************************
** 文件名:  EnvelopeManageAPI.h
** 描 述:   列车包络管理模块对外接口头文件
*******************************************************************************/

#ifndef ENVELOPE_MANAGE_API_H_
#define ENVELOPE_MANAGE_API_H_
#include "EnvelopeDefine.h"

/**
 * @brief 对外接口：列车包络管理模块上电初始化
 * @return CI_SUCCESS 上电初始化成功
 *         CI_ERROR   上电初始化失败
 * @note OC上电时
 */
UINT8 elm_Init(void);

/**
 * @brief 对外接口：列车包络管理模块主入口函数
 * @param[in] 
 * @param[out]
 * @return 
 * @note 列车包络管理需要处理CT车包络、UT车包络及隐藏车包络
 *       隐藏车包络即计轴区段无通信车包络或者UT车包络，也无法判断为计轴器故障，则该计轴区段为隐藏车包络
 *       CT车包络即有通信列车安全位置形成的包络
 *       UT车包络即丢失通信车后的列车包络
 */
void elm_MainProcess(void);


/**
 * @brief 对外接口：通过计轴数组ID查找计轴区段上的包络信息
 * @param[in] UINT16 acID
 * @param[out] EnvelopeStruct envelopeInfo[] 计轴区段上的包络信息
 * @return 0 计轴区段上不存在包络
           非0且小于SECTION_REL_ENVELOPE_SUM_MAX 计轴区段上包络数量
		   其他，非法返回，函数执行错误
 * @note 
 */
UINT8 elm_GetEnvelopeInAC(UINT16 acID,INOUT EnvelopeStruct envelopeInfo[SECTION_REL_ENVELOPE_SUM_MAX]);


/**
 * @brief 对外接口：通过计轴数组ID查找计轴区段上的包络ID信息
 * @param[in] UINT16 acID
 * @param[out] UINT16 envelopeIDs[] 计轴区段上的包络信息
 * @return 0 计轴区段上不存在包络
           非0且小于SECTION_REL_ENVELOPE_SUM_MAX 计轴区段上包络数量
		   其他，非法返回，函数执行错误
 * @note 
 */
UINT8 elm_GetEnvelopeIDsInAC(UINT16 acID,INOUT UINT16 envelopeIDs[SECTION_REL_ENVELOPE_SUM_MAX]);


/**
* @brief 对外接口：获取线路所有的包络信息
* @param[out] UINT16 envelopeID[ENVELOPE_SUM_MAX] 包络ID
* @return 0 不存在包络
0 ~ ENVELOPE_SUM_MAX-1 包络数量
ENVELOPE_SUM_MAX 非法
* @note
*/
UINT16 elm_GetAllEnvelope(OUT UINT16 envelopeID[ENVELOPE_SUM_MAX]);

/**
* 功能：通信车、休眠车、故障车列车包络分类更新存储
* 输入参数： 无
* 全局变量：static s_TRAIN_ENVELOPE_ID CTTrainEnvelope;  CT列车包络
* static s_TRAIN_ENVELOPE_ID SleepTrainEnvelope;  休眠车包络信息
* static s_TRAIN_ENVELOPE_ID FaultTrainEnvelope; 休眠车包络信息 *
* fan 2024.06.12
*/
void UpdateTrainEnvelope(void);

/**
* 功能：获取通信车包络
* @param[out] UINT16 envelopeID[ENVELOPE_SUM_MAX] 包络ID
* 全局变量：static s_TRAIN_ENVELOPE_ID CTTrainEnvelope;  CT列车包络
* 返回值： 0 ~ ENVELOPE_SUM_MAX-1 包络数量 ENVELOPE_SUM_MAX 非法
* fan 2024.06.12
*/
UINT16 elm_GetCTEnvelope(OUT UINT16 envelopeID[ENVELOPE_SUM_MAX]);

/**
* 功能：获取休眠车包络
* @param[out] UINT16 envelopeID[ENVELOPE_SUM_MAX] 包络ID
* 全局变量：static s_TRAIN_ENVELOPE_ID SleepTrainEnvelope;  CT列车包络
* 返回值： 0 ~ ENVELOPE_SUM_MAX-1 包络数量 ENVELOPE_SUM_MAX 非法
* fan 2024.06.12
*/
UINT16 elm_GetSleepEnvelope(OUT UINT16 envelopeID[ENVELOPE_SUM_MAX]);

/**
* 功能：获取故障车包络
* @param[out] UINT16 envelopeID[ENVELOPE_SUM_MAX] 包络ID
* 全局变量：static s_TRAIN_ENVELOPE_ID FaultTrainEnvelope;  CT列车包络
* 返回值： 0 ~ ENVELOPE_SUM_MAX-1 包络数量 ENVELOPE_SUM_MAX 非法
* fan 2024.06.12
*/
UINT16 elm_GetFaultEnvelope(OUT UINT16 envelopeID[ENVELOPE_SUM_MAX]);

/**
 * @brief 对外接口：通过ID获取包络信息
 * @param[in] UINT16 envelopeID 包络ID
 * @return 非空 查询正确，包络信息
           NULL 查询错误
 * @note 
 */
const EnvelopeStruct* elm_GetEnvelopeInfoByID(UINT16 envelopeID);


/**
 * @brief 对外接口：通过列车ID获取关联的包络ID
 * @param[in] UINT16 trainID 列车ID
 * @return 非空 查询正确，包络信息
           NULL 查询错误
 * @note 
 */
const EnvelopeStruct* elm_GetEnvelopeInfoByTrainID(UINT16 trainID);



/**
 * @brief 对外接口：通过包络ID转换成接口组包需要的包络信息 
 * @param[in] UINT16 envelopeID 包络ID
 * @param[out] InfEnvelopeStruct *pInfEnvelope 转换的接口包络信息
 * @return CI_SUCCESS 获取成功
           CI_ERROR 获取失败
 * @note 无
 */
UINT8 elm_ConvertEnvelopeInfo(UINT16 envelopeID,IN InfEnvelopeStruct *pInfEnvelope);


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

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


/**
 * @brief 对外接口：根据已知条件创建包络
 * @param[in] UINT8 envelopeType 包络类型
 * @param[in] UINT16 TrainID 包络ID
 * @param[in] LOD_STRU startPoint 包络起始位置
 * @param[in] LOD_STRU endPoint 包络终止位置
 * @param[in] UINT16 headTrainID 包络前端列车ID
 * @param[in] UINT16 tailTrainID 包络后端列车ID
 * @param[out] EnvelopeStruct *pEnvelope 包络
 * @return CI_SUCCESS 包络创建正确，返回成功
 *         CI_ERROR   包络创建失败，返回失败
 * @note 
 */
UINT8 elm_BuildEnveLope(UINT8 envelopeType,UINT16 TrainID, LOD_STRU startPoint,LOD_STRU endPoint,UINT16 headTrainID,UINT16 tailTrainID, \
	INOUT EnvelopeStruct *pEnvelope);

/**
 * @brief 对外接口：查询基准包络前方最近的包络
 * @param[in] const EnvelopeStruct* pEnvelop 基准包络
 * @param[in] const UINT16 arEnvelopID[TRAIN_SUM_MAX_IN_OC] 待比较的包络
 * @param[in] UINT8 envelopeCnt 待比较的包络数量
 * @param[out] UINT16 *preEnvelope 包络前方id
 * @param[out] UINT16 *backEnvelope 包络后方id
 * @return CI_ERROR 查询失败
           CI_SUCCESS 查询成功
 * @note 无
 */
UINT8 elm_GetNearestBaseOnEnvelope(IN const EnvelopeStruct* pEnvelop,IN const UINT16 arEnvelopID[TRAIN_SUM_MAX_IN_OC],UINT8 envelopeCnt,OUT UINT16 *preEnvelope,OUT UINT16 *backEnvelope);

/**
* @brief 对外接口：列车注销时清除对应包络
* @param[in] wId 列车ID
* @return 无
* @note 无
*/
void elm_LogoutDel(UINT16 wTrainId);


/**
 * @brief 对外接口：获取列车关联的包络
 * @param[in] UINT16 wTrainId 列车ID
 * @param[out] UINT16 envelopeId[TRAIN_REL_ENVELOPE_SUM_MAX] 列车关联的包络
 * @return UINT8 列车关联的包络
 * @note 无
 */
UINT8 elm_GetTrainRelELM(UINT16 wTrainId,OUT UINT16 envelopeId[TRAIN_REL_ENVELOPE_SUM_MAX]);

/**
 * @brief 创建一个临时的UKT包络
 * @param[in] UINT16 acID 计轴ID
 *            UINT8 Dir 包络方向
 * @param[out] EnvelopeStruct* pEnvelope 创建的包络
 * @return 1 创建成功
 *         0 创建失败
 */
UINT8 elm_CreatTempUKTEnvelope(UINT16 acID, UINT8 Dir, EnvelopeStruct* pEnvelope);

/**
* @brief 获取包络相邻的包络
* @param[in] UINT16 envelopeId
* @param[out] UINT16 *preEnvelope 包络前方id
* @param[out] UINT16 *backEnvelope 包络后方id
* @return CI_ERROR 查询失败
CI_SUCCESS 查询成功
* @note
*   1、elm_GetNearestEnvelope 接口函数
*/
UINT8 elm_GetNearestEnvelopeApi(UINT16 envelopeId, OUT UINT16 *preEnvelope, OUT UINT16 *backEnvelope);

/**
* @brief 获取包络是否完全属于本OC
* @param[in] const EnvelopeStruct* Ptemp
* @param[out] 无
* @return ELM_BELONG_OTHER 属于相邻OC
ELM_BELONG_OWNER 属于本OC
CI_ERROR，非法
* @note 无
*/
UINT8 elm_PrepareEnvelopeIsSelfApi(IN const EnvelopeStruct* ptemp);

#endif /*ENVELOPE_MANAGE_API_H_*/
