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

#include "LogicSectionConfigDataManage.h"
#include "LinkConfigDataManage.h"
#include "AxisSectionConfigDataManage.h"




LogicSectionConfigDataStruct LogicSectionConfigDataStru[LOGIC_SECTION_SUM_MAX];   /*定义逻辑区段配置数据结构体,cgh-合并CID-2539-1：此处声明不进行初始化，统一放到InitAllStaticDataStr函数中进行初始化，为解决生成内核过大得问题*/
UINT16 LocalCiLogicSectionIdBuf[LOGIC_SECTION_SUM_MAX] = {0u};                   /*定义本地联锁逻辑区段ID映射数组*/
INT16 LogicSectionCurSum = 0;   /*逻辑区段当前总数*/
UINT16 totalLogicSectionNum = 0u;/*本联锁和相邻联锁发送给本联锁逻辑区段总数*/




/*
* 功能描述： 获取逻辑区段当前总数
* 参数说明： void    
* 返回值  ： 0: 获取数据失败
*			>0: 逻辑区段当前总数
*/
UINT16 GetLogicSecCurSum(void)
{
	UINT16 retVal = 0u;
    if ((INT16)LOGIC_SECTION_SUM_MAX <= LogicSectionCurSum)
    {
        retVal = LOGIC_SECTION_SUM_MAX;
    }
	else if (0 > LogicSectionCurSum)
	{
		retVal = 0u;
	}
    else
    {
        retVal = (UINT16)LogicSectionCurSum;
    }
	return retVal;
}

/*
* 功能描述： 获取指定ID逻辑区段索引号
* 参数说明： const UINT16 logSectionId, 逻辑区段ID
* 返回值  ： LOGIC_SECTION_SUM_MAX: 获取数据失败
*			<LOGIC_SECTION_SUM_MAX: 查找成功
*/
UINT16 GetlogSectionBufIndex(const UINT16 logSectionId)
{
	UINT16 retVal = LOGIC_SECTION_SUM_MAX;
	if ((1u <=logSectionId) && (LOGIC_SECTION_SUM_MAX > logSectionId))
	{
        retVal = logSectionId;
	}
	else
	{
		;
	}
	
	return retVal;
}

