⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zdapp.c

📁 一些基于IRA环境开发的zigbee实例程序
💻 C
📖 第 1 页 / 共 5 页
字号:
}

/*********************************************************************
 * @fn      ZDApp_ProcessOSALMsg()
 *
 * @brief   Process the incoming task message.
 *
 * @param   msgPtr - message to process
 *
 * @return  none
 */
void ZDApp_ProcessOSALMsg( osal_event_hdr_t *msgPtr )
{
  // Data Confirmation message fields
  byte sentEP;       // This should always be 0
  byte sentStatus;
  afDataConfirm_t *afDataConfirm;

  switch ( msgPtr->event )
  {
    // Incoming ZDO Message
    case AF_INCOMING_MSG_CMD:
      ZDP_IncomingData( (afIncomingMSGPacket_t *)msgPtr );
      break;

    case ZDO_CB_MSG:
      ZDApp_ProcessMsgCBs( (zdoIncomingMsg_t *)msgPtr );
      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 NLMEDE.h]
      // The message fields are defined in AF.h
      afDataConfirm = (afDataConfirm_t *)msgPtr;
      sentEP = afDataConfirm->endpoint;
      sentStatus = afDataConfirm->hdr.status;

      // Action taken when confirmation is received.
      /* Put code here */
#if !defined ( RTR_NWK )
      if ( sentStatus == ZMacNoACK )
      {
        //ZDApp_SendMsg( ZDAppTaskID, ZDO_NWK_JOIN_REQ, sizeof(osal_event_hdr_t), NULL );
      }
#else
     (void)sentStatus;
#endif
      break;

    case ZDO_NWK_DISC_CNF:
      if (devState != DEV_NWK_DISC)
      {
      }
#if !defined ( ZDO_COORDINATOR ) || defined ( SOFT_START )
  #if defined ( MANAGED_SCAN )
      else if ( (((ZDO_NetworkDiscoveryCfm_t *)msgPtr)->hdr.status == ZDO_SUCCESS) && (zdoDiscCounter > NUM_DISC_ATTEMPTS) )
  #else
      else if ( (((ZDO_NetworkDiscoveryCfm_t *)msgPtr)->hdr.status == ZDO_SUCCESS) && (zdoDiscCounter++ > NUM_DISC_ATTEMPTS) )
  #endif
      {
        if ( devStartMode == MODE_JOIN )
        {
          devState = DEV_NWK_JOINING;

          ZDApp_NodeProfileSync((ZDO_NetworkDiscoveryCfm_t *)msgPtr);

          if ( NLME_JoinRequest( ((ZDO_NetworkDiscoveryCfm_t *)msgPtr)->extendedPANID,
               BUILD_UINT16( ((ZDO_NetworkDiscoveryCfm_t *)msgPtr)->panIdLSB, ((ZDO_NetworkDiscoveryCfm_t *)msgPtr)->panIdMSB ),
               ((ZDO_NetworkDiscoveryCfm_t *)msgPtr)->logicalChannel,
               ZDO_Config_Node_Descriptor.CapabilityFlags ) != ZSuccess )
          {
            ZDApp_NetworkInit( (uint16)(NWK_START_DELAY
                + ((uint16)(osal_rand()& EXTENDED_JOINING_RANDOM_MASK))) );
          }
        }
        else if ( devStartMode == MODE_REJOIN )
        {
          devState = DEV_NWK_REJOIN;
          if ( NLME_ReJoinRequest() != ZSuccess )
          {
            ZDApp_NetworkInit( (uint16)(NWK_START_DELAY
                + ((uint16)(osal_rand()& EXTENDED_JOINING_RANDOM_MASK))) );
          }
        }

        if ( ZDO_Config_Node_Descriptor.CapabilityFlags & CAPINFO_RCVR_ON_IDLE )
        {
          // The receiver is on, turn network layer polling off.
          NLME_SetPollRate( 0 );
          NLME_SetQueuedPollRate( 0 );
          NLME_SetResponseRate( 0 );
        }
      }
      else
      {
#if defined ( SOFT_START ) && !defined ( VIRTKEY_SOFT_START )
  #if defined ( MANAGED_SCAN )
        if ( (softStartAllowCoord)
            && (((ZDO_NetworkDiscoveryCfm_t *)msgPtr)->hdr.status != ZDO_SUCCESS )
              && (zdoDiscCounter > NUM_DISC_ATTEMPTS) )
  #else
        if ( (softStartAllowCoord)
            && (((ZDO_NetworkDiscoveryCfm_t *)msgPtr)->hdr.status != ZDO_SUCCESS )
              && (zdoDiscCounter++ > NUM_DISC_ATTEMPTS) )
  #endif
        {
          ZDO_Config_Node_Descriptor.LogicalType = NODETYPE_COORDINATOR;
          devStartMode = MODE_HARD;
        }
        else if ( continueJoining == FALSE )
        {
          devState = DEV_HOLD;
          osal_stop_timerEx( ZDAppTaskID, ZDO_NETWORK_INIT );
          break;    // Don't init
        }
#endif
  #if defined ( MANAGED_SCAN )
        ZDApp_NetworkInit( MANAGEDSCAN_DELAY_BETWEEN_SCANS );
  #else
        if ( continueJoining )
        {
          ZDApp_NetworkInit( (uint16)(BEACON_REQUEST_DELAY
              + ((uint16)(osal_rand()& BEACON_REQ_DELAY_MASK))) );
        }
  #endif
      }
#endif  // !ZDO_COORDINATOR
      break;

#if !defined( ZDO_COORDINATOR ) || defined( SOFT_START )
    case ZDO_NWK_JOIN_IND:
      ZDApp_ProcessNetworkJoin();
      break;

    case ZDO_NWK_JOIN_REQ:
      retryCnt = 0;
      devStartMode = MODE_RESUME;
      _tmpRejoinState = true;
      zgDefaultStartingScanDuration = BEACON_ORDER_60_MSEC;
      ZDApp_NetworkInit( 0 );

      // indicate state change to apps
      devState = DEV_INIT;
      osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );
      break;
