/************************************************************************
*
* 文件名     ：     dquCIPZStruFrmChar.c
* 版权说明 ：  北京交控科技有限公司 
* 版本号   ：  1.0
* 创建时间 ：  2011.12.27
* 作者     ：  研发中心软件部
* 功能描述 ：   从数据到CI配置表转换处理过程
* 使用注意 ： 
* 修改记录 ：  
*
************************************************************************/
#include "dquCIPZStruFrmChar.h"
#include "dquEmapInit.h"
#include "dquCIReadCommonChar.h"

DquCiTransmitStruct *pDquCiTranmitInfoStr = NULL;         /*联锁间接口数据表映射结构体*/
UINT16 dquCiTranmitInfoLen = 0u;


DquOutStationSigStruct  *pDquOutStationSigStr = NULL;    /*出站信号机关联逻辑区段(或计轴区段)数据表映射结构体*/
UINT16 dquOutStationSigStrLen = 0u;

DquCiFuncSwitchStructNew *pDquCiFuncSwitchStru = NULL;    /*功能开关配置数据表映射结构体*/
UINT16 dquCiFuncSwitchStruLen = 0u;

DquDiffLineDevStruct *pTempDquDiffLineDevData = NULL;	/*相邻线路设备数据表映射结构体*/
UINT16 tempDquDiffLineDevDataLen = 0u;

DquVirtualDeviceStruct *pDquVirtualDeviceStr = NULL;    /*虚拟设备数据表映射结构体*/
UINT16 dquVirtualDeviceStrLen = 0u;

DquCutoffPointStruct *pstDquCutoffPointData = NULL;		/*分界点设备数据表映射结构体*/
UINT16 dquCutoffPointDataLen =0U;						/*分界点设备数据表*/

DquGatewayDeviceStruct * pstDquGatewayDeviceData=NULL;    /*设备网关信息*/
UINT16 dquGatewayDeviceDataLen = 0u;					/*表数量*/
/*********************************************
*函数功能：从数据到CI配置表转换
*参数说明：pDataAddr数据地址，pPZSysParStr CI配置数据结构体指针
*返回值：0，失败；1，成功
*********************************************/
UINT8 PZ_SystemParaStruFromCharNew(UINT8 * pDataAddr,ParaStruct* pPZSysParStr)
{
	UINT8 * pData = pDataAddr;
	UINT8 rtnvalue = 0u;


	if ((NULL == pDataAddr) || (NULL == pPZSysParStr))
	{
		rtnvalue = 0u;		
	}
	else
	{
		rtnvalue = 1u;

		pPZSysParStr->SysParaId = dquCiShortFromChar(pDataAddr); /*参数编号*/
		pDataAddr += 2u;

		pPZSysParStr->SysParaValue = dquCiShortFromChar(pDataAddr); /*参数取值*/
		pDataAddr += 2u;
	}

	return rtnvalue;
}


/*********************************************
*函数功能：从数据到CI配置表转换
*参数说明：pDataAddr数据地址，pPZSysParStr CI配置数据结构体指针
*返回值：0，失败；1，成功
*********************************************/
UINT8 PZDquCiTransmitInfoFromChar(UINT8 * pDataAddr,DquCiTransmitStruct* pCiTransmitStr)
{
	UINT8 * pData = pDataAddr;
	UINT8 rtnvalue = 0u;

	if ((NULL != pDataAddr) && (NULL != pCiTransmitStr))
	{
		
		pCiTransmitStr->seq = dquCiShortFromChar(pData);       /* 序号 */ 
		pData += 2u;

		pCiTransmitStr->devType = *pData;  /* 设备类型 */
		pData += 1u;
		
		pCiTransmitStr->devId = dquCiShortFromChar(pData);    /*	设备编号	*/ 
		pData += 2u;
		
		pCiTransmitStr->srcCiId = dquCiShortFromChar(pData);  /* 发送CI编号	*/ 
		pData += 2u;
		
		pCiTransmitStr->dstCiId= dquCiShortFromChar(pData);   /*接收CI编号 */		
		pData += 2u;

		pCiTransmitStr->phyLockDirOppOrNot = *pData;	/*物理区段锁闭方向是否取反标志*/
		pData += 1u;

		rtnvalue = 1u;
	}
	return rtnvalue;

}

