📄 hl_serv_c.c
字号:
#include "HL_Serv_Ext.h"
/************************************************************************************/
/* 此函数读取索引为uiIndex,子索引为ucSub_Index对象的数据, */
/* 读取结果存放于psRead_Data中。 */
/* 返回值:0 = 成功;1 = 索引错误;3 = 其他错误 */
/************************************************************************************/
USIGN8 Read_Data ( USIGN16 uiIndex, USIGN8 ucSub_Index, Data_Buffer *psRead_Data )
{
USIGN8 i;
USIGN8 ucSwap_Temp;
USIGN8 ucResult;
USIGN8 *pucTemp;
USIGN8 ucOff_Set;
Get_OD_Type sOD_Temp;
if ( uiIndex < OD_DIRECTRY_INDEX )
return 1;
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:
pucTemp = ( USIGN8 * ) sOD_Information.sOD_Entry.sSimple_OD.pvLocal_Address;
psRead_Data->uiData_Length = sOD_Information.sOD_Entry.sSimple_OD.ucLength;
for ( i=0; i<psRead_Data->uiData_Length; i++ )
psRead_Data->ucBuffer[i] = pucTemp[i];
#ifdef EXCHANGE_INT
if ( sOD_Information.sOD_Entry.sSimple_OD.ucData_Type == HL_DT_INTEGER_16 )
Swamp_Data ( psRead_Data->ucBuffer, 2 );
#endif
break;
case HL_ARRAY_OD:
pucTemp = ( USIGN8 * ) sOD_Information.sOD_Entry.sArray_OD.pvLocal_Address;
if ( ucSub_Index == 0 ) /* 读取整个数组数据 */
{
psRead_Data->uiData_Length =
sOD_Information.sOD_Entry.sArray_OD.ucElement_Number *
sOD_Information.sOD_Entry.sArray_OD.ucElement_Length;
for ( i=0; i<psRead_Data->uiData_Length; i++ )
psRead_Data->ucBuffer[i] = pucTemp[i];
#ifdef EXCHANGE_INT
if ( sOD_Information.sOD_Entry.sArray_OD.ucElement_Type == HL_DT_INTEGER_16 )
for ( i=0; i<sOD_Information.sOD_Entry.sArray_OD.ucElement_Number; i++ )
Swamp_Data ( psRead_Data->ucBuffer + 2*i, 2 );
#endif
}
else
{
if ( ucSub_Index <= sOD_Information.sOD_Entry.sArray_OD.ucElement_Number )
{
psRead_Data->uiData_Length =
sOD_Information.sOD_Entry.sArray_OD.ucElement_Length;
ucOff_Set = ( ucSub_Index - 1 ) * psRead_Data->uiData_Length;
for ( i=0; i<psRead_Data->uiData_Length; i++ )
psRead_Data->ucBuffer[i] = pucTemp[ucOff_Set+i];
#ifdef EXCHANGE_INT
if ( sOD_Information.sOD_Entry.sArray_OD.ucElement_Type == HL_DT_INTEGER_16 )
Swamp_Data ( psRead_Data->ucBuffer + 2*(ucSub_Index-1), 2 );
#endif
}
else
ucResult = 1;
}
break;
case HL_STRUCT_OD:
pucTemp = ( USIGN8 * ) sOD_Information.sOD_Entry.sStruct_OD.pvLocal_Address;
if ( ucSub_Index == 0 ) /* 读取整个结构数据 */
{
psRead_Data->uiData_Length = 0;
for ( i=0; i<sOD_Information.sOD_Entry.sStruct_OD.ucElement_Number; i++ )
{
psRead_Data->uiData_Length +=
sOD_Information.sOD_Entry.sStruct_OD.sElement_Desc[i].ucElement_Length;
}
for ( i=0; i<psRead_Data->uiData_Length; i++ )
psRead_Data->ucBuffer[i] = pucTemp[i];
#ifdef EXCHANGE_INT
ucOff_Set = 0;
for ( i=0; i<sOD_Information.sOD_Entry.sStruct_OD.ucElement_Number; i++ )
{
if ( sOD_Information.sOD_Entry.sStruct_OD.sElement_Desc[i].ucElement_Type == HL_DT_INTEGER_16 )
Swamp_Data ( psRead_Data->ucBuffer + ucOff_Set, 2 );
ucOff_Set +=
sOD_Information.sOD_Entry.sStruct_OD.sElement_Desc[i].ucElement_Length;
}
#endif
}
else
{
if ( ucSub_Index <= sOD_Information.sOD_Entry.sStruct_OD.ucElement_Number )
{
psRead_Data->uiData_Length =
sOD_Information.sOD_Entry.sStruct_OD.sElement_Desc[ucSub_Index-1].ucElement_Length;
ucOff_Set = 0;
for ( i=0; i<ucSub_Index-1; i++ )
{
ucOff_Set +=
sOD_Information.sOD_Entry.sStruct_OD.sElement_Desc[i].ucElement_Length;
}
for ( i=0; i<psRead_Data->uiData_Length; i++ )
psRead_Data->ucBuffer[i] = pucTemp[ucOff_Set+i];
#ifdef EXCHANGE_INT
if ( sOD_Information.sOD_Entry.sStruct_OD.sElement_Desc[ucSub_Index-1].ucElement_Type == HL_DT_INTEGER_16 )
Swamp_Data ( psRead_Data->ucBuffer, 2 );
#endif
}
else
ucResult = 1;
}
break;
default:
ucResult = 3;
break;
}
}
return ucResult;
}
/************************************************************************************/
/* 此函数改写索引为uiIndex,子索引为ucSub_Index对象的数据, */
/* 要写入的数据存放于pucData中,数据长度为ucLength */
/* 返回值:0 = 成功;1 = 索引错误;2= 数据长度错误;3 = 数据只读;4 = 其他错误 */
/************************************************************************************/
USIGN8 Write_Data ( USIGN16 uiIndex, USIGN8 ucSub_Index, USIGN8 *pucData, USIGN8 ucLength )
{
USIGN8 i;
USIGN8 ucResult;
USIGN8 *pucTemp;
USIGN8 ucData_Length;
USIGN8 ucOff_Set;
Get_OD_Type sOD_Temp;
if ( uiIndex < OD_DIRECTRY_INDEX )
return 1;
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:
if ( sOD_Information.sOD_Entry.sSimple_OD.ucAccess == HL_RO_ACCESS )
ucResult = 3;
else
{
if ( sOD_Information.sOD_Entry.sSimple_OD.ucLength == ucLength )
{
pucTemp = ( USIGN8 * ) sOD_Information.sOD_Entry.sSimple_OD.pvLocal_Address;
#ifdef EXCHANGE_INT
if ( sOD_Information.sOD_Entry.sSimple_OD.ucData_Type == HL_DT_INTEGER_16 )
Swamp_Data ( pucData, 2 );
#endif
for ( i=0; i<ucLength; i++ )
pucTemp[i] = pucData[i];
}
else
ucResult = 2;
}
break;
case HL_ARRAY_OD:
if ( sOD_Information.sOD_Entry.sArray_OD.ucAccess == HL_RO_ACCESS )
ucResult = 3;
else
{
pucTemp = ( USIGN8 * ) sOD_Information.sOD_Entry.sArray_OD.pvLocal_Address;
if ( ucSub_Index == 0 ) /* 写入整个数组数据 */
{
ucData_Length =
sOD_Information.sOD_Entry.sArray_OD.ucElement_Number *
sOD_Information.sOD_Entry.sArray_OD.ucElement_Length;
#ifdef EXCHANGE_INT
if ( sOD_Information.sOD_Entry.sArray_OD.ucElement_Type == HL_DT_INTEGER_16 )
for ( i=0; i<sOD_Information.sOD_Entry.sArray_OD.ucElement_Number; i++ )
Swamp_Data ( pucData + 2*i, 2 );
#endif
if ( ucData_Length == ucLength )
{
for ( i=0; i<ucLength; i++ )
pucTemp[i] = pucData[i];
}
else
ucResult = 2;
}
else
{
if ( ucSub_Index <= sOD_Information.sOD_Entry.sArray_OD.ucElement_Number )
{
ucData_Length =
sOD_Information.sOD_Entry.sArray_OD.ucElement_Length;
if ( ucData_Length == ucLength )
{
ucOff_Set = ( ucSub_Index - 1 ) * ucData_Length;
#ifdef EXCHANGE_INT
if ( sOD_Information.sOD_Entry.sArray_OD.ucElement_Type == HL_DT_INTEGER_16 )
Swamp_Data ( pucData + 2*(ucSub_Index-1), 2 );
#endif
for ( i=0; i<ucLength; i++ )
pucTemp[ucOff_Set+i] = pucData[i];
}
else
ucResult = 2;
}
else
ucResult = 1;
}
}
break;
case HL_STRUCT_OD:
pucTemp = ( USIGN8 * ) sOD_Information.sOD_Entry.sStruct_OD.pvLocal_Address;
if ( ucSub_Index == 0 ) /* 写入整个结构数据 */
{
ucData_Length = 0;
for ( i=0; i<sOD_Information.sOD_Entry.sStruct_OD.ucElement_Number; i++ )
ucData_Length +=
sOD_Information.sOD_Entry.sStruct_OD.sElement_Desc[i].ucElement_Length;
if ( ucData_Length == ucLength )
{
ucOff_Set = 0;
for ( i=0; i<sOD_Information.sOD_Entry.sStruct_OD.ucElement_Number; i++ )
{
if ( sOD_Information.sOD_Entry.sStruct_OD.sElement_Desc[i].ucAccess != HL_RO_ACCESS )
{
#ifdef EXCHANGE_INT
if ( sOD_Information.sOD_Entry.sStruct_OD.sElement_Desc[i].ucElement_Type == HL_DT_INTEGER_16 )
Swamp_Data ( pucData + ucOff_Set, 2 );
#endif
for ( i=0; i<sOD_Information.sOD_Entry.sStruct_OD.sElement_Desc[i].ucElement_Length; i++ )
pucTemp[i+ucOff_Set] = pucData[i+ucOff_Set];
}
ucOff_Set +=
sOD_Information.sOD_Entry.sStruct_OD.sElement_Desc[i].ucElement_Length;
}
}
else
ucResult = 2;
}
else
{
if ( ucSub_Index <= sOD_Information.sOD_Entry.sStruct_OD.ucElement_Number )
{
if ( sOD_Information.sOD_Entry.sStruct_OD.sElement_Desc[ucSub_Index-1].ucAccess == HL_RO_ACCESS )
ucResult = 3;
else
{
ucData_Length =
sOD_Information.sOD_Entry.sStruct_OD.sElement_Desc[ucSub_Index-1].ucElement_Length;
if ( ucData_Length == ucLength )
{
ucOff_Set = 0;
for ( i=0; i<ucSub_Index-1; i++ )
{
ucOff_Set +=
sOD_Information.sOD_Entry.sStruct_OD.sElement_Desc[i].ucElement_Length;
}
#ifdef EXCHANGE_INT
if ( sOD_Information.sOD_Entry.sStruct_OD.sElement_Desc[ucSub_Index-1].ucElement_Type == HL_DT_INTEGER_16 )
Swamp_Data ( pucData, 2 );
#endif
for ( i=0; i<ucData_Length; i++ )
pucTemp[i+ucOff_Set] = pucData[i];
}
else
ucResult = 2;
}
}
else
ucResult = 1;
}
break;
default:
ucResult = 4;
break;
}
}
return ucResult;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -