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

#ifndef _PARSE_PACK_OC_DATA_H_
#define _PARSE_PACK_OC_DATA_H_

#define USE_PROTOCOL_RSSP	1

#include "ParsePackDefine.h"
#include "CommonTypes.h"
#include "CommonQueue.h"
#include "Convert.h"

#include "../Route/RouteConfigDataManage.h"
#include "../Route/RouteDataManage.h"
#include "../ReverseRoute/ReverseRouteConfigDataManage.h"
#include "../Relay/RelayDefine.h"
#include "../Relay/RelayConfigDataManage.h"
#include "../Relay/RelayDataManage.h"
#include "../Signal/SignalDataManage.h"
#include "../Signal/SignalConfigDataManage.h"
#include "../Switch/SwitchDataManage.h"
#include "../Switch/SwitchConfigDataManage.h"
#include "../Section/PhysicalSectionConfigDataManage.h"
#include "../Section/PhysicalSectionDataManage.h"
#include "../psd/PSDConfigDataManage.h"
#include "../psd/PSDDataManage.h"
#include "../esb/ESBDataManage.h"
#include "../DataManage/DeviceDataManage.h"
#include "../Garagedoor/GaragedoorDataManage.h"


#define CI_OC_INTERFACE_INFOTYPE    ((UINT16)0x0206) /*CI_OC接口信息类型*/

#define CI_OC_PRTCL_VER ((UINT16)0x01) /*CI_OC协议版本号*/

#ifdef LOGPRINT
#include "../LogRecord/LogRecord.h"
#endif

#define MAX_OC_DEVICE_NUM	((UINT16)150)	/*一个OC最多支持多少个设备*/
#define MAX_OC_DI_BOARD_NUM	((UINT16)20)	/*一个OC支持最大DI板卡数量*/
#define MAX_OC_DO_BOARD_NUM	((UINT16)20)	/*一个OC支持最大DO板卡数量*/
#define MAX_OC_SOR_BOARD_NUM	((UINT16)20)	/*一个OC支持最大SOR板卡数量*/
#define MAX_OC_PLUS_BOX_NUM	((UINT16)3)		/*一个OC支持最大执行电插箱*/
#define MAX_OC_SWITCH_INCLUDE_ZZJ_NUM	((UINT16)4)		/*一个道岔支持最大转辙机个数*/
#define MAX_OC_SWITCH_INCLUDE_BOARD_NUM	((UINT8)4)		/*一个道岔支持最大板卡数量*/

#define Max_OC_GD_NUM		((UINT16)100) /*一个oc支持最大多少个轨道区段*/

#define  OC_CI_STATE_INFO		((UINT16)0x8802)		/*OC给CI状态信息*/

#define  CI_OC_CONTROL_INFO		((UINT16)0x8801)		/*CI给OC控制命令*/

#define  CI_OC_INTERFACE		((UINT16)0x0206)		/*联锁主机与OC*/

#define OC_RELAY_UP		((UINT8)0x05)		/*OC继电器吸起*/
#define OC_RELAY_DOWN	((UINT8)0x0a)		/*OC继电器落下*/

#define  OC_BOARD_STATE_NORMAL		((UINT8)0)	/*oc板卡状态正常*/

#define OC_HAVE_YJK		((UINT8)0x55)	/*OC具备应急控*/
#define OC_NOT_YJK		((UINT8)0xAA)	/*OC不具备应急控*/

#define OC_CTLMODE_YJK	((UINT8)0x55)	/*OC主控状态是应急控*/
#define OC_CTLMODE_JK	((UINT8)0xAA)	/*OC主控状态是机控*/

#define CHANGE_JK_COMMAND	((UINT16)0x00AA)	/*切换机控申请命令*/
#define CHANGE_NO_COMMAND	((UINT16)0x00FF)	/*无切换命令*/

