/********************************************************
*                                                                                                            
* 文 件 名： IndicatorConfigDataManage.c   
* 版权说明： 北京交控科技有限公司 
* 创建时间： 2012-11-26
* 作    者： 联锁组
* 功能描述： 指示数据管理  
*
********************************************************/ 

#include "IndicatorConfigDataManage.h"
#include "../VirtualDevice/VirtualDevDataManage.h"



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

OCStationIndicConfigDataStru g_OCStationIndicConfigDataStru[INDICATOR_SUM_MAX] = { 0u };
UINT16 g_OCStationIndicatorCurSum = 0;   /*本联锁OC站（集中站和非集中站）指示器总数,不涉及主备跟随，取值范围 [0,2000) 暂无使用*/



/*
* 功能描述： 获取指示器当前总数
* 参数说明： void    
* 返回值  ： 0u: 获取数据失败
*			>0u: 当前总数
*/
UINT16 GetIndicatorCurSum(void)
{
	UINT16 reVal = 0u;

    if ((INT16)INDICATOR_SUM_MAX <= IndicatorCurSum)
    {
        reVal = INDICATOR_SUM_MAX;
    }
	else if (0 > IndicatorCurSum)
	{
		reVal = 0u;
	}
    else
    {
        reVal = (UINT16)IndicatorCurSum;
    }

	return reVal;
}



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

	if (bufIndex < GetIndicatorCurSum())
	{
		reVal = LocalCiIndicatorIdBuf[bufIndex];
	}

	return reVal;
}

/*
* 功能描述： 获取指定ID指示器索引号
* 参数说明： const UINT16 indicatorId, 指示器ID
* 返回值  ： 
*			
*/
UINT16 GetIndicatorConfigBufIndex(const UINT16 indicatorId)
{
	UINT16 reVal = INDICATOR_SUM_MAX;

	if ((indicatorId >= 1u) && (indicatorId < INDICATOR_SUM_MAX))
	{
        reVal = indicatorId;
	}

	return reVal;
}


/*
* 功能描述： 获取指定ID指示器类型
* 参数说明： const UINT16 indicatorId, 指示器ID    
* 返回值  ： 
*			       
*/
UINT8 GetIndicatorType(const UINT16 indicatorId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 reVal = CI_ERROR;

	bufIndex = GetIndicatorConfigBufIndex(indicatorId);  /*获取指示器相关继电器数组下标*/

	if (bufIndex < INDICATOR_SUM_MAX)
	{
		reVal = IndicatorConfigDataStru[bufIndex].IndicatorType;
	}

	return reVal;
}


/*
* 功能描述： 获取指定ID指示器相关ID总数
* 参数说明： const UINT16 indicatorId, 指示器ID    
* 返回值  ： 
*			       
*/
UINT8 GetIndicatorRelaySum(const UINT16 indicatorId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 reVal = CI_ERROR;

	bufIndex = GetIndicatorConfigBufIndex(indicatorId);  /*获取指示器相关继电器数组下标*/

	if (bufIndex < INDICATOR_SUM_MAX)
	{
		reVal = IndicatorConfigDataStru[bufIndex].IdSum;
	}

	return reVal;
}


/*
* 功能描述： 获取指定ID指示器相关Id数组地址
* 参数说明： const UINT16 indicatorId, 指示器ID    
* 返回值  ： 
*			       
*/
UINT16* GetIndicatorRelayIdBuf(const UINT16 indicatorId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16* reVal = NULL;

	bufIndex = GetIndicatorConfigBufIndex(indicatorId);  /*获取指示器数组下标*/

	if (bufIndex < INDICATOR_SUM_MAX)
	{
		reVal = IndicatorConfigDataStru[bufIndex].IdBuf;
	}
	return reVal;
}

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

    /*保存indicatorId索引数组*/
    indicatorConfigDataSum = GetIndicatorCurSum();
    if (indicatorConfigDataSum >= INDICATOR_SUM_MAX)
    {/*配置数据总数错误*/
        
        reVal = CI_ERROR;
	}
	else
	{
		reVal = CI_SUCCESS;
		for (ii = 0u; ii < INDICATOR_SUM_MAX; ii++)
		{
			if (jj == indicatorConfigDataSum)
			{/*遍历有效数据完毕*/
	            
				break;
			}
	        
			if (IndicatorConfigDataStru[ii].IndicatorId != 0u)
			{/*该部分为有效数据*/
	            
				LocalCiIndicatorIdBuf[jj] = IndicatorConfigDataStru[ii].IndicatorId;
				jj++; 
			}
		}
	}

    return reVal;
}

