/********************************************************
*                                                                                                            
* 文 件 名： ParseAtsData.h   
* 版权说明： 北京交控科技有限公司 
* 创建时间： 2012-03-28
* 作    者： 联锁组
* 功能描述： ATS数据解析头文件  
* 函数包括：
* 使用注意：
* 修改记录：   
*
********************************************************/ 

#ifndef _PARSE_ATS_DATA_H_
#define _PARSE_ATS_DATA_H_

#include "CommonTypes.h"
#include "CommonQueue.h"
#include "Convert.h"
#include "ParsePackDefine.h"
#include "ParsePackCommon.h"
#include "ParsePackCiData.h"
#include "ParsePackLeuData.h"
#include "ParsePackOcData.h"
#if 0
#include "ParsePackZcData.h"
#endif
#include "../Mask/MaskDefine.h"
#include "../Mask/MaskConfigDataManage.h"
#include "../System/CiSystemDefine.h"
#include "../2oo2/2oo2InterfaceDataManage.h"
#include "../Indicator/IndicatorDataManage.h"
#include "CbtcVersion.h"
#include "../DataManage/PlatDataManage.h"

#define DUAL_WAY_AIR_SWITCH_NORMAL ((UINT8)0x55) /*双路空开正常*/
#define DUAL_WAY_AIR_SWITCH_ABNORMAL ((UINT8)0xFF) /*双路空开异常*/
#define SINGLE_WAY_AIR_SWITCH_ABNORMAL ((UINT8)0xAA) /*单路空开异常*/
#define DUAL_WAY_AIR_SWITCH_NORMAL_ATS ((UINT8)0x01) /*双路空开正常*/
#define DUAL_WAY_AIR_SWITCH_ABNORMAL_ATS ((UINT8)0x03) /*双路空开异常*/
#define SINGLE_WAY_AIR_SWITCH_ABNORMAL_ATS ((UINT8)0x02) /*单路空开异常*/

#define AirFan_NORMAL ((UINT8)0x55) /*风扇正常*/
#define AirFan_ABNORMAL ((UINT8)0xFF) /*风扇故障*/
#define AirFan_Fault ((UINT8)0xAA) /*风扇异常*/
#define AirFan_NORMAL_ATS ((UINT8)0x01) /*风扇正常*/
#define AirFan_ABNORMAL_ATS ((UINT8)0x03) /*风扇故障*/
#define AirFan_Fault_ATS ((UINT8)0x02) /*风扇异常*/

#define OC_CARD_NORMAL ((UINT8)0x55) /*OC板卡正常*/
#define OC_CARD_ABNORMAL ((UINT8)0xFF) /*OC板卡故障*/
#define OC_CARD_NORMAL_ATS ((UINT8)0x55) /*跟ATS接口:OC板卡正常*/
#define OC_CARD_ABNORMAL_ATS ((UINT8)0xAA) /*跟ATS接口:OC板卡故障*/

#define TYPE_POINT_SWITCH  ((UINT8)0xAA)	/*插箱类型为转辙机插箱*/
#define TYPE_SIGNAL  ((UINT8)0x55)			/*插箱类型为信号机插箱*/

#define FUSE_NORMAL ((UINT8)0x55)	/*转辙机或者信号机正常，无报警*/
#define SIGNAL_FUSE_ALARM	((UINT8)0xAA)	/*信号机执行电熔丝报警*/
#define POINT_SWITCH_FUSE_ALARM	((UINT8)0xCC)		/*转辙机执行电熔丝和表示电熔丝均报警*/
#define POINT_SWITCH_EXECUTIVE_FUSE_ALARM	((UINT8)0x5A)	/*转辙机执行电熔丝报警,表示正常*/
#define POINT_SWITCH_EXPRESSED_FUSE_ALARM	((UINT8)0xA5)	/*转辙机表示电熔丝报警,执行正常*/

#define HIGH_NORMAL ((UINT8)0x50)	/*高四位0x5，执行电熔丝正常*/
#define HIGH_ALARM ((UINT8)0xA0)	/*高四位0xA，执行电熔丝故障*/
#define LOW_NORMAL ((UINT8)0x05)	/*低四位0x5，表示电熔丝正常*/
#define LOW_ALARM ((UINT8)0x0A)	/*低四位0xA，表示电熔丝故障*/