/*
* 功能描述： 获取指定数组下标对应的逻辑区段ID
* 参数说明： const UINT16 bufIndex, 数组下标    
* 返回值  ： 0: 获取数据失败
*			>0: 逻辑区段ID      
*/
UINT16 GetLogicSecId(const UINT16 bufIndex)
{
	UINT16 retVal = CI_ERROR;
	UINT16 totalLogSecCurNum = GetTotalLogSecCurNum();
	if (bufIndex < totalLogSecCurNum)
	{
		retVal = LocalCiLogicSectionIdBuf[bufIndex];
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID逻辑区段所属联锁ID
* 参数说明： const UINT16 logicSecId, 逻辑区段ID    
* 返回值  ： 0: 获取数据失败
*			>0: 所属联锁ID      
*/
UINT8 GetLogSecBelongCiId(const UINT16 logicSecId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 retVal = CI_ERROR;
	
	bufIndex = GetlogSectionBufIndex(logicSecId);  /*获取区段数组下标*/
	
	if (LOGIC_SECTION_SUM_MAX > bufIndex)
	{
		retVal = LogicSectionConfigDataStru[bufIndex].belongCiId;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述：	整理读入的逻辑区段配置数据
* 参数说明：	无
* 返回值  ：	CI_SUCCESS,整理成功
*				CI_ERROR,整理失败
*/
UINT8 LogicSectionConfigDataManage(void)
{
    UINT16 ii = 0u;      /*游标*/
    UINT16 jj = 0u;      /*游标*/
    UINT16 logicSectionConfigDataSum = 0u;      /*逻辑区段设备配置数据总数*/
	UINT8 retVal = CI_SUCCESS;
	UINT8 localCiId = GetSystemParaLocalCiId();

    /*保存逻辑区段ID索引数组*/
    logicSectionConfigDataSum = GetLogicSecCurSum();
	totalLogicSectionNum = logicSectionConfigDataSum;
    if (LOGIC_SECTION_SUM_MAX <= logicSectionConfigDataSum)
    {/*配置数据总数错误*/
        
        retVal = CI_ERROR;
	}
	else
	{
		for (ii = 0u; ii < LOGIC_SECTION_SUM_MAX; ii++)
		{
			if (jj == logicSectionConfigDataSum)
			{/*遍历有效数据完毕*/

				break;
			}

			if (0u != LogicSectionConfigDataStru[ii].LogicSectionId)
			{/*该部分为有效数据*/
				if(localCiId == LogicSectionConfigDataStru[ii].belongCiId )
				{
					LocalCiLogicSectionIdBuf[jj] = LogicSectionConfigDataStru[ii].LogicSectionId;
					jj++; 
				}

			}


		}
	}

    
    return retVal;
}

/*
* 功能描述：	整理读入的相邻联锁逻辑区段配置数据
* 参数说明：	logSecSum 逻辑区段数量
*				logSecIdBuff 相邻联锁发送给本联锁的逻辑区段ID配置数据
* 返回值  ：	1,整理成功
*				0,整理失败
*/
UINT8 AddExtendLogSecIdDataManage(UINT16 logSecSum,const UINT16 *logSecIdBuff)
{
	UINT16  index = 0u;  /*数组下标*/
	UINT16  ii = 0u;
	UINT8 retVal = 1u;

	if (LOGIC_SECTION_SUM_MAX <=(totalLogicSectionNum + logSecSum))
	{/*入口防护*/
		retVal = 0u;
	}
	else
	{
		index = totalLogicSectionNum;
		totalLogicSectionNum += logSecSum;
		for(ii = 0u;ii< logSecSum;ii++)
		{
			LocalCiLogicSectionIdBuf[index+ii] = logSecIdBuff[ii];/*追加到LocalCiLogicSectionIdBuf*/
		}
	}

	return retVal;
}

/*
* 功能描述： 获取相邻联锁发送给本联锁以及本联锁逻辑区段当前总数
* 参数说明： void    
* 返回值  ： 0: 获取数据失败
*			>0: 逻辑区段当前总数
*/
UINT16 GetTotalLogSecCurNum(void)
{
	UINT16 retVal  = 0u;
	if (LOGIC_SECTION_SUM_MAX <= totalLogicSectionNum)
	{
		retVal = 0u;
	}
	else
	{
		retVal = totalLogicSectionNum;
	}
	return retVal;
}
/*
* 功能描述： 获取指定ID逻辑区段所属虚拟联锁ID
* 参数说明： const UINT16 logicSecId, 逻辑区段ID    
* 返回值  ： 0: 获取数据失败
*			>0: 所属虚拟联锁ID      
*/
UINT8 GetLogSecBelongVirCiId(const UINT16 logicSecId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 retVal = CI_ERROR;

	bufIndex = GetlogSectionBufIndex(logicSecId);  /*获取区段数组下标*/

	if (LOGIC_SECTION_SUM_MAX > bufIndex)
	{
		retVal = LogicSectionConfigDataStru[bufIndex].belongVirCI;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID逻辑区段侵限物理区段数目
* 参数说明： const UINT16 phySectionId, 物理区段ID
* 返回值  ： 0: 获取数据失败
*			>0: 侵限物理区段数目
* 创建	  ： qw.liu 2022-03-01
*/
UINT8 GetSecIntrudeLgcSectionSum(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT8 retVal = CI_ERROR;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX >  wBufIndex)
	{
		retVal = LogicSectionConfigDataStru[wBufIndex].chSecInvSecAndConSwiSum;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID逻辑区段侵限区段数组
* 参数说明： const UINT16 phySectionId, 物理区段ID
* 返回值  ： NULL: 获取数据失败
*			!NULL: 侵限物理区段结构指针
* 创建	  :  qw.liu 2022-03-01
*/
UINT16* GetSecIntrudeLgcSectionData(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT16* pRetVal = NULL;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX >  wBufIndex)
	{
		pRetVal = LogicSectionConfigDataStru[wBufIndex].wszSecInvSecAndConSwiId;
	}
	else
	{
		pRetVal = NULL;
	}
	return pRetVal;
}

/*
* 功能描述： 获取指定ID逻辑区段侵限区段侵限方向数组
* 参数说明： const UINT16 phySectionId, 物理区段ID
* 返回值  ： NULL: 获取数据失败
*			!NULL: 侵限物理区段结构指针
* 创建	  :  
*/
UINT8* GetSecIntrudeLgcSecDirData(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT8* pRetVal = NULL;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX >  wBufIndex)
	{
		pRetVal = LogicSectionConfigDataStru[wBufIndex].chSecInvSecLockDir;
	}
	else
	{
		pRetVal = NULL;
	}
	return pRetVal;
}
/*
* 功能描述： 获取指定ID逻辑区段关联物理区段ID
* 参数说明： const UINT16 wLgcId, 物理区段ID
* 返回值  ： 0: 获取数据失败
*			>0: 物理区段Id
* 创建	  ： qw.liu 2022-03-01
*/
UINT16 GetLgcSecRelativePhySecId(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT16 wRetVal = CI_ERROR;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX >  wBufIndex)
	{
		wRetVal = LogicSectionConfigDataStru[wBufIndex].wRelativePhySecId;
	}
	else
	{
		wRetVal = CI_ERROR;
	}
	return wRetVal;
}

/*
* 功能描述： 获取指定ID逻辑区段关联计轴区段数量
* 参数说明： const UINT16 wLgcId, 物理区段ID
* 返回值  ： 0: 获取数据失败
*			>0: 计轴区段数量
* 创建	  ： qw.liu 2022-03-01
*/
UINT8 GetLgcSecRelativeAxleSecSum(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT8 chRetVal = CI_ERROR;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX >  wBufIndex)
	{
		chRetVal = LogicSectionConfigDataStru[wBufIndex].chRelativeAxleSum;
	}
	else
	{
		chRetVal = CI_ERROR;
	}
	return chRetVal;
}

/*
* 功能描述： 获取指定ID逻辑区段关联计轴区段数组
* 参数说明： const UINT16 wLgcId,逻辑区段ID
* 返回值  ： NULL: 获取数据失败
*			 其他: linkID数组
* 创建	  ： qw.liu 2022-03-01
*/
UINT16* GetLgcSecRltvAxleSecIdBuf(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT16* pRetVal = NULL;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		pRetVal = LogicSectionConfigDataStru[wBufIndex].wRelativeAxleSecId;
	}
	else
	{
		;
	}
	return pRetVal;
}

/*
* 功能描述： 获取指定ID逻辑区段的link数量
* 参数说明： const UINT16 wLgcId,逻辑区段ID
* 返回值  ： 0: 获取数据失败
*			>0: LINK数量
* 创建	  ： qw.liu 2022-03-01
*/
UINT8 GetSecIntrudeLinkSum(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT8 retVal = CI_ERROR;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		retVal = LogicSectionConfigDataStru[wBufIndex].chLinkNum;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID逻辑区段的linkID数组
* 参数说明： const UINT16 wLgcId,逻辑区段ID
* 返回值  ： NULL: 获取数据失败
*			 其他: linkID数组
* 创建	  ： qw.liu 2022-03-01
*/
UINT16* GetSecIntrudeLinkIdBuf(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT16* pRetVal = NULL;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		pRetVal = LogicSectionConfigDataStru[wBufIndex].szLinkIdBuff;
	}
	else
	{
		;
	}
	return pRetVal;
}

/*
* 功能描述： 获取指定ID逻辑区段起点link编号
* 参数说明： const UINT16 wLgcId, 逻辑区段ID
* 返回值  ： 0: 获取数据失败
*			>0: linkId
* 创建	  ： 2022-03-18
*/
UINT16 GetLgcSecOrgnLink(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT16 wRetVal = CI_ERROR;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		wRetVal = LogicSectionConfigDataStru[wBufIndex].wOrgnLink;
	}
	else
	{
		wRetVal = CI_ERROR;
	}
	return wRetVal;
}

/*
* 功能描述： 获取指定ID逻辑区段终点link编号
* 参数说明： const UINT16 wLgcId, 逻辑区段ID
* 返回值  ： 0: 获取数据失败
*			>0: linkId
* 创建	  ： 2022-03-18
*/
UINT16 GetLgcSecTmnlLink(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT16 wRetVal = CI_ERROR;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		wRetVal = LogicSectionConfigDataStru[wBufIndex].wTmnlLink;
	}
	else
	{
		wRetVal = CI_ERROR;
	}
	return wRetVal;
}

