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

#include "InvadeSectionConfigDataManage.h"

InvSecConfigDataStruct InvSecConfigDataStru[INVA_SECT_N_COND_SWIT_SUM_MAX];		/*定义侵限区段数据结构体数组*/

INT16 InvSecSum = 0;															/*侵限区段总数*/

UINT16 IdToIndMap[INVA_SECT_N_COND_SWIT_SUM_MAX];							/*定义侵限区段映射数组*/

/*
功能描述: 	获得侵限区段数据索引
输入参数:	UINT16 invSecAndConSwiId 侵限区段及条件道岔ID
输出参数:	无
返回值:		(0u, INVA_SECT_N_COND_SWIT_SUM_MAX) 侵限区段数据索引
				INVA_SECT_N_COND_SWIT_SUM_MAX 获取失败
*/
static UINT16 GetInvSecAndConSwiBufInd(const UINT16 invSecAndConSwiId)
{
	UINT16 retVal = INVA_SECT_N_COND_SWIT_SUM_MAX;

	if(	(INVA_SECT_N_COND_SWIT_MIN_ID <= invSecAndConSwiId) &&
		( INVA_SECT_N_COND_SWIT_SUM_MAX > invSecAndConSwiId))
	{
		retVal = invSecAndConSwiId;
	}

	return retVal;
}


/*
功能描述: 	设置侵限区段及条件道岔ID对数据的索引
输入参数:	无
输出参数:	无
返回值:		CI_ERROR 设置失败
				CI_SUCCESS 设置成功
*/
UINT8 SetInvSecAndConSwiBufInd(void)
{
	UINT8 retVal = CI_ERROR;
	UINT16 ii = 0u;      /*游标*/
	UINT16 jj = 0u;      /*游标*/
	UINT16 invSecAndConSwiSum = 0u;      /*侵限区段配置数据总数*/

	/*保存进路ID索引数组*/
	invSecAndConSwiSum = GetInvSecAndConSwiSum();
	if (invSecAndConSwiSum >= INVA_SECT_N_COND_SWIT_SUM_MAX)
	{/*配置数据总数错误*/

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

				break;
			}
			if ((INVA_SECT_N_COND_SWIT_MIN_ID <= InvSecConfigDataStru[ii].InvSecAndConSwiId) &&
				( INVA_SECT_N_COND_SWIT_SUM_MAX > InvSecConfigDataStru[ii].InvSecAndConSwiId)&&
				(jj < INVA_SECT_N_COND_SWIT_SUM_MAX))
			{
				IdToIndMap[jj] = InvSecConfigDataStru[ii].InvSecAndConSwiId;
				jj ++;
			}


		}
		retVal = CI_SUCCESS;
	}

	return retVal;
}


/*
功能描述: 	获得侵限区段总数
输入参数:	无
输出参数:	无
返回值:		[1, 65535]侵限区段数量
				0u 无侵限区段或获取失败
*/
UINT16 GetInvSecAndConSwiSum(void)
{
	UINT16 retVal = INVA_SECT_N_COND_SWIT_SUM_MAX;

	if ((INT16)INVA_SECT_N_COND_SWIT_SUM_MAX <= InvSecSum)
	{
		InvSecSum = (INT16)INVA_SECT_N_COND_SWIT_SUM_MAX;
	}
    else if(0 < InvSecSum)
    {
        retVal = 0u;
    }
	else
	{
		retVal = (UINT16)InvSecSum;
	}

	return retVal;
}

/*
功能描述: 	获得侵限区段ID
输入参数:	UINT16 invSecAndConSwiId 侵限区段及条件道岔ID
输出参数:	无
返回值:		[1, 65535]侵限区段ID
				0u 获取失败
*/
UINT16 GetInvaSectId(UINT16 invSecAndConSwiId)
{
	UINT16 retVal = 0u;
	UINT16 index = 0u;

	index = GetInvSecAndConSwiBufInd(invSecAndConSwiId);

    if(index < INVA_SECT_N_COND_SWIT_SUM_MAX)
    {
        retVal = InvSecConfigDataStru[index].InvaSectId;
    }

	return retVal;
}

/*
功能描述: 	获得侵限区段所有条件道岔数量
输入参数:	UINT16 invSecAndConSwiId 侵限区段及条件道岔数据ID
输出参数:	无
返回值:		[1, 65535]侵限区段所有条件道岔数量
				0u 获取失败
*/
UINT16 GetInvaSectsCondSwitSum(UINT16 invSecAndConSwiId)
{
	UINT16 retVal = 0u;
	UINT16 index = 0u;

	index = GetInvSecAndConSwiBufInd(invSecAndConSwiId);

    if(index < INVA_SECT_N_COND_SWIT_SUM_MAX)
    {
        retVal = InvSecConfigDataStru[index].CondSwitDataSum;
    }

	return retVal;
}

/*
功能描述: 	获得指定侵限区段的指定条件道岔ID
输入参数:	UINT16 invSecAndConSwiId 侵限区段及条件道岔数据ID
				INT16 ConSwiInd 条件道岔索引
输出参数:	无
返回值:		[1, 65535]条件道岔ID
			0u 获取失败
*/
UINT16 GetInvaSectsCondSwitId(UINT16 invSecAndConSwiId, INT16 ConSwiInd)
{
	UINT16 retVal = 0u;
	UINT16 index = 0u;

	index = GetInvSecAndConSwiBufInd(invSecAndConSwiId);

    if((index < INVA_SECT_N_COND_SWIT_SUM_MAX) && (ConSwiInd < (INT16)COND_SWITCH_SUM_MAX))
    {
        retVal = InvSecConfigDataStru[index].CondSwitDataBuff[ConSwiInd].CondSwitId;
    }

	return retVal;
}

/*
功能描述: 	获得指定侵限区段的指定条件道岔状态
输入参数:	UINT16 invSecAndConSwiId 侵限区段及条件道岔数据ID
			INT16 ConSwiInd 条件道岔索引
输出参数:	无
返回值:		[1, 65535]条件道岔状态
				0u 获取失败
*/
UINT16 GetInvaSectsCondSwitStat(UINT16 invSecAndConSwiId, INT16 ConSwiInd)
{
	UINT16 retVal = 0u;
	UINT16 index = 0u;

	index = GetInvSecAndConSwiBufInd(invSecAndConSwiId);

    if((index < INVA_SECT_N_COND_SWIT_SUM_MAX) && (ConSwiInd < (INT16)COND_SWITCH_SUM_MAX))
    {
        retVal = InvSecConfigDataStru[index].CondSwitDataBuff[ConSwiInd].CondSwitStat;
    }

	return retVal;
}

/*
* 功能描述： 获取保护区段侵限道岔配置数据
* 参数说明： void    
* 返回值  ： 保护区段侵限道岔配置数据
*/
InvSecConfigDataStruct* GetInvSecConfigData(void)
{
	return InvSecConfigDataStru;
}