#define OC_TO_ATS_SWITCH_ZZJ_NORMAL ((UINT8)0x55)	/*OC给ATS的多机牵引对应道岔状态-正常*/
#define OC_TO_ATS_SWITCH_ZZJ_ALARM ((UINT8)0xAA)	/*OC给ATS的多机牵引对应道岔状态-故障*/

/*执行电插箱相关信息*/
typedef struct s_PlusBoxDataSendATS
{
	UINT8 chPbId;	/*执行电插箱编号*/
	UINT8 SendAtsAsState; /*报警类型*/
}OcToATSPlusBox;

/*命令数据帧结构体*/
typedef struct S_CommandDataStruct
{
	UINT8 CommandType;      /*命令分类号*/
	UINT32 CommandId;		/*命令ID*/
	UINT32 CommandParam;    /*命令参数*/
	UINT16 termial_id; /*终端ID*/
	UINT8 order_type; /*命令类型*/
	UINT8 response_type; /*回复类型*/
	UINT8 affirm_result; /*确认结果*/
	UINT8 firstCmd_time; /*一次命令倒计时*/
	UINT32 setCurNum; /*一次命令设置周期号*/  
	UINT8 VirCIid;/*虚拟联锁ID*/
	/*车车新加*/
	UINT16 wTrainIdParam;		/*列车ID 20220301车车新增*/
	UINT8 chSectionSum;		/*区段数量,命令类型为0x93,0x94代表逻辑区段数量，0x0b,0x0c代表物理区段数量*/
	UINT16 wSectionData[MAX_ROUTE_IN_LT_NUM];/*区段序列，命令类型为0x93,0x94代表逻辑区段序列，0x0b,0x0c代表物理区段序列*/
	UINT8 OCid;/*OC ID*/
	UINT16 OverLapRouteID;		/*保护区段关联进路ID 20240319车车新增*/
	
} CommandDataStruct;

/*多机牵引道岔对应转辙机相关信息*/
typedef struct s_SwitchZzjDataSendATS
{
	UINT16 wSwitchId;	/*道岔ID*/
	UINT8 chSwIncludeZzjSum; /*道岔对应转辙机数目*/
	UINT8 szSwitchIncldeZzjState[MAX_OC_SWITCH_INCLUDE_ZZJ_NUM]; /*给ATS组包的道岔对应转辙机状态*/
}OcToATSSwitchZzjData;

#ifdef __cplusplus
extern "C" {
#endif

/*******************************全局变量声明*******************************/
extern CommandDataStruct CiRevCmdDataStru[ATSORXIANDI_TO_CI_CMD_DATA_STRU_SUM_MAX]; /*CI操作命令结构体数组*/
extern UINT16 CiRevCmdStruCurSum;
extern CommandDataStruct ATSorXDToCiCmdRtnToTRDataStru[ATSORXIANDI_TO_CI_CMD_DATA_STRU_SUM_MAX];
extern UINT16 ATSorXDToCiCmdReturnToTRCurSum;
extern CommandDataStruct CiSendCmdDataStru[CI_TO_ATSORXIANDI_CMD_DATA_STRU_SUM_MAX];
extern UINT16 CiSendCmdStruCurSum;
extern CommandDataStruct CiSendBackDataTempStru[CI_TO_ATSORXIANDI_CMD_DATA_STRU_SUM_MAX];
extern UINT16 CiSendBackDataTempStruSum;
extern UINT8 LastCmdSourceSysType;
extern UINT32 FirstCmdId;      /*首次操作确认的命令ID号*/

/*
* 功能描述： 解析操作命令数据帧
* 参数说明： const UINT8* dataBuf, 数据缓冲区
*            const UINT16 dataLength, 数据长度
* 返回值  ： 0: 数据解析失败
*			 1: 数据解析成功      
*/
UINT8 ParseAtsOrXianDiToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength);

/*
* 功能描述： 组ATS或现地数据
* 参数说明： 
*            const UINT8 deviceId, 目标系统ID
*            const UINT8 targetDevType, 目标系统类型
*            const UINT8 frame,帧类型
* 返回值  ： 0: 组包失败
*			 1: 组包成功      
*/
UINT8 PackCiToAtsOrXianDiData( const UINT8 deviceId, const UINT8 targetDevType,const UINT8 frame);

/*
* 功能描述： 获取CI接收的操作命令结构体数组长度
* 参数说明： void    
* 返回值  ： 0: 获取失败
*           >0: CI接收操作命令结构体数组长度      
*/
UINT16 GetCiRevCmdStruCurSum(void);

