zdcache.lst

来自「CC2430上开关控制灯和温度传感器采集两个例子」· LST 代码 · 共 1,345 行 · 第 1/5 页

LST
1,345
字号
    401          /*********************************************************************
    402           * @fn      getIdxExt
    403           *
    404           * @brief   Find the idx into the Discovery Cache Arrays corresponding to
    405           *          the given IEEE address.
    406           *
    407           * @param   byte * - a valid buffer containing an extended IEEE address.
    408           *
    409           * @return  If address found, return the valid index, else CACHE_DEV_MAX.
    410           *
    411           */
    412          static byte getIdxExt( byte *ieee )
    413          {
    414            byte idx;
    415          
    416            for ( idx = 0; idx < CACHE_DEV_MAX; idx++ )
    417            {
    418              if ( osal_ExtAddrEqual( ieee, ExtAddr[idx] ) &&
    419                                                    (NwkAddr[idx] != INVALID_NODE_ADDR) )
    420              {
    421                break;
    422              }
    423            }
    424          
    425            return idx;
    426          }
    427          
    428          /*********************************************************************
    429           * @fn      getIdxEP
    430           *
    431           * @brief   Find the idx into the EndPoint Array corresponding to the idx of a
    432           *          cached short address.
    433           *
    434           * @param   byte - a valid index of a cached 16 bit short address.
    435           * @param   byte - the EndPoint of interest.
    436           *
    437           * @return  If EndPoint found, return the valid index, else CACHE_EP_MAX.
    438           *
    439           */
    440          static byte getIdxEP( byte idx, byte ep )
    441          {
    442            byte epIdx;
    443          
    444            for ( epIdx = 0; epIdx < EPCnt[idx]; epIdx++ )
    445            {
    446              if ( ep == EPArr[idx][epIdx] )
    447              {
    448                break;
    449              }
    450            }
    451          
    452            if ( epIdx == EPCnt[idx] )
    453            {
    454              epIdx = CACHE_EP_MAX;
    455            }
    456          
    457            return epIdx;
    458          }
    459          
    460          /*********************************************************************
    461           * @fn      purgeAddr
    462           *
    463           * @brief   Purge every instance of given network address from Discovery Cache.
    464           *
    465           * @param   uint16 - a 16-bit network address.
    466           *
    467           */
    468          static byte purgeAddr( uint16 addr )
    469          {
    470            byte idx, cnt = 0;
    471          
    472            for ( idx = 0; idx < CACHE_DEV_MAX; idx++ )
    473            {
    474              if ( NwkAddr[idx] == addr )
    475              {
    476                NwkAddr[idx] = INVALID_NODE_ADDR;
    477                cnt++;
    478              }
    479            }
    480          
    481            return cnt;
    482          }
    483          
    484          /*********************************************************************
    485           * @fn      purgeIEEE
    486           *
    487           * @brief   Purge every instance of given IEEE from Discovery Cache.
    488           *
    489           * @param   ZLongAddr_t - a valid IEEE address.
    490           *
    491           */
    492          static byte purgeIEEE( byte *ieee )
    493          {
    494            byte idx, cnt = 0;
    495          
    496            for ( idx = 0; idx < CACHE_DEV_MAX; idx++ )
    497            {
    498              if ( osal_ExtAddrEqual( ieee, ExtAddr[idx] ) &&
    499                                                    (NwkAddr[idx] != INVALID_NODE_ADDR) )
    500              {
    501                NwkAddr[idx] = INVALID_NODE_ADDR;
    502                cnt++;
    503              }
    504            }
    505          
    506            return cnt;
    507          }
    508          #endif
    509          
    510          /*********************************************************************
    511           * @fn          ZDCacheInit
    512           *
    513           * @brief       Initialize ZDO Cache environment.
    514           *
    515           */
    516          void ZDCacheInit( void )
    517          {
    518          
    519            msgAddr.endPoint = ZDO_EP;
    520            msgAddr.addrMode = afAddr16Bit;
    521            msgAddr.addr.shortAddr = INVALID_NODE_ADDR;
    522            radius = AF_DEFAULT_RADIUS;
    523            (void)secUse;
    524          
    525          #if ( CACHE_DEV_MAX > 0 )
    526            byte idx;
    527          
    528            for ( idx = 0; idx < CACHE_DEV_MAX; idx++ )
    529            {
    530              byte epIdx;
    531              NwkAddr[idx] = INVALID_NODE_ADDR;
    532          
    533              for ( epIdx = 0; epIdx < CACHE_EP_MAX; epIdx++ )
    534              {
    535                SimpDesc[idx][epIdx].pAppInClusterList = InClusters[idx][epIdx];
    536                SimpDesc[idx][epIdx].pAppOutClusterList= OutClusters[idx][epIdx];
    537              }
    538            }
    539          #elif ( CACHE_DEV_MAX == 0 )
    540            // Client cache work done by ZDCacheTimerEvent, driven by NWK_AUTO_POLL_EVT.
    541          #endif
    542          }
    543          
    544          /*********************************************************************
    545           * @fn          ZDCacheTimerEvent
    546           *
    547           * @brief       ZDP maintenance, aging discovery cache.
    548           *              Invoked at RTG_TIMER_INTERVAL.
    549           */
    550          void ZDCacheTimerEvent( void )
    551          {
    552          #if ( CACHE_DEV_MAX > 0 )
    553            byte idx;
    554          
    555            for ( idx = 0; idx < CACHE_DEV_MAX; idx++ )
    556            {
    557              if ( NwkAddr[idx] != INVALID_NODE_ADDR )
    558              {
    559                if ( --Expiry[idx] == 0 )
    560                {
    561                  NwkAddr[idx] = INVALID_NODE_ADDR;
    562                }
    563              }
    564            }
    565          #elif ( CACHE_DEV_MAX == 0 )
    566            static eCacheState state = eCacheWait;
    567            static byte reqIdx = 0;
    568            static byte wCnt = 0;
    569          
    570            byte strtFind = FALSE;
    571            byte cmd = 0;
    572            byte len = 2 + Z_EXTADDR_LEN;
    573            byte *msg, *ptr;
    574          
    575            wCnt++;
    576            if ( state == eCacheWait )
    577            {
    578              if ( wCnt < WAIT_TO_STORE_CACHE )
    579              {
    580                return;
    581              }
    582            }
    583            else if ( wCnt < WAIT_ON_RESP_CACHE )
    584            {
    585              return;
    586            }
    587          
    588            msg = osal_mem_alloc( MAX_PKT_LEN );
    589            if ( msg == NULL )
    590            {
    591              return;
    592            }
    593          
    594            msg[0] = LO_UINT16( ZDAppNwkAddr.addr.shortAddr );
    595            msg[1] = HI_UINT16( ZDAppNwkAddr.addr.shortAddr );
    596            osal_cpyExtAddr( msg+2, saveExtAddr );
    597            ptr = msg+2+Z_EXTADDR_LEN;
    598          
    599            switch ( state )
    600            {
    601            case eCacheWait:
    602              state = eCacheClean;
    603              msgAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR;
    604              cmd = Find_node_cache_req;
    605              cacheCnt = 0;
    606              reqIdx = 0;
    607              break;
    608          
    609            case eCacheClean:
    610              if ( reqIdx < cacheCnt )
    611              {
    612                msgAddr.addr.shortAddr = cacheFindAddr[reqIdx++];
    613                cmd = Remove_node_cache_req;
    614              }
    615              else
    616              {
    617                strtFind = TRUE;
    618                radius = 0;
    619              }
    620              break;
    621          
    622            case eCacheFind:
    623              if ( cacheCnt != 0 )
    624              {
    625                state = eCacheRequest;
    626                reqIdx = 0;
    627              }
    628              else
    629              {
    630                strtFind = TRUE;
    631              }
    632              break;
    633          
    634            case eCacheRequest:
    635              if ( (cacheRsp == ZDP_SUCCESS) && (reqIdx != 0) )
    636              {
    637                cmd = Node_Desc_store_req;
    638                len += sizeof( NodeDescriptorFormat_t );
    639                ptr = osal_memcpy( ptr, &ZDO_Config_Node_Descriptor,
    640                                                      sizeof( NodeDescriptorFormat_t ) );
    641                state = eNodeDescStore;
    642              }
    643              else if ( reqIdx < cacheCnt )
    644              {
    645                EPCnt = afNumEndPoints() - 1;  // -1 for ZDO endpoint descriptor.
    646          
    647                if ( EPCnt < CACHE_EP_MAX )
    648                {
    649                  byte idx;
    650                  afEndPoints( EPArr, true );
    651          
    652                  msgAddr.addr.shortAddr = cacheFindAddr[reqIdx++];
    653          
    654                  cmd = Discovery_store_req;
    655                  len += (4 + EPCnt);
    656                  *ptr++ = sizeof( NodeDescriptorFormat_t );
    657                  *ptr++ = sizeof( NodePowerDescriptorFormat_t );
    658                  *ptr++ = EPCnt + 1;  // NOT -1 for size in bytes of EP list.
    659                  *ptr++ = EPCnt;
    660          
    661                  for ( idx = 0; idx < EPCnt; idx++ )
    662                  {
    663                    SimpleDescriptionFormat_t *sDesc;
    664                    byte free = afFindSimpleDesc( &sDesc, EPArr[idx] );
    665          
    666                    if ( sDesc != NULL )
    667                    {
    668                      *ptr++ = 8 + sDesc->AppNumInClusters + sDesc->AppNumOutClusters;
    669          

⌨️ 快捷键说明

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