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

#include "../Section/PhysicalSectionDataManage.h"
#include "SignalConfigDataManage.h"
#include "ELMDataPrepare.h"


SignalConfigDataStruct SignalConfigDataStru[SIGNAL_SUM_MAX];   /*定义信号机数据配置结构体,cgh-合并CID-2539-1：此处声明不进行初始化，统一放到InitAllStaticDataStr函数中进行初始化，为解决生成内核过大得问题*/
UINT16 LocalCiSignalIdBuf[SIGNAL_SUM_MAX] = {0u};                   /*定义本地联锁信号机ID映射数组*/
INT16 SignalCurSum = 0;   /*属于本联锁信号机当前总数*/
UINT16 totalSignalNum = 0u;/*本联锁和相邻联锁发送给本联锁信号机总数*/


UINT16 SignalTypeNum = 0u;	/*配置的信号机类型数量*/
/*定义信号机类型后备开放颜色配置结构体*/
SignalDrvTypeOpenColorConfig SignalTypeOpenColorConfigStru[SIGNAL_MAX_DRVCOLL_TYPE_NUM];

/*
* 功能描述： 获取指定ID信号机索引号
* 参数说明： const UINT16 signalId, 信号机D
* 返回值  ： SIGNAL_SUM_MAX: 获取数据失败
*			<SIGNAL_SUM_MAX: 查找成功
*/
UINT16 GetSignalConfigBufIndex(const UINT16 signalId)
{
	UINT16 retVal = SIGNAL_SUM_MAX;
	if ((1U <= signalId) && (SIGNAL_SUM_MAX > signalId))
	{
        retVal = signalId;
	}
	
	return retVal;
}


/*
* 功能描述： 获取信号机当前总数
* 参数说明： void    
* 返回值  ： 0: 获取数据失败
*			>0: 信号机当前总数
*/
UINT16 GetSignalCurSum(void)
{
	UINT16 retVal  = 0u;
    if ((INT16)SIGNAL_SUM_MAX <=SignalCurSum)
    {
        retVal = SIGNAL_SUM_MAX;
    }
	else if (0 > SignalCurSum)
	{
		retVal = 0;
	}
    else
    {
        retVal = (UINT16)SignalCurSum;
    }
	return retVal;
}

/*
* 功能描述：  获取指定ID信号机数据
* 参数说明：  
* 返回值  ： 
             SignalConfigDataStruct *   
*/
SignalConfigDataStruct *GetSignalConfigData(void)
{
    return SignalConfigDataStru;
}
	

