void ZDO_StartLinkStatus(){ /* Jitter time to avoid synchronization with link status of others devices. Time in milliseconds. */ uint8_t gNwkLinkStatusJitterInterval = GetRandomRange(0,10); /* Start the timer */ TMR_StartSingleShotTimer(gLinkStatusTimerID, (TmrSeconds( NlmeGetRequest(gNwkLinkStatusPeriod_c) ) + gNwkLinkStatusJitterInterval), CustomLinkStatusTimeOutCallBack); }
/******************************************************************************* * Task for ZigBee Cluster Library. Used to signal ourselves of events. *******************************************************************************/ void TS_ZclTask ( uint16_t events /* IN: the ID to shoose from which to which sap handler the message should flow */ ) { /*prevent compiler warnings*/ (void) events; #if gZclEnableReporting_c /* time to send a report */ if(events & gZclEventReportTimeout_c) ZCL_SendReport(); if(events & gZclEventReportTick_c) { /*Start a 1 second timer*/ TMR_StartSingleShotTimer(gZclReportingTimerID, (tmrTimeInMilliseconds_t)1000, ZCL_ReportingTimeout); } #endif #if gASL_ZclDmndRspLdCtrl_ReportEvtStatus_d if(events & gZclEvtHandleLdCtrl_c) ZCL_HandleScheduledEventNow(); if(events & gzclEvtHandleReportEventsStatus_c) ZCL_HandleReportEventsStatus(); #endif #if gASL_ZclDmndRspLdCtrl_GetScheduledEvtsReq_d if(events & gzclEvtHandleGetScheduledLdCtlEvts_c) ZCL_HandleGetScheduledLdCtlEvts(); #endif if(events & gzclEvtHandlePriceClusterEvt_c) ZCL_HandleSEPriceClusterEvt(); }
/***************************************************************************** *Mac Application Task event processor. This function is called to * process all events for the task. Events include timers, messages and any * other user defined events * * Interface assumptions: None * * Return value: None *****************************************************************************/ void AppTask(event_t events) { /* Pointer for storing the messages from MLME, MCPS, and ASP. */ void *pMsgIn; /* Stores the status code returned by some functions. */ uint8_t rc; pMsgIn = NULL; /* Dequeue the MLME message */ if (events & gAppEvtMessageFromMLME_c) { /* Get the message from MLME */ pMsgIn = MSG_DeQueue(&mMlmeNwkInputQueue); /* Any time a beacon might arrive. Always handle the beacon frame first */ if (pMsgIn) { rc = App_WaitMsg(pMsgIn, gNwkBeaconNotifyInd_c); if(rc == errorNoError) { /* ALWAYS free the beacon frame contained in the beacon notify indication.*/ /* ALSO the application can use the beacon payload.*/ MSG_Free(((nwkMessage_t *)pMsgIn)->msgData.beaconNotifyInd.pBufferRoot); UartUtil_Print("Received an MLME-Beacon Notify Indication\n\r", gAllowToBlock_d); } } } /* The application state machine */ switch(gState) { case stateInit: /* Print a welcome message to the UART */ UartUtil_Print("MyWirelessApp Demo Non Beacon End Device application is initialized and ready.\n\r\n\r", gAllowToBlock_d); /* Goto Active Scan state. */ gState = stateScanActiveStart; TS_SendEvent(gAppTaskID_c, gAppEvtDummyEvent_c); break; case stateScanActiveStart: /* Start the Active scan, and goto wait for confirm state. */ UartUtil_Print("Start scanning for a PAN coordinator\n\r", gAllowToBlock_d); /*print a message on the LCD also*/ LCD_ClearDisplay(); LCD_WriteString(1,"Start scanning"); LCD_WriteString(2,"for coordinator"); rc = App_StartScan(gScanModeActive_c); if(rc == errorNoError) { gState = stateScanActiveWaitConfirm; } break; case stateScanActiveWaitConfirm: /* Stay in this state until the Scan confirm message arrives, and then goto the associate state. */ if (events & gAppEvtMessageFromMLME_c) { if (pMsgIn) { rc = App_WaitMsg(pMsgIn, gNwkScanCnf_c); if(rc == errorNoError) { rc = App_HandleScanActiveConfirm(pMsgIn); if(rc == errorNoError) { UartUtil_Print("Found a coordinator with the following properties:\n\r", gAllowToBlock_d); UartUtil_Print("----------------------------------------------------", gAllowToBlock_d); UartUtil_Print("\n\rAddress...........0x", gAllowToBlock_d); UartUtil_PrintHex(mCoordInfo.coordAddress, mCoordInfo.coordAddrMode == gAddrModeShort_c ? 2 : 8, 0); UartUtil_Print("\n\rPAN ID............0x", gAllowToBlock_d); UartUtil_PrintHex(mCoordInfo.coordPanId, 2, 0); UartUtil_Print("\n\rLogical Channel...0x", gAllowToBlock_d); UartUtil_PrintHex(&mCoordInfo.logicalChannel, 1, 0); UartUtil_Print("\n\rBeacon Spec.......0x", gAllowToBlock_d); UartUtil_PrintHex(mCoordInfo.superFrameSpec, 2, 0); UartUtil_Print("\n\rLink Quality......0x", gAllowToBlock_d); UartUtil_PrintHex(&mCoordInfo.linkQuality, 1, 0); UartUtil_Print("\n\r\n\r", gAllowToBlock_d); gState = stateAssociate; TS_SendEvent(gAppTaskID_c, gAppEvtDummyEvent_c); } else { UartUtil_Print("Scan did not find a suitable coordinator\n\r", gAllowToBlock_d); /*print a message on the LCD also*/ LCD_ClearDisplay(); LCD_WriteString(1,"No coordinator"); LCD_WriteString(2,"found."); } } } } break; case stateAssociate: /* Associate to the PAN coordinator */ UartUtil_Print("Associating to PAN coordinator on channel 0x", gAllowToBlock_d); UartUtil_PrintHex(&(mCoordInfo.logicalChannel), 1, gPrtHexNewLine_c); /*print a message on the LCD also*/ LCD_ClearDisplay(); LCD_WriteString(1,"Associating to "); LCD_WriteString(2,"PAN coordinator"); rc = App_SendAssociateRequest(); if(rc == errorNoError) gState = stateAssociateWaitConfirm; break; case stateAssociateWaitConfirm: /* Stay in this state until the Associate confirm message arrives, and then goto the Listen state. */ if (events & gAppEvtMessageFromMLME_c) { if (pMsgIn) { rc = App_WaitMsg(pMsgIn, gNwkAssociateCnf_c); if(rc == errorNoError) { rc = App_HandleAssociateConfirm(pMsgIn); if (rc == errorNoError) { UartUtil_Print("Successfully associated with the coordinator.\n\r", gAllowToBlock_d); UartUtil_Print("We were assigned the short address 0x", gAllowToBlock_d); UartUtil_PrintHex(maMyAddress, mAddrMode == gAddrModeShort_c ? 2 : 8, 0); UartUtil_Print("\n\r\n\rReady to send and receive data over the UART.\n\r\n\r", gAllowToBlock_d); /*print a message on the LCD also*/ LCD_ClearDisplay(); LCD_WriteString(1,"Ready to send"); LCD_WriteString(2,"and receive data"); /* Startup the timer */ TMR_StartSingleShotTimer(mTimer_c, mPollInterval, AppPollWaitTimeout); /* Go to the listen state */ gState = stateListen; TS_SendEvent(gAppTaskID_c, gAppEvtDummyEvent_c); } else { UartUtil_Print("\n\rAssociate Confirm wasn't successful... \n\r\n\r", gAllowToBlock_d); gState = stateScanActiveStart; TS_SendEvent(gAppTaskID_c, gAppEvtDummyEvent_c); } } } } break; case stateListen: //WSNProject //need to sleep? PWR_AllowDeviceToSleep(); Reason=PWR_EnterLowPower(); /* Transmit to coordinator data received from UART. */ if (events & gAppEvtMessageFromMLME_c) { if (pMsgIn) { /* Process it */ rc = App_HandleMlmeInput(pMsgIn); } } if (events & gAppEvtRxFromUart_c) { /* get byte from UART */ App_TransmitUartData(); } break; } if (pMsgIn) { /* Messages must always be freed. */ MSG_Free(pMsgIn); } /* Handle MCPS confirms and transmit data from UART */ if (events & gAppEvtMessageFromMCPS_c) { /* Get the message from MCPS */ pMsgIn = MSG_DeQueue(&mMcpsNwkInputQueue); if (pMsgIn) { /* Process it */ App_HandleMcpsInput(pMsgIn); /* Messages from the MCPS must always be freed. */ MSG_Free(pMsgIn); } } /* Check for pending messages in the Queue */ if(MSG_Pending(&mMcpsNwkInputQueue)) TS_SendEvent(gAppTaskID_c, gAppEvtMessageFromMCPS_c); if(MSG_Pending(&mMlmeNwkInputQueue)) TS_SendEvent(gAppTaskID_c, gAppEvtMessageFromMLME_c); }