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

📄 holley_d.c

📁 是zmac的协议的全部完整的解析.代码例子很全
💻 C
字号:
#include	"app/sensor/common.h"
#include	"Holley.h"

#ifdef	SINK_APP
	HL_Buffered_Data		sUart_Buffer;
	int16u					ticksSinceLastHeard[EMBER_BINDING_TABLE_SIZE-1];
	int16u					timeBeforeSinkAdvertise; 
#endif

#ifdef	SENSOR_APP
	int8u					aucUart_Buffer[HL_UART_BUFFER_SIZE];
	int16u					uiUart_Point;
	BOOL					bUART_Frame_To_Process;	// 从串口接收到完整数据,等待处理
	int8u					ucProcessed_Package;	// 在分包发送时,已经处理完毕的包数

	int16u					uiUART_Last_Output_Time;// 串口上一帧数据输出时间
	BOOL					bWaiting_UART_Respond;	// 从串口发送数据后,等待回应
	int16u					uiUart_Resp_Time_Out;	// 等待串口响应超时时间

	int8u					ucSensor_Back_Off_State;// 等待随机延时的状态
	int16u					uiBack_Off_Start_Time;	// 随机延时开始时间
	int16u					uiBack_Off_Time;		// 随机延时的时间长度

	int16u					uiMeter_Disc_Sequence;	// 电表发现的进程

	int8u					ucFreeze_Meter_Sequence;// 数据冻结的电表进程
	int8u					ucFreeze_ID_Sequence;	// 数据冻结的数据标识进程
	int8u					aucFrozen_Data[HL_MAX_FROZEN_DATA_LENGTH];

	int8u					ucSensor_State;			// 当前状态, 包含电表发现和数据冻结状态

#endif

int8u					ucReset_Token = 0;

int8u					ucCurrent_MSG = 0;
int8u					aucRF_MSG_Index[HL_MAX_PACKAGE_NUMBER];	// RF 数据在 LinkedBuffers
																// 中的索引
int8u					aucSwam[HL_SWAM_SIZE];

int16u					uiUART_Last_Receive_Time= 0;		// 串口上一次数据接收时间

HL_Full_Time			sCurrent_Time;				// 当前时间

HL_Device_Info	PGM		sHL_Device_Info = {
											{'0','2','0','1'},		// aucSoftware_Version[4]
											{'0','1','2','0'},		// aucHardware_Version[4]
											{'0','1','1','0'},		// aucOD_Version[4]
											{'H','O','L','L','E',	// aucManufacture[12]
											 'Y',' ','M','E','T',
											 'E','R'
											},
											PROFILE_ID,				// uiProfile_ID
											{ 0,0,0,0,0,0,0,0,0,0,	// aucReserved[22]
											  0,0,0,0,0,0,0,0,0,0,
											  0,0
											}
										  };


/************************************************************************/
/*	以下是 Token 数据的缺省值											*/
/************************************************************************/
HL_Network_Para		PGM		sHL_Network_Para =
	{
		APP_CHANNEL,			// ucCurrent_Channel
		FALSE,					// bCompress_Enable
		FALSE,					// bEncrypt_Enable
		APP_POWER,				// ucTransmit_Power
		{ 0,0,0,0,0,0,0,0,		// aucPWD[16]
		  0,0,0,0,0,0,0,0
		},
		APP_PANID,				// uiPAN_ID
		0,						// ucGroup_ID
		{ 0,0,0,0,0,0,0,0,0,0,	// aucReserved[25]
		  0,0,0,0,0,0,0,0,0,0,
		  0,0,0,0,0
		}
	};


#ifdef	SINK_APP

	HL_AMR_Para_Gateway	PGM		sHL_AMR_Para_Gateway =
		{
			900,					// uiAD_Cycle
			3,						// ucRespond_Timeout
			3,						// ucRepeat_Time
			{1, 1, 0, 0},			// sUp_Load_Time
			24,						// ucCollect_Cycle
			1,						// ucRequire_Resp
			HL_RESP_SW_VERSION,		// ucResp_Contents
			HL_BROADCAST_RADIUS,	// ucAD_Radius
			0,						// bReturn_Flow_Ctrl
			{0,0,0,0,0,0,0,0,0,0,	// aucReserved[27]
			 0,0,0,0,0,0,0,0,0,0,
			 0,0,0,0,0,0,0
			}
		};

#endif


