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

📄 network.c

📁 关于zigbee厂家jennic的zigbee通信模块JN5139的一些示例程序。
💻 C
📖 第 1 页 / 共 5 页
字号:
	vJPI_WakeTimerStart(E_JPI_WAKE_TIMER_1, 320);

	/* Initialise the serial port and rx/tx queues */
	vSerialQ_Init();
	vUart_Init();

	#if NETWORK_BUTTON_START
	{
		uint8 u8NewButton;
		/* Loop until button press */
		do
		{
			/* Read buttons */
			u8NewButton = u8ButtonReadRfd();
			/* Button 0 - become a coordinator */
			if 	 	((u8NewButton & BUTTON_0_MASK) != 0) eDeviceType = E_JENIE_COORDINATOR;
			/* Button 1 - become a router */
			else if ((u8NewButton & BUTTON_1_MASK) != 0) eDeviceType = E_JENIE_ROUTER;

		}
		while (u8NewButton == 0);
	}
	#endif

    /* Initialise protocol and display */
	if (eDeviceType == E_JENIE_COORDINATOR)
		{
		vProtocol_Init(TRUE);
		vWUartDisp_Init("Autoflow Crd");
		}
	else
		{
		vProtocol_Init(FALSE);
		vWUartDisp_Init("Autoflow Rtr");
		}
	vWUartDisp_Update();

	/* Cold start ? */
	if (! bWarmStart)
	{
		/* Swap LEDs */
		vLedControl(0, TRUE);
		vLedControl(1, FALSE);
	}

	/* Start the stack running for our device type */
	eStatus = eJenie_Start(eDeviceType);

	#if NETWORK_DEBUG
		if (bUartUp)
		{
			if (! bWarmStart)
			{
				vPrintf("\n------------------------------\n");
				vPrintf("ChipVersion(%x)\n", u32Jenie_GetVersion(E_JENIE_COMPONENT_CHIP));
				vPrintf("MacVersion(%x)\n", u32Jenie_GetVersion(E_JENIE_COMPONENT_MAC));
				vPrintf("StackVersion(%x)\n", u32Jenie_GetVersion(E_JENIE_COMPONENT_NETWORK));
				vPrintf("JenieVersion(%x)\n", u32Jenie_GetVersion(E_JENIE_COMPONENT_JENIE));
				vPrintf("NetworkVersion(%d)\n", NETWORK_VERSION);
				vPrintf("ApplicationId(%x)\n", gJenie_NetworkApplicationID);
				vPrintf("PanId(%x)\n", gJenie_PanID);
				vPrintf("Channel(%d)\n", gJenie_Channel);
				vPrintf("ScanChannels(%x)\n", gJenie_ScanChannels);
				vPrintf("MaxChildren(%d)\n", gJenie_MaxChildren);
				vPrintf("ServicesRequest(%d)\n", NETWORK_MAX_SOURCE);
				vPrintf("DeviceType(%s)\n", aszDeviceType[eDeviceType]);
			}
			vPrintf("vNetwork_Init(%d, %d)\n", bWarmStart, bInitUart);
			vPrintf("eJenie_Start(%s) = %s\n", aszDeviceType[eDeviceType], aszStatusCode[eStatus]);
		}
	#endif

	/* End device and warm start and network is up and polling period specified */
	if (eDeviceType == E_JENIE_END_DEVICE &&
		bWarmStart &&
		bNetworkUp &&
		u16PollPeriod > 0)
	{
		/* Set a short poll timer so we poll soon after starting the network */
		u16PollTimer = 5;
	}
}

/****************************************************************************
 *
 * NAME: 		vNetwork_Main
 */
/*!
 *\DESCRIPTION	Main application task, called repeatedly by the stack.
 *
 * This function should be called from vJenie_CbMain() as it performs
 * the network tasks common to all Jenie device types.
 *
 * This function should be non-blocking.
 */
