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

📄 hl_serv_c.c

📁 是zmac的协议的全部完整的解析.代码例子很全
💻 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 + -