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

#include "ESBConfigDataManage.h"




EsbConfigDataStruct EsbConfigDataStru[ESB_SUM_MAX];   /*定义ESB数据配置结构体,cgh-合并CID-2539-1：此处声明不进行初始化，统一放到InitAllStaticDataStr函数中进行初始化，为解决生成内核过大得问题*/
UINT16 LocalCiEsbIdBuf[ESB_SUM_MAX] = {0u};                   /*定义本地联锁紧急停车按钮ID映射数组*/
INT16 EsbCurSum = 0;   /*ESB当前总数*/
UINT16 totalEsbNum = 0u;/*本联锁和相邻联锁发送给本联锁ESB总数*/




/*
* 功能描述： 获取紧急停车当前总数
* 参数说明： void    
* 返回值  ： 0: 获取数据失败
*			>0: 紧急停车当前总数
*/
UINT16 GetEsbSum(void)
{
	UINT16 reVal = 0u;

    if (EsbCurSum >= (INT16)ESB_SUM_MAX)
    {
        reVal = ESB_SUM_MAX;
    }
	else if (EsbCurSum < 0)
	{
		reVal = 0u;
	}
    else
    {
        reVal = (UINT16)EsbCurSum;
    }
	return reVal;
}

/*
* 功能描述： 获取指定数组下标对应的紧急停车ID
* 参数说明： const UINT16 bufIndex, 数组下标    
* 返回值  ： 0: 获取数据失败
*			>0: 紧急停车ID      
*/
UINT16 GetEsbId(const UINT16 bufIndex)
{
	UINT16 reVal = CI_ERROR;

	if (bufIndex < GetTotalEsbCurNum())
	{
		reVal = LocalCiEsbIdBuf[bufIndex];
	}
	return reVal;
}

/*
* 功能描述： 获取指定ID紧急停车按钮索引号
* 参数说明： const UINT16 esbId, 紧急停车按钮ID
* 返回值  ： ESB_SUM_MAX: 获取数据失败
*			<ESB_SUM_MAX: 查找成功
*/
UINT16 GetEsbConfigBufIndex(const UINT16 esbId)
{
	UINT16 reVal = ESB_SUM_MAX;

	if ((esbId >= 1u) && (esbId < ESB_SUM_MAX))
	{
        reVal = esbId;
	}
	
	return reVal;
}




/*
* 功能描述： 获取指定ID站台紧急停车按钮所属联锁ID
* 参数说明： const UINT16 esbId, 站台紧急停车按钮ID    
* 返回值  ： 0: 获取数据失败
*			>0: 所属联锁ID      
*/
UINT8 GetEsbBelongCiId(const UINT16 esbId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 reVal = CI_ERROR;
	
	bufIndex = GetEsbConfigBufIndex(esbId);  /*获取数组下标*/
	
	if (bufIndex < ESB_SUM_MAX)
	{
		reVal = EsbConfigDataStru[bufIndex].BelongCiId;
	}
	return reVal;
}

/*
* 功能描述： 获取指定ID站台紧急停车按钮所属站台ID
* 参数说明： const UINT16 esbId, 站台紧急停车按钮ID
* 返回值  ： 0: 获取数据失败
*			>0: 所属联锁ID
*/
UINT16 GetEsbBelongPlatFormId(const UINT16 esbId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 reVal = CI_ERROR;

	bufIndex = GetEsbConfigBufIndex(esbId);  /*获取数组下标*/

	if (bufIndex < ESB_SUM_MAX)
	{
		reVal = EsbConfigDataStru[bufIndex].BelongPlatFormId;
	}
	return reVal;
}
/*
* 功能描述： 获取指定ID紧急停车按钮继电器ID
* 参数说明： const UINT16 esbId, 紧急停车按钮ID    
* 返回值  ： 0: 获取数据失败
*			>0: 紧急停车按钮继电器ID      
*/
UINT16 GetEsbRelayId(const UINT16 esbId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 reVal = CI_ERROR;

	bufIndex = GetEsbConfigBufIndex(esbId);  /*获取数组下标*/

	if (bufIndex < ESB_SUM_MAX)
	{
		reVal = EsbConfigDataStru[bufIndex].EsbRelayId;
	}
	return reVal;
}