/* RETURNS
 * None
 *
 ****************************************************************************/
PUBLIC void vNetwork_Main (void)
{
	/* Is the network up ? */
	if (bNetworkUp)
	{
		/* Deal with transmit queue */
		vNetwork_Tx_Main();
		/* Deal with registering and requesting services */
		vNetwork_Service_Main();
	}
}

/****************************************************************************
 *
 * NAME		 	vNetwork_StackMgmtEvent
 */
/*!
 *\DESCRIPTION	Called when a stack management event has occurred.
 *
 * This function should be called from vJenie_CbStackMgmtEvent() as it performs
 * the network management tasks common to all Jenie device types.
 */
/* RETURNS
 * None
 *
 ****************************************************************************/
PUBLIC void vNetwork_StackMgmtEvent (
	teEventType   eEventType,	/**< Type of stack management event received */
	void        *pvEventPrim)	/**< Pointer to event primitive */
{
	/* Which event has occurred ? */
	switch (eEventType)
	{

	/* Register Service Response ? */
	case E_JENIE_REG_SVC_RSP:
		{
			/* Empty primitive structure for this event */
			;
			/* Network debugging */
			#if NETWORK_DEBUG
				if (bUartUp)
				{
					vPrintf("vNetwork_StackMgmtEvent(%s)\n",
							aszEventType[eEventType]);
				}
			#endif

			/* Are we waiting for a register response ? */
			if (eServiceState    == E_SERVICE_STATE_REGISTER &&
				u8ServiceCurrent == 0)
			{
				/* Note the services we registered */
				asServices[u8ServiceCurrent].u32Ready  = asServices[u8ServiceCurrent].u32Pend;
				asServices[u8ServiceCurrent].u32Pend   = 0;
				/* Update to process next service next call to main */
				vNetwork_Service_Current();
				/* Go to idle state */
				vNetwork_Service_State(E_SERVICE_STATE_IDLE);
			}
		}
		break;

	/* Request Service Response ? */
	case E_JENIE_SVC_REQ_RSP:
		{
			/* Get pointer to correct primitive structure */
			tsSvcReqRsp *psSvcReqRsp = (tsSvcReqRsp *) pvEventPrim;

			/* Network debugging */
			#if NETWORK_DEBUG
				if (bUartUp)
				{
					vPrintf("vNetwork_StackMgmtEvent(%s, %x:%x, %x)\n",
							aszEventType[eEventType],
							(uint32) (psSvcReqRsp->u64SrcAddress >> 32),
							(uint32) (psSvcReqRsp->u64SrcAddress  & 0xFFFFFFFF),
							psSvcReqRsp->u32Services);
				}
			#endif

			/* Are we waiting for a request response ? */
			if (eServiceState == E_SERVICE_STATE_REQUEST &&
				u8ServiceCurrent >= 1 && u8ServiceCurrent <= NETWORK_MAX_SOURCE)
			{
				/* Bind to services */
				(void) u32Network_Services_Bind(u8ServiceCurrent, psSvcReqRsp->u32Services, psSvcReqRsp->u64SrcAddress);
			}
		}
		break;

	/* Poll complete ? */
	case E_JENIE_POLL_CMPLT:
		/* Don't do any debugging - usually too many of these */
		;
		break;

	/* Network up ? */
	case E_JENIE_NETWORK_UP:
		{
			/* Network debugging */
			#if NETWORK_DEBUG
				if (bUartUp)
				{
					#if 0
					/* Get pointer to correct primitive structure (Jenie v1.1) */
					tsNwkStartUp *psNwkStartUp = (tsNwkStartUp *) pvEventPrim;
					vPrintf("vNetwork_StackMgmtEvent(%s, %x:%x, %x:%x, %d, %x, %d)\n",
						aszEventType[eEventType],
						(uint32) (psNwkStartUp->u64ParentAddress >> 32),
						(uint32) (psNwkStartUp->u64ParentAddress  & 0xFFFFFFFF),
						(uint32) (psNwkStartUp->u64LocalAddress >> 32),
						(uint32) (psNwkStartUp->u64LocalAddress  & 0xFFFFFFFF),
						psNwkStartUp->u16Depth,
						psNwkStartUp->u16PanID,
						psNwkStartUp->u8Channel);
					#else
					/* Get pointer to correct primitive structure (Jenie v1.0) */
					tsNwkStartUp *psNwkStartUp = (tsNwkStartUp *) pvEventPrim;
					vPrintf("vNetwork_StackMgmtEvent(%s, %x:%x, %x:%x, %d, %x, %d)\n",
						aszEventType[eEventType],
						(uint32) (psNwkStartUp->u64ParentAddress >> 32),
						(uint32) (psNwkStartUp->u64ParentAddress  & 0xFFFFFFFF));
					#endif
				}
			#endif

			/* Note network is now up */
			bNetworkUp = TRUE;

			/* End device and polling period specified */
			if (eDeviceType == E_JENIE_END_DEVICE &&
				u16PollPeriod > 0)
			{
				/* Set a short poll timer so we poll soon after joining the network */
				u16PollTimer = 5;
			}

			#if NETWORK_LED
			/* Turn on LED 1 */
			vLedControl(1, TRUE);
			#endif

			/* End device or we don't want any children ? */
			if (eDeviceType == E_JENIE_END_DEVICE || gJenie_MaxChildren == 0)
			{
				/* Don't allow devices to join to us */
				(void) eNetwork_SetPermitJoin(FALSE);
			}
			else
			{
				/* Allow devices to join to us */
				(void) eNetwork_SetPermitJoin(TRUE);
			}
		}
		break;

	/* Stack reset (network down) ? */
	case E_JENIE_STACK_RESET:
		{
			/* Network debugging */
			#if NETWORK_DEBUG
				if (bUartUp)
				{
					/* Get pointer to correct primitive structure */
					vPrintf("vNetwork_StackMgmtEvent(%s)\n",
						aszEventType[eEventType]);
				}
			#endif

			/* Note network is now down */
			bNetworkUp = FALSE;
		}
		break;

	/* Child joined ? */
	case E_JENIE_CHILD_JOINED:
		{
			/* Network debugging */
			#if NETWORK_DEBUG
				if (bUartUp)
				{
					/* Get pointer to correct primitive structure */
					tsChildJoined *psChildJoined = (tsChildJoined *) pvEventPrim;
					vPrintf("vNetwork_StackMgmtEvent(%s, %x:%x)\n",
							aszEventType[eEventType],
							(uint32) (psChildJoined->u64SrcAddress >> 32),
							(uint32) (psChildJoined->u64SrcAddress  & 0xFFFFFFFF));
				}
			#endif
		}
		break;

	/* Packet sent ? */
	case E_JENIE_PACKET_SENT:
		{
			/* Is this sent for our head packet and
			   didn't want a data ack ? */
			if (sNetworkTxQ.bPend == TRUE &&
			   (sNetworkTxQ.asTx[sNetworkTxQ.u8Head].u8TxFlags & TXOPTION_ACKREQ) == 0)
			{
				/* Indicate success by setting attempts to 0xFF */
				sNetworkTxQ.u8Attempts = 0xFF;
			}

			/* Network debugging */
			#if NETWORK_DEBUG
				if (bUartUp)
				{
					/* Debug */
					vPrintf("vNetwork_StackMgmtEvent(%s)[%d, %d]\n",
							aszEventType[eEventType],
							sNetworkTxQ.bPend,
							sNetworkTxQ.u8Attempts);
				}
			#endif
			}
		break;

	/* Others ? */
	default:
		{
			/* Network debugging */
			#if NETWORK_DEBUG
				if (bUartUp)
				{
					vPrintf("vNetwork_StackMgmtEvent(%s)\n",
                	    	aszEventType[eEventType]);
                }
			#endif
		}
		break;
	}
}

