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

📄 zdapp.c

📁 Zigbee2006入门源代码,包括了Zigbee的入门介绍,和源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
  // it here. if we're going to be a joining device setting will be done in the
  // confirm callback if necessary.
  if (restore)
  {
    // we need to set NV to a (possibly) new value
    NLME_SetRequest(nwkProtocolVersion, 0, &protoVer);
  }
}

/*********************************************************************
 * @fn      ZDApp_InitUserDesc()
 *
 * @brief   Initialize the User Descriptor, the descriptor is read from NV
 *          when needed.  If you want to initialize the User descriptor to
 *          something other than all zero, do it here.
 *
 * @param   none
 *
 * @return  none
 */
void ZDApp_InitUserDesc( void )
{
  UserDescriptorFormat_t ZDO_DefaultUserDescriptor;

  // Initialize the User Descriptor, the descriptor is read from NV
  // when needed.  If you want to initialize the User descriptor to something
  // other than all zero, do it here.
  osal_memset( &ZDO_DefaultUserDescriptor, 0, sizeof( UserDescriptorFormat_t ) );
  if ( ZSUCCESS == osal_nv_item_init( ZCD_NV_USERDESC,
         sizeof(UserDescriptorFormat_t), (void*)&ZDO_DefaultUserDescriptor ) )
  {
    if ( ZSUCCESS == osal_nv_read( ZCD_NV_USERDESC, 0,
         sizeof(UserDescriptorFormat_t), (void*)&ZDO_DefaultUserDescriptor ) )
    {
      if ( ZDO_DefaultUserDescriptor.len != 0 )
      {
        ZDO_Config_Node_Descriptor.UserDescAvail = TRUE;
      }
    }
  }
}

/*********************************************************************
 * @fn      ZDAppCheckForHoldKey()
 *
 * @brief   Check for key to set the device into Hold Auto Start
 *
 * @param   none
 *
 * @return  none
 */
void ZDAppCheckForHoldKey( void )
{
#if (defined HAL_KEY) && (HAL_KEY == TRUE)
  // Get Keypad directly to see if a HOLD_START is needed.
  // Hold down the SW_BYPASS_START key (see OnBoard.h)
  // while booting to avoid starting up the device.
  if ( HalKeyRead () == SW_BYPASS_START)
  {
    // Change the device state to HOLD on start up
    devState = DEV_HOLD;
  }
#endif // HAL_KEY
}

/*********************************************************************
 * @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 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;
}

#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

#if ( SECURE != 0 )
/*********************************************************************
 * @fn      ZDApp_SaveNwkKey()
 *
 * @brief   Save off the Network key information.
 *
 * @param   none
 *
 * @return  none
 */
void ZDApp_SaveNwkKey( void )
{
  nwkActiveKeyItems keyItems;

  SSP_ReadNwkActiveKey( &keyItems );
  keyItems.frameCounter++;

  osal_nv_write( ZCD_NV_NWKKEY, 0, sizeof( nwkActiveKeyItems ),
                (void *)&keyItems );

  nwkFrameCounterChanges = 0;
}

/*********************************************************************
 * @fn      ZDApp_ResetNwkKey()
 *
 * @brief   Reset the Network key information in NV.
 *
 * @param   none
 *
 * @return  none

⌨️ 快捷键说明

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