/*
* 功能描述： 获取指定ID紧急停车按钮旁路继电器ID
* 参数说明： const UINT16 esbId, 紧急停车按钮ID
* 返回值  ： 0: 获取数据失败
*			>0: 紧急停车按钮继电器ID
*/
UINT16 GetEsbCutRelayId(const UINT16 esbId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 reVal = CI_ERROR;

	bufIndex = GetEsbConfigBufIndex(esbId);  /*获取数组下标*/

	if (bufIndex < ESB_SUM_MAX)
	{
		reVal = EsbConfigDataStru[bufIndex].EsbCutRelayId;
	}
	return reVal;
}


/*
* 功能描述：	整理读入的ESB配置数据
* 参数说明：	无
* 返回值  ：	CI_SUCCESS,整理成功
*				CI_ERROR,整理失败
*/
UINT8 EsbConfigDataManage(void)
{
    UINT16 ii = 0u;      /*游标*/
    UINT16 jj = 0u;      /*游标*/
    UINT16 esbConfigDataSum = 0u;      /*ESB设备配置数据总数*/
	UINT8 reVal = CI_SUCCESS;

    /*保存ESBID索引数组*/
    esbConfigDataSum = GetEsbSum();
	totalEsbNum = esbConfigDataSum;
    if (esbConfigDataSum >= ESB_SUM_MAX)
    {/*配置数据总数错误*/
        
        reVal = CI_ERROR;
	}
	else
	{
		for (ii = 0u; ii < ESB_SUM_MAX; ii++)
		{
			if (jj == esbConfigDataSum)
			{/*遍历有效数据完毕*/
	            
				break;
			}
	        
			if (EsbConfigDataStru[ii].BelongCiId == GetSystemParaLocalCiId())
			{/*该部分为有效数据*/
	            
				LocalCiEsbIdBuf[jj] = EsbConfigDataStru[ii].EsbId;
				jj++;
			}
		}
	}


    return reVal;
}

/*
* 功能描述：	整理读入的相邻联锁ESB配置数据
* 参数说明：	esbSum 进路数量
*				esbIdBuff 相邻联锁发送给本联锁的ESBID配置数据
* 返回值  ：	1,整理成功
*				0,整理失败
*/
UINT8 AddExtendEsbIdDataManage(UINT16 esbSum,const UINT16 *esbIdBuff)
{
	UINT16  index = 0u;  /*数组下标*/
	UINT16  ii = 0u;
	UINT8 retVal = 1u;

	if ((totalEsbNum + esbSum) >= ESB_SUM_MAX)
	{/*入口防护*/
		retVal = 0u;
	}
	else
	{
		index = totalEsbNum;
		totalEsbNum += esbSum;
		for(ii = 0u;ii< esbSum;ii++)
		{
			LocalCiEsbIdBuf[index+ii] = esbIdBuff[ii];/*追加到LocalCiEsbIdBuf*/
		}
	}

	return retVal;
}

