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

📄 holley.c

📁 是zmac的协议的全部完整的解析.代码例子很全
💻 C
字号:

#include	"Holley_ext.h"


#ifdef	SINK_APP

/************************************************************************/
/*	申明集中器(广告)													*/
/*	参数																*/
/*		ucRadius	广播发送的半径										*/
/*					ucRadius = 0, 则发送半径为 EMBER_MAX_HOPS			*/
/*		bRespond	是否要求应答										*/
/*	返回值																*/
/*		无																*/
/************************************************************************/
void	Send_Advertise( int8u ucRadius, int8u ucRespond, int8u ucContents )
{
	aucSwam[0]= HL_CMD_STATEMENT;		// 命令标识
	aucSwam[1]= 0xFF;					// Num = 0xFF

	MEMCOPY( aucSwam+2, emberGetEui64(), 8 );	// Long Address

	aucSwam[10]	= sCurrent_Time.ucYear;		// 当前时间占7字节
	aucSwam[11]	= sCurrent_Time.ucMonth;
	aucSwam[12]	= sCurrent_Time.ucDate;
	aucSwam[13]	= sCurrent_Time.ucWeek;
	aucSwam[14]	= sCurrent_Time.ucHour;
	aucSwam[15]	= sCurrent_Time.ucMinute;
	aucSwam[16]	= sCurrent_Time.ucSecond;

	aucSwam[17] = ucRespond;				// 是否返回应答
	aucSwam[18] = ucContents;				// 应答谌?

	Sink_Send_Rf_BroadCast( aucSwam, HL_CMD_STATEMENT, 19 );

	#ifdef	HL_OUTPUT_DEBUG_INFO_VIA_SERIAL
		emberSerialPrintf( APP_SERIAL,"\r\nSink sent Advertise: Radius=%x, Respond=%x, Contents=%x\r\n", ucRadius, ucRespond, ucContents );
	#endif
}


/************************************************************************/
/*	集中器参数初始化													*/
/*	参数																*/
/*		无																*/
/*	返回值																*/
/*		无																*/
/************************************************************************/
void	Sink_Para_Init ( void )
{
	int8u	*p;

	p = (int8u*) &sUart_Buffer;
	MEMSET ( p, 0, sizeof(HL_Buffered_Data) );

	timeBeforeSinkAdvertise = 20;		// 5 秒后发送广告

	MEMSET ( aucRF_MSG_Index, 0xFF, HL_MAX_PACKAGE_NUMBER );

	MEMSET ( aucSwam, 0, HL_SWAM_SIZE );

	p = (int8u*) &sCurrent_Time;
	MEMSET ( p, 0, sizeof(HL_Full_Time) );
}


/************************************************************************/
/*	集中器以广播形式发送数据, 广播半径不限								*/
/*	参数																*/
/*		pData		需要发送的数葜刚?								*/
/*		ucC_ID		Cluster ID											*/
/*		ucLength	需要发送的数据长度									*/
/*	返回值																*/
/*		TRUE		发送成功											*/
/*		FALSE		发送失败,可能是由以下原因造成						*/
/*					1. 缓冲区满											*/
/*					2. emberSendMulticast() 失败						*/
/************************************************************************/
BOOL	Sink_Send_Rf_BroadCast( int8u *pData, int8u ucC_ID, int8u ucLength )
{
	EmberStatus			status;
	EmberMessageBuffer	buffer	= 0;
	int8u				ucRadius= 0;

	buffer = emberFillLinkedBuffers( pData, ucLength );

	if ( buffer == EMBER_NULL_MESSAGE_BUFFER ) 
	{
		#ifdef	HL_OUTPUT_DEBUG_INFO_VIA_SERIAL
			emberSerialPrintf( APP_SERIAL, "\r\nEmber Linked Buffers Full, Send Failed.\r\n" );
			emberSerialWaitSend( APP_SERIAL );   
		#endif
		return FALSE;
	}

	Read_OD( HL_AMR_PARA_GATEWAY_INDEX, 8, &ucRadius );

	if ( ucRadius > 0 )
	{
		status = emberSendLimitedMulticast( MULTICAST_BINDING_INDEX,	// binding
											ucC_ID,						// cluster ID
											buffer,						// data to send
											ucRadius );					// hops
	}
	else
	{
		status = emberSendMulticast( MULTICAST_BINDING_INDEX,			// binding
									 ucC_ID,							// cluster ID
									 buffer );							// data to send
	}

	emberReleaseMessageBuffer( buffer );

	#ifdef	HL_OUTPUT_DEBUG_INFO_VIA_SERIAL
		switch ( status )
		{
			case EMBER_SUCCESS:
				emberSerialPrintf(APP_SERIAL,"\r\nSent RF Broadcast ok\r\n");
				break;
			case EMBER_CONNECTION_CLOSED:
				emberSerialPrintf(APP_SERIAL,"\r\nSent RF Broadcast failed:connection closed!\r\n");
				break;

			case EMBER_INVALID_BINDING_INDEX:
				emberSerialPrintf(APP_SERIAL,"\r\nSent RF Broadcast failed:invalid binding index\r\n");
				break;

			case EMBER_MESSAGE_TOO_LONG:
				emberSerialPrintf(APP_SERIAL,"\r\nSent RF Broadcast failed:message too long!\r\n");
				break;

			case EMBER_MAX_MESSAGE_LIMIT_REACHED:
				emberSerialPrintf(APP_SERIAL,"\r\nSent RF Broadcast failed:max message limit reached!\r\n");
				break;
		}
	#endif

	if ( status != EMBER_SUCCESS )
		return	FALSE;

	return	TRUE;
}