typedef struct s_OcDevState
{
	UINT16 OcId;/*oc id*/
	UINT8 DeviceType;   /*设备类型 1道岔/2信号机/3轨道区段/CC采集板卡/DD驱动板卡*/
	UINT16 DeviceId;	/*设备Id*/
	UINT8 DeviceState;  /*设备状态*/
	UINT8 chSwitchIncldeZzjNum; /*道岔对应转辙机数目，设备类型为信号机时,此个数为0*/
	UINT8 szSwitchIncldeZzjState[MAX_OC_SWITCH_INCLUDE_ZZJ_NUM];/*转辙机状态*/
	UINT8 BoardNum; /*板卡数量*/
	UINT8 BoardAddr[MAX_OC_SWITCH_INCLUDE_BOARD_NUM];	/*板卡地址*/
	UINT8 BoardState[MAX_OC_SWITCH_INCLUDE_BOARD_NUM];	/*板卡状态 正常0x0000 错误发错误码*/
}OcDeviceStruct;

typedef struct s_OcBoardData
{
	UINT8 BoardAddr;	/*板卡地址*/
	UINT8 BoardState;	/*板卡状态 正常0x00 错误发错误码*/
	UINT8 BoardCollData[18];	/*采集数据*/
}OcDIBoard;

typedef struct s_OcGd
{
	UINT16 OcId;	/*OC编号*/
	UINT16 GdDeviceId;/*轨道区段Id*/
	UINT8 BoardAddr1;	/*1系板卡地址*/
	UINT8 BoardState1;	/*1系板卡状态 正常0x0000 错误发错误码*/
	UINT8 GdState1;/*1系板卡采集的区段状态：0x55：出清；0xAA：占用；0x5A：故障*/

	UINT8 BoardAddr2;	/*1系板卡地址*/
	UINT8 BoardState2;	/*1系板卡状态 正常0x0000 错误发错误码*/
	UINT8 GdState2;/* 2系板卡采集的区段状态：0x55：出清；0xAA：占用；0x5A：故障*/

	UINT8 GdMergeState;/*轨道融合状态*/
}OcGdDevice;

typedef struct s_OcDoBoard
{
	UINT8 DoBoardAddr;
	UINT8 DoBoardState;
}OcDoBoard;

typedef struct s_PlusBox
{
	UINT8 chPbId;	/*编号*/
	UINT8 chPbType;	/*类型 0x55:信号机插箱，0xaa:转辙机插箱*/
	UINT8 chAsState; /*空开状态 高四位表示1空开状态，第四位表示2空开状态，0x5正常，0xa故障（对于信号机插箱，只有一个空开，高四位有效；对于转辙机插箱高、低四位均有效）*/
}OcPlusBox;

typedef struct s_PsdInfo
{
	UINT16 wPsdId;				/*编号*/
	UINT8 OpenErrState;			/*开门故障状态*/
	UINT8 CloseErrState;		/*关门故障状态*/
	UINT8 OpenOrCloseState;		/*开关门状态*/
	UINT8 InterlockRelState;	/*互锁解除状态*/
	UINT32 psdFaultQStataOne;   /*故障隔离信息高四个字节*/
	UINT32 psdFaultQStataTwo;   /*故障隔离信息低四个字节*/
	UINT32 psdDoorsStateOne;    /*每扇屏蔽门的开关状态高四个字节*/
	UINT32 psdDoorsStateTwo;    /*每扇屏蔽门的开关状态低四个字节*/
	UINT32 psdDoorIStateOne;    /*每扇屏蔽门的被隔离信息高四个字节*/
	UINT32 psdDoorIStateTwo;    /*每扇屏蔽门的被隔离信息低四个字节*/
	UINT8  psdAlarmState;		/*障碍物报警状态*/

}OcToCiPsdInfo;