/*
* 功能描述： 获取指定数组下标对应的信号机ID
* 参数说明： const UINT16 bufIndex, 数组下标    
* 返回值  ： 0: 获取数据失败
*			>0: 信号机ID      
*/
UINT16 GetSignalId(const UINT16 bufIndex)
{
	UINT16 retVal = CI_ERROR;
	UINT16 totalSignalCurNum = 0u;
	totalSignalCurNum = GetTotalSignalCurNum(); 
	if (bufIndex < totalSignalCurNum)
	{
		retVal = LocalCiSignalIdBuf[bufIndex];
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID信号机所属联锁ID
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ： 0: 获取数据失败
*			>0: 所属联锁ID      
*/
UINT8 GetSignalBelongCiId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT8 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

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


/*
* 功能描述： 获取指定ID信号机的方向
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ： 0: 获取数据失败
*			>0: 信号机的方向 
*/
UINT8 GetSignalDirection(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT8 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取信号机数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].Direction;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID信号机的运营方向
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ： 0: 获取数据失败
*			>0: 信号机运营方向 
*/
UINT8 GetSignalOperDirection(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT8 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取信号机数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].OperDirection;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID信号机类型
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ： 0: 获取数据失败
*			>0: 信号机类型 
*/
UINT8 GetSignalType(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 retVal = CI_ERROR;

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].SignalType;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID信号机1灯丝继电器ID
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ：  0: 获取数据失败
*			 >0: 1灯丝继电器ID      
*/
UINT16 GetSignalFirstDsRelayId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 retVal = CI_ERROR;

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].FirDsRelayId;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID信号机2灯丝继电器ID
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ：  0: 获取数据失败
*			 >0: 2灯丝继电器ID      
*/
UINT16 GetSignalSecondDsRelayId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 retVal = CI_ERROR;

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].SecDsRelayId;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID信号机列车信号继电器ID
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ：  0: 获取数据失败
*			 >0: 列车信号继电器ID      
*/
UINT16 GetSignalLxRelayId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT16 retVal = CI_ERROR; 
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].LxRelayId;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID信号机正线信号继电器ID
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ：  0: 获取数据失败
*			 >0: 正线信号继电器ID      
*/
UINT16 GetSignalZxRelayId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT16 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].ZxRelayId;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID信号机引导信号继电器ID
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ：  0: 获取数据失败
*			 >0: 引导信号继电器ID      
*/
UINT16 GetSignalYxRelayId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 retVal = CI_ERROR;

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].YxRelayId;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID信号机点灯继电器ID
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ：  0: 获取数据失败
*			 >0: 点灯继电器ID      
*/
UINT16 GetSignalDdRelayId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 retVal = CI_ERROR;

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].DdRelayId;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID信号机调车继电器ID
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ：  0: 获取数据失败
*			 >0: 调车继电器ID      
*/
UINT16 GetSignalDxRelayId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 retVal = CI_ERROR;

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].DxRelayId;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID信号机黄灯继电器ID
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ：  0: 获取数据失败
*			 >0: 调车继电器ID      
*/
UINT16 GetSignalYellowRelayId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 retVal = CI_ERROR;

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].YellowRelayId_wh;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID信号机绿灯继电器ID
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ：  0: 获取数据失败
*			 >0: 调车继电器ID      
*/
UINT16 GetSignalGreenRelayId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 retVal = CI_ERROR;

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].GreenRelayId_wh;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID信号机蓝灯继电器ID
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ：  0: 获取数据失败
*			 >0: 调车继电器ID      
*/
UINT16 GetSignalBlueRelayId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 retVal = CI_ERROR;

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].BlueDsRelayId_wh;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

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

    /*保存信号机ID索引数组*/
    signalConfigDataSum = GetSignalCurSum();
	totalSignalNum = signalConfigDataSum;
    if (signalConfigDataSum >= SIGNAL_SUM_MAX)
    {/*配置数据总数错误*/
        
        retVal = CI_ERROR;
	}
	else
	{
		for (ii = 0u; ii < SIGNAL_SUM_MAX; ii++)
		{
			if (jj == signalConfigDataSum)
			{/*遍历有效数据完毕*/

				break;
			}

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


		}
	}


    return retVal;
}

/*
* 功能描述： 获取指定ID信号机的内方第一物理区段ID
* 参数说明： const UINT16 signalId, 信号机ID
*            const UINT16 routeId, 进路ID
* 返回值  ： 0: 获取数据失败
*			>0: 内方第一物理区段ID
*/
UINT16 GetSignalInFirstPhySecId(const UINT16 signalId,const UINT16 routeId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 retVal = CI_ERROR;

	UINT8 railwayType = CI_TRADITION_RAILWAY;

	UINT16 routePhySecInx = 0u;

	railwayType = GetCiFunctionSwitchConfig(LINE_RAILWAY_TYPE_CONF);/**/

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		if(CI_TRADITION_RAILWAY == railwayType)
		{/*传统城轨线路*/
			retVal = SignalConfigDataStru[bufIndex].InFirstPhySecId;
		}/* zt 删除单轨相关代码 2022-02-15 */
		else
		{

		}
	}
	else
	{
		retVal = CI_ERROR;
	}

	return retVal;
}