/*
功能描述: 将原始数据转换为其他线路设备数据
输入参数:	UINT8 * pDataAddr 数据地址
输出参数:	DquDiffLineDevStruct * pDiffLineDevData 其他线路配置数据结构体指针
返回值:	0 失败
		1 成功
*/
UINT8 PZDquDiffLineDevDataFromChar(UINT8 * pDataAddr, DquDiffLineDevStruct * pDiffLineDevData)
{
	UINT8 retVal = 0u;

	if ((NULL != pDataAddr) && (NULL != pDiffLineDevData))
	{
		
		pDiffLineDevData->devSn = dquCiShortFromChar(pDataAddr);	/*序号*/ 
		pDataAddr += 2u;

		pDiffLineDevData->devType = *pDataAddr;  					/*设备类型*/
		pDataAddr += 1u;
		
		pDiffLineDevData->devId = dquCiShortFromChar(pDataAddr);	/*设备编号*/ 
		pDataAddr += 2u;

		retVal = 1u;
	}

	return retVal;
}


/*********************************************
*函数功能：从点式临时限速配置数据表到点式临时限速配置结构的转换
*参数说明：pDataAddr数据地址，
*          pDquOutStationSigStr CI配置数据结构体指针
*返回值：0，失败；1，成功
*********************************************/
UINT8 PZDquOutStationSigReltLogSec(UINT8 * pDataAddr, DquOutStationSigStruct *pOutStationSigStr)
{
	UINT8 * pData = pDataAddr;
	UINT8 rtnvalue = 0u;
	UINT8 ii;
	UINT16 logSecId = 0u;


	if ((NULL != pDataAddr) && (NULL != pOutStationSigStr))
	{
		pOutStationSigStr->wRalatedLogSecSum = 0u;                       /*关联逻辑区段数量初始化为0*/

		pOutStationSigStr->wSignalId = dquCiShortFromChar(pData);        /* 信号机ID*/ 
		pData += 2u;

		for(ii = 0u;ii < OUTSTATION_SIGNAL_RALATED_LOGSEC_SUM_MAX;ii++)
		{
			logSecId = dquCiShortFromChar(pData);                           /*逻辑区段ID*/
			pData += 2u;

			if(0u != logSecId) 
			{
				pOutStationSigStr->wRalatedLogSecIdBuf[pOutStationSigStr->wRalatedLogSecSum] = logSecId;
				pOutStationSigStr->wRalatedLogSecSum++;
			}
			else
			{
			}
		}
		rtnvalue = 1u;
	}
	else
	{
	}
	return rtnvalue;

}

/*********************************************
*函数功能：从功能开关配置数据表到功能开关配置结构的转换
*参数说明：pDataAddr 数据地址，
*          pDquCiFuncSwitchStru CI配置数据结构体指针
*返回值：0，失败；1，成功
*********************************************/
UINT8 PZDquCiFunctionSwitchInfo(UINT8 * pDataAddr, DquCiFuncSwitchStructNew * pCiFuncSwitchStru)
{
	UINT8 * pData = pDataAddr;
	UINT8 rtnvalue = 0u;
	UINT8 ii = 0u;

	if ((NULL != pDataAddr) && (NULL != pCiFuncSwitchStru))
	{
		pCiFuncSwitchStru->wCiFuncSwitchId = dquCiShortFromChar(pData);    /*功能编号*/ 
		pData += 2u;

		pCiFuncSwitchStru->wCiFuncSwitchVal = *pData;    /*功能开关取值*/
		pData += 1u;
		
		rtnvalue = 1u;
	}
	return rtnvalue;

}

/*********************************************
*函数功能：从虚拟设备配置数据表到虚拟设备配置结构的转换
*参数说明：pDataAddr数据地址，
*          pVirtualDeviceStr CI配置数据结构体指针
*返回值：0，失败；1，成功
*********************************************/
UINT8 PZDquVirtualDeviceInfoFromChar(UINT8 * pDataAddr, DquVirtualDeviceStruct *pVirtualDeviceStr)
{
	UINT8 * pData = pDataAddr;
	UINT8 rtnvalue = 0u;

	if ((NULL != pData) && (NULL != pVirtualDeviceStr))
	{

		pVirtualDeviceStr->vDeviceId = dquCiShortFromChar(pData);    /*虚拟设备ID*/ 
		pData += 2u;

		pVirtualDeviceStr->vDeviceType = *pData;					 /* 虚拟设备类型*/
		pData += 1u;

		rtnvalue = 1u;
	}

	return rtnvalue;
}