/*
* 功能描述： 获取相邻联锁发送给本联锁以及本联锁ESB当前总数
* 参数说明： void    
* 返回值  ： 0: 获取数据失败
*			>0且小于 ESB_SUM_MAX : ESB当前总数
*/
UINT16 GetTotalEsbCurNum(void)
{
	UINT16 retVal  = 0u;
	if (totalEsbNum >= ESB_SUM_MAX)
	{
		retVal = 0u;
	}
	else
	{
		retVal = totalEsbNum;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID ESB的虚拟属性
* 参数说明： const UINT16 esbId, ESB ID    
* 返回值  ： 0: 获取数据失败
*			>0: ESB的虚拟属性      
*/
UINT8 GetEsbVirtualAttribute(const UINT16 esbId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 retVal = CI_ERROR;

	bufIndex = GetEsbConfigBufIndex(esbId);  /*获取ESB数组下标*/

	if (bufIndex < ESB_SUM_MAX)
	{
		retVal = EsbConfigDataStru[bufIndex].VirtualAttribute;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/***********分界线 esb复示继电器********************************************/
/*
* 功能描述： 获取指定ID ESB复示继电器ID
* 参数说明： const UINT16 esbId
* 返回值  ：  0: 获取数据失败
*		 >0: esb复视继电器ID
*/
UINT16 GetEsbRepRelayId(const UINT16 esbId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	UINT16 retVal = CI_ERROR;
	bufIndex = GetEsbConfigBufIndex(esbId);  /*获取ESB数组下标*/

	if (bufIndex < ESB_SUM_MAX)
	{
		retVal = EsbConfigDataStru[bufIndex].EsbRepRelayId;
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}



/*
* 功能描述： 获取指定ID紧急停车按钮指示灯继电器ID
* 参数说明： const UINT16 esbId, 紧急停车按钮指示灯ID    
* 返回值  ： 0: 获取数据失败
*			>0: 紧急停车按钮指示灯继电器ID     
*/
UINT16 GetEsbDisRelayId(const UINT16 esbId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 reVal = CI_ERROR;

	bufIndex = GetEsbConfigBufIndex(esbId);  /*获取数组下标*/

	if (bufIndex < ESB_SUM_MAX)
	{
		reVal = EsbConfigDataStru[bufIndex].EsbDisRelayId;
	}
	return reVal;
}

/*
* 功能描述： 获取指定ID紧急停车按钮旁路指示灯继电器ID
* 参数说明： const UINT16 esbId, 紧急停车按钮ID
* 返回值  ： 0: 获取数据失败
*			>0: 紧急停车按钮继电器ID
*/
UINT16 GetEsbCutDisRelayId(const UINT16 esbId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 reVal = CI_ERROR;

	bufIndex = GetEsbConfigBufIndex(esbId);  /*获取数组下标*/

	if (bufIndex < ESB_SUM_MAX)
	{
		reVal = EsbConfigDataStru[bufIndex].EsbCutDisRelayId;
	}
	return reVal;
}
/*
* 功能描述： 获取指定ID站台紧急停车按钮所属联锁ID
* 参数说明： const UINT16 esbId, 站台紧急停车按钮ID    
* 返回值  ： 0: 获取数据失败
*			>0: 所属联锁ID      
*/
UINT8 GetEsbBelongVirCiId(const UINT16 esbId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 reVal = CI_ERROR;

	bufIndex = GetEsbConfigBufIndex(esbId);  /*获取数组下标*/

	if (bufIndex < ESB_SUM_MAX)
	{
		reVal = EsbConfigDataStru[bufIndex].BelongVirCiId;
	}
	return reVal;
}

/*
* 功能描述： 获取指定ID站台紧急停车按钮对应的蜂鸣器继电器ID
* 参数说明： const UINT16 esbId, 站台紧急停车按钮ID    
* 返回值  ： 0: 获取数据失败
*			>0: 蜂鸣器继电器ID   
*/
UINT16 GetEsbBuzzRelayId(const UINT16 esbId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 reVal = CI_ERROR;

	bufIndex = GetEsbConfigBufIndex(esbId);  /*获取数组下标*/

	if (ESB_SUM_MAX > bufIndex)
	{
		/*返回蜂鸣器继电器ID*/
		reVal = EsbConfigDataStru[bufIndex].EsbBuzzRelayId;
	}
	else
	{
		/*不做处理*/
	}
	return reVal;
}

/*
* 功能描述： 获取指定ID紧急停车按钮继电器ID 2
* 参数说明： const UINT16 esbId, 紧急停车按钮ID
* 返回值  ： 0: 获取数据失败
*			>0: 紧急停车按钮继电器ID
*/
UINT16 GetEsbRelayId2(const UINT16 esbId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 reVal = CI_ERROR;

	bufIndex = GetEsbConfigBufIndex(esbId);  /*获取数组下标*/

	if (bufIndex < ESB_SUM_MAX)
	{
		reVal = EsbConfigDataStru[bufIndex].wEsbRelayId2;
	}
	return reVal;
}
/*
* 功能描述： 获取指定ID紧急停车开关继电器ID
* 参数说明： const UINT16 esbId, 紧急停车按钮ID
* 返回值  ： 0: 获取数据失败
*			>0: 紧急停车开关继电器ID
* cgh-合并CID-2349-3：
*/
UINT16 GetESSRelayId(const UINT16 esbId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 reVal = CI_ERROR;

	bufIndex = GetEsbConfigBufIndex(esbId);  /*获取数组下标*/

	if (bufIndex < ESB_SUM_MAX)
	{
		reVal = EsbConfigDataStru[bufIndex].ESSRelayId;
	}
	return reVal;
}


/*
* 功能描述： 获取指定ID紧急停车开关稳灯继电器ID
* 参数说明： const UINT16 esbId, 紧急停车按钮ID
* 返回值  ： 0: 获取数据失败
*			>0: 紧急停车开关稳灯继电器ID
* cgh-合并CID-2349-3：
*/
UINT16 GetESSSteadyIndicatRelayId(const UINT16 esbId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 reVal = CI_ERROR;

	bufIndex = GetEsbConfigBufIndex(esbId);  /*获取数组下标*/

	if (bufIndex < ESB_SUM_MAX)
	{
		reVal = EsbConfigDataStru[bufIndex].ESSSteadyIndicatRelayId;
	}
	return reVal;
}

/*
* 功能描述： 获取指定ID紧急停车开关闪光指示灯继电器ID
* 参数说明： const UINT16 esbId, 紧急停车按钮ID
* 返回值  ： 0: 获取数据失败
*			>0: 紧急停车开关闪灯继电器ID
* cgh-合并CID-2349-3：
*/
UINT16 GetESSFlashIndicatRelayId(const UINT16 esbId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 reVal = CI_ERROR;

	bufIndex = GetEsbConfigBufIndex(esbId);  /*获取数组下标*/

	if (bufIndex < ESB_SUM_MAX)
	{
		reVal = EsbConfigDataStru[bufIndex].ESSFlashIndicatRelayId;
	}
	return reVal;
}
/*
* 功能描述： 获取指定紧急停车对应的ESS稳灯继电器ID
* 参数说明： const UINT16 bufIndex, 数组下标
* 返回值  ： 0: 获取数据失败
*			>0: 继电器ID
* cgh-合并CID-2349-3\cgh-合并CID-3037-1：：
*/
UINT16 GetEssSteadyIndicatId(const UINT16 esbId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 reVal = CI_ERROR;

	bufIndex = GetEsbConfigBufIndex(esbId);  /*获取数组下标*/

	if (bufIndex < ESB_SUM_MAX)
	{
		reVal = EsbConfigDataStru[bufIndex].ESSSteadyIndicatRelayId;
	}
	return reVal;
}

/*
* 功能描述： 获取指定紧急停车对应的ESS闪灯继电器ID
* 参数说明： const UINT16 bufIndex, 数组下标
* 返回值  ： 0: 获取数据失败
*			>0: 继电器ID
* cgh-合并CID-2349-3\cgh-合并CID-3037-1：：
*/
UINT16 GetEssFlashIndicatId(const UINT16 esbId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 reVal = CI_ERROR;

	bufIndex = GetEsbConfigBufIndex(esbId);  /*获取数组下标*/

	if (bufIndex < ESB_SUM_MAX)
	{
		reVal = EsbConfigDataStru[bufIndex].ESSFlashIndicatRelayId;
	}
	return reVal;
}

/*
* 功能描述： 获取指定ESB对应ATS-CI的ESS稳灯状态码位是否配置标志
* 参数说明： UINT16 esbId ESBID
* 返回值  ：ESS_MASK_NO 未配置
*			ESS_MASK_YES 配置
* cgh-合并CID-2349-3：
*/
UINT8 GetEssSteadyCiToAtsMaskFlag(UINT16 esbId)
{
	UINT8 reVal = ESS_MASK_NO;
	UINT16 bufIndex = 0U;  /*数组下标*/

	bufIndex = GetEsbConfigBufIndex(esbId);  /*获取数组下标*/

	if (ESB_SUM_MAX > bufIndex)
	{
		reVal = EsbConfigDataStru[bufIndex].ConfigAtsCiEssSteadyMask;
	}
	return reVal;
}

/*
* 功能描述： 获取指定ESB对应ATS-CI的ESS闪灯状态码位是否配置标志
* 参数说明： UINT16 esbId ESBID
* 返回值  ：ESS_MASK_NO 未配置
*			ESS_MASK_YES 配置
* cgh-合并CID-2349-3：
*/
UINT8 GetEssFlashCiToAtsMaskFlag(UINT16 esbId)
{
	UINT8 reVal = ESS_MASK_NO;
	UINT16 bufIndex = 0U;  /*数组下标*/

	bufIndex = GetEsbConfigBufIndex(esbId);  /*获取数组下标*/

	if (ESB_SUM_MAX > bufIndex)
	{
		reVal = EsbConfigDataStru[bufIndex].ConfigAtsCiEssFlashMask;
	}
	return reVal;
}

/*
* 功能描述： 获取指定ID紧急停车按钮取消紧急停车按钮继电器ID
* 参数说明： const UINT16 esbId, 紧急停车按钮ID
* 返回值  ： 0: 获取数据失败
*			>0: 取消紧急停车按钮继电器ID
*/
UINT16 GetCancelEsbRelayId(const UINT16 esbId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 reVal = CI_ERROR;

	bufIndex = GetEsbConfigBufIndex(esbId);  /*获取数组下标*/

	if (bufIndex < ESB_SUM_MAX)
	{
		reVal = EsbConfigDataStru[bufIndex].CancelEsbRelayId;
	}
	return reVal;
}

/*
* 功能描述： 获取指定ID紧急停车按钮站台指示灯继电器ID
* 参数说明： const UINT16 esbId, 紧急停车按钮ID
* 返回值  ： 0: 获取数据失败
*			>0: 紧急停车按钮站台指示灯继电器ID
*/
UINT16 GetEsbPlatformDisRelayId(const UINT16 esbId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 reVal = CI_ERROR;

	bufIndex = GetEsbConfigBufIndex(esbId);  /*获取数组下标*/

	if (bufIndex < ESB_SUM_MAX)
	{
		reVal = EsbConfigDataStru[bufIndex].EsbPlatformDisRelayId;
	}
	return reVal;
}

/*
* 功能描述： 获取指定ID紧急停车按钮切除蜂鸣器报警继电器ID
* 参数说明： const UINT16 esbId, 紧急停车按钮ID
* 返回值  ： 0: 获取数据失败
*			>0: 紧急停车按钮切除蜂鸣器报警继电器ID
*/
UINT16 GetEsbCutoffBuzzRelayId(const UINT16 esbId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 reVal = CI_ERROR;

	bufIndex = GetEsbConfigBufIndex(esbId);  /*获取数组下标*/

	if (bufIndex < ESB_SUM_MAX)
	{
		reVal = EsbConfigDataStru[bufIndex].EsbCutoffBuzzRelayId;
	}
	return reVal;
}

/*
* 功能描述： 检查Esb是否属于传输范围
* 参数说明： const UINT16 wCheckEsbId, 检查EsbID
* 返回值  ： CI_ERROR 属于
*			 CI_SUCCESS 不属于
* by cgh 20240621
*/
UINT8 CheckEsbBelSendRange(const UINT16 wCheckEsbId)
{
	UINT8 retVal = CI_ERROR;
	UINT16 wEsbSum = 0U;/*Esb数目*/
	UINT16 ii = 0U;
	UINT16 wEsbId = 0U;/*Esb ID*/

	if ((0U < wCheckEsbId) && (ESB_SUM_MAX > wCheckEsbId))
	{
		/*初始不属于*/
		retVal = CI_SUCCESS;
		wEsbSum = GetTotalEsbCurNum();
		for (ii = 0U; ii < wEsbSum; ii++)
		{
			wEsbId = GetEsbId(ii);/*获取配置文件中该索引下的PSD ID*/
			if (wCheckEsbId == wEsbId)
			{
				retVal = CI_ERROR;
				break;
			}
			else
			{
				; /*do nothing*/
			}
		}
	}
	else
	{
		; /*不处理*/
	}

	return retVal;
}