/*
* 功能描述： 获取指定ID信号机的内方锁闭的第一物理区段ID
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ： 0: 获取数据失败
*			>0: 内方锁闭的第一物理区段ID
*/
UINT16 GetSignalInFirstLockedPhySecId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 retVal = CI_ERROR;
	UINT16 routePhySecInx = 0u;
	UINT16 routeId = 0u;
	UINT16 phySecId = 0u;
	UINT16 lockRouteId;

	UINT8 railwayType = CI_TRADITION_RAILWAY;

	railwayType = GetCiFunctionSwitchConfig(LINE_RAILWAY_TYPE_CONF);/**/

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		if(CI_TRADITION_RAILWAY == railwayType)
		{/*传统城轨线路*/
			phySecId = SignalConfigDataStru[bufIndex].InFirstPhySecId;/*先获取信号机内方第一区段*/
			lockRouteId = GetPhySecRLockBelongRouteId(phySecId);/*物理区段锁闭所属进路ID*/
			
			if(CI_ERROR != lockRouteId)
			{
				retVal = SignalConfigDataStru[bufIndex].InFirstPhySecId;
			}
		}/* zt 删除单轨相关代码 2022-02-15 */
		else
		{
			/*线路类型有误 不处理*/
		}
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID信号机的外方第一物理区段ID
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ： 0: 获取数据失败
*			>0: 外方第一物理区段ID
*/
UINT16 GetSignalOutFirstPhySecId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 retVal = CI_ERROR;

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].OutFirstPhySecId;
        if (0xffffU == retVal)   /*数据配置中，信号机外方第一区段有0xffff的非法情况*/
        {
            retVal = 0u;
        }
	}
	else
	{
		retVal = CI_ERROR;
	}
    
	return retVal;
}


/*
* 功能描述： 获取指定ID信号机关联的逻辑区段数目
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ： 0: 获取数据失败
*			>0: 关联物理区段的数目
*/
UINT16 GetSignalRelatedLogSecSum(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;                           /*数组下标*/
	UINT16 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].relatedLogSecSum;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID信号机关联的逻辑区段ID数组
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ： NULL: 获取数据失败
*			!NULL: 关联物理区段的数组首地址
*/
UINT16 *GetSignalRelatedLogSecIdBuf(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;                           /*数组下标*/
	UINT16 *retVal = NULL;

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].ralatedLogSecIdBuf;
	}
	else
	{
		retVal = NULL;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID信号机是否已对外驱动
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ： SIGNAL_DRV_ENABLE: 即采集又驱动
*			SIGNAL_DRV_DISABLE: 即采集不驱动
*/
UINT8 GetSignalDrvEnable(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 retVal = SIGNAL_DRV_DISABLE;

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].driveEnable;
	}

	return retVal;
}

/*
* 功能描述： 获取指定ID信号机封灯类型
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ：
*			SIGNAL_TYPE_FENG_YELLOW     0x55           封黄灯
*           SIGNAL_TYPE_FENG_GREEN      0xaa           封绿灯 
*           SIGNAL_TYPE_FENG_NO         0xff           不封灯
*/
UINT8 GetSignalFengDengType(const UINT16 signalId)
{
    UINT16 bufIndex = 0u;  /*数组下标*/
    UINT8 retVal = CI_ERROR;

    bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

    if (bufIndex < SIGNAL_SUM_MAX)
    {
        retVal = SignalConfigDataStru[bufIndex].SignalFengDengType;
    }

    return retVal;
}
/*
* 功能描述： 获取始端信号机相同的进路数目
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ： 0: 获取数据失败
*			>0: 始端信号机相同的进路数目
*/
UINT16 GetStartSignalRouteSum(const UINT16 signalId)
{
    UINT16 bufIndex = 0u;  /*数组下标*/
    UINT16 retVal = CI_ERROR;

    bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

    if (bufIndex < SIGNAL_SUM_MAX)
    {
        retVal = SignalConfigDataStru[bufIndex].startSigRouSum;
    }

    return retVal;
}
/*
* 功能描述： 获取始端信号机相同的进路ID数组
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ： 0: 获取数据失败
*			>0: 始端信号机相同的进路ID数组
*/
UINT16* GetStartSignalRouteBuf(const UINT16 signalId)
{
    UINT16 bufIndex = 0u;  /*数组下标*/
    UINT16* retVal = NULL;

    bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

    if (bufIndex < SIGNAL_SUM_MAX)
    {
        retVal = SignalConfigDataStru[bufIndex].startSigRouBuf;
    }

    return retVal;
}
/*
* 功能描述：	整理读入的相邻联锁信号机配置数据
* 参数说明：	signalSum 信号机数量
*				signalIdBuff 相邻联锁发送给本联锁的信号机ID配置数据
* 返回值  ：	1,整理成功
*				0,整理失败
*/
UINT8 AddExtendSignalIdDataManage(UINT16 sigSum,const UINT16 *signalIdBuff)
{
	UINT16  index = 0u;  /*数组下标*/
	UINT16  ii = 0u;
	UINT8 retVal = 1u;
	
	if ((totalSignalNum + sigSum) >= SIGNAL_SUM_MAX)
	{/*入口防护*/
		retVal = 0u;
	}
	else
	{
		index = totalSignalNum;
		totalSignalNum += sigSum;
		for(ii = 0u;ii< sigSum;ii++)
		{
			LocalCiSignalIdBuf[index+ii] = signalIdBuff[ii];/*追加到LocalCiSignalIdBuf*/
		}
	}
	
	return retVal;
}

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

