zdcache.lst

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

LST
1,345
字号
    670                      if ( free )
    671                      {
    672                        osal_mem_free( sDesc );
    673                      }
    674                    }
    675                    else
    676                    {
    677                      *ptr++ = 8;
    678                    }
    679                  }
    680                }
    681              }
    682              else
    683              {
    684                strtFind = TRUE;
    685              }
    686              break;
    687          
    688            case eNodeDescStore:
    689              if ( cacheRsp == ZDP_SUCCESS )
    690              {
    691                cmd = Power_Desc_store_req;
    692                len += sizeof( NodePowerDescriptorFormat_t );
    693                ptr = osal_memcpy( ptr, &ZDO_Config_Power_Descriptor,
    694                                                 sizeof( NodePowerDescriptorFormat_t ) );
    695                state = ePwrDescStore;
    696              }
    697              else
    698              {
    699                strtFind = TRUE;
    700              }
    701              break;
    702          
    703            case ePwrDescStore:
    704              if ( cacheRsp == ZDP_SUCCESS )
    705              {
    706                cmd = Active_EP_store_req;
    707                len += EPCnt + 1;
    708                *ptr++ = EPCnt;
    709                afEndPoints( ptr, true );
    710                state = eActiveEPStore;
    711              }
    712              else
    713              {
    714                strtFind = TRUE;
    715              }
    716              break;
    717          
    718            case eActiveEPStore:
    719              if ( cacheRsp == ZDP_SUCCESS )
    720              {
    721                state = eSimpDescStore;
    722                reqIdx = 0;
    723              }
    724              else
    725              {
    726                strtFind = TRUE;
    727              }
    728              break;
    729          
    730            case eSimpDescStore:
    731              if ( (cacheRsp == ZDP_SUCCESS) || (reqIdx == 0) )
    732              {
    733                if ( reqIdx >= EPCnt )
    734                {
    735                  state = eCacheDone;
    736                }
    737                else
    738                {
    739                  SimpleDescriptionFormat_t *sDesc;
    740                  byte free = afFindSimpleDesc( &sDesc, EPArr[reqIdx++] );
    741          
    742                  if ( sDesc != NULL )
    743                  {
    744                    cmd = Simple_Desc_store_req;
    745                    len += 1 + 8 + sDesc->AppNumInClusters + sDesc->AppNumOutClusters;
    746                    *ptr++ = 8 + sDesc->AppNumInClusters + sDesc->AppNumOutClusters;
    747                    *ptr++ = sDesc->EndPoint;
    748                    *ptr++ = LO_UINT16( sDesc->AppProfId );
    749                    *ptr++ = HI_UINT16( sDesc->AppProfId );
    750                    *ptr++ = LO_UINT16( sDesc->AppDeviceId );
    751                    *ptr++ = HI_UINT16( sDesc->AppDeviceId );
    752                    *ptr++ = (sDesc->Reserved << 4) | sDesc->AppDevVer;
    753                    *ptr++ = sDesc->AppNumInClusters;
    754                    ptr = osal_memcpy( ptr, sDesc->pAppInClusterList,
    755                                                                sDesc->AppNumInClusters );
    756                    *ptr++ = sDesc->AppNumOutClusters;
    757                    osal_memcpy(ptr, sDesc->pAppOutClusterList, sDesc->AppNumOutClusters);
    758          
    759                    if ( free )
    760                    {
    761                      osal_mem_free( sDesc );
    762                    }
    763                  }
    764                }
    765              }
    766              else
    767              {
    768                strtFind = TRUE;
    769              }
    770              break;
    771          
    772            case eCacheDone:
    773          #if !defined( NWK_AUTO_POLL )
    774              NLME_SetPollRate( 0 );  // Stop the timer to allow max power savings.
    775          #endif
    776              break;
    777          
    778            default:
    779              break;
    780            }  // switch ( state )
    781          
    782            if ( strtFind )
    783            {
    784              if ( state >= eNodeDescStore )
    785              {
    786                SendMsg( Remove_node_cache_req, 2+Z_EXTADDR_LEN, msg );
    787              }
    788          
    789              state = eCacheFind;
    790              if ( ++radius > (2 * _NIB.MaxDepth) )
    791              {
    792                radius = 1;
    793              }
    794              msgAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR;
    795              cacheCnt = 0;
    796              cmd = Discovery_Register_req;
    797            }
    798            cacheRsp = ZDP_TIMEOUT;
    799            wCnt = 0;
    800          
    801            if ( cmd != 0 )
    802            {
    803              SendMsg( cmd, len, msg );
    804            }
    805            osal_mem_free( msg );
    806          #endif
    807          }
    808          
    809          #if ( CACHE_DEV_MAX > 0 )
    810          /*********************************************************************
    811           * @fn          ZDCacheProcessReq
    812           *
    813           * @brief       Build and send a response to a Discovery Cache request.
    814           *
    815           */
    816          void ZDCacheProcessReq( zAddrType_t *src, byte *msg, byte len,
    817                                                           byte cmd, byte seq, byte sty )
    818          {
    819            byte status = ZDP_SUCCESS;
    820            byte sent = FALSE;
    821          
    822            msgAddr.addr.shortAddr = src->addr.shortAddr;
    823            tranSeq = seq;
    824            secUse = sty;
    825          
    826            if ( !CACHE_SERVER )
    827            {
    828              // Broadcast reqs without a negative response specified.
    829              if ( (cmd == Discovery_Register_req) || (cmd == Find_node_cache_req) )
    830              {
    831                sent = TRUE;
    832              }
    833              else
    834              {
    835                status = ZDP_NOT_SUPPORTED;
    836              }
    837            }
    838            else if ( cmd == Discovery_Register_req )
    839            {
    840              if ( getIdx( INVALID_NODE_ADDR ) == CACHE_DEV_MAX )
    841              {
    842                status = ZDP_TABLE_FULL;
    843              }
    844            }
    845            else if ( cmd == Discovery_store_req )
    846            {
    847              status = processDiscoveryStoreReq( msg );
    848            }
    849            else if ( cmd == Find_node_cache_req )
    850            {
    851              processFindNodeCacheReq( msg );
    852              sent = TRUE;
    853            }
    854            else if ( cmd == Mgmt_Cache_req )
    855            {
    856              processMgmtCacheReq( *msg );
    857              sent = TRUE;
    858            }
    859            else
    860            {
    861              uint16 aoi = BUILD_UINT16( msg[0], msg[1] );
    862              byte idx = getIdx( aoi );
    863          
    864              if ( cmd == Remove_node_cache_req )
    865              {
    866                if ( (purgeAddr( aoi ) + purgeIEEE( msg+2 )) == 0 )
    867                {
    868                  status = ZDP_NOT_PERMITTED;
    869                }
    870              }
    871              else if ( idx == CACHE_DEV_MAX )
    872              {
    873                status = ZDP_NOT_PERMITTED;
    874              }
    875              else
    876              {
    877                msg += (2 + Z_EXTADDR_LEN);
    878          
    879                switch ( cmd )
    880                {
    881                case Node_Desc_store_req:
    882                  osal_memcpy( NodeDesc+idx, msg, sizeof( NodeDescriptorFormat_t ) );
    883                  break;
    884          
    885                case Power_Desc_store_req:
    886                  osal_memcpy( NodePwr+idx, msg, sizeof( NodePowerDescriptorFormat_t ) );
    887                  break;
    888          
    889                case Active_EP_store_req:
    890                  if ( *msg < CACHE_EP_MAX )
    891                  {
    892                    EPCnt[idx] = *msg++;
    893                    osal_memcpy( EPArr+idx, msg, EPCnt[idx] );
    894                  }
    895                  else
    896                  {
    897                    status = ZDP_INSUFFICIENT_SPACE;
    898                  }
    899                  break;
    900          
    901                case Simple_Desc_store_req:
    902                  status = processSimpleDescStoreReq( msg, idx );
    903                  break;
    904                }
    905              }
    906            }
    907          
    908            if ( !sent )
    909            {
    910              SendMsg( (cmd | ZDO_RESPONSE_BIT ), 1, &status );
    911            }
    912          }
    913          
    914          /*********************************************************************
    915           * @fn        ZDCacheProcessMatchDescReq
    916           *
    917           * @brief     Build and send a response to a Broadcast Discovery Cache request.
    918           *
    919           * @return    None.
    920           */
    921          void ZDCacheProcessMatchDescReq( byte seq, zAddrType_t *src,
    922                           byte inCnt, uint16 *inClusters, byte outCnt, uint16 *outClusters,
    923                                                 uint16 profileID, uint16 aoi, byte sty )
    924          {
    925            byte buf[ 1 + 2 + 1 + CACHE_EP_MAX ];  // Status + AOI + Len + EP list.
    926            byte aoiMatch = (aoi == NWK_BROADCAST_SHORTADDR) ? TRUE : FALSE;
    927            SimpleDescriptionFormat_t *sDesc;
    928            byte idx, epIdx, epCnt;
    929            secUse = sty;
    930          
    931            if ( !CACHE_SERVER )
    932            {
    933              return;
    934            }
    935          
    936            buf[0] = ZDP_SUCCESS;
    937            buf[1] = LO_UINT16( aoi );
    938            buf[2] = HI_UINT16( aoi );

⌨️ 快捷键说明

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