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

#include "RelayConfigDataManage.h"

/*新增，故障锁闭照查继电器ID数量*/
UINT16 LockExceptZhaoChaRelayNum = 0u;
/*新增，故障锁闭照查继电器ID数组*/
UINT16 LockExceptZhaoChaRelayId[MAX_LOCK_EXCEPT_ZHAO_RELAY_NUM];

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


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

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

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

OcConnetDataCfgStruct OcConnetDataCfgStru[OC_LIAISON_DEV_SUM_MAX] = {0u}; /*联络线接口继电器配置表数组*/
UINT16 OcConnetDataDevNum = 0u;

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

OcDrvBoardsStruct LocalOcDrvBoardsMap[OC_SUM_MAX];/*oc与drv板卡映射关系*/
UINT8 LocalOcSum = 0U;/*oc数量*/

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


UINT16 totalRelayNum = 0u;/*本联锁和相邻联锁发送给本联锁Relay总数*/
/*
* 功能描述： 获取指定ID继电器索引号
* 参数说明： const UINT16 relayId, 继电器ID
* 返回值  ： RELAY_SUM_MAX: 获取数据失败
*			<RELAY_SUM_MAX: 查找成功
*/
UINT16 GetRelayConfigBufIndex(const UINT16 relayId)
{
	UINT16 retVal = RELAY_SUM_MAX;
	if ((relayId >= 1u) && (relayId < RELAY_SUM_MAX))
	{
        retVal = relayId;
	}

	return retVal;
}

/*
* 功能描述： 获取继电器当前总数
* 参数说明： void    
* 返回值  ： 0: 获取数据失败
*			>0: 继电器当前总数
*/
UINT16 GetRelayCurSum(void)
{
	UINT16 retVal = 0u;
    if (RelayCurSum >= (INT16)RELAY_SUM_MAX)
    {
        retVal = RELAY_SUM_MAX;
    }
	else if (RelayCurSum < 0)
	{
		retVal = 0u;
	}
    else
    {/*在RelayCurSum在[0,RELAY_SUM_MAX)区间时强转，保证安全*/
        retVal = (UINT16)RelayCurSum;
    }
	return retVal;
}

