/********************************************************
*                                                                                                            
* 文 件 名： RelayConfigDataManage.h   
* 版权说明： 北京交控科技有限公司 
* 创建时间： 2012-03-20
* 作    者： 联锁组
* 功能描述： 继电器配置数据管理头文件  
* 函数包括： 
* 使用注意：
* 修改记录：   
*
********************************************************/ 

#ifndef _RELAY_CONFIG_DATA_MANAGE_H_
#define _RELAY_CONFIG_DATA_MANAGE_H_



#include "RelayDefine.h"
#include "CommonTypes.h"
#include "../System/CiSystemDefine.h"
#include "../System/SystemParameterManage.h"




#ifdef __cplusplus
extern "C" {
#endif



/*继电器接口数据结构体*/
typedef struct S_RelayConfigDataStruct
{
    UINT16 RelayId;                 /*继电器ID (配置字段)*/
	UINT8 BelongCiId;               /*所属联锁ID (配置字段)*/
	UINT16 BelongOcId;				/*所属OC id*/
	UINT16 BelongDrvOcId;			/*驱动OC id*/
	UINT8 BelongVirCIid;				/*所属OC id*/
	UINT8 CollMode;                 /*采集模式(前节点/后节点/双节点) (配置字段)*/
	UINT8 ForeNodeCollAddrA;        /*A系前节点采集地址 (配置字段)*/
	UINT8 ForeNodeCollPosA;         /*A系前节点采集位置 (配置字段)*/
	UINT8 BackNodeCollAddrA;        /*A系后节点采集地址 (配置字段)*/
	UINT8 BackNodeCollPosA;         /*A系后节点采集地址 (配置字段)*/
	UINT8 DrvAddrA;                 /*A系驱动地址 (配置字段)*/
	UINT8 DrvPosA;                  /*A系驱动位置 (配置字段)*/
	UINT8 ForeNodeCollAddrB;        /*B系前节点采集地址 (配置字段)*/
	UINT8 ForeNodeCollPosB;         /*B系前节点采集位置 (配置字段)*/
	UINT8 BackNodeCollAddrB;        /*B系后节点采集地址 (配置字段)*/
	UINT8 BackNodeCollPosB;         /*B系后节点采集位置 (配置字段)*/
	UINT8 DrvAddrB;                 /*B系驱动地址 (配置字段)*/
	UINT8 DrvPosB;                  /*B系驱动位置 (配置字段)*/
	UINT8 VirtualAttribute;			/*虚拟继电器属性*/
	UINT16 LockExceptPhySecNum;		/*照查继电器关联的故障锁闭区段ID数量*/
	UINT16 LockExceptPhySecIdBuf[MAX_LOCK_EXCEPT_SECTION_NUM];	/*照查继电器关联的故障锁闭区段ID数组*/
	UINT8 BoardType;  /*所属板卡类型(仅初始化本控区继电器)*/
} RelayConfigDataStruct;

/*照查继电器联锁条件检查类型数据结构体*/
typedef struct S_ZhaochaCheckTypeStruct
{
	UINT8 CheckType;             /*检查类型*/
	UINT8 DevType;      		 /* 设备类型 (配置字段)*/
	UINT16 DevId;      			 /* 设备ID (配置字段)*/
} ZhaochaCheckTypeStruct;

/*照查继电器联锁条件检查数据结构体*/
typedef struct S_ZhaochaCheckConfigDataStruct
{
	UINT16 ZhaochaRelayId;   /*照查继电器ID*/
	UINT16 ZhaochaCheckSum;  /*照查检查条件数目*/
	ZhaochaCheckTypeStruct ZhaochaCheckTypeBuf[ZHAOCHA_CHECK_TYPE_SUN_MAX]; /*照查检查类型数据*/
} ZhaochaCheckConfigDataStruct;


/*采集驱动板数据结构体*/
typedef struct S_BoardDataStruct
{
	UINT8 OcId;			/*所属oc id*/
    UINT8 BoardAddress;  /*电路板地址 (配置字段)*/
	UINT16 RelayIdBuf[BOARD_POS_MAX];   /*电路板对应的继电器数组 (配置字段)*/
} BoardDataStruct;

/*****************OC相关**********************/
typedef struct S_OcBoardDataStruct
{
	UINT16 OcId;		/*OcId*/
#if 0
	UINT16 CollBoardNum;	/*采集板卡数量*/
	BoardDataStruct CollBoardDataArr[OC_BOARD_SUM_MAX];   /*OC电路板对应的采集板卡地址和继电器(配置字段)*/
#endif
	BoardDataStruct DrvBoardDataArr[OC_BOARD_SUM_MAX];   /*OC电路板对应的驱动板卡地址和继电器 (配置字段)*/
	UINT16 DrvBoardNum;		/*驱动板卡数量*/
}OcDrvBoardDataStruct;

typedef struct S_OcDrvBoardAddrsStruct
{
	UINT16 OcId;
	UINT16 DrvBoardAddrArr[OC_BOARD_SUM_MAX];
	UINT8  DrvBoardSum;
}OcDrvBoardsStruct;/*一个oc对应的所有驱动板卡地址，oc与多板卡映射关系*/

/*OC 联络线接口继电器配置表数据-继电器信息*/
typedef struct S_OcConnetRelayCfgStruct
{
	UINT8 RelayType;  /*继电器类型*/
	UINT16 RelayId;   /*采集继电器ID*/
	UINT16 DrvRelayId;	/*驱动继电器*/
}OcConnetRelayCfgStruct;

/*OC 联络线接口继电器配置表数据*/
typedef struct S_OcConnetDataCfgStruct
{
	UINT8 DevType;      		 /* 设备类型 (配置字段)*/
	UINT16 DevId;      			 /* 设备ID (配置字段)*/
	OcConnetRelayCfgStruct OcConnetRelayDataBuf[OC_LIAISON_RELAY_SUM_MAX]; /*继电器类型配置*/
	UINT8 DevIsThisLine;          /*设备是否本线路*/
}OcConnetDataCfgStruct;




/*****************OC相关**********************/

/*********************新加的：修复processiotoci耗时*****************/
typedef struct S_BoardConfigStruct
{
	UINT16 Pos[BOARD_POS_MAX+1u];/*继电器位置*/
}BoardConfigStruct;

/*******************************全局变量声明*******************************/
/*新增，故障锁闭照查继电器数量*/
extern UINT16 LockExceptZhaoChaRelayNum;
/*新增，故障锁闭照查继电器ID数组*/
extern UINT16 LockExceptZhaoChaRelayId[MAX_LOCK_EXCEPT_ZHAO_RELAY_NUM];

/*新增，照查联锁检查条件照查继电器ID数量*/
extern UINT16 CiCheckZhaoChaRelayNum;
extern OcConnetDataCfgStruct OcConnetDataCfgStru[OC_LIAISON_DEV_SUM_MAX]; /*联络线接口继电器配置表数组*/

/*OC 联络线接口继电器配置表设备数量*/
extern UINT16 OcConnetDataDevNum;

/*********************新加的：修复processiotoci耗时*****************/
extern BoardConfigStruct BoardConfigForeNodeA[OC_SUM_MAX][BOARD_MAX_ADDR];/*前节点A系板卡*/
extern BoardConfigStruct BoardConfigForeNodeB[OC_SUM_MAX][BOARD_MAX_ADDR];/*前节点B系板卡*/
extern BoardConfigStruct BoardConfigBackNodeA[OC_SUM_MAX][BOARD_MAX_ADDR];/*后节点A系板卡*/
extern BoardConfigStruct BoardConfigBackNodeB[OC_SUM_MAX][BOARD_MAX_ADDR];/*后节点B系板卡*/


extern RelayConfigDataStruct RelayConfigDataStru[RELAY_SUM_MAX]; /*定义继电器配置数据结构体数组*/
extern UINT16 LocalCiRelayIdBuf[RELAY_SUM_MAX];                 /*定义本地联锁继电器ID映射数组*/
extern INT16 RelayCurSum;/*继电器当前总数*/

extern BoardDataStruct CiCollBoardDataStru[BOARD_SUM_MAX];  /*定义采集板数据结构体数组*/
extern UINT16 CiCollBoardCurSum;   /*定义采集板当前总数*/

extern BoardDataStruct CiDrvBoardDataStru[BOARD_SUM_MAX];  /*定义驱动板数据结构体数组*/
extern UINT16 CiDrvBoardCurSum;  /*定义驱动板当前总数*/
extern ZhaochaCheckConfigDataStruct ZhaochaCheckConfigDataStru[ZHAOCHA_CHECK_SUM_MAX];/*照查继电器联锁条件检查数据结构体数组*/
																						/*新增，照查联锁检查条件照查继电器ID数量*/

/********************OC相关******************/
extern OcDrvBoardDataStruct LocalCIOcDrvBoardConfigDataArr[OC_SUM_MAX];/*定义本联锁相关的OC板卡配置数据*/
extern UINT8 LocalCiOcSum;

extern OcDrvBoardsStruct LocalOcDrvBoardsMap[OC_SUM_MAX];/*oc与drv板卡映射关系*/
extern UINT8 LocalOcSum;

 /********************OC相关******************/


extern UINT16 totalRelayNum;

/*
* 功能描述： 获取指定ID继电器索引号
* 参数说明： const UINT16 relayId, 继电器ID
* 返回值  ： RELAY_SUM_MAX: 获取数据失败
*			<RELAY_SUM_MAX: 查找成功
*/
UINT16 GetRelayConfigBufIndex(const UINT16 relayId);

/*
* 功能描述： 获取继电器当前总数
* 参数说明： void    
* 返回值  ： 0: 获取数据失败
*			>0: 继电器当前总数
*/
UINT16 GetRelayCurSum(void);

/*
* 功能描述： 获取指定数组下标对应的继电器ID
* 参数说明： const UINT16 bufIndex, 数组下标    
* 返回值  ： 0: 获取数据失败
*			>0: 继电器ID      
*/
UINT16 GetRelayId(const UINT16 bufIndex);

/*
* 功能描述： 获取指定ID继电器所属联锁ID
* 参数说明： const UINT16 relayId, 继电器ID    
* 返回值  ： 0: 获取数据失败
*			>0: 所属联锁ID      
*/
UINT8 GetRelayBelongCiId(const UINT16 relayId);

/*
* 功能描述： 获取指定ID继电器采集模式
* 参数说明： const UINT16 relayId, 继电器ID    
* 返回值  ： 0: 获取数据失败
*			>0: 采集模式      
*/
UINT8 GetRelayCollectMode(const UINT16 relayId);

/*
* 功能描述： 获取指定ID继电器A系前节点采集地址
* 参数说明： const UINT16 relayId, 继电器ID     
* 返回值  ： 0: 获取数据失败
*			>0: A系前节点采集地址      
*/
UINT8 GetRelayForeNodeCollAddrA(const UINT16 relayId);

/*
* 功能描述： 获取指定ID继电器A系前节点采集位置
* 参数说明： const UINT16 relayId, 继电器ID     
* 返回值  ： 0: 获取数据失败
*			>0: A系前节点采集位置      
*/
UINT8 GetRelayForeNodeCollPosA(const UINT16 relayId);

/*
* 功能描述： 获取指定ID继电器A系后节点采集地址
* 参数说明： const UINT16 relayId, 继电器ID     
* 返回值  ： 0: 获取数据失败
*			>0: A系后节点采集地址      
*/
UINT8 GetRelayBackNodeCollAddrA(const UINT16 relayId);

/*
* 功能描述： 获取指定ID继电器A系后节点采集位置
* 参数说明： const UINT16 relayId, 继电器ID     
* 返回值  ： 0: 获取数据失败
*			>0: A系后节点采集位置      
*/
UINT8 GetRelayBackNodeCollPosA(const UINT16 relayId);

/*
* 功能描述： 获取指定ID继电器A系驱动地址
* 参数说明： const UINT16 relayId, 继电器ID     
* 返回值  ： 0: 获取数据失败
*			>0: A系驱动地址      
*/
UINT8 GetRelayDrvAddrA(const UINT16 relayId);

/*
* 功能描述： 获取指定ID继电器A系驱动位置
* 参数说明： const UINT16 relayId, 继电器ID     
* 返回值  ： 0: 获取数据失败
*			>0: A系驱动位置      
*/
UINT8 GetRelayDrvPosA(const UINT16 relayId);

/*
* 功能描述： 获取指定ID继电器B系前节点采集地址
* 参数说明： const UINT16 relayId, 继电器ID     
* 返回值  ： 0: 获取数据失败
*			>0: B系前节点采集地址      
*/
UINT8 GetRelayForeNodeCollAddrB(const UINT16 relayId);

/*
* 功能描述： 获取指定ID继电器B系前节点采集位置
* 参数说明： const UINT16 relayId, 继电器ID     
* 返回值  ： 0: 获取数据失败
*			>0: B系前节点采集位置      
*/
UINT8 GetRelayForeNodeCollPosB(const UINT16 relayId);

/*
* 功能描述： 获取指定ID继电器B系后节点采集地址
* 参数说明： const UINT16 relayId, 继电器ID     
* 返回值  ： 0: 获取数据失败
*			>0: B系后节点采集地址      
*/
UINT8 GetRelayBackNodeCollAddrB(const UINT16 relayId);

/*
* 功能描述： 获取指定ID继电器B系后节点采集位置
* 参数说明： const UINT16 relayId, 继电器ID     
* 返回值  ： 0: 获取数据失败
*			>0: B系后节点采集位置      
*/
UINT8 GetRelayBackNodeCollPosB(const UINT16 relayId);

/*
* 功能描述： 获取指定ID继电器B系驱动地址
* 参数说明： const UINT16 relayId, 继电器ID     
* 返回值  ： 0: 获取数据失败
*			>0: B系驱动地址      
*/
UINT8 GetRelayDrvAddrB(const UINT16 relayId);

/*
* 功能描述： 获取指定ID继电器B系驱动位置
* 参数说明： const UINT16 relayId, 继电器ID     
* 返回值  ： 0: 获取数据失败
*			>0: B系驱动位置      
*/
UINT8 GetRelayDrvPosB(const UINT16 relayId);

/*
* 功能描述： 获取指定联锁ID的采集板结构体总数
* 参数说明： void
* 返回值  ： 0: 获取数据失败
*			>0: 采集板结构体总数     
*/
UINT16 GetColRelayStructSum(void);

/*
* 功能描述： 获取指定联锁ID的采集板结构体
* 参数说明： void
* 返回值  ： NULL: 获取数据失败
*			 !NULL: 获取数据成功     
*/
BoardDataStruct* GetColRelayStruct(void);

/*
* 功能描述： 获取指定联锁ID的驱动板结构体总数
* 参数说明： void    
* 返回值  ： 0: 获取数据失败
*			>0: 采集板结构体总数     
*/
UINT16 GetDrvRelayStructSum(void);

/*
* 功能描述： 获取指定联锁ID的驱动板结构体
* 参数说明： void
* 返回值  ： NULL: 获取数据失败
*			 !NULL: 获取数据成功    
*/
BoardDataStruct* GetDrvRelayStruct(void);

/*
* 功能描述： 获取指定采集板地址和位置的继电器ID
* 参数说明： const UINT8 RelayAdrr, 采集板地址
*			 const UINT8 Pos, 采集点位置
* 返回值  ： 0: 获取数据失败
*			 >0: 继电器ID    
*/
UINT16 GetColRelayID(const UINT8 ocId, const UINT8 RelayAdrr, const UINT8 Pos);

/*
* 功能描述： 获取本联锁指定采集板地址和位置的继电器采集描述信息
* 参数说明： const UINT8 RelayAdrr, 采集板地址
*			 const UINT8 Pos, 采集点位置
* 返回值  ： 0: 获取数据失败
*			 >0: 采集描述信息   
*/
UINT8 GetColRelayInfo(const UINT8 ocId, const UINT8 RelayAdrr, const UINT8 Pos);

/*
* 功能描述：	整理读入的继电器配置数据
* 参数说明：	无
* 返回值  ：	CI_SUCCESS,整理成功
*				CI_ERROR,整理失败
*/
UINT8 RelayConfigDataManage(void);

/*
* 功能描述：	根据继电器数据生成采集驱动板数据
* 参数说明：	无
* 返回值  ：	CI_SUCCESS,整理成功
*				CI_ERROR,整理失败
*/
UINT8 ConvertRelayConfigToBoardConfig(void);

/*
* 功能描述：	获取继电器虚拟属性
* 参数说明：	无
* 返回值  ：	
*			CI_ERROR,整理失败
			0x55:虚拟
			0xaa:非虚拟
*/
UINT8 GetRelayVirtAttr(const UINT16 relayId);

/*
* 功能描述：	整理读入的相邻联锁虚拟继电器配置数据
* 参数说明：	relayNum 继电器数量
*				relayIdBuff 相邻联锁发送给本联锁的继电器ID配置数据
* 返回值  ：	1,整理成功
*				0,整理失败
*/
UINT8 AddExtendRelayIdDataManage(UINT16 relayNum,const UINT16 *relayIdBuff);

/*
* 功能描述： 获取相邻联锁发送给本联锁以及本联锁继电器当前总数
* 参数说明： void    
* 返回值  ： 0: 获取数据失败
*			>0: 继电器当前总数
*/
UINT16 GetTotalRelayCurNum(void);

/*
* 功能描述：	获取继电器关联的故障锁闭照查物理区段数量
* 参数说明：	无
* 返回值  ：	
*			CI_ERROR,获取为0或者获取失败
			>0：故障锁闭照查物理区段数量
*/
UINT16 GetRelayLockExceptPhySecNum(const UINT16 relayId);


/*
* 功能描述：	获取继电器关联的故障锁闭照查物理区段ID数组
* 参数说明：	无
* 返回值  ：	
*			CI_ERROR,整理失败
			0x55:虚拟
			0xaa:非虚拟
*/
UINT16* GetRelayLockExceptPhySecIdBuf(const UINT16 relayId);

/*
* 功能描述：	初始化oc驱动板卡配置
* 参数说明：	无
* 返回值  ：	void
*/
void InitOcDrvBoardCfg(void);

/*
* 功能描述：	把板卡配置转化成oc板卡配置数据
* 参数说明：	无
* 返回值  ：	void
*/
void ConvertBoardCfgToOcDrvBoardCfg(void);
/*
* 功能描述： 获取指定ID继电器所属虚拟联锁ID
* 参数说明： const UINT16 relayId, 继电器ID    
* 返回值  ： 0: 获取数据失败
*			>0: 所属虚拟联锁ID      
*/
UINT8 GetRelayBelongVirCiId(const UINT16 relayId);

/*
* 功能描述： 获取照查继电器配置数量
* 参数说明： void    
* 返回值  ： 获取照查继电器配置数量      
*/
UINT16 GetZhaochaCheckConfigDataNum(void);


/*
* 功能描述： 获取照查继电器检查结构体数据
* 参数说明： void    
* 返回值  ： 照查继电器检查结构体数组指针      
*/
ZhaochaCheckConfigDataStruct* GetZhaochaCheckConfigDataStru(void);

/*
* 功能描述： 获取联络线接口继电器表结构体数据
* 参数说明： void    
* 返回值  ： 联络线接口继电器表结构体数组指针      
*/
OcConnetDataCfgStruct* GetOcConnetDataCfgStruc(void);

/*
* 功能描述： 获取联络线接口继电器表配置数量
* 参数说明： void    
* 返回值  ： 获取联络线接口继电器表配置数量      
*/
UINT16 GetOcConnetDataDevNum(void);

/*
* 功能描述： 获取指定ID继电器所属OCID
* 参数说明： const UINT16 relayId, 继电器ID
* 返回值  ： 0: 获取数据失败
*			>0: 所属OC ID
*/
UINT16 GetRelayBelongOCId(const UINT16 relayId);

/*
* 功能描述：设置指定ID继电器板卡类型
* 参数说明：const UINT16 relayId 继电器ID
*           const UINT8 cBoardType 板卡类型
* 返 回 值：无
* Created By LQ 2025.07.03
*/
void SetRelayBoardType(const UINT16 relayId, const UINT8 cBoardType);

/*
* 功能描述：获取指定ID继电器板卡类型
* 参数说明：const UINT16 relayId 继电器ID
* 返 回 值：0: 获取数据失败
*			>0: 继电器板卡类型
* Created By LQ 2025.07.03
*/
UINT8 GetRelayBoardType(const UINT16 relayId);

#ifdef __cplusplus
}
#endif

#endif
