⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hl_od_c.c

📁 是zmac的协议的全部完整的解析.代码例子很全
💻 C
字号:
#include	"HL_OD_Ext.h"
#include	"HL_GPRS_Ext.h"


/************************************************************************************/
/*	此函数用于获得对象的OD描述,其描述信息存放于 psOD_Info中。支持两种方式:		*/
/*	索引方式:sOD_Type.ucGet_OD_Type = 1; 返回索引为sOD_Type.uiOD_Index的OD描述		*/
/*	数据标识方式:sOD_Type.ucGet_OD_Type = 2; 返回标识为sOD_Type.uiCode_ID的OD描述	*/
/*	返回值:0 = 成功;1 = 索引不存在;2 = 数据标识不存在;3 = 其他错误				*/
/************************************************************************************/
USIGN8	Get_OD ( Get_OD_Type sOD_Type,  OD_Info *psOD_Info )
{
	USIGN8	i;
	USIGN8	ucResult;

	switch ( sOD_Type.ucGet_OD_Type )
	{
		case 1:		/* GetOD by OD index */

			ucResult = 1;

			if ( sOD_Type.sOD_Class.uiOD_Index == 0 )			/* OD自身的描述 */
			{
				psOD_Info->ucOD_Type								 = HL_OD_DESCRIPTION;
				psOD_Info->sOD_Entry.sOD_Description.uiIndex		 = 0;
				psOD_Info->sOD_Entry.sOD_Description.cOD_Version[0]	 = '0';
				psOD_Info->sOD_Entry.sOD_Description.cOD_Version[1]	 = '1';
				psOD_Info->sOD_Entry.sOD_Description.cOD_Version[2]	 = '0';
				psOD_Info->sOD_Entry.sOD_Description.cOD_Version[3]	 = '0';
				psOD_Info->sOD_Entry.sOD_Description.cManufacture_Name[0]= 'H';
				psOD_Info->sOD_Entry.sOD_Description.cManufacture_Name[1]= 'o';
				psOD_Info->sOD_Entry.sOD_Description.cManufacture_Name[2]= 'l';
				psOD_Info->sOD_Entry.sOD_Description.cManufacture_Name[3]= 'l';
				psOD_Info->sOD_Entry.sOD_Description.cManufacture_Name[4]= 'e';
				psOD_Info->sOD_Entry.sOD_Description.cManufacture_Name[5]= 'y';
				for ( i=0; i<11; i++ )
					psOD_Info->sOD_Entry.sOD_Description.cModule_Number[i] =
						sGPRS_Parameter.cModule_Number[i];
				psOD_Info->sOD_Entry.sOD_Description.bEncrypt_Enable =
						sGPRS_Parameter.bEncrypt_Enable;
				psOD_Info->sOD_Entry.sOD_Description.uiPrimary_OD_Length = 255;
				psOD_Info->sOD_Entry.sOD_Description.uiOD_Directry_Index = OD_DIRECTRY_INDEX;

				ucResult = 0;
			}

			if ( ( sOD_Type.sOD_Class.uiOD_Index > 0 ) &&
				 ( sOD_Type.sOD_Class.uiOD_Index <= 255 ) )		/* Primary OD的描述 */
			{
				ucResult = Get_Index_OD (	sOD_Type.sOD_Class.uiOD_Index,
											&sPrimary_OD_Entry,
											LENGTH_OF_PRIMARY_OD,
											psOD_Info );
			}

			if ( sOD_Type.sOD_Class.uiOD_Index == OD_DIRECTRY_INDEX )	/* uiOD_Directry[]的描述 */
			{
				psOD_Info->ucOD_Type							= HL_ARRAY_OD;
				psOD_Info->sOD_Entry.sArray_OD.uiIndex			= OD_DIRECTRY_INDEX;
				psOD_Info->sOD_Entry.sArray_OD.uiCode_ID		= 0;
				psOD_Info->sOD_Entry.sArray_OD.ucElement_Type	= HL_DT_INTEGER_16;
				psOD_Info->sOD_Entry.sArray_OD.ucElement_Unit	= 0;
				psOD_Info->sOD_Entry.sArray_OD.ucElement_Number	= NUMBER_OF_OD_LIST;
				psOD_Info->sOD_Entry.sArray_OD.ucElement_Length	= 2;
				psOD_Info->sOD_Entry.sArray_OD.ucDecimal_Point	= 0;
				psOD_Info->sOD_Entry.sArray_OD.ucAccess			= HL_RO_ACCESS;
				psOD_Info->sOD_Entry.sArray_OD.pvLocal_Address	= ( void* ) &uiOD_Directry;

				ucResult = 0;
			}

			if ( sOD_Type.sOD_Class.uiOD_Index == FIRST_OD_INDEX )	/* uiGPRS_Code[]的描述 */
			{
				psOD_Info->ucOD_Type							= HL_ARRAY_OD;
				psOD_Info->sOD_Entry.sArray_OD.uiIndex			= FIRST_OD_INDEX;
				psOD_Info->sOD_Entry.sArray_OD.uiCode_ID		= 0;
				psOD_Info->sOD_Entry.sArray_OD.ucElement_Type	= HL_DT_INTEGER_16;
				psOD_Info->sOD_Entry.sArray_OD.ucElement_Unit	= 0;
				psOD_Info->sOD_Entry.sArray_OD.ucElement_Number	= FIRST_OD_LENGTH;
				psOD_Info->sOD_Entry.sArray_OD.ucElement_Length	= 2;
				psOD_Info->sOD_Entry.sArray_OD.ucDecimal_Point	= 0;
				psOD_Info->sOD_Entry.sArray_OD.ucAccess			= HL_RO_ACCESS;
				psOD_Info->sOD_Entry.sArray_OD.pvLocal_Address	= ( void* ) &uiGPRS_Code;

				ucResult = 0;
			}

			if ( ( sOD_Type.sOD_Class.uiOD_Index > FIRST_OD_INDEX ) &&
				 ( ( sOD_Type.sOD_Class.uiOD_Index - FIRST_OD_INDEX ) <= FIRST_OD_LENGTH ) )
			{
				ucResult = Get_Index_OD (	sOD_Type.sOD_Class.uiOD_Index,
											&sGPRS_OD_Entry,
											FIRST_OD_LENGTH,
											psOD_Info );

			}

			break;

		case 2:		/* GetOD by Data Code_ID */
			
			ucResult = 2;

			for ( i=0; i<FIRST_OD_LENGTH; i++ )
			{
				if ( sOD_Type.sOD_Class.uiCode_ID == uiGPRS_Code[i] )
				{
					ucResult = Get_Index_OD (	FIRST_OD_INDEX + 1 + i,
												&sGPRS_OD_Entry,
												FIRST_OD_LENGTH,
												psOD_Info );
					break;
				}
			}
			break;

		default:
			ucResult = 3;
			break;
	}

	return	ucResult;
}