#ifdef	SENSOR_APP

	HL_AMR_Para_Config	PGM		sHL_AMR_Para_Config =
		{
			3,						// ucBaud_Rate = 1200
			0,						// ucReserved
			480,					// uiRead_Cycle= 480 min
			{ 1, 1, 0, 0 },			// sTime_Stamp
			50,						// uiUART_Frame_Gap
			200,					// uiUART_Resp_Timeout
			HL_METER_APPLICATION,	// ucApplication, HL_METER_APPLICATION = 0 - 电表
			HL_CONN_TO_METER_RS485,	// ucConnection_To_Meter, HL_CONN_TO_METER_RS485 = 0 - RS485
			4,						// ucRandom_Delay_Scale, 4 - 右移4位,相当于除16
			{0,0,0,0,0,0,0,0,0,0,	// aucReserved[13]
			 0,0,0
			}
		};

	HL_AMR_Data_IDs		PGM		sHL_AMR_Data_IDs =
		{
			0,						// ucData_ID_Numb
			{ 0, 0, 0 },			// aucReserved[3]
			{ 0,0,0,0,0,0,0,0,0,0,
			  0,0,0,0,0,0,0,0,0,0,	// aucData_IDs[24]
			  0,0,0,0
			}
		};

	HL_AMR_Meter_Addr_Low	PGM	sHL_AMR_Meter_Addr_Low =
		{
			0,						// ucMeter_Numb
			FALSE,					// bDiscover_Meter
			{ 0,0 },				// aucReserved[2]
			{ 0,0,0,0,0,0,0,0,0,0,	// aucMeter_Addr_Low_A[48]
			  0,0,0,0,0,0,0,0,0,0,
			  0,0,0,0,0,0,0,0,0,0,
			  0,0,0,0,0,0,0,0,0,0,
			  0,0,0,0,0,0,0,0
			},
			{ 0,0,0,0,0,0,0,0,0,0,	// aucMeter_Addr_Low_B[48]
			  0,0,0,0,0,0,0,0,0,0,
			  0,0,0,0,0,0,0,0,0,0,
			  0,0,0,0,0,0,0,0,0,0,
			  0,0,0,0,0,0,0,0
			}
		};

	HL_AMR_Meter_Addr_High	PGM	sHL_AMR_Meter_Addr_High =
		{
			0,						// ucMeter_Numb
			{ 0,0,0 },				// aucReserved[3]
			{ 0,0,0,0,0,0,0,0,0,0,	// aucMeter_Addr_High_A[48]
			  0,0,0,0,0,0,0,0,0,0,
			  0,0,0,0,0,0,0,0,0,0,
			  0,0,0,0,0,0,0,0,0,0,
			  0,0,0,0,0,0,0,0
			},
			{ 0,0,0,0,0,0,0,0,0,0,	// aucMeter_Addr_High_B[48]
			  0,0,0,0,0,0,0,0,0,0,
			  0,0,0,0,0,0,0,0,0,0,
			  0,0,0,0,0,0,0,0,0,0,
			  0,0,0,0,0,0,0,0
			}
		};

	HL_AMR_Unrespond_Meters	PGM	sHL_AMR_Unrespond_Meters =
		{
			0,						// ucMeter_Numb
			{ 0,0,0 },				// aucReserved[3]
			{ 0,0,0,0,0,0,0,0,0,0,	// aucMeter_Addr_Low[36]
			  0,0,0,0,0,0,0,0,0,0,
			  0,0,0,0,0,0,0,0,0,0,
			  0,0,0,0,0,0
			}
		};

#endif		//	#ifdef	SENSOR_APP


/************************************************************************/
/*	以下是 OD 描述数据													*/
/************************************************************************/

Struct_OD	PGM		sHL_Device_Info_OD =	// HL_Device_Info 的描述
{
	HL_DEVICE_INFO_INDEX,			// uiIndex = 0
	(void*)&sHL_Device_Info,		// pvLocal_Address
	6,								// ucElement_Number
	{
		{							// aucSoftware_Version[4]
			HL_DT_VIS_STRING,			// ucElement_Type
			0,							// ucElement_Unit
			4,							// ucElement_Length
			0,							// ucDecimal_Point
			HL_RO_ACCESS				// ucAccess
		},
		{ HL_DT_VIS_STRING,	0, 4, 0, HL_RO_ACCESS },	// aucHardware_Version[4]
		{ HL_DT_VIS_STRING,	0, 4, 0, HL_RO_ACCESS },	// aucOD_Version[4]
		{ HL_DT_VIS_STRING,	0, 12,0, HL_RO_ACCESS },	// aucManufacture[12]
		{ HL_DT_INTEGER_16,	0, 2, 0, HL_RO_ACCESS },	// uiProfile_ID
		{ HL_DT_VIS_STRING, 0, 22,0, HL_NON_ACCESS},	// aucReserved[22]
	}
};


