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

#include "LongRouteConfigDataManage.h"



LongRouteConfigDataStruct LongRouteConfigDataStru[ROUTE_LONG_SUM_MAX];   /*定义长调进路配置数据结构体,cgh-合并CID-2539-1：此处声明不进行初始化，统一放到InitAllStaticDataStr函数中进行初始化，为解决生成内核过大得问题*/
INT16 LongRouteCurSum = 0; /*长调进路当前总数*/
UINT16 LocalCiLongRouteIdBuf[ROUTE_LONG_SUM_MAX] = {0u};                   /*定义本地联锁长调进路ID映射数组*/

/*
* 功能描述： 获取指定ID长调进路索引号
* 参数说明： const UINT16 routeId, 进路ID
* 返回值  ： ROUTE_LONG_SUM_MAX: 获取数据失败
*			<ROUTE_LONG_SUM_MAX: 查找成功
*/
UINT16 GetLongRouteConfigBufIndex(const UINT16 routeId)
{
	UINT16 ii = 0u;
	UINT16 retVal = ROUTE_LONG_SUM_MAX;
	if ((routeId >= 1u) && (routeId < ROUTE_LONG_SUM_MAX))
	{
		retVal = routeId;
	}

	return retVal;
}

/*
* 功能描述： 获取长调进路当前总数
* 参数说明： void    
* 返回值  ： 0: 获取数据失败
*			>0: 进路当前总数
*/
UINT16 GetLongRouteCurSum(void)
{
	UINT16 retVal = 0u;
    if (LongRouteCurSum >= (INT16)ROUTE_LONG_SUM_MAX )
    {
        retVal = ROUTE_LONG_SUM_MAX;
    }
	else if (LongRouteCurSum < 0)
	{
		retVal = 0u;
	}
    else
    {
        retVal = (UINT16)LongRouteCurSum;
    }
	return retVal;
}


/*
* 功能描述： 获取指定数组下标对应的进路ID
* 参数说明： const UINT16 bufIndex, 数组下标    
* 返回值  ： 0: 获取数据失败
*			>0: 进路ID      
*/
UINT16 GetLongRouteId(const UINT16 bufIndex)
{
	UINT16 retVal = CI_ERROR;
	UINT16 curLongRouteSum = 0u;
	curLongRouteSum = GetLongRouteCurSum();

	if ((ROUTE_LONG_SUM_MAX > bufIndex ) && (bufIndex <= curLongRouteSum))
	{
		retVal = LocalCiLongRouteIdBuf[bufIndex];
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取整个进路数据
* 参数说明：   
* 返回值  ： LongRouteConfigDataStruct*  
*/
LongRouteConfigDataStruct *GetLongRouteConfigData(void)
{
	return LongRouteConfigDataStru;
}


/*
* 功能描述： 获取指定ID长调进路包含子进路数目
* 参数说明： const UINT16 routeId, 进路ID    
* 返回值  ： 0: 获取数据失败
*           >0: 防护区段组数目
*/
UINT8 GetLongRouteSubRouteSum(const UINT16 routeId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 retVal = CI_ERROR;

	bufIndex = GetLongRouteConfigBufIndex(routeId);  /*获取道岔数组下标*/

	if (bufIndex < ROUTE_LONG_SUM_MAX)
	{
		retVal = LongRouteConfigDataStru[bufIndex].SubRouteSum;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID长调进路包含子进路ID数组
* 参数说明： const UINT16 routeId, 进路ID    
* 返回值  ： NULL: 获取数据失败
*			!NULL: 防护区段组ID数组指针
*/
UINT16* GetLongRouteSubRouteIdBuf(const UINT16 routeId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 *retVal = NULL; 

	bufIndex = GetLongRouteConfigBufIndex(routeId);  /*获取道岔数组下标*/

	if (bufIndex < ROUTE_LONG_SUM_MAX)
	{
		retVal = LongRouteConfigDataStru[bufIndex].SubRouteIdBuf;
	}
	else
	{
		retVal = NULL;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID长调进路最后一个进路Id
* 参数说明： const UINT16 routeId, 进路ID    
* 返回值  ： UINT16 进路Id
*/
UINT16 GetLongRouteLastRouteId(const UINT16 routeId)
{
    UINT16 bufIndex = 0u;  /*数组下标*/
    UINT8 subRouteSum = 0u;
    UINT16 retVal = 0u;
    
    bufIndex = GetLongRouteConfigBufIndex(routeId);  /*获取道岔数组下标*/
    
    if (bufIndex < ROUTE_LONG_SUM_MAX)
    {
        subRouteSum = LongRouteConfigDataStru[bufIndex].SubRouteSum;
        if ((subRouteSum > 0u) && (subRouteSum <= ROUTE_SUBROUTE_SUM_MAX))
        {
            /*返回最后一条进路ID 从远端进路开始排序*/
            retVal = LongRouteConfigDataStru[bufIndex].SubRouteIdBuf[0];
        }
        else
        {
            retVal = 0u;
	    }
    }
    else
    {
        retVal = 0u;
	}
	return retVal;
}

/*
* 功能描述：	整理读入的长调进路配置数据
* 参数说明：	无
* 返回值  ：	CI_SUCCESS,整理成功
*				CI_ERROR,整理失败
*/
UINT8 LongRouteConfigDataManage(void)
{
	UINT16 ii = 0u;      /*游标*/
	UINT16 jj = 0u;      /*游标*/
	UINT16 longRouteConfigDataSum = 0u;      /*进路设备配置数据总数*/
	UINT8 retVal = CI_SUCCESS;
	UINT8 chRouteBelongCi = 0U;
	UINT8 chLocalCi = GetSystemParaLocalCiId();
	/*保存进路ID索引数组*/
	longRouteConfigDataSum = GetLongRouteCurSum();
	if (longRouteConfigDataSum >= ROUTE_LONG_SUM_MAX)
	{/*配置数据总数错误*/

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

				break;
			}
			chRouteBelongCi = GetRouteBelongCiId(LongRouteConfigDataStru[ii].SubRouteIdBuf[0]);
			if(chLocalCi == chRouteBelongCi)
			{
				LocalCiLongRouteIdBuf[jj] = LongRouteConfigDataStru[ii].LongRouteId;
				jj++;
			}

		}
	}


	return retVal;
}