/************************************************************************************/
/*	此函数根据对象的OD索引uiIndex,所属的目录对象psOD_Entry,来获得对象的描述描述。		*/
/*	其描述信息存放于 psOD_Info中。													*/
/*	返回值:0 = 成功;1 = 索引不存在;2 = 其他错误										*/
/************************************************************************************/
USIGN8	Get_Index_OD (  USIGN16			uiIndex,
						OD_Entry	rom	*psOD_Entry,
						USIGN8			ucOD_Length,
						OD_Info			*psOD_Info )
{
	USIGN8					i, j;
	Primary_OD			rom	* psPrimary_OD;
	Primary_Struct_OD	rom	* psPrimary_Struct_OD;
	Simple_OD			rom	* psSimple_OD;
	Array_OD			rom	* psArray_OD;
	Struct_OD			rom	* psStruct_OD;

	USIGN8				ucResult = 0;

	for ( i=0; i<ucOD_Length; i++ )
		if ( ( psOD_Entry + i )->uiOD_Index == uiIndex )
			break;

	if ( i < ucOD_Length )
	{
		switch ( ( psOD_Entry + i )->ucOD_Type )
		{
			case HL_PRIMARY_OD:
				psPrimary_OD = ( Primary_OD rom * ) ( psOD_Entry + i )->pvLocal_Address;

				psOD_Info->ucOD_Type = HL_PRIMARY_OD;
				psOD_Info->sOD_Entry.sPrimary_OD.uiIndex = psPrimary_OD->uiIndex;

				psOD_Info->sOD_Entry.sPrimary_OD.ucDesc_Length =
													psPrimary_OD->ucDesc_Length;

				for ( j=0; j<psPrimary_OD->ucDesc_Length; j++ )
					psOD_Info->sOD_Entry.sPrimary_OD.cDescription[j] = 
													psPrimary_OD->cDescription[j];
				break;

			case HL_PRIMARY_STRUCT_OD:
				psPrimary_Struct_OD =
								( Primary_Struct_OD rom * ) ( psOD_Entry + i )->pvLocal_Address;

				psOD_Info->ucOD_Type = HL_PRIMARY_STRUCT_OD;

				psOD_Info->sOD_Entry.sPrimary_Struct_OD.uiIndex =
												psPrimary_Struct_OD->uiIndex;
				psOD_Info->sOD_Entry.sPrimary_Struct_OD.ucElement_Number =
												psPrimary_Struct_OD->ucElement_Number;

				for ( j=0; j<psPrimary_Struct_OD->ucElement_Number; j++ )
				{
					psOD_Info->sOD_Entry.sPrimary_Struct_OD.sElement_Desc[j].ucElement_Type = 
								psPrimary_Struct_OD->sElement_Desc[j].ucElement_Type;

					psOD_Info->sOD_Entry.sPrimary_Struct_OD.sElement_Desc[j].ucElement_Unit = 
								psPrimary_Struct_OD->sElement_Desc[j].ucElement_Unit;

					psOD_Info->sOD_Entry.sPrimary_Struct_OD.sElement_Desc[j].ucElement_Length = 
								psPrimary_Struct_OD->sElement_Desc[j].ucElement_Length;

					psOD_Info->sOD_Entry.sPrimary_Struct_OD.sElement_Desc[j].ucDecimal_Point = 
								psPrimary_Struct_OD->sElement_Desc[j].ucDecimal_Point;

					psOD_Info->sOD_Entry.sPrimary_Struct_OD.sElement_Desc[j].ucAccess = 
								psPrimary_Struct_OD->sElement_Desc[j].ucAccess;
				}

				break;

			case HL_SIMPLE_OD:
				psSimple_OD = ( Simple_OD rom * ) ( psOD_Entry + i )->pvLocal_Address;

				psOD_Info->ucOD_Type = HL_SIMPLE_OD;

				psOD_Info->sOD_Entry.sSimple_OD.uiIndex			= psSimple_OD->uiIndex;
				psOD_Info->sOD_Entry.sSimple_OD.uiCode_ID		= psSimple_OD->uiCode_ID;
				psOD_Info->sOD_Entry.sSimple_OD.ucData_Type		= psSimple_OD->ucData_Type;
				psOD_Info->sOD_Entry.sSimple_OD.ucUnit			= psSimple_OD->ucUnit;
				psOD_Info->sOD_Entry.sSimple_OD.ucLength		= psSimple_OD->ucLength;
				psOD_Info->sOD_Entry.sSimple_OD.ucDecimal_Point	= psSimple_OD->ucDecimal_Point;
				psOD_Info->sOD_Entry.sSimple_OD.ucAccess		= psSimple_OD->ucAccess;
				psOD_Info->sOD_Entry.sSimple_OD.pvLocal_Address = psSimple_OD->pvLocal_Address;

				break;

			case HL_ARRAY_OD:
				psArray_OD = ( Array_OD rom * ) ( psOD_Entry + i )->pvLocal_Address;

				psOD_Info->ucOD_Type = HL_ARRAY_OD;

				psOD_Info->sOD_Entry.sArray_OD.uiIndex			= psArray_OD->uiIndex;
				psOD_Info->sOD_Entry.sArray_OD.uiCode_ID		= psArray_OD->uiCode_ID;
				psOD_Info->sOD_Entry.sArray_OD.ucElement_Type	= psArray_OD->ucElement_Type;
				psOD_Info->sOD_Entry.sArray_OD.ucElement_Unit	= psArray_OD->ucElement_Unit;
				psOD_Info->sOD_Entry.sArray_OD.ucElement_Number	= psArray_OD->ucElement_Number;
				psOD_Info->sOD_Entry.sArray_OD.ucElement_Length	= psArray_OD->ucElement_Length;
				psOD_Info->sOD_Entry.sArray_OD.ucDecimal_Point	= psArray_OD->ucDecimal_Point;
				psOD_Info->sOD_Entry.sArray_OD.ucAccess			= psArray_OD->ucAccess;
				psOD_Info->sOD_Entry.sArray_OD.pvLocal_Address	= psArray_OD->pvLocal_Address;

				break;

			case HL_STRUCT_OD:
				psStruct_OD = ( Struct_OD rom * ) ( psOD_Entry + i )->pvLocal_Address;

				psOD_Info->ucOD_Type = HL_STRUCT_OD;

				psOD_Info->sOD_Entry.sStruct_OD.uiIndex			 = psStruct_OD->uiIndex;
				psOD_Info->sOD_Entry.sStruct_OD.uiCode_ID		 = psStruct_OD->uiCode_ID;
				psOD_Info->sOD_Entry.sStruct_OD.ucElement_Number = psStruct_OD->ucElement_Number;
				psOD_Info->sOD_Entry.sStruct_OD.pvLocal_Address	 = psStruct_OD->pvLocal_Address;
												

				for ( j=0; j<psStruct_OD->ucElement_Number; j++ )
				{
					psOD_Info->sOD_Entry.sStruct_OD.sElement_Desc[j].ucElement_Type = 
								psStruct_OD->sElement_Desc[j].ucElement_Type;

					psOD_Info->sOD_Entry.sStruct_OD.sElement_Desc[j].ucElement_Unit = 
								psStruct_OD->sElement_Desc[j].ucElement_Unit;

					psOD_Info->sOD_Entry.sStruct_OD.sElement_Desc[j].ucElement_Length = 
								psStruct_OD->sElement_Desc[j].ucElement_Length;

					psOD_Info->sOD_Entry.sStruct_OD.sElement_Desc[j].ucDecimal_Point = 
								psStruct_OD->sElement_Desc[j].ucDecimal_Point;

					psOD_Info->sOD_Entry.sStruct_OD.sElement_Desc[j].ucAccess = 
								psStruct_OD->sElement_Desc[j].ucAccess;
				}

				break;

			default:
				ucResult = 2;
		}
	}
	else
		ucResult = 1;

	return	ucResult;
}