/*
* 功能描述： 获取指定ID逻辑区段起点偏移量
* 参数说明： const UINT16 wLgcId, 逻辑区段ID
* 返回值  ： UINT32_MAX: 获取数据失败
*			非UINT32_MAX: 偏移量
* 创建	  ： 2022-03-18
*/
UINT32 GetLgcSecOrgnOffset(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT32 wRetVal = UINT32_MAX;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		wRetVal = LogicSectionConfigDataStru[wBufIndex].dwOrgnOffset;
	}
	else
	{
		wRetVal = CI_ERROR;
	}
	return wRetVal;
}

/*
* 功能描述： 获取指定ID逻辑区段终点偏移量
* 参数说明： const UINT16 wLgcId, 逻辑区段ID
* 返回值  ： UINT32_MAX: 获取数据失败
*			非UINT32_MAX: 偏移量
* 创建	  ： 2022-03-18
* @note 内部优化 20220418 wqm 修改无效值为UINT32_MAX
*/
UINT32 GetLgcSecTmnlOffset(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT32 wRetVal = UINT32_MAX;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		wRetVal = LogicSectionConfigDataStru[wBufIndex].dwTmnlOffset;
	}
	else
	{
		wRetVal = UINT32_MAX;
	}
	return wRetVal;
}

/**
* @brief 查询两个逻辑区段的位置关系
* @param UINT16 wLogA
* @param UINT16 wLogB
* @param UINT8 dir
* @return 查询失败：CI_ERROR；共同起点：CI_SUCCESS；A在B前：FLAG_SET；B在A前：FLAG_UNSET
*/
UINT8 dsuJudgeLogAandLogBPosition(UINT16 wLogA, UINT16 wLogB, UINT8 dir)
{
	struct_PathPoint strPointA = { 0u };
	struct_PathPoint strPointB = { 0u };
	UINT8 chRtn = CI_ERROR;

	/* 入参检测 */
	if ((DIR_SAME != dir) && (DIR_CONVERT != dir))
	{
		;
	}
	else
	{
		strPointA.wLinkId = GetLgcSecOrgnLink(wLogA);
		strPointA.dwOffset = GetLgcSecOrgnOffset(wLogA);
		strPointB.wLinkId = GetLgcSecOrgnLink(wLogB);
		strPointB.dwOffset = GetLgcSecOrgnOffset(wLogB);

		chRtn = CheckLinkValid(strPointA.wLinkId, strPointA.dwOffset);
		chRtn &= CheckLinkValid(strPointB.wLinkId, strPointB.dwOffset);
	}

	/* 将两个逻辑区段始端进行比较 */
	if (CI_SUCCESS == chRtn)
	{
		chRtn = dsuJudgePointAandPointBPosition(&strPointA, &strPointB, dir);
	}
	else
	{
		;
	}

	return chRtn;
}