/*
* 功能描述： 获取CI接收的操作命令结构体数组
* 参数说明： void    
* 返回值  ： NULL: 获取失败
*           !NULL: CI接收操作命令结构体数组指针      
*/
CommandDataStruct* GetCiRevCmdDataStruct(void);

/*
* 功能描述： 添加CI命令反馈数据
* 参数说明： const UINT32 CommandId, 命令ID
*            const UINT8 CommandType, 命令类型
*            const UINT16 DeviceId, 设备ID
*			 const UINT8 commandParam, 反馈参数
*            const UINT32 commandId, 命令ID
* 返回值  ： void  
*/
void SetCiSendCmdBackInfoData(const UINT8 CommandType, const UINT8 deviceType, const UINT16 deviceId, const UINT8 commandParam, const UINT32 commandId);

/*
* 功能描述： 添加CI命令反馈数据带列车ID
* 参数说明： const UINT32 CommandId, 命令ID
*            const UINT8 CommandType, 命令类型
*            const UINT16 DeviceId, 设备ID
*			 const UINT8 commandParam, 反馈参数
*            const UINT32 commandId, 命令ID
*			 const UINT16 TrainId,列车ID
* 返回值  ： 0: 设置失败
*			 1: 设置成功
*/
void SetCiSendCmdBackInfoWithTrainId(const UINT8 CommandType, const UINT8 deviceType, const UINT16 deviceId, const UINT8 commandParam, const UINT32 commandId, const UINT16 trainId);

/*
* 功能描述： 一次二次命令优化
* 参数说明： const UINT32 CommandId, 命令ID
*            const UINT8 CommandType, 命令类型
*            const UINT16 DeviceId, 设备ID
*			 const UINT8 commandParam, 反馈参数
*            const UINT32 commandId, 命令ID
* 返回值  ： 无      
*/
void SetCiSendCmdBackData_OrderBack( const UINT32 commandId,const UINT16 deviceId, const UINT8 deviceType,const UINT16 termial_id, const UINT8 order_type, const UINT8 response_type,const UINT8 affirm_result,const UINT8 virCIid);
/*
* 功能描述：对一次命令倒计时更新
* 参数说明： 无
* 返回值  ： 无     
*/
void UpdataCiSendCmdBack_OrderBack(void);
/*
* 功能描述： 清空CI接收命令数据队列
* 参数说明： void    
* 返回值  ： 0: 解析失败
*			 1: 解析成功      
*/
void ClearCiRevCmdData(void);

/*
* 功能描述： 清空CI发送命令反馈数据队列
* 参数说明： void    
* 返回值  ： 0: 解析失败
*			 1: 解析成功      
*/
void ClearCiSendCmdData(void);

/*
* 功能描述： 获取首次操作确认的命令ID
* 参数说明： void    
* 返回值  ： 首次操作确认的命令ID     
*/
UINT32 GetFirstCmdId(void);

/*
* 功能描述： 设置首次操作确认的命令ID
* 参数说明： const UINT32 cmdId, 命令ID    
* 返回值  ： void     
*/
void SetFirstCmdId(const UINT32 cmdId);

/*
* 功能描述： 获取CI接收的ATS或现地信号特开操作命令结构体数组长度
* 参数说明： void    
* 返回值  ： 0: 获取失败
*           >0: CI接收ATS或现地信号特开操作命令结构体数组长度      
*/
UINT16 GetATSToCiCmdRtnToTRCurSum(void);

/*
* 功能描述： 获取CI接收的ATS或现地信号特开操作命令结构体数组
* 参数说明： void    
* 返回值  ： NULL: 获取失败
*           !NULL: CI接收ATS或现地信号特开操作命令结构体数组指针      
*/
CommandDataStruct* GetATSorXDToCiCmdRtnToTRData(void);

/*
* 功能描述： 从信号特开命令结构体数组中，删除指定位置的数据
* 参数说明： const UINT16 idx:信号特开命令结构体数组的位置索引
* 返回值  ： 0:失败
*			 1:成功     
*/
UINT8 RemoveReturnToTRCmdAt(const UINT16 idx);

/*
* 功能描述： 拷贝信号特开信息结构体
* 参数说明： const CommandDataStruct* src:被复制的信号特开命令结构体指针
			 CommandDataStruct* dst:目标信号特开命令结构体指针
* 返回值  ： 无     
*/
void CopyReturnToTRCmd(const CommandDataStruct* src,CommandDataStruct* dst);

