/********************************************************
*                                                                                                            
* 文 件 名： FloodGateConfigDataManage.c   
* 版权说明： 北京交控科技有限公司 
* 创建时间： 2014-12-24
* 作    者： 联锁组
* 功能描述： 防淹门配置数据管理  
* 修改记录：   
*
********************************************************/ 

#include "FloodGateConfigDataManage.h"




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

/*
* 功能描述： 获取防淹门当前总数
* 参数说明： void    
* 返回值  ： 0u: 获取数据失败
*			>0u: 防淹门当前总数
*/
UINT16 GetFloodGateCurSum(void)
{
	UINT16 floodCurSum = 0u;
    if ((INT16)FLOOD_GATE_SUM_MAX <= FloodGateCurSum)
    {
        floodCurSum = FLOOD_GATE_SUM_MAX;
    }
    else if (0 > FloodGateCurSum)
    {
		floodCurSum = 0u;
    }
	else
    {
        floodCurSum = (UINT16)FloodGateCurSum;
    }
	return floodCurSum;
}

/*
* 功能描述： 获取指定数组下标对应的防淹门ID
* 参数说明： const UINT16 bufIndex, 数组下标    
* 返回值  ： 0u: 获取数据失败
*			>0u: 防淹门ID      
*/
UINT16 GetFloodGateId(const UINT16 bufIndex)
{
	UINT16 floodGateId = CI_ERROR;

	UINT16 curSum = GetTotalFloodGateCurSum();

	if (bufIndex < curSum)
	{
		floodGateId = LocalCiFloodGateIdBuf[bufIndex];
	}

	return floodGateId;
}


/*
* 功能描述： 获取指定ID防淹门数组下标
* 参数说明： const UINT16 floodGateId, 防淹门ID    
* 返回值  ： 0u: 获取数据失败
*			>0u: 防淹门ID      
*/
UINT16 GetFloodGateBufIndex(const UINT16 floodGateId)
{
    UINT16 returnValue = FLOOD_GATE_SUM_MAX;

	if ((floodGateId >=1u) && (floodGateId < FLOOD_GATE_SUM_MAX))
	{
        returnValue = floodGateId;
	}
	else
	{
		returnValue = 0u;
	}
	return returnValue;
}


/*
* 功能描述： 获取指定数组下标对应的关门请求继电器ID
* 参数说明： const UINT16 bufIndex, 数组下标    
* 返回值  ： 0u: 获取数据失败
*			>0u: 防淹门ID      
*/
UINT16 GetFloodGateCloseApplyRelayId(const UINT16 floodGateId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 closeApplyRelayId = CI_ERROR;
	
	bufIndex = GetFloodGateBufIndex(floodGateId);  /*获取防淹门数组下标*/
	
    if (1u <= bufIndex) 
    {
        closeApplyRelayId = FloodGateConfigDataStru[bufIndex].CloseApplyRelayId;
    }
	else
	{
	    /*无操作*/
	}
    return closeApplyRelayId;
}

/*
* 功能描述： 获取指定数组下标对应的开门且锁闭继电器ID
* 参数说明： const UINT16 bufIndex, 数组下标    
* 返回值  ： 0u: 获取数据失败
*			>0u: 防淹门ID      
*/
UINT16 GetFloodGateOpenLockRelayId(const UINT16 floodGateId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 openLockRelayId = CI_ERROR;
	
	bufIndex = GetFloodGateBufIndex(floodGateId);  /*获取防淹门数组下标*/
	
    if (1u <= bufIndex) 
    {
        openLockRelayId = FloodGateConfigDataStru[bufIndex].OpenLockRelayId;
    }
	else
	{
	    /*无操作*/
	}
    return openLockRelayId;
}

/*
* 功能描述： 获取指定数组下标对应的允许请求继电器ID
* 参数说明： const UINT16 bufIndex, 数组下标    
* 返回值  ： 0u: 获取数据失败
*			>0u: 防淹门ID      
*/
UINT16 GetFloodGateAllowRequestRelayId(const UINT16 floodGateId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 allowRequestRelayId = CI_ERROR;
	
	bufIndex = GetFloodGateBufIndex(floodGateId);  /*获取防淹门数组下标*/
	
    if (1u <= bufIndex)
    {
        allowRequestRelayId = FloodGateConfigDataStru[bufIndex].AllowCloseRelayId;
    }
	else
	{
	    /*无操作*/
	}
    return allowRequestRelayId;
}
/*
* 功能描述： 获取指定ID防淹门所属联锁ID
* 参数说明： const UINT16 floodGateId, 防淹门ID    
* 返回值  ： 0u: 获取数据失败
*			>0u: 所属联锁ID
*/
UINT8 GetFloodGateBelongCiId(const UINT16 floodGateId)
{
    UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 belongCiId = CI_ERROR;

	bufIndex = GetFloodGateBufIndex(floodGateId);  /*获取防淹门数组下标*/

    if (1u <= bufIndex)
    {
        belongCiId = FloodGateConfigDataStru[bufIndex].BelongCiId;
    }
	else
	{
	    /*无操作*/
	}
    return belongCiId;
}

