/********************************************************
*                                                                                                            
* 文 件 名： NonRouteConfigDataManage.c   
* 版权说明： 北京交控科技有限公司 
* 创建时间： 2012-11-17
* 作    者： 联锁组
* 功能描述： 非进路调车配置数据管理  
* 修改记录：   
*
********************************************************/ 

#include "NonRouteConfigDataManage.h"
#include "../System/CiSystemDefine.h"
#include "../Signal/SignalConfigDataManage.h"

NonRouteConfigDataStruct NonRouteConfigDataStruArr[NONROUTE_ID_NUM_MAX];  /*非进路数据结构体数组*/

UINT16 NonRouteCurSum = 0u;   /*非进路当前总数*/

	
/*
* 功能描述： 获取非进路数量
* 参数说明： void    
* 返回值  ： 非进路配置数据
*/
UINT16 GetNonRouteCurSum(void)
{
	UINT16 retVal = 0u;
	if (NonRouteCurSum >= NONROUTE_ID_NUM_MAX)
	{
		retVal = 0u;
	}
	else
	{
		retVal = NonRouteCurSum;
	}
	return retVal;
}
/*
* 功能描述： 获取非进路配置数据
* 参数说明： void    
* 返回值  ： 非进路配置数据
*/
NonRouteConfigDataStruct* GetNonRouteConfigDataPtr(void)
{
	return NonRouteConfigDataStruArr;
}

/*
* 功能描述： 根据非进路id，获取非进路结构体指针
* 参数说明： 非进路id    
* 返回值  ： 非进路结构体指针
*/
NonRouteConfigDataStruct* GetNonRouteConfigDataPtrById(UINT8 nonRouteId)
{
	NonRouteConfigDataStruct* pNonRoutePtr = NULL;

	UINT8 i = 0u;
	for (i=0u;i< NONROUTE_ID_NUM_MAX;i++)
	{
		pNonRoutePtr = NonRouteConfigDataStruArr + i;
		if (pNonRoutePtr!=NULL)
		{
			if (pNonRoutePtr->NonRouteId == nonRouteId)
			{
				break;
			}
		}
	}
	return pNonRoutePtr;
}

/*
* 功能描述： 获取非进路调车包含信号机数目
* 参数说明： 非进路id    
* 返回值  ： 非进路调车包含信号数目
*/
UINT8 GetNonRouteSignalSumById(UINT8 nonRouteId)
{
	UINT8 sigNum = 0u;

	NonRouteConfigDataStruct *pNonRouteConfig = GetNonRouteConfigDataPtrById(nonRouteId);
	if (pNonRouteConfig !=NULL)
	{
		sigNum = pNonRouteConfig->SignalSum;
	}
	return sigNum;
}


/*
* 功能描述： 获取非进路调车包含信号机数组
* 参数说明： 非进路id   
* 返回值  ： 非进路调车包含信号机数组
*/
UINT16* GetNonRouteSignalIdBufById(UINT8 nonRouteId)
{
	UINT16 *pSigArr = NULL;
	NonRouteConfigDataStruct *pNonRouteConfig = GetNonRouteConfigDataPtrById(nonRouteId);
	if (pNonRouteConfig !=NULL)
	{
		pSigArr = pNonRouteConfig->SignalIdBuf;
	}
	return pSigArr;
}


/*
* 功能描述： 获取非进路调车包含区段数目
* 参数说明： 非进路id
* 返回值  ： 非进路调车包含区段数目
*/
UINT8 GetNonRoutePhySectionSumById(UINT8 nonRouteId)
{
	UINT8 secNum = 0u;

	NonRouteConfigDataStruct *pNonRouteConfig = GetNonRouteConfigDataPtrById(nonRouteId);
	if (pNonRouteConfig !=NULL)
	{
		secNum = pNonRouteConfig->PhySectionSum;
	}
	return secNum;
}


/*
* 功能描述： 获取非进路调车包含区段数组
* 参数说明： 非进路id   
* 返回值  ： 非进路调车包含区段数组
*/
NonRoutePhySectionStruct* GetNonRoutePhySecStruBufById(UINT8 nonRouteId)
{
	NonRoutePhySectionStruct* phyArr = NULL;

	NonRouteConfigDataStruct *pNonRouteConfig = GetNonRouteConfigDataPtrById(nonRouteId);
	if (pNonRouteConfig !=NULL)
	{
		phyArr = pNonRouteConfig->NonRoutePhySecStru;
	}

	return phyArr;
}