Struct_OD	PGM		sHL_Network_Para_OD =	// HL_Network_Para 的描述
{
	HL_NETWORK_PARAMETER_INDEX,		// uiIndex = 1001
	0,								// pvLocal_Address
	8,								// ucElement_Number
	{
		{							// ucCurrent_Channel
			HL_DT_INTEGER_8,			// ucElement_Type
			0,							// ucElement_Unit
			1,							// ucElement_Length
			0,							// ucDecimal_Point
			HL_RW_ACCESS				// ucAccess
		},
		{ HL_DT_BOOL,		0, 1, 0, HL_RW_ACCESS },	// bCompress_Enable
		{ HL_DT_BOOL,		0, 1, 0, HL_RW_ACCESS },	// bEncrypt_Enable
		{ HL_DT_INTEGER_8,	0, 1, 0, HL_RW_ACCESS },	// cTransmit_Power
		{ HL_DT_VIS_STRING, 0, 16,0, HL_WO_ACCESS },	// aucPWD[16]
		{ HL_DT_INTEGER_16, 0, 2, 0, HL_RW_ACCESS },	// uiPAN_ID
		{ HL_DT_INTEGER_8,	0, 1, 0, HL_RW_ACCESS },	// ucGroup_ID
		{ HL_DT_VIS_STRING, 0, 25,0, HL_NON_ACCESS},	// aucReserved[25]
	}
};

Struct_OD	PGM		sCurrent_Time_OD =	// HL_Full_Time 的描述
{
	HL_CURRENT_TIME_INDEX,			// uiIndex = 1002
	(void*)&sCurrent_Time,			// pvLocal_Address
	8,								// ucElement_Number
	{
		{							// ucYear
			HL_DT_INTEGER_8,			// ucElement_Type
			0,							// ucElement_Unit
			1,							// ucElement_Length
			0,							// ucDecimal_Point
			HL_RW_ACCESS				// ucAccess
		},
		{ HL_DT_INTEGER_8, 0, 1, 0, HL_RW_ACCESS },	// ucMonth
		{ HL_DT_INTEGER_8, 0, 1, 0, HL_RW_ACCESS },	// ucDate
		{ HL_DT_INTEGER_8, 0, 1, 0, HL_RW_ACCESS },	// ucWeek
		{ HL_DT_INTEGER_8, 0, 1 ,0, HL_RW_ACCESS },	// ucHour
		{ HL_DT_INTEGER_8, 0, 1, 0, HL_RW_ACCESS },	// ucMinute
		{ HL_DT_INTEGER_8, 0, 1, 0, HL_RW_ACCESS },	// ucSecond
		{ HL_DT_INTEGER_8, 0, 1, 0, HL_NON_ACCESS},// ucReserved
	}
};

Struct_OD	PGM		sHL_Neighbor_Table_OD =	// HL_Neighbor_Table 的描述
{
	HL_NEIGHBOR_TABLE_INDEX,		// uiIndex = 1003
	0,								// pvLocal_Address
	5,								// ucElement_Number
	{
		{							// aucLong_Address[8]
			HL_DT_VIS_STRING,			// ucElement_Type
			0,							// ucElement_Unit
			8,							// ucElement_Length
			0,							// ucDecimal_Point
			HL_RO_ACCESS				// ucAccess
		},
		{ HL_DT_INTEGER_16,0,			2, 0, HL_RO_ACCESS },	// uiShort_Address
		{ HL_DT_INTEGER_8, 0,			1, 0, HL_RO_ACCESS },	// ucNeighbor_Numb
		{ HL_DT_INTEGER_8, 0,			1, 0, HL_NON_ACCESS},	// ucReserved
		{ HL_DT_VIS_STRING,0,		   36, 0, HL_RO_ACCESS },	// aucNeighbor_Table[36]
	}
};