/*
* 功能描述：	整理读入的防淹门配置数据
* 参数说明：	无
* 返回值  ：	1,整理成功
*				0u,整理失败
*/
UINT8 FloodGateConfigDataManage(void)
{
    UINT16 ii = 0u;      /*游标*/
    UINT16 jj = 0u;      /*游标*/
    UINT16 floodGateConfigDataSum = 0u;      /*防淹门设备配置数据总数*/
	UINT8 returnValue = CI_SUCCESS;

    /*保存自动折返进路Id索引数组*/
    floodGateConfigDataSum = GetFloodGateCurSum();
	TotalFloodGateNum = floodGateConfigDataSum;
    if (floodGateConfigDataSum >= FLOOD_GATE_SUM_MAX)
    {/*配置数据总数错误*/
        
        returnValue = CI_ERROR;
	}
	else
	{
		for (ii = 0u; ii < FLOOD_GATE_SUM_MAX; ii++)
		{
			if (jj == floodGateConfigDataSum)
			{/*遍历有效数据完毕*/
	            
				break;
			}
	        
			if (FloodGateConfigDataStru[ii].BelongCiId == GetSystemParaLocalCiId())
			{/*该部分为无效数据*/
	            
				LocalCiFloodGateIdBuf[jj] = FloodGateConfigDataStru[ii].FloodGateId;
				jj++; 
			}
		}
	}

    return returnValue;
}

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

/*
* 功能描述：	整理读入的相邻联锁防淹门数据
* 参数说明：	
*				UINT16 floodGateSum,			 相邻联锁发给本联锁的防淹门数量
*				const UINT16 *floodGateIdBuff,   相邻联锁发给本联锁的物理区段ID
* 返回值  ：	0u-失败	1-成功
*/
UINT8 AddExtendFloodGateIdDataManage(UINT16 floodGateSum,const UINT16 *floodGateIdBuff)
{
	UINT16  index = 0u;  /*数组下标*/
	UINT16  ii = 0u;
	UINT8 retVal =1u;

	if ((TotalFloodGateNum + floodGateSum) >= FLOOD_GATE_SUM_MAX)
	{/*入口防护*/
		retVal = 0u;
	}
	else
	{
		index = TotalFloodGateNum;
		TotalFloodGateNum += floodGateSum;
		for(ii = 0u;ii< floodGateSum;ii++)
		{
			LocalCiFloodGateIdBuf[index+ii] = floodGateIdBuff[ii];/*追加到LocalCiFloodGateIdBuf*/
		}
	}

	return retVal;
}


/*
* 功能描述： 获取指定ID防淹门接近区域区段数量
* 参数说明： const UINT16 floodGateId, 防淹门ID    
* 返回值  ： 0u: 获取数据失败
*			>0u: 接近区域区段数量
*/
UINT16 GetFloodGateAccessPhySecNum(const UINT16 floodGateId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 reVal = 0u;

	bufIndex = GetFloodGateBufIndex(floodGateId);  /*获取防淹门数组下标*/

	if (1u <= bufIndex) 
	{
		reVal = FloodGateConfigDataStru[bufIndex].AccessPhySecNum;
	}
	else
	{
	    /*无操作*/
	}
	return reVal;
}

/*
* 功能描述： 获取指定ID防淹门接近区域区段信息结构体
* 参数说明： const UINT16 floodGateId, 防淹门ID    
* 返回值  ： NULL: 获取数据失败
*			!NULL: 接近区域区段结构体
*/
FloodGateAccessPhySecStruct* GetFloodGateAccessPhyDataStru(const UINT16 floodGateId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	FloodGateAccessPhySecStruct* pPhysecIdStr = NULL;

	bufIndex = GetFloodGateBufIndex(floodGateId);  /*获取防淹门数组下标*/

	if (1u <= bufIndex)
	{
		pPhysecIdStr = FloodGateConfigDataStru[bufIndex].AccessPhySecStru;
	}
	else
	{
	    /*无操作*/
	}    
	return pPhysecIdStr;
}


