/********************************************************
*
* 文 件 名： ReverseCutConfigDataManage.c
* 版权说明： 北京交控科技有限公司
* 创建时间： 2022-06-15
* 作    者： 联锁组
* 功能描述： 倒切装置配置数据管理
* 修改记录：
*
********************************************************/

#include "ReverseCutConfigDataManage.h"


ReverseCutCfgDataStru gstReverseCutCfgData[REVERSE_CUT_SUM_MAX] = { 0U };       /*定义倒切装置数据配置结构体*/
UINT16 gReverseCutCfgIdBuf[REVERSE_CUT_SUM_MAX] = { 0U };					   /*定义倒切装置数据配置ID 缓存*/
INT16 gReverseCutCfgSum = 0;							   /*定义倒切装置数据配置总数 */


/*
* 功能描述： 获取倒切装置当前总数
* 参数说明： void
* 返回值  ： 0: 获取数据失败
*			>0: 倒切装置当前总数
*/
UINT16 GetReverseCutCurSum(void)
{
	UINT16 retVal = 0u;
	if ((INT16)REVERSE_CUT_SUM_MAX <= gReverseCutCfgSum)
	{
		retVal = REVERSE_CUT_SUM_MAX;
	}
	else if (0 > gReverseCutCfgSum)
	{
		retVal = 0u;
	}
	else
	{
		retVal = (UINT16)gReverseCutCfgSum;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID倒切索引号
* 参数说明： const UINT16 wReverseCutId, 倒切ID
* 返回值  ： REVERSE_CUT_SUM_MAX: 获取数据失败
*			<REVERSE_CUT_SUM_MAX: 查找成功
*/
UINT16 GetReverseCutCfgBufIndex(const UINT16 wReverseCutId)
{
	UINT16 wRetVal = REVERSE_CUT_SUM_MAX;
	if ((1u <= wReverseCutId) && (REVERSE_CUT_SUM_MAX > wReverseCutId))
	{
		wRetVal = wReverseCutId;
	}

	return wRetVal;
}

/*
* 功能描述： 获取指定数组下标对应的倒切ID
* 参数说明： const UINT16 wBufIndex, 数组下标
* 返回值  ： 0: 获取数据失败
*			>0: 倒切ID
*/
UINT16 GetReverseCutId(const UINT16 wBufIndex)
{
	UINT16 retVal = CI_ERROR;
	UINT16 wReverseCutCurSum = GetReverseCutCurSum();
	if (wBufIndex < wReverseCutCurSum)
	{
		retVal = gReverseCutCfgIdBuf[wBufIndex];
	}
	else
	{
		retVal = CI_ERROR;
	}
	return retVal;
}

/*
* 功能描述： 获取指定ID倒切继电器ID
* 参数说明： const UINT16 wReverseCutId, 倒切ID
* 返回值  ： 0: 获取数据失败
*			>0: 倒切ID
*/
UINT16 GetReverseCutRelayId(const UINT16 wReverseCutId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT16 wRetVal = CI_ERROR;

	wBufIndex = GetReverseCutCfgBufIndex(wReverseCutId);  /*获取区段数组下标*/

	if (REVERSE_CUT_SUM_MAX > wBufIndex)
	{
		wRetVal = gstReverseCutCfgData[wBufIndex].wReverseRelayId;
	}
	else
	{
		wRetVal = CI_ERROR;
	}
	return wRetVal;
}

/*
* 功能描述： 获取指定ID倒切设备所属联锁ID
* 参数说明： const UINT16 wReverseCutId, 倒切ID
* 返回值  ： 0: 获取数据失败
*			>0: 所属TIOC ID
*/
UINT8 GetReverseCutBelongCiId(const UINT16 wReverseCutId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT8 chRetVal = CI_ERROR;

	wBufIndex = GetReverseCutCfgBufIndex(wReverseCutId);  /*获取区段数组下标*/

	if (REVERSE_CUT_SUM_MAX > wBufIndex)
	{
		chRetVal = gstReverseCutCfgData[wBufIndex].chBelongCiId;
	}
	else
	{
		chRetVal = CI_ERROR;
	}
	return chRetVal;
}

/*
* 功能描述：	整理读入的倒切设备配置数据
* 参数说明：	无
* 返回值  ：	CI_SUCCESS,整理成功
*				CI_ERROR,整理失败
*/
UINT8 ReverseCutConfigDataManage(void)
{
	UINT16 ii = 0u;      /*游标*/
	UINT16 jj = 0u;      /*游标*/
	UINT16 wReverseCutDataSum = 0u;      /*信号机设备配置数据总数*/
	UINT8 ret = CI_ERROR;
	UINT8 localCiId = GetSystemParaLocalCiId();

	/*保存信号机ID索引数组*/
	wReverseCutDataSum = GetReverseCutCurSum();
	if (wReverseCutDataSum < REVERSE_CUT_SUM_MAX)
	{/*配置数据总数错误*/

		for (ii = 0u; ii < REVERSE_CUT_SUM_MAX; ii++)
		{
			if (jj == wReverseCutDataSum)
			{/*遍历有效数据完毕*/

				break;
			}
			if (localCiId == gstReverseCutCfgData[ii].chBelongCiId)
			{/*该部分为有效数据*/

				gReverseCutCfgIdBuf[jj] = gstReverseCutCfgData[ii].wId;
				jj++;
			}
		}
		ret = CI_SUCCESS;
	}

	return ret;

}