/*
* 功能描述： 获取指定数组下标对应的继电器ID
* 参数说明： const UINT16 bufIndex, 数组下标    
* 返回值  ： 0: 获取数据失败
*			>0: 继电器ID      
*/
UINT16 GetRelayId(const UINT16 bufIndex)
{
	UINT16 retVal = CI_ERROR;
	if (bufIndex < GetRelayCurSum())
	{
		retVal = LocalCiRelayIdBuf[bufIndex];
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

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

	bufIndex = GetRelayConfigBufIndex(relayId);  /*获取继电器数组下标*/

	if (bufIndex < RELAY_SUM_MAX)
	{
		retVal = RelayConfigDataStru[bufIndex].BelongCiId;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


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

	bufIndex = GetRelayConfigBufIndex(relayId);  /*获取继电器数组下标*/

	if (bufIndex < RELAY_SUM_MAX)
	{
		retVal = RelayConfigDataStru[bufIndex].CollMode;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


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

	bufIndex = GetRelayConfigBufIndex(relayId);  /*获取继电器数组下标*/

	if (bufIndex < RELAY_SUM_MAX)
	{
		retVal = RelayConfigDataStru[bufIndex].ForeNodeCollAddrA;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


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

	bufIndex = GetRelayConfigBufIndex(relayId);  /*获取继电器数组下标*/

	if (bufIndex < RELAY_SUM_MAX)
	{
		retVal = RelayConfigDataStru[bufIndex].ForeNodeCollPosA;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


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

	bufIndex = GetRelayConfigBufIndex(relayId);  /*获取继电器数组下标*/

	if (bufIndex < RELAY_SUM_MAX)
	{
		retVal = RelayConfigDataStru[bufIndex].BackNodeCollAddrA;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


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

	bufIndex = GetRelayConfigBufIndex(relayId);  /*获取继电器数组下标*/

	if (bufIndex < RELAY_SUM_MAX)
	{
		retVal = RelayConfigDataStru[bufIndex].BackNodeCollPosA;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


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

	bufIndex = GetRelayConfigBufIndex(relayId);  /*获取继电器数组下标*/

	if (bufIndex < RELAY_SUM_MAX)
	{
		retVal = RelayConfigDataStru[bufIndex].DrvAddrA;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


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

	bufIndex = GetRelayConfigBufIndex(relayId);  /*获取继电器数组下标*/

	if (bufIndex < RELAY_SUM_MAX)
	{
		retVal = RelayConfigDataStru[bufIndex].DrvPosA;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


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

	bufIndex = GetRelayConfigBufIndex(relayId);  /*获取继电器数组下标*/

	if (bufIndex < RELAY_SUM_MAX)
	{
		retVal = RelayConfigDataStru[bufIndex].ForeNodeCollAddrB;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


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

	bufIndex = GetRelayConfigBufIndex(relayId);  /*获取继电器数组下标*/

	if (bufIndex < RELAY_SUM_MAX)
	{
		retVal = RelayConfigDataStru[bufIndex].ForeNodeCollPosB;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


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

	bufIndex = GetRelayConfigBufIndex(relayId);  /*获取继电器数组下标*/

	if (bufIndex < RELAY_SUM_MAX)
	{
		retVal = RelayConfigDataStru[bufIndex].BackNodeCollAddrB;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


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

	bufIndex = GetRelayConfigBufIndex(relayId);  /*获取继电器数组下标*/

	if (bufIndex < RELAY_SUM_MAX)
	{
		retVal = RelayConfigDataStru[bufIndex].BackNodeCollPosB;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


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

	bufIndex = GetRelayConfigBufIndex(relayId);  /*获取继电器数组下标*/

	if (bufIndex < RELAY_SUM_MAX)
	{
		retVal = RelayConfigDataStru[bufIndex].DrvAddrB;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


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

	bufIndex = GetRelayConfigBufIndex(relayId);  /*获取继电器数组下标*/

	if (bufIndex < RELAY_SUM_MAX)
	{
		retVal = RelayConfigDataStru[bufIndex].DrvPosB;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


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

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

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

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

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

	for (ii = 0u; ii < BoardSum; ii++)
	{
		if ((ocId== CiCollBoardDataStru[ii].OcId)&& (RelayAdrr == CiCollBoardDataStru[ii].BoardAddress))
		{
			retVal = CiCollBoardDataStru[ii].RelayIdBuf[Pos];
			break;
		}
	}

	return retVal;
}

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

#if 0
	for (ii = 1u; ii < RELAY_SUM_MAX; ii++)
	{
		if (RelayConfigDataStru[ii].BelongCiId == GetSystemParaLocalCiId())
		{
			/*继电器采集地址和采集位置均对应，则返回对应的采集点信息*/
			if ((RelayAdrr == RelayConfigDataStru[ii].ForeNodeCollAddrA) && (Pos == RelayConfigDataStru[ii].ForeNodeCollPosA - 1u))
			{
				retVal = RELAY_COLL_FORENODE_A;
			}
			else if ((RelayAdrr == RelayConfigDataStru[ii].ForeNodeCollAddrB) && (Pos == RelayConfigDataStru[ii].ForeNodeCollPosB - 1u))
			{
				retVal = RELAY_COLL_FORENODE_B;
			}
			else if ((RelayAdrr == RelayConfigDataStru[ii].BackNodeCollAddrA) && (Pos == RelayConfigDataStru[ii].BackNodeCollPosA - 1u))
			{
				retVal = RELAY_COLL_BACKNODE_A;
			}
			else if ((RelayAdrr == RelayConfigDataStru[ii].BackNodeCollAddrB) && (Pos == RelayConfigDataStru[ii].BackNodeCollPosB - 1u))
			{
				retVal = RELAY_COLL_BACKNODE_B;
			}
			else
			{
				/*不执行*/
			}

			if(CI_ERROR != retVal)
			{/*说明已经查询到*/
				break;
			}
		}


	}
#endif

	if (RelayAdrr < BOARD_MAX_ADDR)
	{
		if (Pos + 1u < BOARD_POS_MAX+1u)
		{
			if (BoardConfigForeNodeA[ocId][RelayAdrr].Pos[Pos+1u]>0u)
			{
				retVal = RELAY_COLL_FORENODE_A;
			}
			else if (BoardConfigForeNodeB[ocId][RelayAdrr].Pos[Pos+1u]>0u)
			{
				retVal = RELAY_COLL_FORENODE_B;
			}
			else if (BoardConfigBackNodeA[ocId][RelayAdrr].Pos[Pos+1u]>0u)
			{
				retVal = RELAY_COLL_BACKNODE_A;
			}
			else if (BoardConfigBackNodeB[ocId][RelayAdrr].Pos[Pos+1u]>0u)
			{
				retVal = RELAY_COLL_BACKNODE_B;
			}
			else
			{
				/*不做处理*/
			}
		}
	}

	

	return retVal;
}

/*
* 功能描述：	整理读入的继电器配置数据
* 参数说明：	无
* 返回值  ：	CI_SUCCESS,整理成功
*				CI_ERROR,整理失败
*/
UINT8 RelayConfigDataManage(void)
{
    UINT16 ii = 0u;      /*游标*/
    UINT16 jj = 0u;      /*游标*/
    UINT16 relayConfigDataSum = 0u;      /*继电器设备配置数据总数*/
	UINT8 retVal = CI_SUCCESS;

    /*保存继电器ID索引数组*/
    relayConfigDataSum = GetRelayCurSum();
    if (relayConfigDataSum >= RELAY_SUM_MAX)
    {/*配置数据总数错误*/

        retVal = CI_ERROR;
	}
	else
	{
		for (ii = 0u; ii < RELAY_SUM_MAX; ii++)
		{
			if (jj == relayConfigDataSum)
			{/*遍历有效数据完毕*/

				break;
			}

			if (RelayConfigDataStru[ii].BelongCiId == GetSystemParaLocalCiId())
			{/*该部分为有效数据*/
				LocalCiRelayIdBuf[jj] = RelayConfigDataStru[ii].RelayId;
				jj++;
			}

		}
	}


    return retVal;
}


/*
* 功能描述：	初始化oc驱动板卡配置
* 参数说明：	无
* 返回值  ：	void
*/
void InitOcDrvBoardCfg(void)
{
	UINT8 ii = 0u;
	UINT8 jj = 0u;
	UINT8 kk = 0u;
	for (ii = 0u; ii < OC_SUM_MAX; ii++)
	{
		LocalCIOcDrvBoardConfigDataArr[ii].OcId = 0u;
		LocalCIOcDrvBoardConfigDataArr[ii].DrvBoardNum = 0u;
		for (jj = 0u; jj < OC_BOARD_SUM_MAX; jj++)
		{
			LocalCIOcDrvBoardConfigDataArr[ii].DrvBoardDataArr[jj].BoardAddress = 0u;
			LocalCIOcDrvBoardConfigDataArr[ii].DrvBoardDataArr[jj].OcId = 0u;
			for (kk = 0u; kk < BOARD_POS_MAX; kk++)
			{
				LocalCIOcDrvBoardConfigDataArr[ii].DrvBoardDataArr[jj].RelayIdBuf[kk] = 0u;
			}

		}
	}

	for (ii = 0u; ii < OC_SUM_MAX; ii++)
	{
		LocalOcDrvBoardsMap[ii].OcId = 0u;
		LocalOcDrvBoardsMap[ii].DrvBoardSum = 0u;
		for (jj = 0u; jj < OC_BOARD_SUM_MAX; jj++)
		{
			LocalOcDrvBoardsMap[ii].DrvBoardAddrArr[jj] = 0u;
		}

	}
}

/*
* 功能描述：	把板卡配置转化成oc板卡配置数据
* 参数说明：	无
* 返回值  ：	void
*/
void ConvertBoardCfgToOcDrvBoardCfg(void)
{
	UINT16 ii = 0u;
	UINT16 jj = 0u;

	UINT8 findOcFlag = 0u;
	UINT16 findOcIndex = 0u;

	UINT8 findBoardFlag = 0u;
	UINT8 findBoardIndex = 0u;

	LocalCiOcSum = 0u;

	for (ii = 0u; ii < CiDrvBoardCurSum; ii++)/*遍历驱动板卡数据*/
	{
		findOcFlag = 0u;

		for (jj = 0u; jj < LocalCiOcSum; jj++)
		{
			if (LocalCIOcDrvBoardConfigDataArr[jj].OcId == CiDrvBoardDataStru[ii].OcId)
			{
				findOcFlag = 1u;
				findOcIndex = jj;
				break;
			}

		}
		if (findOcFlag == 0u)
		{
			findOcIndex = LocalCiOcSum;
		}
		/*findindex有可能是没找到的，所以oc id需要赋一下值*/
		LocalCIOcDrvBoardConfigDataArr[findOcIndex].OcId = CiDrvBoardDataStru[ii].OcId;

		/*从此oc里面找板卡地址，理论上是找不着的，因为cidrvboarddatastru是不重复的*/
		for (jj = 0u; jj < LocalCIOcDrvBoardConfigDataArr[findOcIndex].DrvBoardNum; jj++)
		{
			if (LocalCIOcDrvBoardConfigDataArr[findOcIndex].DrvBoardDataArr[jj].BoardAddress ==
				CiDrvBoardDataStru[ii].BoardAddress)
			{/*找到了*/
				findBoardFlag = 1u;
				findBoardIndex = (UINT8)jj;
				break;
			}
			/*没找着*/
			findBoardIndex = (UINT8)LocalCIOcDrvBoardConfigDataArr[findOcIndex].DrvBoardNum;
		}


		/*继电器id赋值*/






		if (findBoardIndex == 0u)
		{
			LocalCIOcDrvBoardConfigDataArr[findOcIndex].DrvBoardNum++;/*没找着，使用板卡数目作为索引，然后数目+1*/
		}


		if (findOcFlag == 0u)
		{
			LocalCiOcSum++;/*没找着，使用oc数目作为索引，然后数目+1*/
		}
	}

	/*************************************与上面分离开来****************************/
	LocalOcSum = 0u;
	for (ii = 0u; ii < CiDrvBoardCurSum; ii++)
	{
		findOcFlag = 0u;
		findOcIndex = 0u;
		for (jj = 0u; jj < LocalOcSum; jj++)
		{
			if (LocalOcDrvBoardsMap[jj].OcId == CiDrvBoardDataStru[ii].OcId)
			{
				/*找到oc*/
				findOcFlag = 1u;
				findOcIndex = jj;
				break;
			}
			findOcIndex = LocalOcSum;
		}
		/*往oc的板卡地址填值*/
		LocalOcDrvBoardsMap[findOcIndex].OcId = CiDrvBoardDataStru[ii].OcId;


		if (findOcFlag == 0u)
		{
			LocalOcSum++;
		}
	}
}

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

    UINT16 ii = 0u;
    UINT16 jj = 0u;
    UINT16 index = 0u;
    UINT8 isAdded = 0u;/*标志是否添加了该地址*/
	UINT8 reVal = CI_ERROR;
	UINT8 localCi = 0u;
    UINT16 relaySum = GetRelayCurSum();

	if (0U == relaySum)
	{
		reVal = CI_SUCCESS;
	}
	else
	{

		/*添加采集驱动板地址*/
		for (ii = 0u; ii < relaySum; ii++)
		{
			index = GetRelayConfigBufIndex(LocalCiRelayIdBuf[ii]);/*获取继电器索引*/

			if (RELAY_SUM_MAX <= index)
			{
				reVal = CI_ERROR;
				break;
			}
			else
			{
				reVal = CI_SUCCESS;
			}

			if (CI_SUCCESS == reVal)
			{
				localCi = GetSystemParaLocalCiId();

				if ((RelayConfigDataStru[index].BelongCiId == localCi) && (0u != localCi))
				{/*继电器所属联锁为本联锁，才处理*/

					if (RELAY_COLL_MODE_FORE == RelayConfigDataStru[index].CollMode)
					{/*前节点采集*/
						if (((0u != RelayConfigDataStru[index].ForeNodeCollAddrA) && (0u != RelayConfigDataStru[index].ForeNodeCollPosA)) &&
							((0u != RelayConfigDataStru[index].ForeNodeCollAddrB) && (0u != RelayConfigDataStru[index].ForeNodeCollPosB)))
						{
							/*通过*/
						}
						else
						{
							debug_infor_printf((const)"ConvertRelayConfigToBoardConfig failed: Relay %d config Error.\n", RelayConfigDataStru[index].RelayId);
							reVal = CI_ERROR;
							break;
						}
					}
					else if (RELAY_COLL_MODE_DOUBLE == RelayConfigDataStru[index].CollMode)
					{/*双节点采集*/
						if ((0u != RelayConfigDataStru[index].ForeNodeCollAddrA) && (0u != RelayConfigDataStru[index].ForeNodeCollPosA) &&
							(0u != RelayConfigDataStru[index].ForeNodeCollAddrB) && (0u != RelayConfigDataStru[index].ForeNodeCollPosB) &&
							(0u != RelayConfigDataStru[index].BackNodeCollAddrA) && (0u != RelayConfigDataStru[index].BackNodeCollPosA) &&
							(0u != RelayConfigDataStru[index].BackNodeCollAddrB) && (0u != RelayConfigDataStru[index].BackNodeCollPosB)
							)
						{
							/*通过*/
						}
						else
						{
							debug_infor_printf((const)"ConvertRelayConfigToBoardConfig failed: Relay %d config Error.\n", RelayConfigDataStru[index].RelayId);
							reVal = CI_ERROR;
							break;
						}
					}
					else if (RELAY_COLL_MODE_BACK == RelayConfigDataStru[index].CollMode)
					{/*后节点采集*/
						if ((0u != RelayConfigDataStru[index].BackNodeCollAddrA) && (0u != RelayConfigDataStru[index].BackNodeCollPosA) &&
							(0u != RelayConfigDataStru[index].BackNodeCollAddrB) && (0u != RelayConfigDataStru[index].BackNodeCollPosB))
						{
							/*通过*/
						}
						else
						{
							debug_infor_printf((const)"ConvertRelayConfigToBoardConfig failed: Relay %d config Error.\n", RelayConfigDataStru[index].RelayId);
							reVal = CI_ERROR;
							break;
						}
					}
					else if (RELAY_COLL_MODE_AFORE_BBCAK == RelayConfigDataStru[index].CollMode)
					{/*双节点采集*/
						if ((0u != RelayConfigDataStru[index].ForeNodeCollAddrA) && (0u != RelayConfigDataStru[index].ForeNodeCollPosA) &&
							(0u != RelayConfigDataStru[index].BackNodeCollAddrB) && (0u != RelayConfigDataStru[index].BackNodeCollPosB)
							)
						{
							/*通过*/
						}
						else
						{
							debug_infor_printf((const)"ConvertRelayConfigToBoardConfig failed: Relay %d config Error.\n", RelayConfigDataStru[index].RelayId);
							reVal = CI_ERROR;
							break;
						}
					}
					else if (RELAY_COLL_MODE_ABACK_BFORE == RelayConfigDataStru[index].CollMode)
					{/*双节点采集*/
						if ((0u != RelayConfigDataStru[index].ForeNodeCollAddrB) && (0u != RelayConfigDataStru[index].ForeNodeCollPosB) &&
							(0u != RelayConfigDataStru[index].BackNodeCollAddrA) && (0u != RelayConfigDataStru[index].BackNodeCollPosA))
						{
							/*通过*/
						}
						else
						{
							debug_infor_printf((const)"ConvertRelayConfigToBoardConfig failed: Relay %d config Error.\n", RelayConfigDataStru[index].RelayId);

							reVal = CI_ERROR;
							break;

						}
					}
					else
					{/*没有采集或者无效采集方式*/

					}


					/*前采集模式或双采集模式*/
					if ((RELAY_COLL_MODE_FORE == RelayConfigDataStru[index].CollMode)
						|| (RELAY_COLL_MODE_DOUBLE == RelayConfigDataStru[index].CollMode)
						|| (RELAY_COLL_MODE_AFORE_BBCAK == RelayConfigDataStru[index].CollMode)
						|| (RELAY_COLL_MODE_ABACK_BFORE == RelayConfigDataStru[index].CollMode))
					{
						/*添加A系前采集板地址*/
						isAdded = 0u;
						for (jj = 0u; jj < CiCollBoardCurSum; jj++)
						{
							if (jj < BOARD_SUM_MAX)
							{
								if ((CiCollBoardDataStru[jj].OcId == RelayConfigDataStru[index].BelongOcId) && (RelayConfigDataStru[index].ForeNodeCollAddrA == CiCollBoardDataStru[jj].BoardAddress))
								{/*地址已经添加*/
									if (0u != RelayConfigDataStru[index].BelongOcId)
									{
										CiCollBoardDataStru[jj].OcId = (UINT8)RelayConfigDataStru[index].BelongOcId;
									}
									else
									{
									}

									if (0U != RelayConfigDataStru[index].ForeNodeCollPosA)
									{
										CiCollBoardDataStru[jj].RelayIdBuf[RelayConfigDataStru[index].ForeNodeCollPosA - 1u]
											= RelayConfigDataStru[index].RelayId;
										isAdded = 1u;/*设置已添加标志*/


									/*********************新加的：修复processiotoci耗时，前采A*****************/
										if (BOARD_MAX_ADDR > RelayConfigDataStru[index].ForeNodeCollAddrA)
										{
											if (RelayConfigDataStru[index].ForeNodeCollPosA < (BOARD_POS_MAX + 1u))
											{
												BoardConfigForeNodeA[RelayConfigDataStru[index].BelongOcId][RelayConfigDataStru[index].ForeNodeCollAddrA].Pos[RelayConfigDataStru[index].ForeNodeCollPosA] = 1u;
											}
											else
											{
											}
										}
										else
										{
										}
									}
									else
									{
									}
									break;
								}
								else
								{
								}
							}
							else
							{
								isAdded = 1u;/*超出宏值，置1，不添加*/
							}
						}
						if (0u == isAdded)
						{/*地址未添加*/
							if (0u != RelayConfigDataStru[index].BelongOcId)
							{
								CiCollBoardDataStru[CiCollBoardCurSum].OcId = (UINT8)RelayConfigDataStru[index].BelongOcId;
							}
							if (0U != RelayConfigDataStru[index].ForeNodeCollPosA)
							{
								CiCollBoardDataStru[CiCollBoardCurSum].BoardAddress = RelayConfigDataStru[index].ForeNodeCollAddrA;
								CiCollBoardDataStru[CiCollBoardCurSum].RelayIdBuf[RelayConfigDataStru[index].ForeNodeCollPosA - 1u]
									= RelayConfigDataStru[index].RelayId;
								CiCollBoardCurSum++;

								/*********************新加的：修复processiotoci耗时，前采A*****************/
								if (BOARD_MAX_ADDR > RelayConfigDataStru[index].ForeNodeCollAddrA)
								{
									if (RelayConfigDataStru[index].ForeNodeCollPosA < (BOARD_POS_MAX + 1u))
									{
										BoardConfigForeNodeA[RelayConfigDataStru[index].BelongOcId][RelayConfigDataStru[index].ForeNodeCollAddrA].Pos[RelayConfigDataStru[index].ForeNodeCollPosA] = 1u;
									}
									else
									{
									}
								}
								else
								{
								}
							}
							else
							{
							}
						}
						else
						{
						}



						/*添加B系前采集板地址*/
						isAdded = 0u;
						for (jj = 0u; jj < CiCollBoardCurSum; jj++)
						{
							if (BOARD_SUM_MAX > jj)
							{
								if ((CiCollBoardDataStru[jj].OcId == RelayConfigDataStru[index].BelongOcId) && (RelayConfigDataStru[index].ForeNodeCollAddrB == CiCollBoardDataStru[jj].BoardAddress))
								{/*地址已经添加*/
									if (0u != RelayConfigDataStru[index].BelongOcId)
									{
										CiCollBoardDataStru[jj].OcId = (UINT8)RelayConfigDataStru[index].BelongOcId;
									}
									else
									{
									}

									if (0U != RelayConfigDataStru[index].ForeNodeCollPosB)
									{
										CiCollBoardDataStru[jj].RelayIdBuf[RelayConfigDataStru[index].ForeNodeCollPosB - 1u]
											= RelayConfigDataStru[index].RelayId;
										isAdded = 1u;/*设置已添加标志*/

									/*********************新加的：修复processiotoci耗时，前采B*****************/
										if (BOARD_MAX_ADDR > RelayConfigDataStru[index].ForeNodeCollAddrB)
										{
											if (RelayConfigDataStru[index].ForeNodeCollPosB < (BOARD_POS_MAX + 1u))
											{
												BoardConfigForeNodeB[RelayConfigDataStru[index].BelongOcId][RelayConfigDataStru[index].ForeNodeCollAddrB].Pos[RelayConfigDataStru[index].ForeNodeCollPosB] = 1u;
											}
											else
											{
											}
										}
										else
										{
										}
									}
									else
									{
									}
									break;
								}
								else
								{
								}
							}
							else
							{
								isAdded = 1u;/*超出宏值，置1，不添加*/
							}
						}
						if (0u == isAdded)
						{/*地址未添加*/
							if (0u != RelayConfigDataStru[index].BelongOcId)
							{
								CiCollBoardDataStru[CiCollBoardCurSum].OcId = (UINT8)RelayConfigDataStru[index].BelongOcId;
							}
							if (0U != RelayConfigDataStru[index].ForeNodeCollPosB)
							{
								CiCollBoardDataStru[CiCollBoardCurSum].BoardAddress = RelayConfigDataStru[index].ForeNodeCollAddrB;
								CiCollBoardDataStru[CiCollBoardCurSum].RelayIdBuf[RelayConfigDataStru[index].ForeNodeCollPosB - 1u]
									= RelayConfigDataStru[index].RelayId;
								CiCollBoardCurSum++;

								/*********************新加的：修复processiotoci耗时，前采B*****************/
								if (RelayConfigDataStru[index].ForeNodeCollAddrB < BOARD_MAX_ADDR)
								{
									if (RelayConfigDataStru[index].ForeNodeCollPosB < (BOARD_POS_MAX + 1u))
									{
										BoardConfigForeNodeB[RelayConfigDataStru[index].BelongOcId][RelayConfigDataStru[index].ForeNodeCollAddrB].Pos[RelayConfigDataStru[index].ForeNodeCollPosB] = 1u;
									}
									else
									{
									}
								}
								else
								{
								}
							}
							else
							{
							}
						}
						else
						{
						}



					}
					else
					{
						;
					}

					/*后采集模式或双采集模式*/
					if ((RELAY_COLL_MODE_BACK == RelayConfigDataStru[index].CollMode)
						|| (RELAY_COLL_MODE_DOUBLE == RelayConfigDataStru[index].CollMode)
						|| (RELAY_COLL_MODE_AFORE_BBCAK == RelayConfigDataStru[index].CollMode)
						|| (RELAY_COLL_MODE_ABACK_BFORE == RelayConfigDataStru[index].CollMode))
					{
						/*添加A系后采集板地址*/
						isAdded = 0u;

						for (jj = 0u; jj < CiCollBoardCurSum; jj++)
						{
							if (BOARD_SUM_MAX > jj)
							{
								if ((CiCollBoardDataStru[jj].OcId == RelayConfigDataStru[index].BelongOcId) && (RelayConfigDataStru[index].BackNodeCollAddrA == CiCollBoardDataStru[jj].BoardAddress))
								{/*地址已经添加*/
									if (0u != RelayConfigDataStru[index].BelongOcId)
									{
										CiCollBoardDataStru[jj].OcId = (UINT8)RelayConfigDataStru[index].BelongOcId;
									}
									else
									{
									}

									if (0U != RelayConfigDataStru[index].BackNodeCollPosA)
									{
										CiCollBoardDataStru[jj].RelayIdBuf[RelayConfigDataStru[index].BackNodeCollPosA - 1u]
											= RelayConfigDataStru[index].RelayId;
										isAdded = 1u;/*设置已添加标志*/

										/*********************新加的：修复processiotoci耗时，后采A*****************/
										if (BOARD_MAX_ADDR > RelayConfigDataStru[index].BackNodeCollAddrA)
										{
											if (RelayConfigDataStru[index].BackNodeCollPosA < (BOARD_POS_MAX + 1u))
											{
												BoardConfigBackNodeA[RelayConfigDataStru[index].BelongOcId][RelayConfigDataStru[index].BackNodeCollAddrA].Pos[RelayConfigDataStru[index].BackNodeCollPosA] = 1u;
											}
											else
											{
											}
										}
										else
										{
										}
									}
									break;
								}
								else
								{
								}
							}
							else
							{
								isAdded = 1u;
							}
						}
						if (0u == isAdded)
						{/*地址未添加*/
							if (0u != RelayConfigDataStru[index].BelongOcId)
							{
								CiCollBoardDataStru[CiCollBoardCurSum].OcId = (UINT8)RelayConfigDataStru[index].BelongOcId;
							}
							else
							{
							}
							if (0U != RelayConfigDataStru[index].BackNodeCollPosA)
							{
								CiCollBoardDataStru[CiCollBoardCurSum].BoardAddress = RelayConfigDataStru[index].BackNodeCollAddrA;
								CiCollBoardDataStru[CiCollBoardCurSum].RelayIdBuf[RelayConfigDataStru[index].BackNodeCollPosA - 1u]
									= RelayConfigDataStru[index].RelayId;
								CiCollBoardCurSum++;

								/*********************新加的：修复processiotoci耗时，后采A*****************/
								if (BOARD_MAX_ADDR > RelayConfigDataStru[index].BackNodeCollAddrA)
								{
									if ((BOARD_POS_MAX + 1u) > RelayConfigDataStru[index].BackNodeCollPosA)
									{
										BoardConfigBackNodeA[RelayConfigDataStru[index].BelongOcId][RelayConfigDataStru[index].BackNodeCollAddrA].Pos[RelayConfigDataStru[index].BackNodeCollPosA] = 1u;
									}
									else
									{
									}
								}
								else
								{
								}
							}
							else
							{
							}
						}
						else
						{
						}



						/*添加B系后采集板地址*/
						isAdded = 0u;
						for (jj = 0u; jj < CiCollBoardCurSum; jj++)
						{
							if (jj < BOARD_SUM_MAX)
							{
								if ((CiCollBoardDataStru[jj].OcId == RelayConfigDataStru[index].BelongOcId) && (RelayConfigDataStru[index].BackNodeCollAddrB == CiCollBoardDataStru[jj].BoardAddress))
								{/*地址已经添加*/
									if (0u != RelayConfigDataStru[index].BelongOcId)
									{
										CiCollBoardDataStru[jj].OcId = (UINT8)RelayConfigDataStru[index].BelongOcId;
									}
									else
									{
									}

									if (0U != RelayConfigDataStru[index].BackNodeCollPosB)
									{
										CiCollBoardDataStru[jj].RelayIdBuf[RelayConfigDataStru[index].BackNodeCollPosB - 1u]
											= RelayConfigDataStru[index].RelayId;
										isAdded = 1u;/*设置已添加标志*/

										/*********************新加的：修复processiotoci耗时，后采B*****************/
										if (BOARD_MAX_ADDR > RelayConfigDataStru[index].BackNodeCollAddrB)
										{
											if (RelayConfigDataStru[index].BackNodeCollPosB < (BOARD_POS_MAX + 1u))
											{
												BoardConfigBackNodeB[RelayConfigDataStru[index].BelongOcId][RelayConfigDataStru[index].BackNodeCollAddrB].Pos[RelayConfigDataStru[index].BackNodeCollPosB] = 1u;
											}
											else
											{
											}
										}
										else
										{
										}
									}
									else
									{
									}
									break;
								}
								else
								{
								}
							}
							else
							{
								isAdded = 1u;
							}
						}
						if (0u == isAdded)
						{/*地址未添加*/
							if (0u != RelayConfigDataStru[index].BelongOcId)
							{
								CiCollBoardDataStru[CiCollBoardCurSum].OcId = (UINT8)RelayConfigDataStru[index].BelongOcId;
							}
							else
							{
							}
							if (0U != RelayConfigDataStru[index].BackNodeCollPosB)
							{
								CiCollBoardDataStru[CiCollBoardCurSum].BoardAddress = RelayConfigDataStru[index].BackNodeCollAddrB;
								CiCollBoardDataStru[CiCollBoardCurSum].RelayIdBuf[RelayConfigDataStru[index].BackNodeCollPosB - 1u]
									= RelayConfigDataStru[index].RelayId;
								CiCollBoardCurSum++;

								/*********************新加的：修复processiotoci耗时，后采B*****************/
								if (BOARD_MAX_ADDR > RelayConfigDataStru[index].BackNodeCollAddrB)
								{
									if (RelayConfigDataStru[index].BackNodeCollPosB < (BOARD_POS_MAX + 1u))
									{
										BoardConfigBackNodeB[RelayConfigDataStru[index].BelongOcId][RelayConfigDataStru[index].BackNodeCollAddrB].Pos[RelayConfigDataStru[index].BackNodeCollPosB] = 1u;
									}
									else
									{
									}
								}
								else
								{
								}
							}
							else
							{
							}
						}
						else
						{
						}


					}
					else
					{
						;
					}

					/*驱动地址存在*/
					if ((0u != RelayConfigDataStru[index].DrvAddrA)
						&& (0u != RelayConfigDataStru[index].DrvAddrB))
					{
						/*添加A系驱动板地址*/
						isAdded = 0u;
						for (jj = 0u; jj < CiDrvBoardCurSum; jj++)
						{
							if (BOARD_SUM_MAX > jj)
							{
								if ((CiDrvBoardDataStru[jj].OcId == RelayConfigDataStru[index].BelongDrvOcId) && (RelayConfigDataStru[index].DrvAddrA == CiDrvBoardDataStru[jj].BoardAddress))
								{/*地址已经添加*/
									if (0u != RelayConfigDataStru[index].BelongDrvOcId)
									{
										CiDrvBoardDataStru[jj].OcId = (UINT8)RelayConfigDataStru[index].BelongDrvOcId;
									}
									else
									{
									}

									CiDrvBoardDataStru[jj].RelayIdBuf[RelayConfigDataStru[index].DrvPosA - 1u]
										= RelayConfigDataStru[index].RelayId;
									isAdded = 1u;/*设置已添加标志*/
									break;
								}
								else
								{
								}
							}
							else
							{
								isAdded = 1u;
							}
						}
						if (0u == isAdded)
						{/*地址未添加*/
							if (0u != RelayConfigDataStru[index].BelongDrvOcId)
							{
								CiDrvBoardDataStru[CiDrvBoardCurSum].OcId = (UINT8)RelayConfigDataStru[index].BelongDrvOcId;
							}
							else
							{
							}

							CiDrvBoardDataStru[CiDrvBoardCurSum].BoardAddress = RelayConfigDataStru[index].DrvAddrA;
							CiDrvBoardDataStru[CiDrvBoardCurSum].RelayIdBuf[RelayConfigDataStru[index].DrvPosA - 1u]
								= RelayConfigDataStru[index].RelayId;
							CiDrvBoardCurSum++;
						}
						else
						{
						}

						/*添加B系驱动板地址*/
						isAdded = 0u;
						for (jj = 0u; jj < CiDrvBoardCurSum; jj++)
						{
							if (BOARD_SUM_MAX > jj)
							{
								if ((CiDrvBoardDataStru[jj].OcId == RelayConfigDataStru[index].BelongDrvOcId) && (RelayConfigDataStru[index].DrvAddrB == CiDrvBoardDataStru[jj].BoardAddress))
								{/*地址已经添加*/
									if (0u != RelayConfigDataStru[index].BelongDrvOcId)
									{
										CiDrvBoardDataStru[jj].OcId = (UINT8)RelayConfigDataStru[index].BelongDrvOcId;
									}
									else
									{
									}

									CiDrvBoardDataStru[jj].RelayIdBuf[RelayConfigDataStru[index].DrvPosB - 1u]
										= RelayConfigDataStru[index].RelayId;
									isAdded = 1u;/*设置已添加标志*/
									break;
								}
								else
								{
								}
							}
							else
							{
								isAdded = 1u;
							}
						}
						if (0u == isAdded)
						{/*地址未添加*/
							if (0u != RelayConfigDataStru[index].BelongDrvOcId)
							{
								CiDrvBoardDataStru[CiDrvBoardCurSum].OcId = (UINT8)RelayConfigDataStru[index].BelongDrvOcId;
							}
							else
							{
							}

							CiDrvBoardDataStru[CiDrvBoardCurSum].BoardAddress = RelayConfigDataStru[index].DrvAddrB;
							CiDrvBoardDataStru[CiDrvBoardCurSum].RelayIdBuf[RelayConfigDataStru[index].DrvPosB - 1u]
								= RelayConfigDataStru[index].RelayId;
							CiDrvBoardCurSum++;
						}
						else
						{
						}
					}
					else
					{
						;
					}
				}
				else
				{
					;
				}
			}
			else
			{
				;
			}
		}
	}
	return reVal;
}

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

	bufIndex = GetRelayConfigBufIndex(relayId);  /*获取继电器数组下标*/

	if (bufIndex < RELAY_SUM_MAX)
	{
		retVal = RelayConfigDataStru[bufIndex].VirtualAttribute;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

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

	totalRelayNum = GetRelayCurSum();

	if ((totalRelayNum + relayNum) >= RELAY_SUM_MAX)
	{/*入口防护*/
		retVal = 0u;
	}
	else
	{
		index = totalRelayNum;
		totalRelayNum += relayNum;
		for(ii = 0u;ii< relayNum;ii++)
		{
			LocalCiRelayIdBuf[index+ii] = relayIdBuff[ii];/*追加到LocalCiRelayIdBuf*/
		}
	}

	return retVal;
}

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

/**************************************分界线---故障锁闭照查****************/

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

	bufIndex = GetRelayConfigBufIndex(relayId);  /*获取继电器数组下标*/

	if (RELAY_SUM_MAX > bufIndex)
	{
		retVal = RelayConfigDataStru[bufIndex].LockExceptPhySecNum;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


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

	bufIndex = GetRelayConfigBufIndex(relayId);  /*获取继电器数组下标*/

	if (RELAY_SUM_MAX > bufIndex)
	{
		pRetVal = RelayConfigDataStru[bufIndex].LockExceptPhySecIdBuf;
	}
	else
	{
	}
	
	return pRetVal;
}

/*
* 功能描述： 获取指定ID继电器所属虚拟联锁ID
* 参数说明： const UINT16 relayId, 继电器ID    
* 返回值  ： 0: 获取数据失败
*			>0: 所属虚拟联锁ID      
*/
UINT8 GetRelayBelongVirCiId(const UINT16 relayId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 retVal = 0u;

	bufIndex = GetRelayConfigBufIndex(relayId);  /*获取继电器数组下标*/

	if (bufIndex < RELAY_SUM_MAX)
	{
		retVal = RelayConfigDataStru[bufIndex].BelongVirCIid;
	}
	else
	{
		retVal = 0u;
	}
	return retVal;
}
/*********************************分界线---故障锁闭照查--------------------END****/
/*
* 功能描述： 获取照查继电器检查结构体数据
* 参数说明： void    
* 返回值  ： 照查继电器检查结构体数组指针      
*/
ZhaochaCheckConfigDataStruct* GetZhaochaCheckConfigDataStru(void)
{
	return(ZhaochaCheckConfigDataStru);
}

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


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

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

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

	bufIndex = GetRelayConfigBufIndex(relayId);  /*获取继电器数组下标*/

	if (bufIndex < RELAY_SUM_MAX)
	{
		retVal = RelayConfigDataStru[bufIndex].BelongOcId;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

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

	bufIndex = GetRelayConfigBufIndex(relayId);  /*获取继电器数组下标*/

	if ((bufIndex < RELAY_SUM_MAX) && ((RELAY_DO_BOARD == cBoardType) || (RELAY_DO_RELAY_BOARD == cBoardType) || (RELAY_SO_BOARD == cBoardType) 
		|| (RELAY_THIRTY_SIX_DI_BOARD == cBoardType) || (RELAY_THIRTY_TWO_DI_BOARD == cBoardType) || (RELAY_SI_BOARD == cBoardType)))
	{
		RelayConfigDataStru[bufIndex].BoardType = cBoardType;
	}
	else
	{
		/*不处理*/
	}
}

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

	bufIndex = GetRelayConfigBufIndex(relayId);  /*获取继电器数组下标*/

	if (bufIndex < RELAY_SUM_MAX)
	{
		retVal = RelayConfigDataStru[bufIndex].BoardType;
	}
	else
	{
		retVal = CI_ERROR;
	}

	return retVal;
}