/*
* 功能描述： 获取确认PSC互锁解除标志
* 参数说明： UINT8 pscId, PSC系统ID
*            
* 返回值  ： 0: 未设置互锁解除
*			 >0: 设置互锁解除      
*/
UINT8 GetPscConfirmFlag(UINT8 pscId);
/*
* 功能描述： psd超时报警处理
* 参数说明： 无
*
* 返回值  ：无
* cgh-合并CID-3037-2：
*/
void PsdDriveOutTimeToAts(void);
/*
* 功能描述： 输入二次命令，获取对应一次命令
* 参数说明： 二次命令
*            
* 返回值  ： 一次命令    
*/
UINT8 FindFirstOrder(UINT8 SecondOrder);
/*
* 功能描述： 二次命令有效性检查
* 参数说明： 设备ID,设备类型，终端ID,终端类型    
* 返回值  ：CI_ERROR : 失败
*			CI_SUCCESS: 成功      
*/
UINT8 CheckSecondOrderValid(const UINT32 commandId,const UINT16 deviceId, const UINT8 deviceType,const UINT16 termial_id, const UINT8 order_type,const UINT8 virCiID);
/*
* 功能描述： 清空CI暂存的不需要的命令数据
* 参数说明： void    
* 返回值  ：无     
*/
void ClearCiSendBackDataTempStruData(void);
/*
* 功能描述：一次命令超时报警
* 参数说明： 无
* 返回值  ： 无     
*/
void SetCiSendCmdBack_FstOrdOutTime(const UINT32 commandId,const UINT16 deviceId, const UINT8 deviceType,const UINT8 order_type,const UINT16 termial_id,UINT8 virCIid);
/*
* 功能描述： 给发送现地或ATS的反馈数据添加虚拟联锁ID或者本地联锁ID
* 参数说明： void    
* 返回值  ：无     
*/
void AddCiSendBackDataCIid(void);

/*
* 功能描述： 检查ATS/现地的命令数据总长度有效性
* 参数说明： const UINT8* pdataBuf, 数据缓冲区
*            const UINT16 comSum, 命令帧总数量
*            const UINT16 comTotalLen, 命令数据总长度
* 返回值  ： CI_ERROR 无效
*			 CI_SUCCESS 有效
*/
UINT8 CheckATSorXiandTotalDataLenVal(const UINT8* pdataBuf, const UINT16 comSum, const UINT16 comTotalLen);

/*
* 功能描述： 故障码信息转命令反馈
* 参数说明： const UINT32 CommandId, 命令ID
*            const UINT8 CommandType, 命令类型
*            const UINT16 DeviceId, 设备ID
*			 const UINT8 virCIid, 虚拟联锁ID
* 返回值  ： 0: 设置失败
*			 1: 设置成功
* cgh-合并CID-2349-5：
*/
void errorCodeDataTransCmdBack(const UINT8 CommandType, const UINT8 deviceType, const UINT16 deviceId, const UINT8 virCIid);

/*
* 功能描述： 转换Ci到ATS中OCbyte执行电插箱状态信息
* 参数说明：入参
*            UINT8 *dataLength, 输入数据地址
*			出参
*			OcToATSPlusBox *ciSendATSPlusBox, 状态输出缓冲区
*
* 返回值  ： 执行电插箱数量
*/
UINT8 TransCiToAtsOCPlusBoxInfo(OcToATSPlusBox *ciSendATSPlusBox, UINT8 *wDataLength);

/*
* 功能描述： 转换Ci到ATS中多机牵引道岔转辙机数目状态信息
* 参数说明：入参
*            UINT8 *wDataLength, 输入数据地址
*			出参
*			OcToATSSwitchZzjData *ciSendAtsSwitchZzjData, 状态输出缓冲区
* 返回值  ： 多机牵引道岔数量
*/
UINT16 TransCiToAtsSwitchZzjInfo(OcToATSSwitchZzjData* ciSendAtsSwitchZzjData, UINT8* wDataLength);

