ZigBee學習一 任務處理函數_ProcessEvent
//任務處理函數
UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events )
{
//定義應用層數據包
afIncomingMSGPacket_t *MSGpkt; //定義一個指向接收消息結構體的指針MSGpkt
//如果系統消息到來
if ( events & SYS_EVENT_MSG )
{
//接收數據包
MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );//使用osal_msg_receive函數從消息隊列上接收消息,該消息中包含了接收到的無線數據包(准確地說是包含了指向接收到的無線數據包的指針)。
//如果數據包不為空
while ( MSGpkt )
{
//判斷消息類型
switch ( MSGpkt->hdr.event )
{
//處理在初始化中注冊的消息
case ZDO_CB_MSG:
SAPI_ProcessZDOMsgs( (zdoIncomingMsg_t *)pMsg );
break;
//按鍵消息
case KEY_CHANGE:
//調用按鍵處理函數
GenericApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );
break;
//數據發送后返回信息處理函數
case AF_DATA_CONFIRM_CMD:
// This message is received as a confirmation of a data packet sent.
// The status is of ZStatus_t type [defined in ZComDef.h]
// The message fields are defined in AF.h
pDataConfirm = (afDataConfirm_t *) pMsg;
SAPI_SendDataConfirm( pDataConfirm->transID, pDataConfirm->hdr.status );
break;
//接收數據事件
case AF_INCOMING_MSG_CMD:
//調接收數據的處理函數
GenericApp_MessageMSGCB( MSGpkt );
break;
//網絡狀態發生變化事件
case ZDO_STATE_CHANGE:
//獲取網絡狀態
GenericApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
//判斷網絡類型
if ( (GenericApp_NwkState == DEV_ZB_COORD)
|| (GenericApp_NwkState == DEV_ROUTER)
|| (GenericApp_NwkState == DEV_END_DEVICE) )
{
}
break;
default:
break;
}
//釋放存儲區
osal_msg_deallocate( (uint8 *)MSGpkt );
//判斷操作系統層是否有未處理的數據包,繼續處理緩沖區中的包
MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );//處理完一個消息后,再從消息隊列里接收消息,然后對其進行相應的處理,直到所有消息都處理完為止。
}
// 返回未處理的任務
return (events ^ SYS_EVENT_MSG);
}
// Discard unknown events
return 0;
}