/********************************************************
*
* 文 件 名： DeviceConfigDataManage.c
* 版权说明： 北京交控科技有限公司
* 创建时间： 2016-12-18
* 作    者： 联锁组
* 功能描述：
设备配置数据管理。随着CI的外部逻辑不断增加，需要的配置越来越多。
之前代码文件夹的结构是按设备种类划分的，例如：信号和道岔都有自己的文件夹，并且文件夹下面有静态数据和动态数据的定义已经管理文件。
但如今，很多配置的设备含义并不那么明显，并且为了避免目录结构随意的膨胀，于是对一些配置进行统一管理。
* 函数包括：
* 使用注意：
* 修改记录：
*		2016-12-18 新建
*
********************************************************/

#include "DeviceConfigDataManage.h"
#include "dquCbtcType.h"
#include "dquCIInterFace.h"

EmapCiConfigStru gEmapCiConfigStrus[CI_SUM_MAX] = {0u};/*存储各CI使用的电子地图版本*/


/*
* 功能描述： 读取各指定CI的电子地图校验版本配置
* 参数说明：
	const UINT8 ciId:联锁编号
	UINT32 *emapVer:存储指定CI的电子地图校验版本号的UINT32变量指针
	const UINT8 commDevType:与CI通信的设备类型
* 返回值:
	CI_SUCCESS:获取成功
	CI_ERROR:获取失败
*/
UINT8 GetCiEmapCheckVer(const UINT8 ciId, UINT32 *emapVer,const UINT8 commDevType)
{
	UINT8 retVal = CI_ERROR;

	if ((ciId > 0u) && (ciId < CI_SUM_MAX) &&(commDevType > 0u))
	{
		if (gEmapCiConfigStrus[ciId].devId == ciId)
		{
			switch (commDevType)
			{/*根据通信设备类型获取CI与该通信设备的共用数据校验信息*/
			case CI_SYSTEM_TYPE_VOBC:
			case CI_SYSTEM_TYPE_ITE:
				*emapVer = gEmapCiConfigStrus[ciId].dataVerCheckCIAndVOBC;  /*ITE使用与VOBC相同的校验信息*/
				break;
			case CI_SYSTEM_TYPE_ZC:
				*emapVer = gEmapCiConfigStrus[ciId].dataVerCheckCIAndZC;
				break;
			case CI_SYSTEM_TYPE_XIANDI:
			case CI_SYSTEM_TYPE_ATS:
				*emapVer = gEmapCiConfigStrus[ciId].dataVerCheckCIAndATS;
				break;
			case CI_SYSTEM_TYPE_TMC:
				*emapVer = gEmapCiConfigStrus[ciId].dataVerCheckCIAndTMC;
				break;
			default:
				/*CI_SYSTEM_TYPE_CI等情况*/
				break;
			}

			retVal = CI_SUCCESS;
		}
	}

	return retVal;
}

/*********************************************
*函数功能：读取联锁类型
*参数说明：const UINT8 ciId联锁ID 
*返回值：UINT8 联锁类型
*			  0x01      正线联锁
*             0x04      车辆段联锁
*			  0x02		试车线
*				0       无效
*********************************************/
UINT8 GetCiType(const UINT8 ciId)
{
	UINT8 retVal = 0u;

	if ((ciId > 0u) && (ciId < CI_SUM_MAX))
	{
		if (gEmapCiConfigStrus[ciId].devId == ciId)
		{
			retVal = gEmapCiConfigStrus[ciId].ciType;
		}
	}

	return retVal;
}

