/**************************************************************************************************
*
* @fn MAC_CbackEvent
*
* @brief This callback function sends MAC events to the application.
* The application must implement this function. A typical
* implementation of this function would allocate an OSAL message,
* copy the event parameters to the message, and send the message
* to the application's OSAL event handler. This function may be
* executed from task or interrupt context and therefore must
* be reentrant.
*
* @param pData - Pointer to parameters structure.
*
* @return None.
*
**************************************************************************************************/
void MAC_CbackEvent(macCbackEvent_t *pData)
{
macCbackEvent_t *pMsg = NULL;
uint8 len = msa_cbackSizeTable[pData->hdr.event];
switch (pData->hdr.event)
{
case MAC_MLME_BEACON_NOTIFY_IND:
len += sizeof(macPanDesc_t) + pData->beaconNotifyInd.sduLength +
MAC_PEND_FIELDS_LEN(pData->beaconNotifyInd.pendAddrSpec);
if ((pMsg = (macCbackEvent_t *) osal_msg_allocate(len)) != NULL)
{
/* Copy data over and pass them up */
osal_memcpy(pMsg, pData, sizeof(macMlmeBeaconNotifyInd_t));
pMsg->beaconNotifyInd.pPanDesc = (macPanDesc_t *) ((uint8 *) pMsg + sizeof(macMlmeBeaconNotifyInd_t));
osal_memcpy(pMsg->beaconNotifyInd.pPanDesc, pData->beaconNotifyInd.pPanDesc, sizeof(macPanDesc_t));
pMsg->beaconNotifyInd.pSdu = (uint8 *) (pMsg->beaconNotifyInd.pPanDesc + 1);
osal_memcpy(pMsg->beaconNotifyInd.pSdu, pData->beaconNotifyInd.pSdu, pData->beaconNotifyInd.sduLength);
}
break;
case MAC_MCPS_DATA_IND:
pMsg = pData;
break;
default:
if ((pMsg = (macCbackEvent_t *) osal_msg_allocate(len)) != NULL)
{
osal_memcpy(pMsg, pData, len);
}
break;
}
if (pMsg != NULL)
{
osal_msg_send(MSA_TaskId, (uint8 *) pMsg);
}
}
描述:這個回調函數發送MAC事件到應用程序。應用程序必須執行這個函數。這個函數的典型執行是分配一個OSAL信息,複製事件參數到該信息中,併發送該信息到應用程序的OSAL事件處理器。這個函數可以在任務或者中斷的環境下執行,因此必須是可重新進入的。
詳細參數:
/* Union of callback structures */
typedef union
{
macEventHdr_t hdr;
macMlmeAssociateInd_t associateInd; /* MAC_MLME_ASSOCIATE_IND */
macMlmeAssociateCnf_t associateCnf; /* MAC_MLME_ASSOCIATE_CNF */
macMlmeDisassociateInd_t disassociateInd; /* MAC_MLME_DISASSOCIATE_IND */
macMlmeDisassociateCnf_t disassociateCnf; /* MAC_MLME_DISASSOCIATE_CNF */
macMlmeBeaconNotifyInd_t beaconNotifyInd; /* MAC_MLME_BEACON_NOTIFY_IND */
macMlmeOrphanInd_t orphanInd; /* MAC_MLME_ORPHAN_IND */
macMlmeScanCnf_t scanCnf; /* MAC_MLME_SCAN_CNF */
macMlmeStartCnf_t startCnf; /* MAC_MLME_START_CNF */
macMlmeSyncLossInd_t syncLossInd; /* MAC_MLME_SYNC_LOSS_IND */
macMlmePollCnf_t pollCnf; /* MAC_MLME_POLL_CNF */
macMlmeCommStatusInd_t commStatusInd; /* MAC_MLME_COMM_STATUS_IND */
macMlmePollInd_t pollInd; /* MAC_MLME_POLL_IND */
macMcpsDataCnf_t dataCnf; /* MAC_MCPS_DATA_CNF */
macMcpsDataInd_t dataInd; /* MAC_MCPS_DATA_IND */
macMcpsPurgeCnf_t purgeCnf; /* MAC_MCPS_PURGE_CNF */
} macCbackEvent_t;
/* MAC event header type */
typedef struct
{
uint8 event; /* MAC event */
uint8 status; /* MAC status */
} macEventHdr_t;
/* Size table for MAC structures */
const CODE uint8 msa_cbackSizeTable [] =
{
0, /* unused */
sizeof(macMlmeAssociateInd_t), /* MAC_MLME_ASSOCIATE_IND */
sizeof(macMlmeAssociateCnf_t), /* MAC_MLME_ASSOCIATE_CNF */
sizeof(macMlmeDisassociateInd_t), /* MAC_MLME_DISASSOCIATE_IND */
sizeof(macMlmeDisassociateCnf_t), /* MAC_MLME_DISASSOCIATE_CNF */
sizeof(macMlmeBeaconNotifyInd_t), /* MAC_MLME_BEACON_NOTIFY_IND */
sizeof(macMlmeOrphanInd_t), /* MAC_MLME_ORPHAN_IND */
sizeof(macMlmeScanCnf_t), /* MAC_MLME_SCAN_CNF */
sizeof(macMlmeStartCnf_t), /* MAC_MLME_START_CNF */
sizeof(macMlmeSyncLossInd_t), /* MAC_MLME_SYNC_LOSS_IND */
sizeof(macMlmePollCnf_t), /* MAC_MLME_POLL_CNF */
sizeof(macMlmeCommStatusInd_t), /* MAC_MLME_COMM_STATUS_IND */
sizeof(macMcpsDataCnf_t), /* MAC_MCPS_DATA_CNF */
sizeof(macMcpsDataInd_t), /* MAC_MCPS_DATA_IND */
sizeof(macMcpsPurgeCnf_t), /* MAC_MCPS_PURGE_CNF */
sizeof(macEventHdr_t), /* MAC_PWR_ON_CNF */
sizeof(macMlmePollInd_t) /* MAC_MLME_POLL_IND */
};