/********************************************************
*                                                      
*  文件名   ： CbtcVersion.c         
*  版权说明 ： 北京交控科技有限公司 
*  版本号   ： 1.0
*  创建时间 ： 2012.07.23
*  作者     ： 研发中心软件部
*  功能描述 ： 版本号格式转换软件                                                                    
*  修改记录 ：  
*
********************************************************/ 

#include "CbtcVersion.h"


/*
* 功能说明 : 软件模块版本号转换。
* 参数说明 : UINT16 productNo,产品编号
*            UINT16 moduleNo,软件模块编号
*            UINT16 mainVer,主版本号
*            UINT16 subVer，子版本号
* 返回值:    U32表示的版本号
*/
UINT32 VerToU32SoftwareModule(UINT16 productNo,UINT16 moduleNo,UINT16 mainVer,UINT16 subVer)
{
	UINT32 U32Version = 0u; /* 返回结果 */
	
	U32Version = (UINT32)subVer & (0xFFu);
	U32Version|= ((UINT32)mainVer & (0x3Fu))<<(8u);
	U32Version|= ((UINT32)moduleNo & (0x3FFu))<<(14u);
	U32Version|= ((UINT32)productNo & (0xFFu))<<(24u);
	return U32Version;
}

/*
* 功能说明 : 软件模块版本号转换。
* 参数说明 : UINT16 *pProductNo,产品编号
*            UINT16 *pModuleNo,软件模块编号
*            UINT16 *pMainVer,主版本号
*            UINT16 *pSubVer，子版本号
*            UINT32 u32Ver，U32表示的版本号
*修改记录:
*1、修复集成测试缺陷QC-1811,数据转换问题,Baix,2020-04-13;
*/
void VerFromU32SoftwareModule(UINT16 *pProductNo,UINT16 *pModuleNo,UINT16 *pMainVer,UINT16 *pSubVer,UINT32 u32Ver)
{
	if((NULL != pProductNo) && (NULL != pModuleNo) && (NULL != pMainVer) && (NULL != pSubVer))
	{
		*pProductNo = (UINT16)(u32Ver >> (24u));
		*pModuleNo = (UINT16)((u32Ver & (0x00FFC000u)) >> (14u));
		*pMainVer = (UINT16)((u32Ver & (0x00003F00u)) >> (8u));
		*pSubVer = (UINT16)(u32Ver & (0x000000FFu));
	}
	else
	{
		; /*入口参数错误，无操作*/
	}
}

/*
* 功能说明 : 软件集成版本号转换。
* 参数说明 : UINT16 projectNo,项目编号
*            UINT16 productNo,产品编号
*            UINT16 ocNo,可执行文件编号
*            UINT16 integrationNo,集成编号
* 返回值:    U32表示的版本号
*/
UINT32 VerToU32SoftwareInt(UINT16 projectNo,UINT16 productNo,UINT16 ocNo,UINT16 integrationNo)
{
	UINT32 U32Version = 0u; /* 返回结果 */

	U32Version = (UINT32)integrationNo & (0x01FFu);
	U32Version |= ((UINT32)ocNo & (0x7Fu)) << (9u);
	U32Version |= ((UINT32)productNo & (0x3FFu)) << (16u);
	U32Version |= ((UINT32)projectNo & (0xFFu)) << (24u);
	return U32Version;
}

/*
* 功能说明 : 软件集成版本号转换。
* 参数说明 : UINT16* pProjectNo,项目编号
*            UINT16* pProductNo,产品编号
*            UINT16* pOcNo,可执行文件编号
*            UINT16* pIntegrationNo，集成编号
*            UINT32 u32Ver,U32表示的版本号
*/
void VerFromU32SoftwareInt(UINT16* pProjectNo,UINT16* pProductNo,UINT16* pOcNo,UINT16* pIntegrationNo,UINT32 u32Ver)
{

	if ((NULL != pProjectNo) && (NULL != pProductNo) && (NULL != pOcNo) && (NULL != pIntegrationNo))
	{
		*pProjectNo = (UINT16)(u32Ver >> (24u));
		*pProductNo = (UINT16)((u32Ver & (0x00FF0000u)) >> (16u));
		*pOcNo = (UINT16)((u32Ver & (0x0000FE00u)) >> (9u));
		*pIntegrationNo = (UINT16)(u32Ver & (0x000001FFu));
	} 
	else
	{
		; /*入口参数错误，无操作*/
	}
}