/*
* 功能描述： 获取指定ID防淹门防护区域区段数量
* 参数说明： const UINT16 floodGateId, 防淹门ID    
* 返回值  ： 0u: 获取数据失败
*			>0u: 防护区域区段数量
*/
UINT16 GetFloodGateProtectPhySecNum(const UINT16 floodGateId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 reVal = 0u;

	bufIndex = GetFloodGateBufIndex(floodGateId);  /*获取防淹门数组下标*/

	if (1u <= bufIndex) 
	{
		reVal = FloodGateConfigDataStru[bufIndex].ProtectPhySecNum;
	}
	else
	{
	    /*无操作*/
	}
	return reVal;
} 

/*
* 功能描述： 获取指定ID防淹门防护区域区段Id数组指针
* 参数说明： const UINT16 floodGateId, 防淹门ID    
* 返回值  ： NULL: 获取数据失败
*			!NULL: 防护区域区段Id数组指针
*/
UINT16* GetFloodGateProtectPhyIDBuf(const UINT16 floodGateId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 *pPhysecIdBuf = NULL;

	bufIndex = GetFloodGateBufIndex(floodGateId);  /*获取防淹门数组下标*/

	if (1u <= bufIndex)
	{
		pPhysecIdBuf = FloodGateConfigDataStru[bufIndex].ProtectPhySecIdBuf;
	}
	else
	{
	    /*无操作*/
	}
	return pPhysecIdBuf;
}
/*
* 功能描述： 获取指定ID防淹门所属联锁ID
* 参数说明： const UINT16 floodGateId, 防淹门ID    
* 返回值  ： 0u: 获取数据失败
*			>0u: 所属联锁ID
*/
UINT8 GetFloodGateBelongVirCiId(const UINT16 floodGateId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 belongVirCiId = 0u;

	bufIndex = GetFloodGateBufIndex(floodGateId);  /*获取防淹门数组下标*/

	if (1u <= bufIndex)
	{
		belongVirCiId = FloodGateConfigDataStru[bufIndex].BelongVirId;
	}
	else
	{
	    /*无操作*/
	}
	return belongVirCiId;
}

/*
* 功能描述： 获取指定ID防淹门接近区域计轴区段数量
* 参数说明： const UINT16 floodGateId, 防淹门ID
* 返回值  ： 0u: 获取数据失败
*			>0u: 接近区域区段数量
*/
UINT16 GetFloodGateAccessAxisNum(const UINT16 floodGateId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 reVal = 0u;

	bufIndex = GetFloodGateBufIndex(floodGateId);  /*获取防淹门数组下标*/

	if (1u <= bufIndex)
	{
		reVal = FloodGateConfigDataStru[bufIndex].AccessAxisNum;
	}
	else
	{
		/*无操作*/
	}
	return reVal;
}

/*
* 功能描述： 获取指定ID防淹门接近区域计轴区段Id数组指针
* 参数说明： const UINT16 floodGateId, 防淹门ID
* 返回值  ： NULL: 获取数据失败
*			!NULL: 接近区域区段Id数组指针
*/
UINT16* GetFloodGateAccessAxisIDBuf(const UINT16 floodGateId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 *pPhysecIdBuf = NULL;

	bufIndex = GetFloodGateBufIndex(floodGateId);  /*获取防淹门数组下标*/

	if (1u <= bufIndex)
	{
		pPhysecIdBuf = FloodGateConfigDataStru[bufIndex].AccessAxisId;
	}
	else
	{
		/*无操作*/
	}
	return pPhysecIdBuf;
}

/*
* 功能描述： 获取指定ID防淹门防护区域计轴区段数量
* 参数说明： const UINT16 floodGateId, 防淹门ID
* 返回值  ： 0u: 获取数据失败
*			>0u: 防护区域区段数量
*/
UINT16 GetFloodGateProtectAxisNum(const UINT16 floodGateId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 reVal = 0u;

	bufIndex = GetFloodGateBufIndex(floodGateId);  /*获取防淹门数组下标*/

	if (1u <= bufIndex)
	{
		reVal = FloodGateConfigDataStru[bufIndex].ProtectAxisNum;
	}
	else
	{
		/*无操作*/
	}
	return reVal;
}

/*
* 功能描述： 获取指定ID防淹门防护区域计轴区段Id数组指针
* 参数说明： const UINT16 floodGateId, 防淹门ID
* 返回值  ： NULL: 获取数据失败
*			!NULL: 防护区域区段Id数组指针
*/
UINT16* GetFloodGateProtectAxisIDBuf(const UINT16 floodGateId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 *pPhysecIdBuf = NULL;

	bufIndex = GetFloodGateBufIndex(floodGateId);  /*获取防淹门数组下标*/

	if (1u <= bufIndex)
	{
		pPhysecIdBuf = FloodGateConfigDataStru[bufIndex].ProtectAxisId;
	}
	else
	{
		/*无操作*/
	}
	return pPhysecIdBuf;
}