typedef struct S_OcToCiDataStruct
{
	UINT16 OcId; /*OC编号*/
	
	UINT16 OcDeviceNum;	/*一个oc的所有设备数量*/
	OcDeviceStruct OcDevices[MAX_OC_DEVICE_NUM];  /*一个oc的所有设备*/

	UINT16 OcGdNum;/*一个oc的所有轨道区段的数量*/
	OcGdDevice OcGdDevices[Max_OC_GD_NUM];/*一个oc的所有轨道区段设备*/
	
	UINT16 OcDIBoardDataNum;	/*一个oc的所有采集输入板卡数据数量*/
	OcDIBoard OcDIBoardDatas[MAX_OC_DI_BOARD_NUM];	/*一个oc的所有采集输入板卡数据*/	
	
	UINT16 OcDOBoardNum;/*一个OC的所有采集输出板卡数量*/
	OcDoBoard OcDOBoardDatas[MAX_OC_DO_BOARD_NUM]; /*OC的所有数字输出板卡*/

	UINT16 OcSORBoardNum;/*一个OC输出继电器板卡数量*/
	OcDIBoard OcSORBoardDatas[MAX_OC_SOR_BOARD_NUM]; /*OC的安全输出板卡数据*/

	UINT8 PowerAState;/*A系电源状态，新增。0x55-双路空开正常，0xaa-单路空开异常，0xFF-双路空开异常*/
	UINT8 PowerBState;/*B系电源状态，新增。0x55-双路空开正常，0xaa-单路空开异常，0xFF-双路空开异常*/
	UINT8 OCDevFaultState;/*OC设备故障状态，新增。0x55-板卡正常，0xFF-板卡故障*/ 
	UINT8 FanState;/*风扇状态 0x55-风扇状态正常，0xaa-风扇状态异常，0xFF-风扇状态故障*/

	UINT8 chPbNum;/*执行电插箱数量*/
	OcPlusBox szPlusBox[MAX_OC_PLUS_BOX_NUM];/*执行电插箱信息*/

	UINT16 OCBoardSwapSysNum;/*OC切系板卡数量*/
	UINT8 SwapSysBoardId[MAX_OC_DEVICE_NUM];/*OC切系板卡ID*/

	UINT8 OCPsdNum;/*屏蔽门数量*/
	UINT8 DrvPowerState;/*驱动电源状态*/
	UINT8 CtlPowerState;/*控制电源状态*/
	UINT8 EdgeCtllerState1;/*边缘控制器1状态*/
	UINT8 EdgeCtllerState2;/*边缘控制器2状态*/
	OcToCiPsdInfo PsdInfo[PSD_SUM_MAX];/*屏蔽门信息*/

	UINT8 chHaveYjk;	/*是否具备应急控*/
	UINT8 chControlMode;	/*主控状态*/
	UINT8 chOcYjpComm;	/*OC与YJP通信状态*/

	UINT32 ComStartCycle;		/*通信开始周期，使用该周期判断OC与CI中断*/

	UINT16 RecvErrorDevTypeCycle;		/*收到错误设备类型周期*/
}OcToCiOriginDataStruct;


/*****************OC相关************************/
typedef struct S_OcBoardDataStruct1
{
	UINT8 BoardAddress;  /*板子地址*/
	UINT8 BoardState;	/*板卡状态，0x55：正常，0xaa：故障*/
	UINT8 PosValueBuf[OC_COLL_BOARD_POS_NUM];  /*板子各位置数据*/
	UINT32 TolerateCycNum[OC_COLL_BOARD_POS_NUM];/*板子各位置容忍周期*/
}CollBoardData;

typedef struct S_OcCollBoardDataStruct
{
	UINT16 OcId;
	CollBoardData BoardDatas[Oc_Max_Board_Num];
	UINT16 OcBoardNum;/*数量*/
} OcCollBoardDataStruct;/*一个OC的采集板数据*/

typedef struct S_OcDevFaultStruct
{
	UINT16 OcId;
	UINT8 PowerAState;/*A系电源状态，新增。0x55-双路空开正常，0xaa-单路空开异常，0xFF-双路空开异常*/
	UINT8 PowerBState;/*B系电源状态，新增。0x55-双路空开正常，0xaa-单路空开异常，0xFF-双路空开异常*/
	UINT8 OCDevFaultState;/*OC设备故障状态，新增。0x55-板卡正常，0xFF-板卡故障*/ 
	UINT8 FanState;/*风扇状态 0x55-风扇状态正常，0xaa-风扇状态异常，0xFF-风扇状态故障*/
}OcFaultStateStruct;/*一个OC的故障状态结构体*/

extern UINT16 LocalOcIds[OC_SUM_MAX];/*所有OC ID*/

extern OcToCiOriginDataStruct m_OcToCiOrginDataArr[OC_SUM_MAX]; /*OC到CI数据帧结构体,【原始数据】*/
extern UINT8 m_OcToCiOrginDataNum;	/*Oc到Ci的数据当前的数量*/