/****************************************************************************
 *
 * NAME 		vNetwork_StackDataEvent
 */
/*!
 *\DESCRIPTION	Called when data event has occurred.
 *
 * This function should be called from vJenie_CbStackDataEvent() as it passes
 * the received data onto vNetwork_Destination_Rx() for data sent to a destination
 * service and vNetwork_Rx() for addressed directly to the device.
 */
/* RETURNS
 * None
 *
 ****************************************************************************/
PUBLIC void vNetwork_StackDataEvent (
	teEventType   eEventType,	/**< Type of data event received */
    void        *pvEventPrim)	/**< Pointer to event primitive */
{
	/* Which event has occurred ? */
	switch (eEventType)
	{
	/* Data to service ? */
	case E_JENIE_DATA_TO_SERVICE:
		{
			/* Get pointer to correct primitive structure */
			tsDataToService *psDataToService = (tsDataToService *) pvEventPrim;

			/* Network debugging */
			#if NETWORK_DEBUG
				if (bUartUp)
				{
					/* Data is a string ? */
					if (bNetwork_IsString(psDataToService->u16Length, psDataToService->pau8Data))
					{
						/* Debug with data string */
						vPrintf("vNetwork_StackDataEvent(%s, %x:%x, %d, %d, %x, %d, \"%s\")\n",
							aszEventType[eEventType],
							(uint32) (psDataToService->u64SrcAddress >> 32),
							(uint32) (psDataToService->u64SrcAddress  & 0xFFFFFFFF),
							psDataToService->u8SrcService,
							psDataToService->u8DestService,
							psDataToService->u8MsgFlags,
							psDataToService->u16Length,
							(char *) psDataToService->pau8Data);
					}
					else
					{
						/* Debug without data */
						vPrintf("vNetwork_StackDataEvent(%s, %x:%x, %d, %d, %x, %d)\n",
							aszEventType[eEventType],
							(uint32) (psDataToService->u64SrcAddress >> 32),
							(uint32) (psDataToService->u64SrcAddress  & 0xFFFFFFFF),
							psDataToService->u8SrcService,
							psDataToService->u8DestService,
							psDataToService->u8MsgFlags,
							psDataToService->u16Length);
					}
				}
			#endif

			/* Note address we last received from */
			u64LastRxAddress = psDataToService->u64SrcAddress;

			/* Receive the data */
			vNetwork_Destination_Rx(psDataToService->u64SrcAddress,
							        psDataToService->u8DestService,
								    psDataToService->u16Length,
								    psDataToService->pau8Data);
			}
		break;

	/* Data ? */
	case E_JENIE_DATA:
		{
			/* Get pointer to correct primitive structure */
			tsData *psData = (tsData *) pvEventPrim;

			/* Network debugging */
			#if NETWORK_DEBUG
				if (bUartUp)
				{
					/* Data is a string ? */
					if (bNetwork_IsString(psData->u16Length, psData->pau8Data))
					{
						/* Debug with data string */
						vPrintf("vNetwork_StackDataEvent(%s, %x:%x, %x, %d, \"%s\")\n",
							aszEventType[eEventType],
							(uint32) (psData->u64SrcAddress >> 32),
							(uint32) (psData->u64SrcAddress  & 0xFFFFFFFF),
							psData->u8MsgFlags,
							psData->u16Length,
							(char *) psData->pau8Data);
					}
					else
					{
						/* Debug without data */
						vPrintf("vNetwork_StackDataEvent(%s, %x:%x, %x, %d)\n",
							aszEventType[eEventType],
							(uint32) (psData->u64SrcAddress >> 32),
							(uint32) (psData->u64SrcAddress  & 0xFFFFFFFF),

⌨️ 快捷键说明

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