/*
* 功能描述： 获取非进路调车包含道岔数目
* 参数说明： 非进路id
* 返回值  ： 非进路调车包含道岔数目
*/
UINT8 GetNonRouteSwitchSumById(UINT8 nonRouteId)
{
	UINT8 swNum = 0u;

	NonRouteConfigDataStruct *pNonRouteConfig = GetNonRouteConfigDataPtrById(nonRouteId);
	if (NULL != pNonRouteConfig)
	{
		swNum = pNonRouteConfig->SwitchSum;
	}
	else
	{
		; /*不处理，返回0*/
	}

	return swNum;
}

/*
* 功能描述： 获取非进路调车关联防护道岔数目
* 参数说明： 非进路id
* 返回值  ： 非进路调车关联防护道岔数目
*/
UINT8 GetNonRouteRelatedProtSwitSum(UINT8 nonRouteId)
{
	UINT8 swNum = 0u;

	NonRouteConfigDataStruct *pNonRouteConfig = GetNonRouteConfigDataPtrById(nonRouteId);
	if (pNonRouteConfig !=NULL)
	{
		swNum = pNonRouteConfig->ProtectSwitchSum;
	}

	return swNum;
}


/*
* 功能描述： 获取非进路调车包含道岔结构体数组
* 参数说明： 非进路id 
* 返回值  ： 非进路调车包含道岔结构体数组
*/
NonRouteSwitchStruct* GetNonRouteSwitchStructBufById(UINT8 nonRouteId)
{
	NonRouteSwitchStruct* swArr = NULL;

	NonRouteConfigDataStruct *pNonRouteConfig = GetNonRouteConfigDataPtrById(nonRouteId);
	if (pNonRouteConfig !=NULL)
	{
		swArr = pNonRouteConfig->NonRouteSwitStru;
	}

	return swArr;
}

/*
* 功能描述： 获取非进路调车关联防护道岔结构体数组
* 参数说明： 非进路id 
* 返回值  ： 非进路调车关联防护道岔结构体数组
*/
NonRouteProtectSwitchStruct* GetNonRouteRelatedProtSwitStru(UINT8 nonRouteId)
{
	NonRouteProtectSwitchStruct* swArr = NULL;

	NonRouteConfigDataStruct *pNonRouteConfig = GetNonRouteConfigDataPtrById(nonRouteId);
	if (pNonRouteConfig !=NULL)
	{
		swArr = pNonRouteConfig->NonRouteProtectSwitchStru;
	}
	return swArr;
}


/*
* 功能描述： 获取非进路调车包含敌对信号数目
* 参数说明： 非进路id
* 返回值  ： 非进路调车包含敌对信号数目
*/
UINT8 GetNonRouteEnemySignalSumById(UINT8 nonRouteId)
{
	UINT8 enemySigNum = 0u;

	NonRouteConfigDataStruct *pNonRouteConfig = GetNonRouteConfigDataPtrById(nonRouteId);
	if (pNonRouteConfig !=NULL)
	{
		enemySigNum = pNonRouteConfig->EnemySignalSum;
	}

	return enemySigNum;
}


/*
* 功能描述： 获取非进路调车包含敌对信号结构体数组
* 参数说明： 非进路id   
* 返回值  ： 非进路调车包含敌对信号结构体数组
*/
NonRouteEnemySignalStruct* GetNonRouteEnemySigStruBufById(UINT8 nonRouteId)
{
	NonRouteEnemySignalStruct* pEnemySig = NULL;
	NonRouteConfigDataStruct *pNonRouteConfig = GetNonRouteConfigDataPtrById(nonRouteId);
	if (pNonRouteConfig !=NULL)
	{
		pEnemySig = pNonRouteConfig->EnemySignalStru;
	}

	return pEnemySig;
}

/*
* 功能描述： 获取非进路调车包含侵限区段数目
* 参数说明： 非进路id
* 返回值  ： 非进路调车包含侵限区段数目
*/
UINT8 GetNonRouteIntrudePhySecSumById(UINT8 nonRouteId)
{
	UINT8 intruPhyNum = 0u;

	NonRouteConfigDataStruct *pNonRouteConfig = GetNonRouteConfigDataPtrById(nonRouteId);
	if (pNonRouteConfig !=NULL)
	{
		intruPhyNum = pNonRouteConfig->IntruPhySecSum;
	}

	return intruPhyNum;
}