/*
* 功能描述： 判断两个CI是否属于同一条线路
* 参数说明：
const UINT8 ciA, 第一个CI
const UINT8 ciB, 第二个CI
* 返回值:
SAME_LINE_YES,两个CI属于同一条线路
SAME_LINE_NO,两个CI属于不同线路
SAME_LINE_ERR,无法确定两个CI是否属于同一条线路
*/
UINT8 IsSameLineCI(const UINT8 ciA, const UINT8 ciB)
{
	UINT32 etcsIdA, etcsIdB;
	UINT16 u16CiA, u16CiB;
	UINT8 retVal = SAME_LINE_ERR;
	UINT8 cbtcSysType = DQU_CBTC_FAO;
	UINT8 dquDevNameA = CI_ERROR;
	UINT8 dquDevNameB = CI_ERROR;

	u16CiA = (UINT16)((CI_SYSTEM_TYPE_CI * 256u) + ciA);
	u16CiB = (UINT16)((CI_SYSTEM_TYPE_CI * 256u) + ciB);

	cbtcSysType = GetCbtcSysType();

	dquDevNameA = dquDevName2HlhtId(u16CiA,0u,&etcsIdA);

	dquDevNameB = dquDevName2HlhtId(u16CiB,0u,&etcsIdB);

	if(DQU_CBTC_CPK == cbtcSysType)
	{
		retVal = SAME_LINE_YES;
	}
	else if(DQU_CBTC_FAO == cbtcSysType)
	{
		retVal = SAME_LINE_YES;	
	}
	else if(DQU_CBTC_HLT == cbtcSysType)
	{
		/*需要增加互联互通的判断*/
		if ((CI_SUCCESS == dquDevNameA) && (CI_SUCCESS == dquDevNameB))
		{
			/*根据互联互通ETCS编号的定义，从低到高第三个字节为线路编号*/
			if ((etcsIdA&((UINT32)0x00ff0000)) == (etcsIdB & ((UINT32)0x00ff0000)))
			{
				retVal = SAME_LINE_YES;
			}
			else
			{
				retVal = SAME_LINE_NO;
			}
		}
		else
		{
			retVal = SAME_LINE_ERR;
		}
	}/* zt 删除单轨相关代码 2022-02-15 */
	else if (DQU_CBTC_CC == cbtcSysType)
	{
		retVal = SAME_LINE_YES;
	}
	else
	{		
		retVal = SAME_LINE_ERR;
	}
	return retVal;
}
/*
* 功能描述： 读取各指定CI与通信的该计轴的数据版本号
* 参数说明：
*	const UINT8 ciId:联锁编号
*	const UINT16 deviceName:与CI通信的计轴系统名称(类型+ID)
* 返回值:
*	计轴系统数据校验版本号
* cgh-合并ECI11.0:
*/
UINT32 GetCiTranAxisDataCheckVer(const UINT8 ciId, const UINT16 deviceName)
{
	UINT32 retDataVer = CI_ERROR;
	UINT8 ii = 0u;

	if ((ciId > 0u) && (ciId < CI_SUM_MAX) && (deviceName > 0u))
	{
		if (gEmapCiConfigStrus[ciId].devId == ciId)
		{
			for (ii = 0u; ii < CI_TRAINSMIT_AXIS_MAX_NUM; ii++)
			{
				if ((deviceName == gEmapCiConfigStrus[ciId].ciTransmitAxisId[ii]) && (gEmapCiConfigStrus[ciId].ciTransmitAxisId[ii] > 0u) && (gEmapCiConfigStrus[ciId].ciTransmitAxisId[ii] < 0xFFFFU))
				{
					retDataVer = gEmapCiConfigStrus[ciId].ciTransmitAxisCheckData[ii];
					break;
				}
			}
		}
	}
	return retDataVer;
}