extern OcCollBoardDataStruct m_OcConvertedPtDataArr[OC_SUM_MAX];/*CI收到的所有OC采集板数据【转换后的点位数据】*/

extern OcDeviceStruct m_Signals[CI_SIGNAL_MAX];/*来自OC的所有信号机设备*/
extern UINT16 m_SignalNum;

extern OcDeviceStruct m_Switches[CI_SWITCH_MAX];/*来自OC的所有道岔设备*/
extern UINT16 m_SwitchNum;

extern OcGdDevice m_Gds[CI_GD_MAX];/*轨道设备*/
extern UINT16 m_GdNum;

extern UINT8 xingshiTestStart;
extern UINT32 xingshiTestStartCycle;
extern UINT8 xingshiTestStop;
extern UINT32 xingshiTestStopCycle;


extern UINT8 ocsBoardsIsScatter[OC_SUM_MAX][BOARD_SUM_MAX][1];

extern OcFaultStateStruct m_OcFaultState[OC_SUM_MAX];/*CI收到的所有OC故障状态*/


#define OC_DEVICE_TYPE_SWITCH	1U		/*oc设备类型 - 道岔*/
#define OC_DEVICE_TYPE_SIGNAL	2U		/*oc设备类型 - 信号机*/
/*****************OC相关************************/

/*OC接口从头到设备数量止*/
#define LEN_OC_UP_TO_DEV_NO  43U

/*OC-100接口使用*/
/*计算OC从开始到轨道板数量止，参数devNo:设备数量*/
#define LEN_OC_UP_TO_GD_NO(devNo)  (LEN_OC_UP_TO_DEV_NO+(devNo)*8U+2U)

/*计算OC从开始到DI板数量止，参数devNo:设备数量，参数gdBoardNo：轨道板数量*/
#define LEN_OC_UP_TO_DIBOARD_NO(devNo,gdBoardNo)  LEN_OC_UP_TO_GD_NO(devNo) +((gdBoardNo)*8U)+2U

/*计算OC从开始到DO板数量止，参数devNo:设备数量，参数gdBoardNo：轨道板数量*/
#define LEN_OC_UP_TO_DOBOARD_NO(devNo,gdBoardNo,diBoardNo) LEN_OC_UP_TO_DIBOARD_NO((devNo),(gdBoardNo))+20U*(diBoardNo)+2U

/*计算OC从开始到结束，参数devNo:设备数量，参数gdBoardNo：轨道板数量, 参数diBoardNo：di板数量 参数doBoardNo：do板数量*/
#define LEN_OC_UP_TO_SIBOARD_NO(devNo,gdBoardNo,diBoardNo,doBoardNo) LEN_OC_UP_TO_DOBOARD_NO((devNo),(gdBoardNo),(diBoardNo))+2U*(doBoardNo)+2U

/*计算OC从开始到结束，参数devNo:设备数量，参数gdBoardNo：轨道板数量, 参数diBoardNo：di板数量 参数doBoardNo：do板数量 参数siBoardNo:si板数量*/
#define LEN_OC_UP_TO_SOBOARD_NO(devNo,gdBoardNo,diBoardNo,doBoardNo,siBoardNo) LEN_OC_UP_TO_SIBOARD_NO((devNo),(gdBoardNo),(diBoardNo),(doBoardNo))+14U*(siBoardNo)+2U

/*计算OC从开始到结束，参数devNo:设备数量，参数gdBoardNo：轨道板数量, 参数diBoardNo：di板数量 参数doBoardNo：do板数量 参数siBoardNo:si板数量 参数soBoardNo:so板数量*/
#define LEN_OC100_UP_TO_SWAPSYSBOARD_NO(devNo,gdBoardNo,diBoardNo,doBoardNo,siBoardNo,soBoardNo) LEN_OC_UP_TO_SOBOARD_NO((devNo),(gdBoardNo),(diBoardNo),(doBoardNo),(siBoardNo))+2U*(soBoardNo)+6U

