mapp.c
来自「freescale的基于802.15.4的无线通讯例程」· C语言 代码 · 共 483 行 · 第 1/2 页
C
483 行
/************************************************************************************
*************************************************************************************
* Private functions
*************************************************************************************
************************************************************************************/
/******************************************************************************
* The App_StartScan(scanType) function will start the scan process of the
* specified type in the MAC. This is accomplished by allocating a MAC message,
* which is then assigned the desired scan parameters and sent to the MLME
* service access point.
* The function may return either of the following values:
* errorNoError: The Scan message was sent successfully.
* errorInvalidParameter: The MLME service access point rejected the
* message due to an invalid parameter.
* errorAllocFailed: A message buffer could not be allocated.
*
******************************************************************************/
static uint8_t App_StartScan(uint8_t scanType)
{
mlmeMessage_t *pMsg;
mlmeScanReq_t *pScanReq;
UartUtil_Print("Sending the MLME-Scan Request message to the MAC...");
/* Allocate a message for the MLME (We should check for NULL). */
pMsg = MSG_AllocType(mlmeMessage_t);
if(pMsg != NULL)
{
/* This is a MLME-START.req command */
pMsg->msgType = gMlmeScanReq_c;
/* Create the Start request message data. */
pScanReq = &pMsg->msgData.scanReq;
/* gScanModeED_c, gScanModeActive_c, gScanModePassive_c, or gScanModeOrphan_c */
pScanReq->scanType = scanType;
/* ChannelsToScan & 0xFF - LSB, always 0x00 */
pScanReq->scanChannels[0] = (uint8_t)((mDefaultValueOfChannel_c) & 0xFF);
/* ChannelsToScan>>8 & 0xFF */
pScanReq->scanChannels[1] = (uint8_t)((mDefaultValueOfChannel_c>>8) & 0xFF);
/* ChannelsToScan>>16 & 0xFF */
pScanReq->scanChannels[2] = (uint8_t)((mDefaultValueOfChannel_c>>16) & 0xFF);
/* ChannelsToScan>>24 & 0xFF - MSB */
pScanReq->scanChannels[3] = (uint8_t)((mDefaultValueOfChannel_c>>24) & 0xFF);
/* Duration per channel 0-14 (dc). T[sec] = (16*960*((2^dc)+1))/1000000.
A scan duration of 3 on 16 channels approximately takes 2 secs. */
pScanReq->scanDuration = 3;
/* Send the Scan request to the MLME. */
if(MSG_Send(NWK_MLME, pMsg) == gSuccess_c)
{
UartUtil_Print("Done\n");
return errorNoError;
}
else
{
UartUtil_Print("Invalid parameter!\n");
return errorInvalidParameter;
}
}
else
{
/* Allocation of a message buffer failed. */
UartUtil_Print("Message allocation failed!\n");
return errorAllocFailed;
}
}
/******************************************************************************
* The App_HandleScanActiveConfirm(nwkMessage_t *pMsg) function will handle the
* Active Scan confirm message received from the MLME when the Active scan has
* completed. The message contains a list of PAN descriptors. Based on link
* quality inforamtion in the pan descriptors the nearest coordinator is chosen.
* The corresponding pan descriptor is stored in the global variable mCoordInfo.
*
* The function may return either of the following values:
* errorNoError: A suitable pan descriptor was found.
* errorNoScanResults: No scan results were present in the confirm message.
*
******************************************************************************/
static uint8_t App_HandleScanActiveConfirm(nwkMessage_t *pMsg)
{
uint8_t panDescListSize = pMsg->msgData.scanCnf.resultListSize;
panDescriptor_t *pPanDesc = pMsg->msgData.scanCnf.resList.pPanDescriptorList;
uint8_t rc = errorNoScanResults;
/* Check if the scan resulted in any coordinator responses. */
if(panDescListSize != 0)
{
/* Initialize link quality to very poor. */
uint8_t i, bestLinkQuality = 0;
/* Check all PAN descriptors. */
for(i=0; i<panDescListSize; i++, pPanDesc++)
{
/* Only attempt to associate if the coordinator
accepts associations and is non-beacon. */
if( ( pPanDesc->superFrameSpec[1] & gSuperFrameSpecMsbAssocPermit_c) &&
((pPanDesc->superFrameSpec[0] & gSuperFrameSpecLsbBO_c) == 0x0F) )
{
/* Find the nearest coordinator using the link quality measure. */
if(pPanDesc->linkQuality > bestLinkQuality)
{
/* Save the information of the coordinator candidate. If we
find a better candiate, the information will be replaced. */
FLib_MemCpy(&mCoordInfo, pPanDesc, sizeof(panDescriptor_t));
bestLinkQuality = pPanDesc->linkQuality;
rc = errorNoError;
}
}
}
}
/* ALWAYS free the PAN descriptor list */
MSG_Free(pMsg->msgData.scanCnf.resList.pPanDescriptorList);
return rc;
}
/******************************************************************************
* The App_WaitMsg(nwkMessage_t *pMsg, uint8_t msgType) function does not, as
* the name implies, wait for a message, thus blocking the execution of the
* state machine. Instead the function analyzes the supplied message to
* determine whether or not the message is of the expected type.
* The function may return either of the following values:
* errorNoError: The message was of the expected type.
* errorNoMessage: The message pointer is NULL.
* errorWrongConfirm: The message is not of the expected type.
*
******************************************************************************/
static uint8_t App_WaitMsg(nwkMessage_t *pMsg, uint8_t msgType)
{
/* Do we have a message? If not, the exit with error code */
if(pMsg == NULL)
return errorNoMessage;
/* Is it the expected message type? If not then exit with error code */
if(pMsg->msgType != msgType)
return errorWrongConfirm;
/* Found the expected message. Return with success code */
return errorNoError;
}
/*****************************************************************************
* Handles all key events for this device.
* Interface assumptions: None
* Return value: None
*****************************************************************************/
static void App_HandleKeys
(
key_event_t events /*IN: Events from keyboard modul */
)
{
switch ( events )
{
case gKBD_EventSW1_c:
case gKBD_EventSW2_c:
case gKBD_EventSW3_c:
case gKBD_EventSW4_c:
case gKBD_EventLongSW1_c:
case gKBD_EventLongSW2_c:
case gKBD_EventLongSW3_c:
case gKBD_EventLongSW4_c:
if(gState == stateInit)
{
StopLed1Flashing;
StopLed2Flashing;
StopLed3Flashing;
StopLed4Flashing;
Led1Off;
Led2Off;
Led3Off;
Led4Off;
LCD_ClearDisplay();
LCD_WriteString(1,"Application");
LCD_WriteString(2," started");
TS_SendEvent(gZappTaskID_c, evtInit);
}
}
}
/******************************************************************************
* The App_Idle(void) function will check for network or UART activity .
* The function may return either of the following values:
* TRUE : No activity detected
* FALSE : Network or UART activity detected
******************************************************************************/
static bool_t App_Idle(void)
{
if ((!MSG_Pending(&mMlmeNwkInputQueue)) && (UartUtil_CheckIdle() == TRUE))
{
return TRUE;
}
else
{
return FALSE;
}
}
/*****************************************************************************
* The DeepSleepWakeupStackProc(void) function is called each time the
* application exits the DeepSleep mode .
*
* Return value:
* None
*****************************************************************************/
void DeepSleepWakeupStackProc(void){
return;
}
/******************************************************************************
* The following functions are called by the MAC to put messages into the
* Application's queue. They need to be defined even if they are not used
* in order to avoid linker errors.
******************************************************************************/
uint8_t MLME_NWK_SapHandler(nwkMessage_t * pMsg)
{
/* Put the incoming MLME message in the applications input queue. */
MSG_Queue(&mMlmeNwkInputQueue, pMsg);
TS_SendEvent(gZappTaskID_c, evtMessageFromMLME);
return gSuccess_c;
}
uint8_t MCPS_NWK_SapHandler(mcpsToNwkMessage_t *pMsg)
{
/* If the message is not handled anywhere it must be freed. */
MSG_Free(pMsg);
return gSuccess_c;
}
uint8_t ASP_APP_SapHandler(aspToAppMsg_t *pMsg)
{
/* If the message is not handled anywhere it must be freed. */
MSG_Free(pMsg);
return gSuccess_c;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?