/*
* 功能描述： 获取非进路调车包含侵限区段结构体数组
* 参数说明： 非进路id   
* 返回值  ： 非进路调车包含侵限区段结构体数组
*/
NonRouteIntrudePhySectionStruct* GetNonRouteIntrudePhySecBufById(UINT8 nonRouteId)
{
	NonRouteIntrudePhySectionStruct* pIntruPhyArr = NULL;

	NonRouteConfigDataStruct *pNonRouteConfig = GetNonRouteConfigDataPtrById(nonRouteId);
	if (pNonRouteConfig !=NULL)
	{
		pIntruPhyArr = pNonRouteConfig->IntruPhySecStru;
	}

	return pIntruPhyArr;
}

/*
* 功能描述： 获取非进路调车申请试车继电器ID
* 参数说明： 非进路id    
* 返回值  ： 申请试车继电器ID
*/
UINT16 GetNonRouteAppTryRelayIdById(UINT8 nonRouteId)
{
	UINT16 applyTryTrainId = 0u;

	NonRouteConfigDataStruct *pNonRouteConfig = GetNonRouteConfigDataPtrById(nonRouteId);
	if (pNonRouteConfig !=NULL)
	{
		applyTryTrainId = pNonRouteConfig->ApplyTryTrainRelayId;
	}

	return applyTryTrainId;
}


/*
* 功能描述： 获取非进路调车同意试车继电器ID
* 参数说明： 非进路id    
* 返回值  ： 同意试车继电器ID
*/
UINT16 GetNonRouteAgreeTryRelayIdById(UINT8 nonRouteId)
{
	UINT16 agreeTryTrainRelayId = 0u;

	NonRouteConfigDataStruct *pNonRouteConfig = GetNonRouteConfigDataPtrById(nonRouteId);
	if (pNonRouteConfig !=NULL)
	{
		agreeTryTrainRelayId = pNonRouteConfig->AgreeTryTrainRelayId;
	}

	return agreeTryTrainRelayId;
}


/*
* 功能描述： 获取试车线驱动试车申请继电器ID
* 参数说明： 非进路id    
* 返回值  ： 驱动申请试车继电器ID
*/
UINT16 GetSCXDrvApplyTryRelayIdById(UINT8 nonRouteId)
{
	UINT16 drvApplyTryTrainRelayId = 0u;

	NonRouteConfigDataStruct *pNonRouteConfig = GetNonRouteConfigDataPtrById(nonRouteId);
	if (pNonRouteConfig !=NULL)
	{
		drvApplyTryTrainRelayId = pNonRouteConfig->DrvApplyTryTrainRelayId;
	}

	return drvApplyTryTrainRelayId;
}

/*
* 功能描述： 获取试车线采集同意试车继电器ID
* 参数说明： 非进路id    
* 返回值  ： 采集同意试车继电器ID
*/
UINT16 GetSCXColAgreeTryRelayIdById(UINT8 nonRouteId)
{
	UINT16 collAgreeTryTrainRelayId = 0u;

	NonRouteConfigDataStruct *pNonRouteConfig = GetNonRouteConfigDataPtrById(nonRouteId);
	if (pNonRouteConfig !=NULL)
	{
		collAgreeTryTrainRelayId = pNonRouteConfig->ColAgreeTryTrainRelayId;
	}

	return collAgreeTryTrainRelayId;
}

/*
* 功能描述：根据道岔id查找对应的非进路
* 参数说明：swId-道岔id
* 返回值：非进路结构体指针
*/
NonRouteConfigDataStruct* GetNonRouteConfigDataBySwitchId(UINT16 swId)
{
	NonRouteConfigDataStruct *pNonRoute = NULL;

	UINT8 i=0;
	UINT8 j=0;
	UINT8 breakFlag = 0U;
	for (;i<NONROUTE_ID_NUM_MAX;i++)
	{
		pNonRoute = NonRouteConfigDataStruArr +i;
		if (pNonRoute!=NULL)
		{
			for (;(j<pNonRoute->SwitchSum) && (j < NONROUTE_SWITCH_SUM_MAX);j++)
			{
				if (pNonRoute->NonRouteSwitStru[j].SwitchId == swId)
				{
					breakFlag = 1U;
					break;
				}
			}
		}
		if (1U == breakFlag)
		{
			break;
		}
	}


	return pNonRoute;
}

