コード例 #1
0
        /// <summary>
        /// Decode beacon from frame
        /// </summary>
        /// <param name="frame"></param>
        /// <returns></returns>
        public bool ReadFromFrame(ref Frame frame)
        {
            if (frame == null)
                return false;

            // 7.2.2.1.2 Superframe Specification field
            if (frame.LengthDataUsed < 3)
                return false;
            int i = (int)frame.ReadUInt16(0);
            beaconOrder = (Byte)(i & 0xf);
            superframeOrder = (Byte)((i >> 4) & 0xf);
            finalCapSlot = (Byte)((i >> 8) & 0xf);
            batteryLifeExtension = (Byte)((i >> 12) & 1);
            panCoordinator = (Byte)((i >> 14) & 1);
            associationPermit = (Byte)((i >> 15) & 1);

            // 7.2.2.1.3 GTS Specification field
            i = (int)frame.ReadByte(2);
            gtsLength = (Byte)(i & 7);
            gtsPermit = (Byte)((i >> 7) & 1);

            frame.DeleteFromFront(3);

            // 7.2.2.1.4 GTS Directions field
            gtsDirectionsMask = 0;
            if (gtsLength > 0)
            {
                if (frame.LengthDataUsed < 1)
                    return false;
                i = (int)frame.ReadByte(0);
                gtsDirectionsMask = (Byte)(i & 0x7F);
                frame.DeleteFromFront(1);
            }

            // 7.2.2.1.5 GTS List field
            if (frame.LengthDataUsed < 3 * gtsLength)
                return false;
            gtsDescriptor = new GtsDescriptor[gtsLength];
            for (int k = 0; k < gtsLength; k++)
            {
                gtsDescriptor[k].deviceShortAddr = frame.ReadUInt16(0);
                i = (int)frame.ReadByte(2);
                gtsDescriptor[k].gtsStartingSlot = (Byte)(i & 0xF);
                gtsDescriptor[k].gtsLength = (Byte)((i >> 4) & 0xF);
                frame.DeleteFromFront(3);
            }

            // 7.2.2.1.6 Pending Address Specification field
            if (frame.LengthDataUsed < 1)
                return false;
            i = (int)frame.ReadByte(0);
            pendingShort = (i & 7);
            pendingExt = ((i >> 4) & 7);
            frame.DeleteFromFront(1);

            // 7.2.2.1.7 Address List field
            if (frame.LengthDataUsed < pendingShort * 2 + pendingExt * 8)
                return false;
            shortAddrPending = new UInt16[pendingShort];
            extAddrPending = new UInt64[pendingExt];
            for (int k = 0; k < pendingShort; k++)
            {
                shortAddrPending[k] = frame.ReadUInt16(0);
                frame.DeleteFromFront(2);
            }

            for (int k = 0; k < pendingExt; k++)
            {
                extAddrPending[k] = frame.ReadUInt64(0);
                frame.DeleteFromFront(8);
            }

            // 7.2.2.1.8 Beacon Payload field
            if (frame.LengthDataUsed > 0)
            {
                payload = frame;
                frame = null;
            }
            else
            {
                payload = null;
                Frame.Release(ref frame);
            }

            return true;
        }
コード例 #2
0
ファイル: Network.cs プロジェクト: awakegod/NETMF-LPC
        public bool ReadFromFrame(Frame frame)
        {
            if (frame == null || frame.LengthDataUsed < 1)
                return false;
            byte header = frame.ReadByte(0);
            if (header != (byte)Message.Report)
                return false;
            nodeCount = (frame.LengthDataUsed - 1) / 6;
            if (frame.LengthDataUsed != Length())
                return false;
            frame.DeleteFromFront(1);
            nodes = new Node[nodeCount];
            for (int i = 0; i < nodeCount; i++)
            {
                nodes[i].addr = frame.ReadUInt16(0);
                frame.DeleteFromFront(2);
                nodes[i].rxBps = frame.ReadUInt32(0);
                frame.DeleteFromFront(4);
            }

            return true;
        }
コード例 #3
0
 protected override void DecodePayload(Frame frame)
 {
     panId = frame.ReadUInt16(0);
     coordinatorShortAddr = frame.ReadUInt16(2);
     channel = frame.ReadByte(4);
     shortAddr = frame.ReadUInt16(5);
     if (frame.LengthDataUsed == 8)
     {
         channelPage = frame.ReadByte(7);
         channelPagePresent = true;
     }
     else
     {
         channelPagePresent = false;
     }
 }
コード例 #4
0
ファイル: Network.cs プロジェクト: awakegod/NETMF-LPC
        public bool ReadFromFrame(Frame frame)
        {
            if (frame == null || frame.LengthDataUsed < 1)
                return false;
            byte header = frame.ReadByte(0);
            if (header != (byte)Message.Neighbors)
                return false;
            neighborCount = (frame.LengthDataUsed - 1) / 3;
            if (frame.LengthDataUsed != Length())
                return false;
            frame.DeleteFromFront(1);
            neighbors = new Neighbor[neighborCount];
            for (int i = 0; i < neighborCount; i++)
            {
                neighbors[i].shortAdr = frame.ReadUInt16(0);
                frame.DeleteFromFront(2);
                neighbors[i].lqi = frame.ReadByte(0);
                frame.DeleteFromFront(1);
            }

            return true;
        }
コード例 #5
0
 protected override void DecodePayload(Frame frame)
 {
     shortAddr = frame.ReadUInt16(0);
     status = (Status)frame.ReadByte(2);
 }