/**
* @brief 按照方向获取逻辑区段 所处计轴区段的逻辑区段序列
* @param UINT16 wLgcSec
* @return 0u:查询失败  其他：逻辑区段数量
* @note 无
*/
UINT16 GetLgcSecSeqBelongAc(const UINT16 wStartLgcSec, UINT16 wCurrentAxisSecId ,const UINT8 chDir,OUT UINT16 wszOutLgcSec[AXIS_INCLUDE_LOG_SUM_MAX])
{
	UINT16 rtn = 0u; /* 返回值 */
	UINT16 wOutLgcSecSum = 0U;
	UINT8 chKeepWork = CI_ERROR;
	UINT16 ii = 0U;
	
	UINT16 wAxisSecIncLogicSum = 0U;
	UINT16 *pAxisSecIncLogicSecIdBuf = NULL;

	wAxisSecIncLogicSum = GetAxisSecLogSectionSum(wCurrentAxisSecId);
	pAxisSecIncLogicSecIdBuf = GetAxisSecLogSectionIdBuf(wCurrentAxisSecId);

	if ((DIR_SAME == chDir) || (DIR_CONVERT == chDir))
	{
		chKeepWork = CI_SUCCESS;
	}
	else
	{
		chKeepWork = CI_ERROR;
	}

	if (CI_SUCCESS == chKeepWork)
	{
		if ((0U != wAxisSecIncLogicSum)
			&& (pAxisSecIncLogicSecIdBuf != NULL))
		{
			; /*不处理*/
		}
		else
		{
			chKeepWork = CI_ERROR;
		}
	}

	if (CI_SUCCESS == chKeepWork)
	{
		if (DIR_SAME == chDir)
		{
			for (ii = 0U; ii < wAxisSecIncLogicSum; ii++)
			{
				if (wStartLgcSec == pAxisSecIncLogicSecIdBuf[ii])
				{
					break;
				}
				else
				{
					; /*继续执行*/
				}
			}

			if (ii == wAxisSecIncLogicSum)
			{
				ii = 0U;  /*计轴区段中未找到此逻辑区段，返回计轴区段包含的所有逻辑区段*/
			}

			for (; ii < wAxisSecIncLogicSum; ii++)
			{
				wszOutLgcSec[wOutLgcSecSum++] = pAxisSecIncLogicSecIdBuf[ii];
			}
		}
		else
		{
			for (ii = 0U; ii < wAxisSecIncLogicSum; ii++)
			{
				if (wStartLgcSec == pAxisSecIncLogicSecIdBuf[ii])
				{
					break;
				}
				else
				{
					; /*继续执行*/
				}
			}

			ii = ii + 1U;

			if (ii > wAxisSecIncLogicSum)
			{
				ii = wAxisSecIncLogicSum;  /*计轴区段中未找到此逻辑区段，返回计轴区段包含的所有逻辑区段*/
			}

			for (; ii > 0U; ii--)
			{
				wszOutLgcSec[wOutLgcSecSum++] = pAxisSecIncLogicSecIdBuf[ii - 1U];
			}
		}
	}

	if (CI_SUCCESS == chKeepWork)
	{
		rtn = wOutLgcSecSum;
	}
	else
	{
		rtn = 0U;
	}
	return rtn;
}