#ifdef	SINK_APP

	Struct_OD	PGM		sHL_AMR_Para_Gateway_OD =	// HL_AMR_Para_Gateway 的描述
	{
		HL_AMR_PARA_GATEWAY_INDEX,		// uiIndex = 1005
		0,								// pvLocal_Address
		10,								// ucElement_Number
		{
			{							// uiAD_Cycle
				HL_DT_INTEGER_16,			// ucElement_Type
				HL_UT_SECOND,				// ucElement_Unit
				2,							// ucElement_Length
				0,							// ucDecimal_Point
				HL_RW_ACCESS				// ucAccess
			},
			{ HL_DT_INTEGER_8, HL_UT_MINUTE,1, 0, HL_RW_ACCESS },	// ucRespond_Timeout
			{ HL_DT_INTEGER_8, 0,			1, 0, HL_RW_ACCESS },	// ucRepeat_Time
			{ HL_DT_MID_TIME,  0,			4, 0, HL_RW_ACCESS },	// sUp_Load_Time
			{ HL_DT_INTEGER_8, HL_UT_HOUR,	1, 0, HL_RW_ACCESS },	// ucCollect_Cycle
			{ HL_DT_INTEGER_8, 0,			1, 0, HL_RW_ACCESS },	// ucRequire_Resp
			{ HL_DT_INTEGER_8, 0,			1, 0, HL_RW_ACCESS },	// ucResp_Contents
			{ HL_DT_INTEGER_8, 0,			1, 0, HL_RW_ACCESS },	// ucAD_Radius
			{ HL_DT_BOOL,	   0,			1, 0, HL_RW_ACCESS },	// bReturn_Flow_Ctrl
			{ HL_DT_VIS_STRING,0,		   27, 0, HL_NON_ACCESS}	// aucReserved[27]
		}
	};

	OD_Entry	PGM		sOD_Entry[HL_OD_ENTRY_NUMBER] =
	{
		{ HL_STRUCT_OD,	HL_DEVICE_INFO_INDEX,			( void* )&sHL_Device_Info_OD },
		{ HL_STRUCT_OD,	HL_NETWORK_PARAMETER_INDEX,		( void* )&sHL_Network_Para_OD },
		{ HL_STRUCT_OD,	HL_CURRENT_TIME_INDEX,			( void* )&sCurrent_Time_OD },
		{ HL_STRUCT_OD,	HL_NEIGHBOR_TABLE_INDEX,		( void* )&sHL_Neighbor_Table_OD },
		{ HL_STRUCT_OD,	HL_AMR_PARA_GATEWAY_INDEX,		( void* )&sHL_AMR_Para_Gateway_OD }
	};

#endif