#endif  // !ZDO_COORDINATOR

#if defined ( ZDSECMGR_SECURE )
  #if defined ( ZDSECMGR_COMMERCIAL )
        case ZDO_ESTABLISH_KEY_CFM:
          ZDSecMgrEstablishKeyCfm
            ( (ZDO_EstablishKeyCfm_t*)msgPtr );
          break;
  #endif

  #if defined ( ZDSECMGR_COMMERCIAL )
    #if !defined ( ZDO_COORDINATOR ) || defined ( SOFT_START )
        case ZDO_ESTABLISH_KEY_IND:
          ZDSecMgrEstablishKeyInd
            ( (ZDO_EstablishKeyInd_t*)msgPtr );
          break;
    #endif
  #endif

  #if !defined ( ZDO_COORDINATOR ) || defined( SOFT_START )
        case ZDO_TRANSPORT_KEY_IND:
          ZDSecMgrTransportKeyInd
            ( (ZDO_TransportKeyInd_t*)msgPtr );
          break;
  #endif

  #if defined ( ZDO_COORDINATOR )
        case ZDO_UPDATE_DEVICE_IND:
          ZDSecMgrUpdateDeviceInd
            ( (ZDO_UpdateDeviceInd_t*)msgPtr );
          break;
  #endif

  #if defined ( RTR_NWK )
    #if !defined ( ZDO_COORDINATOR ) || defined( SOFT_START )
        case ZDO_REMOVE_DEVICE_IND:
          ZDSecMgrRemoveDeviceInd
            ( (ZDO_RemoveDeviceInd_t*)msgPtr );
          break;
    #endif
  #endif

  #if defined ( ZDSECMGR_COMMERCIAL )
    #if defined ( ZDO_COORDINATOR )
        case ZDO_REQUEST_KEY_IND:
          ZDSecMgrRequestKeyInd
            ( (ZDO_RequestKeyInd_t*)msgPtr );
          break;
    #endif
  #endif

  #if !defined ( ZDO_COORDINATOR ) || defined( SOFT_START )
        case ZDO_SWITCH_KEY_IND:
          ZDSecMgrSwitchKeyInd
            ( (ZDO_SwitchKeyInd_t*)msgPtr );
          break;
  #endif

#endif // defined ( ZDSECMGR_SECURE )

    default:
      break;
  }

  (void)sentEP;
}

/*********************************************************************
 * @fn      ZDApp_ProcessMsgCBs()
 *
 * @brief   Process response messages
 *
 * @param   none
 *
 * @return  none
 */