/*
* 功能描述： 获取指定ID信号机是否为虚拟信号机
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ： 0: 获取数据失败
*			>0: 信号机类型 
*/
UINT8 GetSignalVirtualAttr(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 retVal = CI_ERROR;

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取信号机数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].signalVirtualAttr;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取以给定信号机为出站信号机的PSD的ID数组
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值  ： 0: 获取数据失败
*			>0: 以给定信号机为出站信号机的PSD的ID数组
*/
UINT16* GetSignalRelatedPsdBuf(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16* retVal = NULL;

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].signalPsdIdBuf;
	}

	return retVal;
}
/*
* 功能描述： 获取以给定信号机为出站信号机的PSD的ID数量
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值  ： 0: 获取数据失败
*			>0: 以给定信号机为出站信号机的PSD的ID数量
*/
UINT8 GetSignalRelatedPsdSum(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 retVal = CI_ERROR;

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].signalPsdSum;
	}

	return retVal;
}

/*
* 功能描述： 获取信号机防护的保护区段数量
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值  ：
信号机防护的保护区段数量
*/
UINT8 GetSignalProSecIdSum(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 retVal = 0u;

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].signalProSecSum;
	}

	return retVal;
}
/*
* 功能描述： 获取信号机防护的保护区段ID数组
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值  ：
信号机防护的保护区段ID数组
*/
UINT16* GetSignalProSecIdBuf(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16* retVal = NULL;

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].signalProSecBuf;
	}

	return retVal;
}

/*
* 功能描述： 获取始端信号机相同的CI关心的进路数目
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ： 0: 获取数据失败
*			>0: 始端信号机相同的CI关心的进路数目
*/
UINT16 GetStartSignalCIRouteSum(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 retVal = CI_ERROR;

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取信号机数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].startSigCiRouteSum;
	}

	return retVal;
}

/*
* 功能描述： 获取指定ID信号机关联的计轴区段数目
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ： 0: 获取数据失败
*			>0: 关联计轴区段的数目
*/
UINT16 GetSignalRelatedAxisSecSum(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;                           /*数组下标*/
	UINT16 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取信号机数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].relatedAxisSecSum;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID信号机关联的计轴区段ID数组
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ： NULL: 获取数据失败
*			!NULL: 关联计轴区段的数组首地址
*/
UINT16 *GetSignalRelatedAxisSecIdBuf(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;                           /*数组下标*/
	UINT16 *retVal = NULL;

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取信号机数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].relatedAxisSecIdBuf;
	}
	else
	{
		retVal = NULL;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID信号机是否为调车跨压关灯信号机
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ： 0: 获取数据失败
*			>0: 信号机类型 
*/
UINT8 GetSignalCrossCloseAttr(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 retVal = CI_ERROR;

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取信号机数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].signalCrossCloseAttr;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID信号机扣车状态采集继电器ID
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ：  0: 获取数据失败
*			 >0: 扣车状态采集继电器ID      
*/
UINT16 GetSignalDetainRelayId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT16 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取信号机数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].detainRelayId;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}




/*
* 功能描述： 获取指定ID信号机是否配置了跨压码位
* 参数说明： const UINT16 sigalId, 信号机ID    
* 返回值  ：  0: 获取数据失败
*		 >0: 是否配置跨压码位     
*/
UINT8 GetSigConfZcCiSignalCrossMask(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT8 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取信号机数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].ConfigZcCiSignalCrossMask;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/**********************分界线 信号机驱采类型后备颜色数量和后备开放颜色值**********************************************/