/*
* 功能描述： 获取指定ID逻辑区段道岔数目
* 参数说明： const UINT16 axisSectionId, 计轴区段ID
* 返回值  ： 0: 获取数据失败
*			>0: 道岔数目
*/
UINT8 GetLogicSecSwitchSum(const UINT16 wLogicSecId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT8 retVal = CI_ERROR;

	wBufIndex = GetlogSectionBufIndex(wLogicSecId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		retVal = LogicSectionConfigDataStru[wBufIndex].chLogsecSwitchSum;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID逻辑区段道岔ID数组
* 参数说明： const UINT16 axisSectionId, 计轴区段ID
* 返回值  ： 0: 获取数据失败
*			>0: 道岔ID数组指针
*/
LogsecSwitchStruct* GetLogicSecSwitchIdStru(const UINT16 wLogicSecId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	LogsecSwitchStruct* retVal = NULL;

	wBufIndex = GetlogSectionBufIndex(wLogicSecId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		retVal = LogicSectionConfigDataStru[wBufIndex].LogsecSwitchIdStru;
	}
	else
	{
		retVal = NULL;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID逻辑区段侧防道岔数目
* 参数说明： const UINT16 axisSectionId, 计轴区段ID
* 返回值  ： 0: 获取数据失败
*			>0: 道岔数目
*/
UINT8 GetLgcSecLtrlDfncSwSum(const UINT16 wLogicSecId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT8 retVal = CI_ERROR;

	wBufIndex = GetlogSectionBufIndex(wLogicSecId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		retVal = LogicSectionConfigDataStru[wBufIndex].chLogLtrlDfncSwitchSum;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID逻辑区段侧防道岔结构体
* 参数说明： const UINT16 axisSectionId, 计轴区段ID
* 返回值  ： 0: 获取数据失败
*			>0: 道岔ID数组指针
*/
LogsecSwitchStruct* GetLgcSecLtrlDfncSwStru(const UINT16 wLogicSecId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	LogsecSwitchStruct* retVal = NULL;

	wBufIndex = GetlogSectionBufIndex(wLogicSecId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		retVal = LogicSectionConfigDataStru[wBufIndex].LogLtrlDfncSwitchStru;
	}
	else
	{
		retVal = NULL;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID逻辑区段侧防道岔锁闭方向数组
* 参数说明： const UINT16 axisSectionId, 计轴区段ID
* 返回值  ： 0: 获取数据失败
*			>0: 侧防道岔锁闭方向数组
*/
UINT8* GetLgcSecLtrlDfncLockDir(const UINT16 wLogicSecId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT8* retVal = NULL;

	wBufIndex = GetlogSectionBufIndex(wLogicSecId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		retVal = LogicSectionConfigDataStru[wBufIndex].szLgcDfncLockDir;
	}
	else
	{
		retVal = NULL;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID逻辑区段起点相邻逻辑区段数目
* 参数说明：const UINT16 wLgcId, 逻辑区段ID
* 返回值  ： 0: 获取数据失败
*			>0: 起点相邻逻辑区段数目
* 创建	  ： cgh 2023-05-06
*/
UINT8 GetLogBeginLogSecSum(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT8 retVal = CI_ERROR;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		retVal = LogicSectionConfigDataStru[wBufIndex].chBeginLogSecSum;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID逻辑区段起点相邻逻辑区段数组
* 参数说明： const UINT16 wLgcId, 逻辑区段ID
* 返回值  ： NULL: 获取数据失败
*			!NULL: 起点相邻逻辑区段结构指针
* 创建	  :  cgh 2023-05-06
*/
UINT16* GetLogBeginLogSecData(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT16* pRetVal = NULL;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		pRetVal = LogicSectionConfigDataStru[wBufIndex].wBeginLogSecId;
	}
	else
	{
		pRetVal = NULL;
	}
	return pRetVal;
}
/*
* 功能描述： 获取指定ID逻辑区段终点相邻逻辑区段数目
* 参数说明：const UINT16 wLgcId, 逻辑区段ID
* 返回值  ： 0: 获取数据失败
*			>0: 终点相邻逻辑区段数目
* 创建	  ： cgh 2023-05-06
*/
UINT8 GetLogEndLogSecSum(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT8 retVal = CI_ERROR;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		retVal = LogicSectionConfigDataStru[wBufIndex].chEndLogSecSum;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID逻辑区段终点相邻逻辑区段数组
* 参数说明： const UINT16 wLgcId, 逻辑区段ID
* 返回值  ： NULL: 获取数据失败
*			!NULL: 终点相邻逻辑区段结构指针
* 创建	  :  cgh 2023-05-06
*/
UINT16* GetLogEndLogSecData(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT16* pRetVal = NULL;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		pRetVal = LogicSectionConfigDataStru[wBufIndex].wEndLogSecId;
	}
	else
	{
		pRetVal = NULL;
	}
	return pRetVal;
}
/*
* 功能描述： 获取指定ID逻辑区段关联始端信号机数目
* 参数说明：const UINT16 wLgcId, 逻辑区段ID
* 返回值  ： 0: 获取数据失败
*			>0: 逻辑区段关联始端信号机数目
* 创建	  ： cgh 2023-05-06
*/
UINT8 GetLogRelateBeginSigSum(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT8 retVal = CI_ERROR;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		retVal = LogicSectionConfigDataStru[wBufIndex].chRelateBeginSigSum;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID逻辑区段关联始端信号机数组
* 参数说明： const UINT16 wLgcId, 逻辑区段ID
* 返回值  ： NULL: 获取数据失败
*			!NULL: 逻辑区段关联始端信号机结构指针
* 创建	  :  cgh 2023-05-06
*/
UINT16* GetLogRelateBeginSigData(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT16* pRetVal = NULL;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		pRetVal = LogicSectionConfigDataStru[wBufIndex].wRelateBeginSigId;
	}
	else
	{
		pRetVal = NULL;
	}
	return pRetVal;
}

/*
* 功能描述： 获取指定ID逻辑区段关联终端信号机数目
* 参数说明：const UINT16 wLgcId, 逻辑区段ID
* 返回值  ： 0: 获取数据失败
*			>0: 逻辑区段关联终端信号机数目
* 创建	  ： cgh 2023-05-06
*/
UINT8 GetLogRelateEndSigSum(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT8 retVal = CI_ERROR;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		retVal = LogicSectionConfigDataStru[wBufIndex].chRelateEndSigSum;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID逻辑区段关联终端信号机数组
* 参数说明： const UINT16 wLgcId, 逻辑区段ID
* 返回值  ： NULL: 获取数据失败
*			!NULL: 逻辑区段关联终端信号机结构指针
* 创建	  :  cgh 2023-05-06
*/
UINT16* GetLogRelateEndSigData(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT16* pRetVal = NULL;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		pRetVal = LogicSectionConfigDataStru[wBufIndex].wRelateEndSigId;
	}
	else
	{
		pRetVal = NULL;
	}
	return pRetVal;
}
/*
* 功能描述： 获取指定ID逻辑区段关联进路数目
* 参数说明：const UINT16 wLgcId, 逻辑区段ID
* 返回值  ： 0: 获取数据失败
*			>0: 逻辑区段关联进路数目
* 创建	  ： cgh 2023-05-06
*/
UINT8 GetLogRelateRouteSum(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT8 retVal = CI_ERROR;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		retVal = LogicSectionConfigDataStru[wBufIndex].chRelateRouteSum;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID逻辑区段关联进路数组
* 参数说明： const UINT16 wLgcId, 逻辑区段ID
* 返回值  ： NULL: 获取数据失败
*			!NULL: 逻辑区段关联进路结构指针
* 创建	  :  cgh 2023-05-06
*/
UINT16* GetLogRelateRouteData(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT16* pRetVal = NULL;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		pRetVal = LogicSectionConfigDataStru[wBufIndex].wRelateRouteId;
	}
	else
	{
		pRetVal = NULL;
	}
	return pRetVal;
}
/*
* 功能描述： 获取指定ID逻辑区段关联联络线道岔数目
* 参数说明：const UINT16 wLgcId, 逻辑区段ID
* 返回值  ： 0: 获取数据失败
*			>0: 逻辑区段关联联络线道岔数目
* 创建	  ： cgh 2023-05-06
*/
UINT8 GetLogRelateContactSwSum(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT8 retVal = CI_ERROR;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		retVal = LogicSectionConfigDataStru[wBufIndex].chRelateContactSwSum;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID逻辑区段关联联络线道岔数组
* 参数说明： const UINT16 wLgcId, 逻辑区段ID
* 返回值  ： NULL: 获取数据失败
*			!NULL: 逻辑区段关联联络线道岔结构指针
* 创建	  :  cgh 2023-05-06
*/
UINT16* GetLogRelateContactSwData(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT16* pRetVal = NULL;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		pRetVal = LogicSectionConfigDataStru[wBufIndex].wRelateContactSwId;
	}
	else
	{
		pRetVal = NULL;
	}
	return pRetVal;
}

/*
* 功能描述： 获取指定ID逻辑区段关联防护道岔数目
* 参数说明： const UINT16 wLogicSecId, 逻辑区段ID
* 返回值  ： 0: 获取数据失败
*			>0: 道岔数目
*  创建	  :  cgh 2023-05-06
*/
UINT8 GetLgcRelateProSwSum(const UINT16 wLogicSecId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT8 retVal = CI_ERROR;

	wBufIndex = GetlogSectionBufIndex(wLogicSecId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		retVal = LogicSectionConfigDataStru[wBufIndex].chRelateProSwSum;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID逻辑区段关联防护道岔结构体
* 参数说明： const UINT16 wLogicSecId, 逻辑区段ID
* 返回值  ： 0: 获取数据失败
*			>0: 道岔ID数组指针
* 创建	  :  cgh 2023-05-06
*/
LogsecSwitchStruct* GetLgcRelateProSwStru(const UINT16 wLogicSecId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	LogsecSwitchStruct* retVal = NULL;

	wBufIndex = GetlogSectionBufIndex(wLogicSecId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		retVal = LogicSectionConfigDataStru[wBufIndex].wRelateProSwId;
	}
	else
	{
		retVal = NULL;
	}
	return retVal;
}

/*
* 功能描述： 获取指定逻辑区段SPKS的开关数
* 参数说明： const UINT16 wLogicSecId, 逻辑区段ID
* 返回值  ： spks数量
* by cgh 20230919
*/
UINT8 GetLogSecSpksSum(const UINT16 wLogicSecId)
{
	UINT8 spksNum = 0U;
	UINT16 wBufIndex = 0U;  /*数组下标*/

	wBufIndex = GetlogSectionBufIndex(wLogicSecId);

	if (wBufIndex < LOGIC_SECTION_SUM_MAX)
	{
		spksNum = LogicSectionConfigDataStru[wBufIndex].chSpksNum;
	}

	return spksNum;
}

/*
* 功能描述： 获取指定逻辑区段指定下标的SPKS的ID
* 参数说明：  const UINT16 wLogicSecId, 逻辑区段ID
*			 wSpksIndex下标
* 返回值  ： spksId 返回的SPKS ID
* by cgh 20230919
*/
UINT16 GetLogSecSpksIdBySpksIdx(const UINT16 wLogicSecId, UINT16 wSpksIndex)
{
	UINT8 chSpksNum = 0U;
	UINT16 wSpksId = 0U;
	UINT16 wBufIndex = 0U;  /*数组下标*/

	wBufIndex = GetlogSectionBufIndex(wLogicSecId);

	if (wBufIndex < LOGIC_SECTION_SUM_MAX)
	{
		chSpksNum = LogicSectionConfigDataStru[wBufIndex].chSpksNum;
	}
	if (wSpksIndex < chSpksNum)
	{
		wSpksId = LogicSectionConfigDataStru[wBufIndex].wSpksIdBuff[wSpksIndex];
	}

	return wSpksId;
}

/*
* 功能描述： 获取指定ID逻辑区段关联联络线设备检查条件数量
* 参数说明： const UINT16 wLogicSecId, 逻辑区段ID
* 返回值  ： 0: 获取数据失败
*			>0: 道岔数目
*/
UINT8 GetLgcSecContactLineCheckSum(const UINT16 wLogicSecId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT8 retVal = CI_ERROR;

	wBufIndex = GetlogSectionBufIndex(wLogicSecId);  /*获取逻辑区段数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		retVal = LogicSectionConfigDataStru[wBufIndex].chContactLineCheckSum;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID逻辑区段关联联络线道岔设备结构体
* 参数说明： const UINT16 wLogicSecId, 逻辑区段ID
* 返回值  ： NULL: 获取数据失败
*			!NULL: 道岔ID数组指针
*/
LogsecContacSwitchStruct* GetLgcSecContactSwitchCheckStru(const UINT16 wLogicSecId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	LogsecContacSwitchStruct* retVal = NULL;

	wBufIndex = GetlogSectionBufIndex(wLogicSecId);  /*获取逻辑区段数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		retVal = LogicSectionConfigDataStru[wBufIndex].LogContactSwitchCheckStru;
	}
	else
	{
		retVal = NULL;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID逻辑区段关联联络线道岔所在计轴区段检查ID数组
* 参数说明： const UINT16 wLgcId, 逻辑区段ID
* 返回值  ： NULL: 获取数据失败
*			!NULL: 逻辑区段关联联络线道岔所在计轴区段检查ID结构指针
*/
UINT16* GetLogContactAxisCheckData(const UINT16 wLgcId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT16* pRetVal = NULL;

	wBufIndex = GetlogSectionBufIndex(wLgcId);  /*获取进路数组下标*/

	if (LOGIC_SECTION_SUM_MAX > wBufIndex)
	{
		pRetVal = LogicSectionConfigDataStru[wBufIndex].chContactAxisCheckID;
	}
	else
	{
		pRetVal = NULL;
	}
	return pRetVal;
}

/*
* 功能描述： 获取指定ID逻辑区段的CBTC区域属性
* 参数说明： const UINT16 logicSecId, 逻辑区段ID
* 返回值  ： 0: 获取数据失败
*			>0: CBTC区域属性
* Created By LQ 2023.12.08
*/
UINT8 GetLogSecCbtcProperty(const UINT16 logicSecId)
{
	UINT16 bufIndex = 0U;  /*数组下标*/
	UINT8 retVal = CI_ERROR;

	bufIndex = GetlogSectionBufIndex(logicSecId);  /*获取区段数组下标*/

	if (LOGIC_SECTION_SUM_MAX > bufIndex)
	{
		retVal = LogicSectionConfigDataStru[bufIndex].cCbtcProperty;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID逻辑区段关联PSD数量
* 参数说明： const UINT16 logicSecId, 逻辑区段ID
* 返回值  ： UINT8_MAX: 获取数据失败
*					其他：关联PSD数量
* Created By fan 2024.4.11
*/
UINT8 GetLogSecPsdSum(const UINT16 logicSecId)
{
	UINT16 bufIndex = 0U;  /*数组下标*/
	UINT8 retVal = UINT8_MAX;

	bufIndex = GetlogSectionBufIndex(logicSecId);  /*获取区段数组下标*/

	if (LOGIC_SECTION_SUM_MAX > bufIndex)
	{
		retVal = LogicSectionConfigDataStru[bufIndex].logSecRltPsdSum;
	}
	else
	{
		; /*不处理*/
	}
	return retVal;
}

/*
* 功能描述： 获取指定逻辑区段指定下标的PSD的ID
* 参数说明：  const UINT16 wLogicSecId, 逻辑区段ID   UINT8  wPsdIndex下标
* 返回值  ：0 : 失败  >0 PsdID
* Created By fan 2024.4.11
*/
UINT16 GetLogSecPsdByIdx(const UINT16 wLogicSecId, UINT8 wPsdIndex)
{
	UINT8 chPsdNum = 0U;
	UINT16 chPsdId = 0U;
	UINT16 wBufIndex = 0U;  /*数组下标*/

	wBufIndex = GetlogSectionBufIndex(wLogicSecId);

	if (wBufIndex < LOGIC_SECTION_SUM_MAX)
	{
		chPsdNum = GetLogSecPsdSum(wLogicSecId);
		if ((wPsdIndex < chPsdNum) && (LOGSEC_RELATE_PSD_MAX >= chPsdNum))
		{
			chPsdId = LogicSectionConfigDataStru[wBufIndex].logSecRltPsdBuf[wPsdIndex];
		}
		else
		{
			; /*不处理*/
		}
	}
	else
	{
		; /*不处理*/
	}
	return chPsdId;
}

/*
* 功能描述： 获取指定ID逻辑区段关联Esb数量
* 参数说明： const UINT16 logicSecId, 逻辑区段ID
* 返回值  ： UINT8_MAX: 获取数据失败
*					其他：关联Esb数量
* Created By fan 2024.4.11
*/
UINT8 GetLogSecEsbSum(const UINT16 logicSecId)
{
	UINT16 bufIndex = 0U;  /*数组下标*/
	UINT8 retVal = UINT8_MAX;

	bufIndex = GetlogSectionBufIndex(logicSecId);  /*获取区段数组下标*/

	if (LOGIC_SECTION_SUM_MAX > bufIndex)
	{
		retVal = LogicSectionConfigDataStru[bufIndex].logSecRltEsbSum;
	}
	else
	{
		; /*不处理*/
	}
	return retVal;
}

/*
* 功能描述： 获取指定逻辑区段指定下标的Esb的ID
* 参数说明：  const UINT16 wLogicSecId, 逻辑区段ID   UINT8  wEsbIndex下标
* 返回值  ：0 : 失败  >0 EsbID
* Created By fan 2024.4.11
*/
UINT16 GetLogSecEsbByIdx(const UINT16 wLogicSecId, UINT8 wEsbIndex)
{
	UINT8 chEsbNum = 0U;
	UINT16 chEsbId = 0U;
	UINT16 wBufIndex = 0U;  /*数组下标*/

	wBufIndex = GetlogSectionBufIndex(wLogicSecId);

	if (wBufIndex < LOGIC_SECTION_SUM_MAX)
	{
		chEsbNum = GetLogSecEsbSum(wLogicSecId);
		if ((wEsbIndex < chEsbNum) && (LOGSEC_RELATE_ESB_MAX >= chEsbNum))
		{
			chEsbId = LogicSectionConfigDataStru[wBufIndex].logSecRltEsbBuf[wEsbIndex];
		}
		else
		{
			; /*不处理*/
		}
	}
	else
	{
		; /*不处理*/
	}
	return chEsbId;
}

/*
* 功能描述： 检查逻辑区段是否属于传输范围
* 参数说明： const UINT16 wCheckLogSecId, 检查逻辑区段ID
* 返回值  ： CI_ERROR 属于
*			 CI_SUCCESS 不属于
* by cgh 20240522
*/
UINT8 CheckLogSecBelSendRange(const UINT16 wCheckLogSecId)
{
	UINT8 retVal = CI_ERROR;
	UINT16 wLogSecSum = 0U;/*逻辑区段数目*/
	UINT16 ii = 0U;
	UINT16 wLogSecId = 0U;/*逻辑区段ID*/

	if ((0U < wCheckLogSecId) && (LOGIC_SECTION_SUM_MAX > wCheckLogSecId))
	{
		/*初始不属于*/
		retVal = CI_SUCCESS;
		wLogSecSum = GetTotalLogSecCurNum();
		for (ii = 0U; ii < wLogSecSum; ii++)
		{
			wLogSecId = GetLogicSecId(ii);/*获取配置文件中该索引下的逻辑区段ID*/
			if (wCheckLogSecId == wLogSecId)
			{
				retVal = CI_ERROR;
				break;
			}
			else
			{
				; /*do nothing*/
			}
		}
	}
	else
	{
		; /*不处理*/
	}

	return retVal;
}