/*计算OC从开始到结束，参数devNo:设备数量，参数gdBoardNo：轨道板数量, 参数diBoardNo：di板数量 参数doBoardNo：do板数量 参数siBoardNo:si板数量 参数soBoardNo:so板数量 参数swapSysBoardNo:切系板卡数量*/
#define LEN_OC100_UP_TO_END(devNo,gdBoardNo,diBoardNo,doBoardNo,siBoardNo,soBoardNo,swapSysBoardNo) LEN_OC100_UP_TO_SWAPSYSBOARD_NO((devNo),(gdBoardNo),(diBoardNo),(doBoardNo),(siBoardNo),(soBoardNo))+(swapSysBoardNo)


/*OC-200接口使用*/
/*计算OC从开始到轨道板数量止，参数devNo:设备数量*/
#define LEN_OC_UP_TO_GD_NO_200(zzjStateNo,switchNo,switchBoardNo,sianalNo)  (LEN_OC_UP_TO_DEV_NO+2U +(switchNo)*5U+ switchBoardNo*2U+(zzjStateNo)*1U)+sianalNo*7U
/*OC2.1.6 计算OC从开始到轨道板数量止，参数devNo:设备数量*/
#define LEN_OC_UP_TO_GD_NO_200_2(devNo,zzjStateNo)  (LEN_OC_UP_TO_DEV_NO+(devNo)* 9U+2U + (zzjStateNo)*1U)

/*计算OC从开始到DI板数量止，参数devNo:设备数量，参数gdBoardNo：轨道板数量*/
#define LEN_OC_UP_TO_DIBOARD_NO_200(startIndex,gdBoardNo)  startIndex +((gdBoardNo)*8U)+2U

/*计算OC从开始到DO板数量止，参数devNo:设备数量，参数gdBoardNo：轨道板数量*/
#define LEN_OC_UP_TO_DOBOARD_NO_200(startIndex,gdBoardNo,diBoardNo) startIndex+((gdBoardNo)*8U)+2U+20U*(diBoardNo)+2U

/*计算OC从开始到结束，参数devNo:设备数量，参数gdBoardNo：轨道板数量, 参数diBoardNo：di板数量 参数doBoardNo：do板数量*/
#define LEN_OC_UP_TO_SIBOARD_NO_200(startIndex,gdBoardNo,diBoardNo,doBoardNo) LEN_OC_UP_TO_DOBOARD_NO_200((startIndex),(gdBoardNo),(diBoardNo))+2U*(doBoardNo)+2U

/*计算OC从开始到结束，参数devNo:设备数量，参数gdBoardNo：轨道板数量, 参数diBoardNo：di板数量 参数doBoardNo：do板数量 参数siBoardNo:si板数量*/
#define LEN_OC_UP_TO_SOBOARD_NO_200(startIndex,gdBoardNo,diBoardNo,doBoardNo,siBoardNo) LEN_OC_UP_TO_SIBOARD_NO_200((startIndex),(gdBoardNo),(diBoardNo),(doBoardNo))+14U*(siBoardNo)+2U

/*计算OC从开始到结束，参数devNo:设备数量，参数gdBoardNo：轨道板数量, 参数diBoardNo：di板数量 参数doBoardNo：do板数量 参数siBoardNo:si板数量 参数soBoardNo:so板数量*/
#define LEN_OC_UP_TO_SORBOARD_NO_200(startIndex,gdBoardNo,diBoardNo,doBoardNo,siBoardNo,soBoardNo) LEN_OC_UP_TO_SOBOARD_NO_200((startIndex),(gdBoardNo),(diBoardNo),(doBoardNo),(siBoardNo))+soBoardNo*2U+1U

/*计算OC从开始到结束，参数devNo:设备数量，参数gdBoardNo：轨道板数量, 参数diBoardNo：di板数量 参数doBoardNo：do板数量 参数siBoardNo:si板数量 参数soBoardNo:so板数量 参数sorBoardNo:sor板数量*/
#define LEN_OC_UP_TO_PLUSBOX_NO_200(startIndex,gdBoardNo,diBoardNo,doBoardNo,siBoardNo,soBoardNo,sorBoardNo) LEN_OC_UP_TO_SORBOARD_NO_200((startIndex),(gdBoardNo),(diBoardNo),(doBoardNo),(siBoardNo),(soBoardNo))+7U*(sorBoardNo)+5U