/*
* 功能描述： 根据信号机id，获取非进路结构体指针
* 参数说明： 信号机    
* 返回值  ： 非进路结构体指针
*/
NonRouteConfigDataStruct* GetNonRouteConfigDataBySignalId(UINT16 sigId)
{
	NonRouteConfigDataStruct *pNonRoute = NULL;

	UINT8 i=0;
	UINT8 j=0;
	UINT8 breakflag = 0U;
	for (;i<NONROUTE_ID_NUM_MAX;i++)
	{
		pNonRoute = NonRouteConfigDataStruArr +i;
		if (pNonRoute!=NULL)
		{
			for (;(j<pNonRoute->SignalSum) && (j < NONROUTE_SIGNAL_SUM_MAX);j++)
			{
				if (pNonRoute->SignalIdBuf[j] == sigId)
				{
					breakflag = 1U;
					break;
				}
			}
		}
		if (1U == breakflag)
		{
			break;
		}
	}


	return pNonRoute;
}

/*
* 功能描述：根据物理区段id查找对应的非进路
* 参数说明：phyId-物理区段id
* 返回值：非进路结构体指针：查找成功
*        NULL：查找失败
*/
NonRouteConfigDataStruct* GetNonRouteConfigDataByPhySecId(UINT16 phyId)
{
	NonRouteConfigDataStruct* pNonRoute = NULL;
	NonRouteConfigDataStruct* retNonRoute = NULL; 
	UINT16 i = 0;
	UINT16 j = 0;
	UINT8 breakFlag = 0U;
	/*遍历所有非进路*/
	for (i = 0; i < NONROUTE_ID_NUM_MAX; i++)
	{
		pNonRoute = NonRouteConfigDataStruArr + i;
		if (pNonRoute != NULL)
		{
			/*查找与输入对应的物理区段*/
			for (j = 0; (j < pNonRoute->PhySectionSum) && (j < NONROUTE_PHYSEC_SUM_MAX); j++)
			{
				if (pNonRoute->NonRoutePhySecStru[j].PhySectionId == phyId)
				{
					breakFlag = 1U;
					break;
				}
				else
				{
					/*继续遍历*/
				}
			}
		}
		if (1U == breakFlag)
		{
			/*查找成功*/
			retNonRoute = pNonRoute;
			break;
		}
		else
		{
			/*继续遍历*/
		}
	}

	return retNonRoute;
}

/*
* 功能描述： 获取非进路所属虚拟联锁
* 参数说明： 非进路id    
* 返回值  ： 所属虚拟联锁
*/
UINT8 GetnonRouteIdbelongVirCIid(UINT8 nonRouteId)
{
	UINT8 i= 0u;
	UINT8 signalSum = 0u;
	UINT16 signalId = 0u;
	UINT8 reVal = 0u;
	for(i=0u;i < NONROUTE_ID_NUM_MAX;i++)
	{
		if(nonRouteId == NonRouteConfigDataStruArr[i].NonRouteId)
		{
			signalSum = NonRouteConfigDataStruArr[i].SignalSum;
			if(0u < signalSum)
			{
				signalId = NonRouteConfigDataStruArr[i].SignalIdBuf[0];
				reVal = GetSignalBelongVirCiId(signalId);
			}
			break;
		}
	}

	return reVal;
}


/*
* 功能描述： 获取非进路所属联锁ID
* 参数说明： 非进路id
* 返回值  ： 所属联锁ID
*/
UINT8 GetnonRouteIdbelongCIid(UINT8 nonRouteId)
{
	UINT8 i = 0u;
	UINT8 signalSum = 0u;
	UINT16 signalId = 0u;
	UINT8 reVal = 0u;
	for (i = 0u; i < NONROUTE_ID_NUM_MAX; i++)
	{
		if (nonRouteId == NonRouteConfigDataStruArr[i].NonRouteId)
		{
			signalSum = NonRouteConfigDataStruArr[i].SignalSum;
			if (0u < signalSum)
			{
				signalId = NonRouteConfigDataStruArr[i].SignalIdBuf[0];
				reVal = GetSignalBelongCiId(signalId);
			}
			break;
		}
	}

	return reVal;
}