/************************************************************************************/
/*	此函数根据对象的OD索引uiIndex和ucSub_index,来获得对象的数据类型。					*/
/*	返回值代表数据的类型,如果返回0,说明索引错误										*/
/************************************************************************************/
USIGN8	Get_Parameter_Type ( USIGN16 uiIndex, USIGN8 ucSub_Index )
{
	Get_OD_Type		sOD_Temp;
	USIGN8			ucResult;

	sOD_Temp.ucGet_OD_Type = 1;
	sOD_Temp.sOD_Class.uiOD_Index = uiIndex;

	ucResult = Get_OD ( sOD_Temp, &sOD_Information );

	if ( ucResult == 0 )
	{
		switch ( sOD_Information.ucOD_Type )
		{
			case HL_SIMPLE_OD:
				return	sOD_Information.sOD_Entry.sSimple_OD.ucData_Type;
				break;

			case HL_ARRAY_OD:
				return	sOD_Information.sOD_Entry.sArray_OD.ucElement_Type;
				break;

			case HL_STRUCT_OD:
				if ( ( ucSub_Index > 0 ) &&
					 ( ucSub_Index <= sOD_Information.sOD_Entry.sStruct_OD.ucElement_Number ) )
				{
					return	sOD_Information.sOD_Entry.sStruct_OD.sElement_Desc[ucSub_Index-1].ucElement_Type;
				}
				else
					return	0;

				break;

			default:
				return	0;
		}
	}
}




#ifdef	EXCHANGE_INT
/************************************************************************************/
/*	此函数将pucData所指向的数据高低字节进行交换。										*/
/*	ucData_Length是数据的长度。如果是2,则是整型,如果是4,则是长整型					*/
/************************************************************************************/
	void	Swamp_Data ( USIGN8 * pucData, USIGN8 ucData_Length )
	{
		USIGN8		ucTemp;

		if ( ucData_Length == 2 )
		{
			ucTemp = pucData[0];
			pucData[0] = pucData[1];
			pucData[1] = ucTemp;
		}
		else
		{
			if ( ucData_Length == 4 )
			{
				ucTemp = pucData[0];
				pucData[0] = pucData[3];
				pucData[3] = ucTemp;

				ucTemp = pucData[2];
				pucData[2] = pucData[3];
				pucData[3] = ucTemp;
			}
		}
	}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -