📄 network.c
字号:
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 + -