#ifndef _TRAIN_ON_AC_MANAGE_H_
#define _TRAIN_ON_AC_MANAGE_H_

#include "TrainDefine.h"
#include "dquVobcCommonStru.h"
#include "EvacuationAreaManage.h"

#define TOA_INIT	0x55u					/* 模块初始状态 */
#define TOA_NORMAL	0xaau					/* 模块正常工作 */

#define TOA_CMD_MAX					10u		/* 命令最大数量 */
#define TOA_CMD_TYPE_SET			0x98u	/* 设置 */
#define	TOA_CMD_TYPE_CANCEL_FIRST	0x99u	/* 解锁 */
#define TOA_CMD_TYPE_CANCEL_SECOND	0x9au	/* 解锁二次命令 */
#define TOA_CMD_TYPE_RESET_FIRST	0x9bu	/* 复位一次 */
#define TOA_CMD_TYPE_RESET_SECOND	0x9cu	/* 复位二次命令 */

/* 列车信息 */
typedef struct  
{
	UINT16 wTrainId;						/* 列车ID */
	UINT8 chTrainType;						/* 列车类型 */
}TrainStruct;

/* 计轴区段关联占压列车结构体 */
typedef struct
{
	UINT8 chTrainNum;						/* 列车数量 */
	TrainStruct strTrain[MAX_TRAIN_ON_AC];	/* 列车ID */
}AcMapStruct;

typedef struct  
{
	UINT16 wTrainId;						/* 故障车ID */
	UINT32 dwUtCyc;							/* 断通信周期号 */
	UINT8 chDir;							/* 故障车方向 */
	UINT8 chAcNum;							/* 故障占用计轴区段数目 */
	UINT16 szAcId[MAX_AC_IN_TRAIN];			/* 故障占用计轴区段ID，顺序排列 */
}UtTrainStruct;

/* 列车位置 */
typedef struct
{
	LOD_STRU startPos;         /*始端位置*/
	LOD_STRU endPos;           /*终端位置*/
}TrainLocStruct;

typedef struct  
{
	UINT8 chCmdType;						/* 命令类型 */
	UINT16 wTrainId;						/* 列车ID */
	UINT32 dwCmdId;							/* 命令编号 */
	UINT16 wTerminalId;						/* 终端编号 */
	UINT8 chVirCi;							/* 虚拟联锁 */
	UINT32 dwCmdParam;						/* 命令参数 */
}ToaCmdStruct;

/**
* @brief 模块初始化
* @param 无
* @return CI_SUCCESS:初始化成功；CI_ERROR：初始化失败
* @note：
*/
extern UINT8 ToaInit(void);

/**
* @brief 模块解锁
* @param 无
* @return 无
* @note：从初始状态转到正常工作
*/
extern void ToaUnlock(void);

/**
* @brief 模块主处理函数
* @param 无
* @return 无
* @note：
*/
extern void ToaMainProc(void);

/**
* @brief 根据列车ID获取列车占压计轴区段序列
* @param wTrainId 列车ID
* @param szAcId 计轴区段ID
* @return 列车占压计轴区段数量
* @note：
*/
extern UINT8 ToaGetUtTrainAc(UINT16 wTrainId, UINT16 szAcId[MAX_AC_IN_TRAIN]);

/**
* @brief 获取UT列车方向
* @param wTrainId 列车ID
* @return 方向
* @note：
*/
extern UINT8 ToaGetUtTrainDir(UINT16 wTrainId);

/**
* @brief 添加命令
* @param chCmdType 命令类型
* @param wTrainId 列车ID
* @param dwCmdId 命令ID
* @param wTerminalId 终端ID
* @param chVirCi 虚拟联锁ID
* @param dwCmdParam 命令参数
* @return CI_ERROR:失败；CI_SUCCESS:成功
* @note：
*/
extern UINT8 ToaAddCmd(UINT8 chCmdType, UINT16 wTrainId, UINT32 dwCmdId, UINT16 wTerminalId, UINT8 chVirCi, UINT32 dwCmdParam);

/**
* @brief 删除UT列车尾部占压计轴区段
* @param wTrainId 列车ID
* @return CI_ERROR:失败；CI_SUCCESS:成功
* @note：
*/
extern UINT8 ToaDeleteUtTrainAc(UINT16 wTrainId); 

/**
* @brief 判断计轴区段是否空闲
* @param wAcIndex 计轴区段存储下标
* @return CI_ERROR:占用；CI_SUCCESS:空闲
* @note：
*/
extern UINT8 IsAcFree(UINT16 wAcIndex);

/*
* @brief 物理区段是否空闲
* @param wPhyId 物理区段ID
* @return CI_ERROR:占用；CI_SUCCESS:空闲
* @note
*/
extern UINT8 IsPhyFree(UINT16 wPhyId);

/*
* @brief 获取当前降级车数量
* @param 无
* @return 当前降级车数量
* @note
*/
extern UINT8 ToaGetUtTrainNum(void);

/*
* @brief 获取当前降级车ID数组
* @param szUtId ID缓冲区
* @return CI_ERROR:获取失败；CI_SUCCESS:获取成功
* @note
*/
extern UINT8 ToaGetUtTrainIdBuf(UINT16 szUtId[TRAIN_SUM_MAX]);

/*
* @brief 获取指定物理区段降级车数量
* @param wPhyId 物理区段ID
* @return 降级车数量
TRAIN_SUM_MAX：失败
* @note
*/
extern UINT8 ToaGetPhyUtNum(UINT16 wPhyId);

/*
* @brief 获取指定物理区段降级车ID
* @param wPhyId 物理区段ID
* @param szUtId 列车ID缓冲区
* @return CI_SUCCESS:获取成功；CI_ERROR:获取失败
* @note
*/
extern UINT8 ToaGetPhyUtId(UINT16 wPhyId, UINT16 szUtId[TRAIN_SUM_MAX]);

/*
* @brief 清除命令
* @param 无
* @return 无
* @note
*/
extern void ToaClearCmd(void);

/**
* @brief 获取物理区段占压列车
* @param wPhyId 物理区段ID
* @param szUtId 列车ID
* @return MAX_AC_IN_TRAIN:失败，其他:列车数量
* @note：
*/
extern UINT8 ToaGetPhyTrain(UINT16 wPhyId, UINT16 szTrainId[MAX_AC_IN_TRAIN]);

/**
* @brief 获取TOA跟随数据
* @param UINT8 *pDataBuff 跟随数据存储缓冲区
* @param UINT32 curIndex 当前索引
* @return 计算后的索引
*/
extern UINT32 ToaGetTransferData(OUT UINT8 *pDataBuff, IN UINT32 curIndex);

/**
* @brief 设置TOA跟随数据
* @param UINT8 *pDataBuff 跟随数据存储缓冲区
* @param UINT32 curIndex 当前索引
* @return 计算后的索引
*/
extern UINT32 ToaSetTransferData(OUT UINT8 *pDataBuff, IN UINT32 curIndex);
#endif