#ifdef	SENSOR_APP

	Struct_OD	PGM		sHL_AMR_Para_Config_OD =	// HL_AMR_Para_Config 的描述
	{
		HL_AMR_PARA_CONFIG_INDEX,		// uiIndex = 1006
		0,								// pvLocal_Address
		10,								// ucElement_Number
		{
			{							// ucBaud_Rate
				HL_DT_INTEGER_8,			// ucElement_Type
				0,							// ucElement_Unit
				1,							// ucElement_Length
				0,							// ucDecimal_Point
				HL_RW_ACCESS				// ucAccess
			},
			{ HL_DT_INTEGER_8,	0,					1, 0, HL_NON_ACCESS},	// ucReserved
			{ HL_DT_INTEGER_16,	HL_UT_MINUTE,		2, 0, HL_RW_ACCESS },	// uiRead_Cycle
			{ HL_DT_MID_TIME,	0,					4, 0, HL_RW_ACCESS },	// sTime_Stamp
			{ HL_DT_INTEGER_16,	HL_UT_MILLI_SCND,	2, 0, HL_RW_ACCESS },	// uiUART_Frame_Gap
			{ HL_DT_INTEGER_16,	HL_UT_MILLI_SCND,	2, 0, HL_RW_ACCESS },	// uiUART_Resp_Timeout
			{ HL_DT_INTEGER_8,	0,					1, 0, HL_RW_ACCESS },	// ucApplication
			{ HL_DT_INTEGER_8,	0,					1, 0, HL_RW_ACCESS },	// ucConnection_To_Meter
			{ HL_DT_INTEGER_8,	0,					1, 0, HL_RW_ACCESS },	// ucRandom_Delay_Scale
			{ HL_DT_VIS_STRING,	0,				   13, 0, HL_NON_ACCESS}	// aucReserved[13]
		}
	};

	Struct_OD	PGM		sHL_AMR_Data_IDs_OD =	// HL_AMR_Data_IDs 的描述
	{
		HL_AMR_DATA_IDS_INDEX,			// uiIndex = 1007
		0,								// pvLocal_Address
		3,								// ucElement_Number
		{
			{							// ucData_ID_Numb
				HL_DT_INTEGER_8,			// ucElement_Type
				0,							// ucElement_Unit
				1,							// ucElement_Length
				0,							// ucDecimal_Point
				HL_RW_ACCESS				// ucAccess
			},
			{ HL_DT_VIS_STRING,	0,	 3, 0, HL_NON_ACCESS},	// aucReserved[3]
			{ HL_DT_VIS_STRING,	0,	24, 0, HL_RW_ACCESS },	// aucData_IDs[24]
		}
	};

	Struct_OD	PGM		sHL_AMR_Meter_Addr_Low_OD =	// HL_AMR_Meter_Addr_Low 的描述
	{
		HL_AMR_METER_ADDR_LOW_INDEX,	// uiIndex = 1008
		0,								// pvLocal_Address
		5,								// ucElement_Number
		{
			{							// ucMeter_Numb
				HL_DT_INTEGER_8,			// ucElement_Type
				0,							// ucElement_Unit
				1,							// ucElement_Length
				0,							// ucDecimal_Point
				HL_RW_ACCESS				// ucAccess
			},
			{ HL_DT_BOOL,		0,	 1, 0, HL_RW_ACCESS },	// bDiscover_Meter
			{ HL_DT_VIS_STRING,	0,	 2, 0, HL_NON_ACCESS},	// aucReserved[2]
			{ HL_DT_VIS_STRING,	0,	48, 0, HL_RW_ACCESS },	// aucMeter_Addr_Low_A[48]
			{ HL_DT_VIS_STRING,	0,	48, 0, HL_RW_ACCESS },	// aucMeter_Addr_Low_B[48]
		}
	};

	Struct_OD	PGM		sHL_AMR_Meter_Addr_High_OD =	// HL_AMR_Meter_Addr_High 的描述
	{
		HL_AMR_METER_ADDR_HIGH_INDEX,	// uiIndex = 1009
		0,								// pvLocal_Address
		4,								// ucElement_Number
		{
			{							// ucMeter_Numb
				HL_DT_INTEGER_8,			// ucElement_Type
				0,							// ucElement_Unit
				1,							// ucElement_Length
				0,							// ucDecimal_Point
				HL_RW_ACCESS				// ucAccess
			},
			{ HL_DT_VIS_STRING,	0,	 3, 0, HL_NON_ACCESS},	// aucReserved[3]
			{ HL_DT_VIS_STRING,	0,	48, 0, HL_RW_ACCESS },	// aucMeter_Addr_High_A[48]
			{ HL_DT_VIS_STRING,	0,	48, 0, HL_RW_ACCESS },	// aucMeter_Addr_High_B[48]
		}
	};

	Struct_OD	PGM		sHL_AMR_Unrespond_Meters_OD =	// HL_AMR_Unrespond_Meters 的描述
	{
		HL_AMR_UNRESPOND_METERS_INDEX,	// uiIndex = 1010
		0,								// pvLocal_Address
		3,								// ucElement_Number
		{
			{							// ucUnrespond_Numb
				HL_DT_INTEGER_8,			// ucElement_Type
				0,							// ucElement_Unit
				1,							// ucElement_Length
				0,							// ucDecimal_Point
				HL_RW_ACCESS				// ucAccess
			},
			{ HL_DT_VIS_STRING,	0,	 3, 0, HL_NON_ACCESS},	// aucReserved[3]
			{ HL_DT_VIS_STRING,	0,	36, 0, HL_RW_ACCESS },	// aucMeter_Addr_Low[36]
		}
	};

	OD_Entry	PGM		sOD_Entry[HL_OD_ENTRY_NUMBER] =
	{
		{ HL_STRUCT_OD,	HL_DEVICE_INFO_INDEX,			( void* )&sHL_Device_Info_OD },
		{ HL_STRUCT_OD,	HL_NETWORK_PARAMETER_INDEX,		( void* )&sHL_Network_Para_OD },
		{ HL_STRUCT_OD,	HL_CURRENT_TIME_INDEX,			( void* )&sCurrent_Time_OD },
		{ HL_STRUCT_OD,	HL_NEIGHBOR_TABLE_INDEX,		( void* )&sHL_Neighbor_Table_OD },
		{ HL_STRUCT_OD,	HL_AMR_PARA_CONFIG_INDEX,		( void* )&sHL_AMR_Para_Config_OD },
		{ HL_STRUCT_OD,	HL_AMR_DATA_IDS_INDEX,			( void* )&sHL_AMR_Data_IDs_OD },
		{ HL_STRUCT_OD,	HL_AMR_METER_ADDR_LOW_INDEX,	( void* )&sHL_AMR_Meter_Addr_Low_OD },
		{ HL_STRUCT_OD,	HL_AMR_METER_ADDR_HIGH_INDEX,	( void* )&sHL_AMR_Meter_Addr_High_OD },
		{ HL_STRUCT_OD,	HL_AMR_UNRESPOND_METERS_INDEX,	( void* )&sHL_AMR_Unrespond_Meters_OD }
	};

#endif		// #ifdef	SENSOR_APP

⌨️ 快捷键说明

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