/*
* 功能描述：	获取指示灯有效标志
* 参数说明：	const UINT16 indicatorId, 指示器ID  
* 返回值  ：	指示灯有效类型
*/
UINT8 GetIndicatorAvalibleFlag(const UINT16 indicatorId)
{
    UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 reVal = INDICATOR_DATA_VALID;

	bufIndex = GetIndicatorConfigBufIndex(indicatorId);  /*获取指示器数组下标*/

	if (bufIndex < INDICATOR_SUM_MAX)
	{
        reVal = IndicatorConfigDataStru[bufIndex].AvalibleFlag;
    }
	return reVal;
}



/*
* 功能描述：	获取指示灯对应的非进路id
* 参数说明：	UINT16 indicatorId, 指示器ID  
* 返回值  ：	非进路id
*/
UINT8 GetNonRouteIdByIndicatorId(UINT16 indicatorId)
{
	UINT8 nonRouteId = 0u;
	
	if(indicatorId < INDICATOR_SUM_MAX)
	{
		IndicatorConfigDataStruct light = IndicatorConfigDataStru[indicatorId];
		if(light.IdSum>=2u)
		{
			nonRouteId = (UINT8)(light.IdBuf[1]);
		}
		else if (light.IdSum == 1u)
		{
			nonRouteId = (UINT8)(light.IdBuf[0]);
		}
		else
		{
			/*不做处理*/
		}
	}
	else
	{
		;
	}
	
	return nonRouteId;
}
/*
* 功能描述：	获取指示灯对应的非进路id
* 参数说明：	UINT16 indicatorId, 指示器ID  
* 返回值  ：	非进路id
*/
UINT16 GetNonRouteIdByIndictId_Vir(UINT8 virCIid,UINT8 indicatorId)
{
	UINT16 nonRouteId = 0u;
	UINT16 * pNonRouteIdBuf = NULL;
	UINT8 nonRouteSum = 0u;
	nonRouteSum = GetVirCIIndicConfDataRelaySum(virCIid,indicatorId);
	pNonRouteIdBuf = GetVirCIIndicConfDataRelayBuf(virCIid,indicatorId);

	if(NULL !=pNonRouteIdBuf)
	{
		if(2u <= nonRouteSum)
		{
			nonRouteId = pNonRouteIdBuf[1];
		}
		else if(1u == nonRouteSum)
		{
			nonRouteId = pNonRouteIdBuf[0];
		}
		else
		{
			nonRouteId = 0u;
		}
	}
	return nonRouteId;
}
/*
* 功能描述： 获取OC站指示灯总数
* 参数说明： void
* 返回值  ： 0u: 获取数据失败
*			>0u: 当前总数
* cgh-合并ECI11.0:
*/
UINT16 GetOCStationIndicCurSum(void)
{
	UINT16 reVal = 0u;

	if (INDICATOR_SUM_MAX >= g_OCStationIndicatorCurSum)
	{
		reVal = (UINT16)g_OCStationIndicatorCurSum;
	}

	return reVal;
}
/*
* 功能描述： 根据索引获取OC站指示灯ID
* 参数说明： void
* 返回值  ： 0u: 获取数据失败
*			>0u: 指示灯ID
* cgh-合并ECI11.0:
*/
UINT8 GetOCStationIndicIdByIndex(UINT16 index)
{
	UINT16 indicNum = GetOCStationIndicCurSum();
	UINT16 i = 0u;
	UINT8 reVal = 0u;

	if (indicNum > index)
	{
		reVal = g_OCStationIndicConfigDataStru[index].IndicatorId;
	}
	return reVal;
}
/*
* 功能描述： 根据索引获取OC站指示灯所属OC
* 参数说明： void
* 返回值  ： 0u: 获取数据失败
*			>0u: OC ID
* cgh-合并ECI11.0:
*/
UINT8 GetOCStationIndicOcIdByIndex(UINT16 index)
{
	UINT16 indicNum = GetOCStationIndicCurSum();
	UINT16 i = 0u;
	UINT8 reVal = 0u;

	if (indicNum > index)
	{
		reVal = g_OCStationIndicConfigDataStru[index].OcId;
	}
	return reVal;
}
/*
* 功能描述： 根据指示灯ID获取对应继电器ID
* 参数说明： UINT8 ocid  OCID
*            UINT8 indicId  指示灯ID
* 返回值  ： 0u: 获取数据失败
*			>0u: 指示灯ID
* cgh-合并ECI11.0:
*/
UINT16 GetOCStationIndicRelayId(UINT8 ocid, UINT8 indicId)
{
	UINT16 indicNum = GetOCStationIndicCurSum();
	UINT16 i = 0u;
	UINT16 relayId = 0u;
	for (i = 0u; i < indicNum; i++)
	{
		if ((indicId == g_OCStationIndicConfigDataStru[i].IndicatorId)
			&& (ocid == g_OCStationIndicConfigDataStru[i].OcId))
		{
			if (0u < g_OCStationIndicConfigDataStru[i].IdSum)
			{
				relayId = g_OCStationIndicConfigDataStru[i].IdBuf[0];
			}
			break;
		}

	}
	return relayId;
}
/*
* 功能描述： 根据指示灯ID获取指示灯类型
* 参数说明： UINT8 ocid  OCID
*            UINT8 indicId  指示灯ID
* 返回值  ： 0u: 获取数据失败
*			>0u: 指示灯ID
* cgh-合并ECI11.0:
*/
UINT8 GetOCStationIndicType(UINT8 ocid, UINT8 indicId)
{
	UINT16 indicNum = GetOCStationIndicCurSum();
	UINT16 i = 0u;
	UINT8 reVal = 0u;
	for (i = 0u; i < indicNum; i++)
	{
		if ((indicId == g_OCStationIndicConfigDataStru[i].IndicatorId)
			&& (ocid == g_OCStationIndicConfigDataStru[i].OcId))
		{
			reVal = g_OCStationIndicConfigDataStru[i].IndicatorType;
			break;
		}

	}
	return reVal;
}