/*********************************************
*函数功能：从点式临时限速配置数据（计轴区段）表到点式临时限速配置结构的转换
*参数说明：pDataAddr数据地址，
*          pDquOutStationSigStr CI配置数据结构体指针
*返回值：0，失败；1，成功
*********************************************/
UINT8 PZDquOutStationSigAxisSecInfo(UINT8 * pDataAddr, DquOutStationSigStruct *pOutStationSigStr)
{
	UINT8 * pData = pDataAddr;
	UINT8 rtnvalue = 0u;
	UINT8 ii;
	UINT16 axisSecId = 0u;


	if ((NULL != pDataAddr) && (NULL != pOutStationSigStr))
	{
		pOutStationSigStr->wRelatedAxisSecSum = 0u;                       /*关联计轴区段数量初始化为0*/

		pOutStationSigStr->wSignalId = dquCiShortFromChar(pData);        /* 信号机ID*/ 
		pData += 2u;

		for(ii = 0u;ii < OUTSTATION_SIGNAL_RELATED_AXISSEC_SUM_MAX;ii++)
		{
			axisSecId = dquCiShortFromChar(pData);                           /*计轴区段ID*/
			pData += 2u;

			if(0u != axisSecId) 
			{
				pOutStationSigStr->wRelatedAxisSecIdBuf[pOutStationSigStr->wRelatedAxisSecSum] = axisSecId;
				pOutStationSigStr->wRelatedAxisSecSum++;
			}
			else
			{
			}
		}
		rtnvalue = 1u;
	}
	else
	{
	}
	return rtnvalue;

}
/*********************************************
*函数功能：从虚拟联锁与OC对应关系表数据表到虚拟联锁结构体数据转换
*参数说明：pDataAddr数据地址，
*          pIncludeOCBuf 虚拟联锁包含OC
*返回值：包含数量
*********************************************/
UINT8 PZDquVirCIWithOCRelatFromChar(UINT8 * pDataAddr, UINT8 *pIncludeOCBuf)
{
	UINT8 * pData = pDataAddr;
	UINT8 rtnvalue = 0u;/*数目*/
	UINT16 ocid = 0u;
	UINT8 OCNum = 0u;
	UINT8 i =0u;

	if ((NULL != pData) && (NULL != pIncludeOCBuf))
	{
		for(i=0u;i<(CI_SYSTEM_VIRCI_INCLUDEOC_LEN-2u)/2u;i++)
		{
			ocid = ShortFromChar(pData);
			pData+=2u;
			if(VIRTUAL_CI_INCLUDE_OC_MAX > OCNum)
			{
				if(ocid < UINT16_MAX)
				{
					pIncludeOCBuf[OCNum++] =(UINT8)ocid;
				}
			}
		}
		rtnvalue = OCNum;
	}

	return rtnvalue;
}

/*********************************************
*函数功能：读取每行主体信号机与复示信号机表配置数据
*参数说明：pDataAddr数据地址，
*          pFushiSignalIdBuf 信号机包含复示信号机ID数组
*返回值：信号机包含复示信号机数量
*********************************************/
UINT8 PZDquSigWithFushiSigFromChar(UINT8* pDataAddr, UINT16* pFushiSignalIdBuf)
{
	UINT8* pData = pDataAddr;
	UINT8 rtnvalue = 0;/*数目*/
	UINT16 fushiSignalId = 0u;
	UINT8 fushiSignalNum = 0u;
	UINT8 i = 0u;

	if ((NULL != pData) && (NULL != pFushiSignalIdBuf))
	{
		for (i = 0U; i < (CI_SYSTEM_SIGWITHFUSHISIG_LEN - 2U) / 2U; i++)
		{
			fushiSignalId = ShortFromChar(pData);
			pData += 2;
			if (SIGNAL_FUSHINUM_MAX > fushiSignalNum)
			{
				if ((fushiSignalId < UINT16_MAX) && (0U != fushiSignalId))
				{
					pFushiSignalIdBuf[fushiSignalNum++] = fushiSignalId;
					SetSignalIsfushiFlag(fushiSignalId, SIGNALTYPE_FUSHI_YES);/*根据配置数据，设置信号机的复示属性*/
				}
			}
		}
		rtnvalue = fushiSignalNum;
	}

	return rtnvalue;
}