/*
* 功能描述： 转换Ci到ATS中主机柜电源/电源模块状态表示灯信息
* 参数说明：入参
*            UINT8 ciToXianDiData, CI到现地数据信息
*			UINT8 MoveNum	左移位数
*			UINT8 powerState  电源/电源模块状态
*			UINT8 BitValY  if成立要左移的宏值数据
*			UINT8 BitValN  if不成立要左移的宏值数据
*			出参
*			无
* 返回值  ： 转换后输出数据
*/
static UINT8 TransCiToAtsPowerModeState(UINT8 ciToXianDiData, UINT8 MoveNum, UINT8 powerState, UINT8 BitValY, UINT8 BitValN);

/*
* 功能描述： 组OC-P信息到ATS
* 参数说明：入参
*			UINT8* ciToXianDiDataBuffer 存放信息的buffer
*			UINT16* ii 偏移量
*			出参
*			无
* 返回值  ： 无
*/
void PackOcPscDataToAts(UINT8* ciToXianDiDataBuffer, UINT16* ii);

/*
* 功能描述： 组PSD信息到ATS
* 参数说明：入参
*			UINT8* ciToXianDiDataBuffer 存放信息的buffer
*			UINT16* ii 偏移量
*			出参
*			无
* 返回值  ： 无
*/
void PackPsdDataToAts(UINT8* ciToXianDiDataBuffer, UINT16* ii);

/*
* 功能描述： 获取确认OC-P旁路状态
* 参数说明： UINT8 index, OC-P系统对应的数组下标
*
* 返回值  ： 0x55 旁路状态已确认
*			 0xaa 旁路状态未确认
*/
UINT8 GetOcPscConfirmFlag(UINT8 index);

/*
* 功能描述： 组通信联锁信息到ATS
* 参数说明：入参
*			UINT8* ciToXianDiDataBuffer 存放信息的buffer
*			UINT16* ii 偏移量
*			出参
*			无
* 返回值  ： 无
*/
void PackCiDataToAts(UINT8* ciToXianDiDataBuffer, UINT16* ii);

/*
* 功能描述：检查批量计轴复位命令
* 参数说明：UINT8 virCIid 输入虚拟联锁ID
*		UINT8 orderType  命令类型
*       const UINT8 cPhySecSum  物理区段数量
*		const UINT16 pPhySecIdBuff[]  物理区段ID数组
* 返 回 值：无
* Created By yx 2026.04.14
*/
UINT8 CheckAxisResetCmd(UINT8 virCIid, UINT8 cmdType, const UINT8 cPhySecSum, const UINT16 pPhySecIdBuff[]);

/*
* 功能描述： 针对批量计轴复位一次二次命令的反馈
* 参数说明： const UINT32 commandId, 命令ID
*			 const UINT16 deviceId, 设备ID
*            const UINT8 deviceType, 设备类型
*            const UINT16 termial_id,终端ID
*			 const UINT8 order_type，命令类型
*			 const UINT8 response_type, 回复类型
*            const UINT8 affirm_result, 确认结果
*			 const UINT8 virCIid, 虚拟联锁ID
*			 const UINT8 cPhySecSum  物理区段数量
*			 const UINT16 pPhySecIdBuff[]  物理区段ID数组
* 返回值  ： 无
* Created By yx 2026.04.14
*/
void SetAixsResetCiSendCmdBackData(const UINT32 commandId, const UINT16 deviceId, const UINT8 deviceType, const UINT16 termial_id, const UINT8 order_type, const UINT8 response_type, const UINT8 affirm_result, const UINT8 virCIid, const UINT8 cPhySecSum, const UINT16 pPhySecIdBuff[]);

/*
* 功能描述： 批量计轴复位二次命令有效性检查
* 参数说明： const UINT32 commandId, 命令ID
*			 const UINT16 deviceId, 设备ID
*            const UINT8 deviceType, 设备类型
*            const UINT16 termial_id,终端ID
*			 const UINT8 order_type，命令类型
*			 const UINT8 virCIid, 虚拟联锁ID
*			 const UINT8 cPhySecSum  物理区段数量
*			 const UINT16 pPhySecIdBuff[]  物理区段ID数组
* 返回值  ：CI_ERROR : 失败
*			CI_SUCCESS: 成功
* Created By yx 2026.04.14
*/
UINT8 CheckAxisResetSndOrderValid(const UINT32 commandId, const UINT16 deviceId, const UINT8 deviceType, const UINT16 termial_id, const UINT8 order_type, const UINT8 virCiID, const UINT8 cPhySecSum, const UINT16 pPhySecIdBuff[]);
#ifdef __cplusplus
}
#endif

#endif