/*
* 功能描述： 根据报警灯ID获取报警灯设备ID
* 参数说明： UINT16 indicatorId
* 返回值  ： 0u: 获取数据失败
*			>0u: 报警灯设备ID
*/
UINT8 GetIndicatorDevId(UINT16 indicatorId)
{
	UINT8 reVal = 0U;
	UINT16 bufIndex = 0U;  /*数组下标*/

	bufIndex = GetIndicatorConfigBufIndex(indicatorId);  /*获取指示器相关继电器数组下标*/

	if (INDICATOR_SUM_MAX != bufIndex)
	{
		/*表示灯类型为无人折返（返回指示灯设备ID）、电源屏报警、UPS工作指示灯、主电源、副电源、UPS电池供电、UPS电池电压等（返回车站ID）*/
		reVal = IndicatorConfigDataStru[bufIndex].BjdDeviceId;
	}
	else
	{
		reVal = 0U;
	}
	if (UINT8_MAX == reVal)
	{
		reVal = 0U;/*数据配置错误返回零，取值只能是0~254*/
	}
	return reVal;
}

/*
* 功能描述： 根据报警灯ID获取无人折返设备ID
* 参数说明： UINT16 indicatorId
* 返回值  ： 0u: 获取数据失败
*			>0u: 报警灯设备ID
* by cgh 20240910
*/
UINT8 GetIndicatorRelNonReturnId(UINT16 indicatorId)
{

	UINT16 wRetVal = CI_ERROR;
	UINT16 NonAutoReturnCurSum = 0U;
	UINT16 ii = 0U;
	UINT16 wNonAutoRtnId = 0U;
	UINT16 wCurNonAutoRtnRlyId = 0U;

	if ((0U < indicatorId) && (INDICATOR_SUM_MAX > indicatorId))
	{
		NonAutoReturnCurSum = GetNonAutoReturnCurSum();
		for (ii = 0U; ii < NonAutoReturnCurSum; ii++)
		{
			wNonAutoRtnId = GetNonReturnId(ii);
			wCurNonAutoRtnRlyId = GetNonRtnRlyId(wNonAutoRtnId);
			if (indicatorId == wCurNonAutoRtnRlyId)
			{
				wRetVal = wNonAutoRtnId;  /*返回无人折返ID*/
				break;
			}
			else
			{
				; /*继续查找*/
			}
		}
	}
	else
	{
		/*入参检查失败，返回失败*/
	}

	return wRetVal;
}