/*********************************************
*函数功能：读取每行总SPKS管辖各SPKS关系表配置数据
*参数说明：pDataAddr数据地址，
*          pSpksIncludeSpksIdBuf 管辖的spksID数组
*返回值：信号机包含复示信号机数量
*********************************************/
UINT8 PZDquTotalSpksWithSpksFromChar(UINT8* pDataAddr, UINT16* pSpksIncludeSpksIdBuf)
{
	UINT8* pData = pDataAddr;
	UINT8 rtnvalue = 0;/*数目*/
	UINT16 spksId = 0u;
	UINT8 spksNum = 0u;
	UINT8 i = 0u;

	if ((NULL != pData) && (NULL != pSpksIncludeSpksIdBuf))
	{
		for (i = 0U; i < (CI_SYSTEM_ZSPKS_INCLUDE_LEN - 2U) / 2U; i++)
		{
			spksId = ShortFromChar(pData);
			pData += 2;
			if (INCLUDELESPKS_MAX_NUM > spksNum)
			{
				if ((spksId < UINT16_MAX) && (0U != spksId))
				{
					pSpksIncludeSpksIdBuf[spksNum++] = spksId;
				}
			}
		}
		rtnvalue = spksNum;
	}

	return rtnvalue;
}

/*
功能描述: 将原始数据转换为分界点数据
输入参数:	UINT8 * pDataAddr 数据地址
输出参数:	DquCutoffPointStruct * pCutoffPointData 分界点数据结构体指针
返回值:	0 失败
1 成功
*/
UINT8 PZDquCutoffPointDataFromChar(UINT8 * pDataAddr, DquCutoffPointStruct * pCutoffPointData)
{
	UINT8 retVal = 0u;

	if ((NULL != pDataAddr) && (NULL != pCutoffPointData))
	{

		pCutoffPointData->wCutoffPointId = dquCiShortFromChar(pDataAddr);	/*序号*/
		pDataAddr += 2u;

		pCutoffPointData->wCutoffPointLinkId = dquCiShortFromChar(pDataAddr);	/*LinkId*/
		pDataAddr += 2u;

		pCutoffPointData->dwCutoffPointLinkOff = dquCiLongFromChar(pDataAddr);	/*LinkId*/
		pDataAddr += 4u;

		pCutoffPointData->wRelativeTioc1 = dquCiShortFromChar(pDataAddr);	/*关联Tioc1编号*/
		pDataAddr += 2u;

		pCutoffPointData->wRelativeTioc2 = dquCiShortFromChar(pDataAddr);	/*关联Tioc2编号*/
		pDataAddr += 2u;
		retVal = 1u;
	}

	return retVal;
}

/*
功能描述: 将原始数据转换为TIOC ATS网关设备数据
输入参数:	UINT8 * pDataAddr 数据地址
输出参数:	DquGatewayDeviceStruct * pGatewayDeviceData 联络线数据结构体指针
返回值:	0 失败
1 成功
*/
UINT8 PZDquGatewayDeviceDataFromChar(UINT8 * pDataAddr, DquGatewayDeviceStruct * pGatewayDeviceData)
{
	/*变量初始化*/
	UINT8 retVal = 0u;

	/*参数不为空*/
	if ((NULL != pDataAddr) && (NULL != pGatewayDeviceData))
	{

		pGatewayDeviceData->wTiocId = dquCiShortFromChar(pDataAddr);	/*ID*/
		pDataAddr += 2u;

		pGatewayDeviceData->wGatewayDeviceId = dquCiShortFromChar(pDataAddr);	/*计轴区段ID*/
		pDataAddr += 2u;

		retVal = 1u;
	}
	else
	{

	}

	return retVal;
}