ZigBee学习一 任务处理函数_ProcessEvent

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;
}

原文地址:https://www.cnblogs.com/liushao/p/6351506.html