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

#include "ReverseCutConfigDataManage.h"
#include "../Switch/SwitchConfigDataManage.h"
#include "../PSD/PSDConfigDataManage.h"


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

ReverseSwitchCfgDataStru gLocalReverseData = { 0U };/*定义属于本联锁的倒切柜数据*/


/*
* 功能描述： 获取倒切装置当前总数
* 参数说明： 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;
	UINT16 wDevId = 0u;
	UINT16 wLocalSwitchSum = 0U;/*本地道岔*/
	UINT16 wLocalPsdSum = 0U;/*本地PSD*/
	UINT8 localCiId = GetSystemParaLocalCiId();       /*获取本机联锁ID*/
	UINT8 belongCiId = 0u;/*设备配置初始化所属联锁*/
	UINT8 chFind = CI_ERROR;
	/*保存倒切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;
	}

	if (CI_SUCCESS == ret)
	{
		if (0U != gLocalReverseData.wId)
		{
			wLocalSwitchSum = GetSwitchCurSum();
			wLocalPsdSum = GetPsdSum();
			/*本联锁具备倒切*/
			for (ii = 0u; ii < gLocalReverseData.wRelateBoardNum; ii++)
			{
				chFind = CI_ERROR;
				if (CI_DEVICE_TYPE_SWITCH == gLocalReverseData.strRelateBoardBuf[ii].chDevType)
				{
					for (jj = 0u; jj < wLocalSwitchSum; jj++)
					{
						wDevId = GetSwitchId(jj);                          /*获取道岔ID*/
						belongCiId = GetSwitchBelongCiId(wDevId);           /*获取所属联锁ID*/
						if ((wDevId == gLocalReverseData.strRelateBoardBuf[ii].wDevId) && (belongCiId == localCiId))
						{
							/*设置对应倒切继电器*/
							chFind = SetSwitchRelateReverseBoardId(wDevId, gLocalReverseData.strRelateBoardBuf[ii].wReversBoardId);
							break;
						}
					}
				}
				else if (CI_DEVICE_TYPE_PSD == gLocalReverseData.strRelateBoardBuf[ii].chDevType)
				{
					for (jj = 0u; jj < wLocalPsdSum; jj++)
					{
						wDevId = GetPsdId(jj);                          /*获取屏蔽门ID*/
						belongCiId = GetPsdBelongCiId(wDevId);           /*获取所属联锁ID*/
						if ((wDevId == gLocalReverseData.strRelateBoardBuf[ii].wDevId) && (belongCiId == localCiId))
						{
							/*设置对应倒切继电器*/
							chFind = SetPsdRelateReverseRelay(wDevId, gLocalReverseData.strRelateBoardBuf[ii].wReversBoardId);
							break;
						}
					}
				}
				else
				{
					chFind = CI_ERROR;
				}
				if (CI_ERROR == chFind)
				{
					ret = CI_ERROR;
					break;
				}
			}
		}
	}

	return ret;
}

/*
* 功能描述： 获取本集中区倒切开关常开继电器
* 参数说明： 无
* 返回值  ： 0: 无倒切
*     [1,65534]继电器ID
*/
UINT16 GetReverseSwitchOpenRelay(void)
{
	return gLocalReverseData.wColOpenRelayId;
}

/*
* 功能描述： 获取本集中区倒切开关常闭继电器
* 参数说明： 无
* 返回值  ： 0: 无倒切
*     [1,65534]继电器ID
*/
UINT16 GetReverseSwitchCloseRelay(void)
{
	return gLocalReverseData.wColCloseRelayId;
}

/*
* 功能描述： 获取本集中区指定索引倒切板卡常开继电器
* 参数说明： wIndex 索引
* 返回值  ： 0: 无倒切
*     [1,65534]继电器ID
*   UINT16_MAX 错误
*/
UINT16 GetReverseBoardOpenRelay(UINT16 wIndex)
{
	UINT16 chRetVal =UINT16_MAX;
	if (0U == gLocalReverseData.wRelateBoardNum)
	{
		chRetVal = 0U;
	}
	else if (wIndex < gLocalReverseData.wRelateBoardNum)
	{
		chRetVal = gLocalReverseData.strRelateBoardBuf[wIndex].wBoardColOpenRelayId;
	}
	else
	{
		;/*错误*/
	}
	return chRetVal;
}

/*
* 功能描述： 获取本集中区指定索引倒切板卡常闭继电器
* 参数说明： wIndex 索引
* 返回值  ： 0: 无倒切
*     [1,65534]继电器ID
*/
UINT16 GetReverseBoardCloseRelay(UINT16 wIndex)
{
	UINT16 chRetVal = UINT16_MAX;
	if (0U == gLocalReverseData.wRelateBoardNum)
	{
		chRetVal = 0U;
	}
	else if (wIndex < gLocalReverseData.wRelateBoardNum)
	{
		chRetVal = gLocalReverseData.strRelateBoardBuf[wIndex].wBoardColCloseRelayId;
	}
	else
	{
		;/*错误*/
	}
	return chRetVal;
}

/*
* 功能描述： 获取本集中区倒切板卡数量
* 参数说明： 无
* 返回值  ： 0: 无倒切  [1,42]板卡数量
*/
UINT16 GetReverseBoardNum(void)
{
	UINT16 chRetVal = 0U;
	if (0U == gLocalReverseData.wRelateBoardNum)
	{
		chRetVal = 0U;
	}
	else if (REVERSE_BOARD_SUM_MAX >= gLocalReverseData.wRelateBoardNum)
	{
		chRetVal = gLocalReverseData.wRelateBoardNum;
	}
	else
	{
		chRetVal = REVERSE_BOARD_SUM_MAX;
	}
	return chRetVal;
}

/**
* @brief 获取本集中区倒切配置数据
* @param[in]  无
* @return 本集中区倒切配置数据
* @note by fan 20260610
*/
const ReverseSwitchCfgDataStru * GetReverseCfgData(void)
{
	return &gLocalReverseData;
}