/*
* 功能描述： 读取各指定CI与通信的相邻联锁的数据版本号
* 参数说明：
*	const UINT8 ciId:联锁编号
*	const UINT16 deviceName:与CI通信的CI系统名称(类型+ID)
* 返回值:
*	CI系统数据校验版本号
*/
UINT32 GetCiTranCiDataCheckVer(const UINT8 ciId, const UINT16 deviceName)
{
	UINT32 retDataVer = CI_ERROR;
	UINT8 ii = 0U;
	UINT8 chBreakFlag = 0U;

	if ((ciId > 0U) && (ciId < CI_SUM_MAX) && (deviceName > 0U))
	{
		if (gEmapCiConfigStrus[ciId].devId == ciId)
		{
			for (ii = 0U; ii < gEmapCiConfigStrus[ciId].chAdjoinCICount; ii++)
			{
				if (ii < CI_TRAINSMIT_CI_MAX_NUM)
				{
					if ((deviceName == gEmapCiConfigStrus[ciId].wAdjoinCIId[ii]) && (gEmapCiConfigStrus[ciId].wAdjoinCIId[ii] > 0U) && (gEmapCiConfigStrus[ciId].wAdjoinCIId[ii] < 0xFFFFU))
					{
						retDataVer = gEmapCiConfigStrus[ciId].dwAdjoinCIShareCheckData[ii];
						chBreakFlag = 1U;
					}
				}
				else
				{
					chBreakFlag = 1U;
				}
				if (1U == chBreakFlag)
				{
					break;
				}
			}
		}
	}
	return retDataVer;
}

/*
* 功能描述： 读取各指定OC与通信的相邻联锁的数据版本号
* 参数说明：
*	const UINT8 ciId:联锁编号
*	const UINT16 deviceName:与CI通信的OC系统名称(类型+ID)
* 返回值:
*	OC系统数据校验版本号
*/
UINT32 GetCiTranOcDataCheckVer(const UINT8 ciId, const UINT16 deviceName)
{
	UINT32 retDataVer = CI_ERROR;
	UINT8 ii = 0U;
	UINT8 chBreakFlag = 0U;

	if ((ciId > 0U) && (ciId < CI_SUM_MAX) && (deviceName > 0U))
	{
		if (gEmapCiConfigStrus[ciId].devId == ciId)
		{
			for (ii = 0U; ii < gEmapCiConfigStrus[ciId].chAdjoinOcCount; ii++)
			{
				if (ii < CI_TRAINSMIT_OC_MAX_NUM)
				{
					if ((deviceName == gEmapCiConfigStrus[ciId].wAdjoinOcId[ii]) && (gEmapCiConfigStrus[ciId].wAdjoinOcId[ii] > 0U) && (gEmapCiConfigStrus[ciId].wAdjoinOcId[ii] < 0xFFFFU))
					{
						retDataVer = gEmapCiConfigStrus[ciId].dwAdjoinOcShareCheckData[ii];
						chBreakFlag = 1U;
					}

				}
				else
				{
					chBreakFlag = 1U;
				}
				if (1U == chBreakFlag)
				{
					break;
				}
			}
		}
	}
	return retDataVer;
}

/**
 * @brief 获取指定联锁的相邻联锁数目
 * @param[in] const UINT8 chCiId 指定CI ID
 * @return 指定联锁的相邻联锁数目
 * @note by cgh 20240220
 */
UINT8 GetCiTranCiSum(const UINT8 chCiId)
{
	UINT8 chReval = 0U;

	if ((0U < chCiId) && (CI_SUM_MAX > chCiId))
	{
		chReval = gEmapCiConfigStrus[chCiId].chAdjoinCICount;
	}
	else
	{
		; /*校验不通过，返回0*/
	}
	return chReval;
}

/**
 * @brief 获取指定联锁的相邻联锁数组
 * @param[in] const UINT8 chCiId 指定CI ID
 * @return 指定联锁的相邻联锁数组
 * @note by cgh 20240220
 */
UINT16* GetCiTranCiData(const UINT8 chCiId)
{
	UINT16* chReval = NULL;

	if ((0U < chCiId) && (CI_SUM_MAX > chCiId))
	{
		chReval = gEmapCiConfigStrus[chCiId].wAdjoinCIId;
	}
	else
	{
		; /*校验不通过，返回空*/
	}
	return chReval;
}