/*
* 功能描述： 获取指定ID信号机驱采类型对应后备开放颜色
* 参数说明： UINT16 wSignalId, 信号机ID    
* 返回值  ：  0: 获取数据失败
*			  >0: 后备开放颜色颜色     
*/
UINT8 GetSignalBlockOpenColorValue(UINT16 wSignalId)
{
	UINT16 ii = 0u;  /*数组下标*/

	UINT8 chRtVal = 0U;

	for (ii = 0u; ii < SIGNAL_MAX_DRVCOLL_TYPE_NUM; ii++)
	{
		if (SignalTypeOpenColorConfigStru[ii].SignalId == wSignalId)
		{
			chRtVal = SignalTypeOpenColorConfigStru[ii].BlockOpenColorValue[0];
			break;
		}
	}

	return chRtVal;
}

/**********************分界线 信号机驱采类型后备颜色数量和后备开放颜色值****END**********************************************/



/**RepLxRelayId*********分界线 信号机复示列车信号继电器********************************************/
/*
* 功能描述： 获取指定ID信号机复示列车信号继电器ID
* 参数说明： const UINT16 sigalId, 信号机ID    
* 返回值  ：  0: 获取数据失败
*		 >0: 复视列车信号继电器     
*/
UINT16 GetSignalRepLxRelayId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT16 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取信号机数组下标*/

	if (SIGNAL_SUM_MAX > bufIndex)
	{
		retVal = SignalConfigDataStru[bufIndex].RepLxRelayId;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/**RepLxRelayId*********分界线 信号机复示列车信号继电器*********END***********************************/



/*
* 功能描述： 获取指定ID信号机扣车驱动继电器
* 参数说明： const UINT16 sigalId, 信号机ID    
* 返回值  ：  0: 获取数据失败
*		 >0: 扣车驱动继电器     
*/
UINT16 GetSignalDetainDriveRelayId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT16 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取信号机数组下标*/

	if (SIGNAL_SUM_MAX > bufIndex)
	{
		retVal = SignalConfigDataStru[bufIndex].DetainDriveRelayId;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID信号机扣车旁路继电器ID
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值  ：  0: 获取数据失败
*			 >0: 扣车状态采集继电器ID
*/
UINT16 GetSignalDetainCutRelayId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT16 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取信号机数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].detainCutRelayId;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID信号机所属Oc ID
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值  ： 0: 获取数据失败
*			>0: 所属Oc ID
*/
UINT16 GetSignalBelongOcId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT16 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

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


/*
* 功能描述： 设置指定ID信号机的内方第一物理区段ID
* 参数说明： const UINT16 signalId, 信号机ID
*            const UINT16 PhysicalSectionId, 区段ID
* 返回值  ： 无
*			 
*/
void SetSignalInFirstPhySecId(const UINT16 signalId, const UINT16 PhysicalSectionId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT16 routePhySecInx = 0u;

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		SignalConfigDataStru[bufIndex].InFirstPhySecId = PhysicalSectionId;
	}
	else
	{
		/*不做处理*/
	}
}


/*
* 功能描述： 获取信号机颜色级别
* 参数说明： const UINT16 signalColor, 信号机颜色
* 返回值  ： SIGNAL_LIGHT_EXTICT_STATE_YES: 灭灯
*			SIGNAL_LIGHT_EXTICT_STATE_NO: 点灯
*/
UINT8 GetSignalColorLevel(const UINT8 signalColor)
{
	UINT8 retLevel = 0u;
	if ((signalColor & 0x80u) == 0x80u)
	{
		retLevel = SIGNAL_LIGHT_EXTICT_STATE_NO;
	}
	else
	{
		retLevel = SIGNAL_LIGHT_EXTICT_STATE_YES;
	}
	return retLevel;
}