/*计算OC从开始到结束，参数devNo:设备数量，参数gdBoardNo：轨道板数量, 参数diBoardNo：di板数量 参数doBoardNo：do板数量 参数siBoardNo:si板数量 参数soBoardNo:so板数量 参数sorBoardNo:sor板数量 参数pbNo:执行电插箱数量*/
#define LEN_OC_UP_TO_SWAPSYSBOARD_NO_200(startIndex,gdBoardNo,diBoardNo,doBoardNo,siBoardNo,soBoardNo, sorBoardNo,pbNo) LEN_OC_UP_TO_PLUSBOX_NO_200((startIndex),(gdBoardNo),(diBoardNo),(doBoardNo),(siBoardNo),(soBoardNo),(sorBoardNo))+3U*(pbNo)+2U

/*计算OC从开始到结束，参数devNo:设备数量，参数gdBoardNo：轨道板数量, 参数diBoardNo：di板数量 参数doBoardNo：do板数量 参数siBoardNo:si板数量 参数soBoardNo:so板数量  参数sorBoardNo:sor板数量 参数pbNo:执行电插箱数量 参数swapSysBoardNo:切系板卡数量*/
#define LEN_OC_UP_TO_END_200(startIndex,gdBoardNo,diBoardNo,doBoardNo,siBoardNo,soBoardNo,sorBoardNo,pbNo,swapSysBoardNo) LEN_OC_UP_TO_SWAPSYSBOARD_NO_200((startIndex),(gdBoardNo),(diBoardNo),(doBoardNo),(siBoardNo),(soBoardNo),(sorBoardNo),(pbNo))+(swapSysBoardNo)


/*OC-300接口使用*/
/*计算OC从开始到结束，参数devNo:设备数量，参数gdBoardNo：轨道板数量, 参数diBoardNo：di板数量 参数doBoardNo：do板数量 参数siBoardNo:si板数量 参数soBoardNo:so板数量 参数sorBoardNo:sor板数量 参数pbNo:执行电插箱数量 参数swapSysBoardNo:切系板卡数量*/
#define LEN_OC_UP_TO_PSD_NO_300(startIndex,gdBoardNo,diBoardNo,doBoardNo,siBoardNo,soBoardNo, sorBoardNo,pbNo, swapSysBoardNo) LEN_OC_UP_TO_SWAPSYSBOARD_NO_200((startIndex),(gdBoardNo),(diBoardNo),(doBoardNo),(siBoardNo),(soBoardNo),(sorBoardNo), (pbNo))+(swapSysBoardNo)+1U

/*计算OC从开始到结束，参数devNo:设备数量，参数gdBoardNo：轨道板数量, 参数diBoardNo：di板数量 参数doBoardNo：do板数量 参数siBoardNo:si板数量 参数soBoardNo:so板数量  参数sorBoardNo:sor板数量 参数pbNo:执行电插箱数量 参数swapSysBoardNo:切系板卡数量 参数psdNo:屏蔽门数量*/
#define LEN_OC_UP_TO_END_300(startIndex,gdBoardNo,diBoardNo,doBoardNo,siBoardNo,soBoardNo,sorBoardNo,pbNo,swapSysBoardNo, psdNo) LEN_OC_UP_TO_PSD_NO_300((startIndex),(gdBoardNo),(diBoardNo),(doBoardNo),(siBoardNo),(soBoardNo),(sorBoardNo),(pbNo), swapSysBoardNo)+33*(psdNo) + (0u == psdNo?0u:4u)



#ifdef __cplusplus
extern "C" {
#endif




/*
* 功能描述： 解析IO到CI数据帧到缓存
* 参数说明： const UINT8* dataBuf, 数据缓冲区
*            const UINT16 dataLength, 数据长度
* 返回值  ： 0: 数据解析失败
*			 1: 数据解析成功      
*/
UINT8 ParseOcToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength,const UINT8 systemId);

/*
* 功能描述： 组OC数据
* 参数说明： 
*            UINT8 deviceId, OC的ID
* 返回值  ： 0:组数据失败
*			 1:组数据成功
*/
UINT8 PackCiToOcData( UINT8 deviceId);

