📄 hl_od_c.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 + -