/*
* 功能描述： 获取指定ID信号机扣车状态指示灯继电器ID
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ：  0: 获取数据失败
*			 >0: 扣车状态指示灯继电器ID      
*/
UINT16 GetSignalDetainDisRelayId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT16 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取信号机数组下标*/

	if (SIGNAL_SUM_MAX > bufIndex)
	{
		retVal = SignalConfigDataStru[bufIndex].detainDisplayRelayId;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID信号机扣车旁路状态指示灯继电器ID
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ：  0: 获取数据失败
*			 >0: 扣车旁路状态指示灯继电器ID      
*/
UINT16 GetSignalDetainCutDisRelayId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT16 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取信号机数组下标*/

	if (SIGNAL_SUM_MAX > bufIndex)
	{
		retVal = SignalConfigDataStru[bufIndex].detainCutDisplayRelayId;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}
/*
* 功能描述： 获取指定ID信号机所属虚拟联锁ID
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ： 0: 获取数据失败
*			>0: 所属虚拟联锁ID      
*/
UINT8 GetSignalBelongVirCiId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT8 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].BelongVirCI;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID信号机是否为本线路
* 参数说明： const UINT16 signalId, 信号机ID    
* 返回值  ： 0: 获取数据失败
*			>0: 是否为本线路      
*/
UINT8 GetSignalIsThisLineState(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT8 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].SignalIsThisLine;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 设置指定ID信号机是否为复示信号机
* 参数说明： const UINT16 signalId, 信号机ID
*            const UINT8 signalIsFushiFlag 复示信号机标志
*/
void SetSignalIsfushiFlag(const UINT16 signalId, const UINT8 signalIsFushiFlag)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		SignalConfigDataStru[bufIndex].SignalIsFushiFlag = signalIsFushiFlag;
	}
	else
	{
	}
}
/*
* 功能描述： 获取指定ID信号机是否为复示信号机
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值  ： 0: 获取数据失败
*			>0: 是否为复示信号机
*/
UINT8 GetSignalIsfushiFlag(const UINT16 signalId)
{
	UINT16 bufIndex = 0;  /*数组下标*/

	UINT8 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].SignalIsFushiFlag;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 设置指定ID信号机的复示信号机数
* 参数说明： const UINT16 signalId, 信号机ID
*           const UINT8 fushiSigNum 复示信号机数量
*/
void SetSignalFushiSignalNum(const UINT16 signalId, const UINT8 fushiSigNum)
{
	UINT16 bufIndex = 0;  /*数组下标*/

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		SignalConfigDataStru[bufIndex].SignalFushiSignalNum = fushiSigNum;
	}
	else
	{

	}
}

/*
* 功能描述： 获取指定ID信号机的复示信号机数
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值： 复示信号机数

*/
UINT8 GetSignalFushiSignalNum(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 reval = 0u;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		reval = SignalConfigDataStru[bufIndex].SignalFushiSignalNum;
		if (SIGNAL_FUSHINUM_MAX < reval)
		{
			reval = 0u;
		}
	}
	else
	{
	}
	return reval;
}

/*
* 功能描述： 设置指定ID信号机的复示信号机ID数组
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值： 复示信号机ID数组

*/
UINT16* GetSignalFushiSignalIdBuf(const UINT16 signalId)
{
	UINT16 bufIndex = 0;  /*数组下标*/
	UINT16* pFushiSignalIdBuf = NULL;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		pFushiSignalIdBuf = SignalConfigDataStru[bufIndex].SignalFushiSignalIdBuf;
	}
	else
	{
	}
	return pFushiSignalIdBuf;
}

/*
* 功能描述： 获取指定ID信号机防护点所处Link
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值  ： 0: 获取数据失败
*			>0: LinkId
* 创    建：qw.liu 2022-03-04
*/
UINT16 GetSignalProtectLink(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT16 wRetVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		wRetVal = SignalConfigDataStru[bufIndex].wProtectLinkId;
	}
	else
	{
		wRetVal = CI_ERROR;
	}
	return wRetVal;
}

/*
* 功能描述： 获取指定ID信号机防护点所处OFF
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值  ： UINT32_MAX: 获取数据失败
*			 其他: Link OFF
* 创    建：qw.liu 2022-03-04
*/
UINT32 GetSignalProtectLinkOff(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT32 dwRetVal = UINT32_MAX;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		dwRetVal = SignalConfigDataStru[bufIndex].dwProtectOff;
	}
	else
	{
		dwRetVal = UINT32_MAX;
	}
	return dwRetVal;
}

/*
* 功能描述： 获取指定ID信号机亮灭功能标志
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值  ： UINT8_MAX: 获取数据失败
*			其他: Link OFF
* 创    建：qw.liu 2022-03-04
*/
UINT8 GetSignalShine(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT8 chRetVal = UINT8_MAX;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		chRetVal = SignalConfigDataStru[bufIndex].chShineSignal;
	}
	else
	{
		chRetVal = CI_ERROR;
	}
	return chRetVal;
}

/*
* 功能描述： 获取指定ID信号机外方第一link
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值  ： 0: 获取数据失败
*			>0: LinkId
* 创    建：2022-03-04
*/
UINT16 GetSignalOutFirstLink(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT16 wRetVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		wRetVal = SignalConfigDataStru[bufIndex].wOutFirstLinkId;
	}
	else
	{
		wRetVal = CI_ERROR;
	}
	return wRetVal;
}
  
/*
* 功能描述： 获取指定ID信号机扣车旁路继电器2 ID
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值  ：  0: 获取数据失败
*			 >0: 扣车状态采集继电器ID
*/
UINT16 GetSignalDetainCutRelayId_2(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT16 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取信号机数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].detainCutRelayId_2;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}
/*
* 功能描述： 获取指定ID信号机扣车状态采集继电器2 ID
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值  ：  0: 获取数据失败
*			 >0: 扣车状态采集继电器ID
*/
UINT16 GetSignalDetainRelayId_2(const UINT16 signalId)
{
	UINT16 bufIndex = 0;  /*数组下标*/

	UINT16 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取信号机数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].detainRelayId_2;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID信号机扣车旁路状态指示灯继电器2 ID
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值  ：  0: 获取数据失败
*			 >0: 扣车旁路状态指示灯继电器ID
*/
UINT16 GetSignalDetainCutDisRelayId_2(const UINT16 signalId)
{
	UINT16 bufIndex = 0;  /*数组下标*/

	UINT16 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取信号机数组下标*/

	if (SIGNAL_SUM_MAX > bufIndex)
	{
		retVal = SignalConfigDataStru[bufIndex].detainCutDisplayRelayId_2;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID信号机扣车状态指示灯继电器2 ID
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值  ：  0: 获取数据失败
*			 >0: 扣车状态指示灯继电器ID
*/
UINT16 GetSignalDetainDisRelayId_2(const UINT16 signalId)
{
	UINT16 bufIndex = 0;  /*数组下标*/

	UINT16 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取信号机数组下标*/

	if (SIGNAL_SUM_MAX > bufIndex)
	{
		retVal = SignalConfigDataStru[bufIndex].detainDisplayRelayId_2;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID信号机取消扣车按钮采集继电器1ID
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值  ：  0: 获取数据失败
*			 >0: 取消扣车按钮继电器1ID
*/
UINT16 GetSignalCancelDetainBtnRelayId(const UINT16 signalId)
{
	UINT16 bufIndex = 0;  /*数组下标*/

	UINT16 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取信号机数组下标*/

	if (SIGNAL_SUM_MAX > bufIndex)
	{
		retVal = SignalConfigDataStru[bufIndex].cancelDetainBtnCollRelayId;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID信号机取消扣车按钮采集继电器2ID
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值  ：  0: 获取数据失败
*			 >0: 取消扣车按钮继电器2ID
*/
UINT16 GetSigCancelDetainBtnRelayId_2(const UINT16 signalId)
{
	UINT16 bufIndex = 0;  /*数组下标*/

	UINT16 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取信号机数组下标*/

	if (SIGNAL_SUM_MAX > bufIndex)
	{
		retVal = SignalConfigDataStru[bufIndex].cancelDetainBtnCollRelayId_2;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取指定信号机关联的ESB数量
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值  ： 0: 获取数据失败
*			>0: 信号机关联的ESB数量
*/
UINT8 GetSignalRelatedEsbSum(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 retVal = CI_ERROR;

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].signalEsbSum;
	}
	else
	{
		/*入参非法，返回CI_ERROR*/
	}


	return retVal;
}

/*
* 功能描述： 获取指定信号机关联的ESB的ID数组
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值  ： NULL: 获取数据失败
*			 非NULL: 信号机关联的ESB的ID数组
*/
UINT16* GetSignalRelatedEsbBuf(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16* retVal = NULL;

	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].signalEsbIdBuf;
	}
	else
	{
		/*入参非法，返回NULL*/
	}

	return retVal;
}

/*
* 功能描述： 获取指定ID信号机列车信号驱动继电器ID（联络线使用）
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值  ：  0: 获取数据失败
*			 >0: 列车信号驱动继电器ID
*/
UINT16 GetSignalLxDrvRelayId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT16 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取信号机数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].LxDrvRelayId;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID信号机引导信号驱动继电器ID（联络线使用）
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值  ：  0: 获取数据失败
*			 >0: 引导信号驱动继电器ID
*/
UINT16 GetSignalYxDrvRelayId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT16 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取信号机数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].YxDrvRelayId;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID信号机调车信号驱动继电器ID（联络线使用）
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值  ：  0: 获取数据失败
*			 >0: 调车信号驱动继电器ID
*/
UINT16 GetSignalDxDrvRelayId(const UINT16 signalId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT16 retVal = CI_ERROR;
	bufIndex = GetSignalConfigBufIndex(signalId);  /*获取区段数组下标*/

	if (bufIndex < SIGNAL_SUM_MAX)
	{
		retVal = SignalConfigDataStru[bufIndex].DxDrvRelayId;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID信号机外方第一逻辑区段
* 参数说明： const UINT16 signalId, 信号机ID
* 返回值  ：  0: 获取数据失败
*			 >0: 逻辑区段ID
*/
UINT16 GetSignalOutFirstLogSec(const UINT16 signalId)
{
	UINT16 outPhySecId = 0U;/*外方第一物理区段ID*/
	UINT8 phySecIncLogSecSum = 0U;  /*物理区段包含的逻辑区段数量*/
	UINT16* phySecIncLogSecId = NULL;  /*物理区段包含的逻辑区段ID*/
	UINT8 i = 0U;
	UINT32 startLength = UINT16_MAX;
	UINT32 endLength = UINT16_MAX;
	UINT16 firstLogSecId = 0U;
	LOD_STRU signalPoint = { 0U };  /*信号机位置*/
	LOD_STRU logSecStartPoint = { 0U };  /*逻辑区段始端位置*/
	LOD_STRU logSecEndtPoint = { 0U };  /*逻辑区段始端位置*/
	UINT16 retVal = 0U;
	UINT8 logSecCount = 0U;
	UINT16 logSecIdbuff[PHYSICAL_INCLUDE_SWITCH_SUM_MAX] = { 0U };
	UINT8 posCheck = CI_ERROR;
	UINT16 devId = 0U;
	UINT8 devState = 0U;
	outPhySecId = GetSignalOutFirstPhySecId(signalId);

	if (0U != outPhySecId)
	{
		/*获取物理区段关联逻辑区段信息*/
		phySecIncLogSecSum = GetPhySecIncLogSecSum(outPhySecId);
		phySecIncLogSecId = GetPhySecIncLogSecIdBuf(outPhySecId);
		/*获取信号机位置信息*/
		signalPoint.Lnk = GetSignalProtectLink(signalId);
		signalPoint.Off = GetSignalProtectLinkOff(signalId);


		if ((0U != phySecIncLogSecSum) && (NULL != phySecIncLogSecId))
		{
			for (i = 0U; i < phySecIncLogSecSum; i++)
			{
				logSecEndtPoint.Lnk = GetLgcSecTmnlLink(phySecIncLogSecId[i]);
				logSecEndtPoint.Off = GetLgcSecTmnlOffset(phySecIncLogSecId[i]);


				logSecStartPoint.Lnk = GetLgcSecOrgnLink(phySecIncLogSecId[i]);
				logSecStartPoint.Off = GetLgcSecOrgnOffset(phySecIncLogSecId[i]);

				startLength = elm_PrepareDistanceBtwPoints(signalPoint, logSecStartPoint);
				endLength = elm_PrepareDistanceBtwPoints(signalPoint, logSecEndtPoint);
				/*查询所有与信号机所在link相连的逻辑区段*/
				if ((0U == startLength) || (0U == endLength))
				{
					logSecIdbuff[logSecCount] = phySecIncLogSecId[i];
					logSecCount++;
				}

			}
			/*判断逻辑区段的道岔位置是否符合*/
			for ( i = 0U; i < logSecCount; i++)
			{
				posCheck = LogicSecRelativeSwitchPosCheck(logSecIdbuff[i], &devId, &devState);
				if (CI_SUCCESS == posCheck)
				{
					retVal = logSecIdbuff[i];
					break;
				}

			}
		}
	}
	return retVal;
}