void ZDApp_ProcessMsgCBs( zdoIncomingMsg_t *inMsg )
{
  switch ( inMsg->clusterID )
  {
#if defined ( ZDO_NWKADDR_REQUEST ) || defined ( ZDO_IEEEADDR_REQUEST ) || defined ( REFLECTOR )
    case NWK_addr_rsp:
    case IEEE_addr_rsp:
      {
        ZDO_NwkIEEEAddrResp_t *pAddrRsp;
        pAddrRsp = ZDO_ParseAddrRsp( inMsg );
        if ( pAddrRsp )
        {
          if ( pAddrRsp->status == ZSuccess )
          {
            ZDO_UpdateAddrManager( pAddrRsp->nwkAddr, pAddrRsp->extAddr );
          }
          osal_mem_free( pAddrRsp );
        }
      }
      break;
#endif

#if defined ( REFLECTOR )
    case Bind_req:
    case Unbind_req:
      {
        ZDO_BindUnbindReq_t bindReq;
        ZDO_ParseBindUnbindReq( inMsg, &bindReq );
        ZDO_ProcessBindUnbindReq( inMsg, &bindReq );
      }
      break;
#endif

#if defined ( ZDO_COORDINATOR )
    case Bind_rsp:
    case Unbind_rsp:
      if ( matchED )
      {
        ZDMatchSendState(
             (uint8)((inMsg->clusterID == Bind_rsp) ? ZDMATCH_REASON_BIND_RSP : ZDMATCH_REASON_UNBIND_RSP),
             ZDO_ParseBindRsp(inMsg), inMsg->TransSeq );
      }
      break;

    case End_Device_Bind_req:
      {
        ZDEndDeviceBind_t bindReq;
        ZDO_ParseEndDeviceBindReq( inMsg, &bindReq );
        ZDO_MatchEndDeviceBind( &bindReq );

        // Freeing the cluster lists - if allocated.
        if ( bindReq.numInClusters )
          osal_mem_free( bindReq.inClusters );
        if ( bindReq.numOutClusters )
          osal_mem_free( bindReq.outClusters );
      }
      break;
#endif
  }
}

/*********************************************************************
 * @fn      ZDApp_RegisterCBs()
 *
 * @brief   Process response messages
 *
 * @param   none
 *
 * @return  none
 */
void ZDApp_RegisterCBs( void )
{
#if defined ( ZDO_IEEEADDR_REQUEST ) || defined ( REFLECTOR )
  ZDO_RegisterForZDOMsg( ZDAppTaskID, IEEE_addr_rsp );
#endif
#if defined ( ZDO_NWKADDR_REQUEST ) || defined ( REFLECTOR )
  ZDO_RegisterForZDOMsg( ZDAppTaskID, NWK_addr_rsp );
#endif
#if defined ( ZDO_COORDINATOR )
  ZDO_RegisterForZDOMsg( ZDAppTaskID, Bind_rsp );
  ZDO_RegisterForZDOMsg( ZDAppTaskID, Unbind_rsp );
  ZDO_RegisterForZDOMsg( ZDAppTaskID, End_Device_Bind_req );
#endif
#if defined ( REFLECTOR )
  ZDO_RegisterForZDOMsg( ZDAppTaskID, Bind_req );
  ZDO_RegisterForZDOMsg( ZDAppTaskID, Unbind_req );
#endif
}

#if !defined( ZDO_COORDINATOR ) || defined( SOFT_START )
/*********************************************************************
 * @fn      ZDApp_ProcessNetworkJoin()
 *
 * @brief
 *
 *   Save off the Network key information.
 *
 * @param   none
 *
 * @return  none
 */