/*
* 功能描述： 把道岔驱动位置转化为道岔驱动命令
* 参数说明： 
*		输入参数：
*			UINT8 drvColor：道岔驱动位置
* 返回值  ： 0:道岔驱动命令转化失败
*			 1:道岔驱动命令    
*/
UINT16 ConvertSwitchDrvPosToSwDrvCmd(UINT8 drvPos);

/*
* 功能描述： 把信号机驱动颜色转化为信号机驱动命令
* 参数说明： 
*		输入参数：
*			UINT8 drvColor：信号机驱动颜色
* 返回值  ： 0:信号机驱动命令转化失败
*			 1:信号机驱动命令      
*/
UINT16 ConvertSigDrvColorToSigDrvCmd(const UINT16 signalId, const UINT8 drvColor);


/*
* 功能描述： 把解析的OC设备数据转换为OC 信号机和 OC 道岔设备数据
* 参数说明： void
* 返回值  ： void      
*/
void ConvertOcOriginDataToOcSigSwDev(void);

/*
* 功能描述： 把解析的OC板卡数据转换为OC点位数据
* 参数说明： void
* 返回值  ： void      
*/
void ConvertOcOriginDataToPtData(void);

/*
* 功能描述： 初始化OC设备
* 参数说明： void
* 返回值  ： void      
*/
void InitOcDevices(void);

/*
* 功能描述： 初始化OC信号机
* 参数说明： void
* 返回值  ： void      
*/
void InitOcSignals(void);

/*
* 功能描述： 初始化OC道岔
* 参数说明： void
* 返回值  ： void      
*/
void InitOcSwitchs(void);

/*
* 功能描述： 初始化OC轨道
* 参数说明： void
* 返回值  ： void      
*/
void InitOcGds(void);

/*
* 功能描述： 通过信号机id获取索引
* 参数说明： 
*	Id：信号机索引
* 返回值  ： 
*	Int16:信号机Id
*/
INT16 GetIndexBySignalId(UINT16 sigId);

/*
* 功能描述： 通过道岔id获取索引
* 参数说明： 
*	Id：道岔索引
* 返回值  ： 
*	Int16:道岔Id
*/
INT16 GetIndexBySwitchId(UINT16 swId);

/*
* 功能描述： 通过轨道id获取索引
* 参数说明： 
*	Id：轨道索引
* 返回值  ： 
*	Int16:轨道Id
*/
INT16 GetIndexByGdId(UINT16 gdId);


/*
* 功能描述： 校验Oc到CI的单帧数据长度合法性
* 参数说明： const UINT8* dataBuf, 数据缓冲区
*            const UINT16 dataLength, 数据长度
* 返回值  ： 0: 数据解析失败
*			 1: 数据解析成功      
*/
UINT8 CheckOc2CiDataLenValid(const UINT8* dataBuf, const UINT16 totalLength);

/*
* 功能描述： 重置oc状态
* 参数说明： const UINT8 ocId, ocId
* 返回值  ： void
*			       
*/
void ResetOcOriginalState(const UINT8 ocId);

/*
* 功能描述：为指定OC->CI的结构设置缺省值(安全值)
* 参数说明： index:OC id对应的数组下标
* 返回值  ： 0:失败
*			 1:成功
*/
void SetOcToCiDefaultDataStru(UINT8 index);

/*
* 功能描述：获取要发送给OC的控权切换命令
* 参数说明： 无
* 返回值  ： 控权切换命令
*/
UINT16 GetKqChangeCommand(void);

/*
* 功能描述： 获取点位采集容忍起始周期
* 参数说明： const UINT16 switchId, 道岔ID
* 返回值  ： UINT32 采集容忍起始周期
*/
UINT32 GetPointTolerateCycNum(const UINT16 ocId, const UINT8 boardNum, const UINT8 pointNum);

/*
* 功能描述： 设置道岔采集容忍起始周期
* 参数说明： const UINT16 ocId, OC ID
*			 const UINT8 boardNum, 板卡ID
*			 const UINT8 pointNum，点位ID
*            const UINT32 cycNum 周期号
* 返回值  ： 无
*/
void SetPointTolerateCycNum(const UINT16 ocId, const UINT8 boardNum, const UINT8 pointNum, const UINT32 cycNum);

#ifdef __cplusplus
}
#endif

#endif
