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 + -
显示快捷键?