/************************************************************************/
/*	将串口中的数据缓存到 sUart_Buffer 中								*/
/*	参数																*/
/*		无																*/
/*	返回值																*/
/*		无																*/
/************************************************************************/
void	Sink_Store_UART_Data ( void )
{
	int8u   i;
	int8u	ucTemp;
	int16u  uiTime = 0;
	int8u   ucLength;
	
	uiTime = halCommonGetInt16uMillisecondTick();       //Read current time
	
	ucLength = emberSerialReadAvailable( HOLLEY_SERIAL );

	if ( ucLength > 0 )
	{	
		uiUART_Last_Receive_Time = uiTime;				//reset last receive time

		if ( ( sUart_Buffer.uiEnd_Of_Last_Frame == sUart_Buffer.uiStart_Of_First_Frame ) ||
			 ( sUart_Buffer.uiPoint != sUart_Buffer.uiStart_Of_First_Frame ) )
		{
			if ( sUart_Buffer.uiStart_Of_First_Frame == sUart_Buffer.uiPoint )
				if ( sUart_Buffer.acBuffer[sUart_Buffer.uiPoint] == 0 )
					if ( sUart_Buffer.uiPoint == 0 )
						sUart_Buffer.uiPoint = HL_BUFFER_SIZE - 1;

			for ( i=0; i<ucLength; i++ )
			{
				sUart_Buffer.uiPoint ++;

				if ( sUart_Buffer.uiPoint == HL_BUFFER_SIZE )
					sUart_Buffer.uiPoint = 0;

				if ( ( sUart_Buffer.uiPoint == sUart_Buffer.uiStart_Of_First_Frame ) &&
					 ( sUart_Buffer.uiPoint != 0 ) )
				{
					sUart_Buffer.uiPoint = sUart_Buffer.uiEnd_Of_Last_Frame;	//溢出
					emberSerialFlushRx( HOLLEY_SERIAL );
					break;
				}

				emberSerialReadByte( HOLLEY_SERIAL, &ucTemp );
				sUart_Buffer.acBuffer[sUart_Buffer.uiPoint] = ucTemp;
			}
		}
		else
			emberSerialFlushRx( HOLLEY_SERIAL );
	}

	if( uiTime - uiUART_Last_Receive_Time > HL_COLLECTOR_UART_FRAME_GAP )
	{
		if ( sUart_Buffer.uiPoint == sUart_Buffer.uiEnd_Of_Last_Frame )	// 没收到有效数据
			return;

		if ( Check_Buffered_Frame( &sUart_Buffer ) )
			Sink_Reply_Buffer_Status( &sUart_Buffer, 0 );		// 向上层软件反馈缓冲区信息
		else
		{
			sUart_Buffer.uiPoint = sUart_Buffer.uiEnd_Of_Last_Frame;	// 境

⌨️ 快捷键说明

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