/***************************************************************************** BeeAppInterPanDataIndication Process InterPan incoming ZigBee over-the-air messages. *****************************************************************************/ void BeeAppInterPanDataIndication(void) { InterPanMessage_t *pMsg; zbInterPanDataIndication_t *pIndication; zbStatus_t status = gZclMfgSpecific_c; while(MSG_Pending(&gInterPanAppDataIndicationQueue)) { /* Get a message from a queue */ pMsg = MSG_DeQueue( &gInterPanAppDataIndicationQueue ); /* ask ZCL to handle the frame */ pIndication = &(pMsg->msgData.InterPandataIndication ); status = ZCL_InterpretInterPanFrame(pIndication); /* not handled by ZCL interface, handle cluster here... */ if(status == gZclMfgSpecific_c) { /* insert manufacturer specific code here... */ } /* Free memory allocated by data indication */ MSG_Free(pMsg); } }
/***************************************************************************** BeeAppDataIndication Process incoming ZigBee over-the-air messages. *****************************************************************************/ void BeeAppDataIndication(void) { apsdeToAfMessage_t *pMsg; zbApsdeDataIndication_t *pIndication; zbStatus_t status = gZclMfgSpecific_c; while(MSG_Pending(&gAppDataIndicationQueue)) { /* Get a message from a queue */ pMsg = MSG_DeQueue( &gAppDataIndicationQueue ); /* give ZCL first crack at the frame */ pIndication = &(pMsg->msgData.dataIndication); status = ZCL_InterpretFrame(pIndication); /* not handled by ZCL interface, handle cluster here... */ if(status == gZclMfgSpecific_c) { /* insert manufacturer specific code here... */ ZCL_SendDefaultMfgResponse(pIndication); } /* Free memory allocated by data indication */ AF_FreeDataIndicationMsg(pMsg); } }
/***************************************************************************** BeeAppDataConfirm Process incoming ZigBee over-the-air data confirms. *****************************************************************************/ void BeeAppDataConfirm(void) { apsdeToAfMessage_t *pMsg; zbApsdeDataConfirm_t *pConfirm; while(MSG_Pending(&gAppDataConfirmQueue)) { /* Get a message from a queue */ pMsg = MSG_DeQueue( &gAppDataConfirmQueue ); pConfirm = &(pMsg->msgData.dataConfirm); /* Action taken when confirmation is received. */ if( pConfirm->status != gZbSuccess_c ) { /* The data wasn't delivered -- Handle error code here */ } /* Free memory allocated in Call Back function */ MSG_Free(pMsg); } }
void OepAgentTask ( event_t event ) { oepGenericApdu_t* pApdu = NULL; if (event & evtApduReceived_c) { pCurrentFragApdu = MSG_DeQueue(&gOepAgentQueue); /* Check if this is a ZTC configuration message */ if (pCurrentFragApdu != NULL) { pApdu = (oepGenericApdu_t*) &(pCurrentFragApdu->fragment.data); if(GetOepMsgType(pApdu) == msgType_ObjCfgMsg) { oepCsManagerHandleConfigMsg(pApdu, &agentBuffer[0], 200, mAgentAddrInfo.srcEndPoint); /* Don't handle the pCurrentFragApdu fragment further */ //event &= ~evtApduReceived_c; } } } switch (currentState) { case stateDisconnected_c: HandleDisconnectedState(event); break; case stateConnDissasociating_c: HandleConnDissasociatingState(event); break; case stateConnUnassociated_c: HandleConnUnassociatedState(event); break; case stateConnAssociating_c: HandleConnAssociatingState(event); break; case stateConnAssocOperating_c: HandleConnConnAssocOperatingState(event); break; case stateConnAssocConfSc_c: /* skip this state, go directly to stateConnAssocConfWa_c */ break; case stateConnAssocConfWa_c: HandleConnAssocConfWaState(event); break; default: break; } if (pCurrentFragApdu) { OepFreeFragmentedApdu(pCurrentFragApdu); pCurrentFragApdu = NULL; } if (MSG_Pending(&gOepAgentQueue)) TS_SendEvent(gOepAgentTaskID, evtApduReceived_c); }
/***************************************************************************** *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); }