/*
* 功能说明 : 数据模块版本号转换。
* 参数说明 : UINT16 projectNo,项目编号
*            UINT16 dataTypeNo,数据类型编号
*            UINT16 dataNo,数据版本号
*            UINT16 reserved,预留信息
* 返回值:    U32表示的版本号
*/
UINT32 VerToU32DataModule(UINT16 projectNo,UINT16 dataTypeNo,UINT16 dataNo,UINT16 reserved)
{
	UINT32 U32Version = 0u; /* 返回结果 */

	U32Version= (UINT32)reserved & (0x0Fu);
	U32Version|=((UINT32)dataNo & (0xFFFu)) << (4u);
	U32Version|=((UINT32)dataTypeNo & (0xFFu)) << (16u);
	U32Version|=((UINT32)projectNo & (0xFFu)) << (24u);
	return U32Version;
}

/*
* 功能说明 : 数据模块版本号转换。
* 参数说明 : UINT16* pProjectNo,项目编号
*            UINT16* pDataTypeNo,数据类型编号
*            UINT16* pDataNo,数据版本号
*            UINT16* pReserved，预留信息
*            UINT32 u32Ver,U32表示的版本号
*/
void VerFromU32DataModule(UINT16* pProjectNo,UINT16* pDataTypeNo,UINT16* pDataNo,UINT16* pReserved,UINT32 u32Ver)
{
	if ((NULL != pProjectNo) && (NULL != pDataTypeNo) && (NULL != pDataNo) && (NULL != pReserved))
	{
		*pProjectNo = (UINT16)(u32Ver >> (24u));
		*pDataTypeNo = (UINT16)((u32Ver & (0x00FF0000u)) >> (16u));
		*pDataNo = (UINT16)((u32Ver & (0x0000FFF0u)) >> (4u));
		*pReserved = (UINT16)(u32Ver & (0x0Fu));
	} 
	else
	{
		; /*入口参数错误，无操作*/
	}
}

/*
* 功能说明 : 数据集成版本号转换。
* 参数说明 : UINT16 projectNo,项目编号
*            UINT16 dataFileNo,数据文件编号
*            UINT16 dataIntNo,数据集成版本号
*            UINT16 reserved,预留信息
* 返回值:    U32表示的版本号
*/
UINT32 VerToU32DataInt(UINT16 projectNo,UINT16 dataFileNo,UINT16 dataIntNo,UINT16 reserved)
{
	UINT32 U32Version = 0u; /* 返回结果 */

	U32Version = (UINT32)reserved & (0x0Fu);
	U32Version |= ((UINT32)dataIntNo & (0xFFFu))<<(4u);
	U32Version |= ((UINT32)dataFileNo & (0xFFu))<<(16u);
	U32Version |= ((UINT32)projectNo & (0xFFu))<<(24u);
	return U32Version;
}

/*
* 功能说明 : 数据模块版本号转换。
* 参数说明 : UINT16* pProjectNo,项目编号
*            UINT16* pDataFileNo,数据文件编号
*            UINT16* pDataIntNo,数据集成版本号
*            UINT16* pReserved，预留信息
*            UINT32 u32Ver,U32表示的版本号
*/
void VerFromU32DataInt(UINT16* pProjectNo,UINT16* pDataFileNo,UINT16* pDataIntNo,UINT16* pReserved,UINT32 u32Ver)
{
	if ((NULL!= pProjectNo) && (NULL != pDataFileNo) && (NULL != pDataIntNo) && (NULL != pReserved))
	{
		*pProjectNo = (UINT16)(u32Ver >> (24u));
		*pDataFileNo = (UINT16)((u32Ver & (0x00FF0000u)) >> (16u));
		*pDataIntNo = (UINT16)((u32Ver & (0x0000FFF0u)) >> (4u));
		*pReserved = (UINT16)(u32Ver & (0x0Fu));
	} 
	else
	{
		; /*入口参数错误，无操作*/
	}

}