void ZDApp_ProcessNetworkJoin( void )
{
  if ( (devState == DEV_NWK_JOINING) ||
      ((devState == DEV_NWK_ORPHAN)  &&
       (ZDO_Config_Node_Descriptor.LogicalType == NODETYPE_ROUTER)) )
  {
    // Result of a Join attempt by this device.
    if ( nwkStatus == ZSuccess )
    {
      osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );

#if defined ( POWER_SAVING )
      osal_pwrmgr_device( PWRMGR_BATTERY );
#endif

#if   ( SECURE != 0  )
      if ( _NIB.SecurityLevel && (ZDApp_RestoreNwkKey() == false ) )
      {
        // wait for auth from trust center!!
        devState = DEV_END_DEVICE_UNAUTH;

        // Start the reset timer for MAX UNAUTH time
        ZDApp_ResetTimerStart( MAX_DEVICE_UNAUTH_TIMEOUT );
      }
      else
#endif  // SECURE
      {
#if defined ( RTR_NWK )
        if ( devState == DEV_NWK_ORPHAN
            && ZDO_Config_Node_Descriptor.LogicalType != NODETYPE_DEVICE )
        {
          // Change NIB state to router for restore
          _NIB.nwkState = NWK_ROUTER;
        }
#endif
        devState = DEV_END_DEVICE;
#if defined ( RTR_NWK )
        // NOTE: first two parameters are not used, see NLMEDE.h for details
  #if !defined (AUTO_SOFT_START)
        if ( ZDO_Config_Node_Descriptor.LogicalType != NODETYPE_DEVICE )
        {
          NLME_StartRouterRequest( 0, 0, false );
        }
  #endif // AUTO_SOFT_START
#endif  // RTR

#if defined ( ZDO_ENDDEVICE_ANNCE_GENERATE )
        ZDP_EndDeviceAnnce( ZDAppNwkAddr.addr.shortAddr, saveExtAddr,
                           ZDO_Config_Node_Descriptor.CapabilityFlags, 0 );
#endif
      }
    }
    else
    {
      if ( (devStartMode == MODE_RESUME) && (++retryCnt >= MAX_RESUME_RETRY) )
      {
        if ( _NIB.nwkPanId == 0xFFFF || _NIB.nwkPanId == INVALID_PAN_ID )
          devStartMode = MODE_JOIN;
        else
        {
          devStartMode = MODE_REJOIN;
          _tmpRejoinState = true;
        }
      }

      if ( (NLME_GetShortAddr() != INVALID_NODE_ADDR) ||
           (_NIB.nwkDevAddress != INVALID_NODE_ADDR) )
      {
        uint16 addr = INVALID_NODE_ADDR;
        // Invalidate nwk addr so end device does not use in its data reqs.
        _NIB.nwkDevAddress = INVALID_NODE_ADDR;
        ZMacSetReq( ZMacShortAddress, (byte *)&addr );
      }

      zdoDiscCounter = 1;

//      ZDApp_NetworkInit( (uint16)
//                         ((NWK_START_DELAY * (osal_rand() & 0x0F)) +
//                          (NWK_START_DELAY * 5)) );
      ZDApp_NetworkInit( (uint16)(NWK_START_DELAY
           + ((uint16)(osal_rand()& EXTENDED_JOINING_RANDOM_MASK))) );
    }
  }
  else if ( devState == DEV_NWK_ORPHAN || devState == DEV_NWK_REJOIN )
  {
    // results of an orphaning attempt by this device
    if (nwkStatus == ZSuccess)
    {
#if ( SECURE != 0 )
      ZDApp_RestoreNwkKey();
#endif
      devState = DEV_END_DEVICE;
      osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );
      // setup Power Manager Device
#if defined ( POWER_SAVING )
      osal_pwrmgr_device( PWRMGR_BATTERY );
#endif

      if ( ZDO_Config_Node_Descriptor.CapabilityFlags & CAPINFO_RCVR_ON_IDLE )
      {
        // The receiver is on, turn network layer polling off.
        NLME_SetPollRate( 0 );
        NLME_SetQueuedPollRate( 0 );
        NLME_SetResponseRate( 0 );
      }

#if defined ( ZDO_ENDDEVICE_ANNCE_GENERATE )
      ZDP_EndDeviceAnnce( ZDAppNwkAddr.addr.shortAddr, saveExtAddr,
                         ZDO_Config_Node_Descriptor.CapabilityFlags, 0 );
#endif

    }
    else
    {
      if ( (devStartMode == MODE_RESUME) && (++retryCnt >= MAX_RESUME_RETRY) )
      {
        if ( _NIB.nwkPanId == 0xFFFF || _NIB.nwkPanId == INVALID_PAN_ID )
          devStartMode = MODE_JOIN;
        else
        {
          devStartMode = MODE_REJOIN;
          _tmpRejoinState = true;
        }
      }

      // setup a retry for later...
      ZDApp_NetworkInit( (uint16)(NWK_START_DELAY
           + (osal_rand()& EXTENDED_JOINING_RANDOM_MASK)) );
    }
  }
  else
  {
    // this is an error case!!
  }
}
#endif // !ZDO_COORDINATOR

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -