/// <summary>
 /// Encode command frame
 /// </summary>
 /// <param name="frame">target buffer</param>
 /// <returns>True on success</returns>
 public bool WriteToFrame(Frame frame)
 {
     if (frame == null || frame.LengthDataAvail < _lengthMax || frame.LengthDataUsed != 0)
         return false;
     frame.ReserveHeader(frame.LengthHeaderAvail + 1); // increase header space by one byte
     frame.AllocBack(_lengthMax - 1); // reserve space without command type, so payload is at 0..n-1
     EncodePayload(frame);
     frame.AllocFront(1);
     frame.Write(0, (byte)_type);
     return true;
 }
示例#2
0
        public bool WriteToFrame(Frame frame)
        {
            int len = Length();
            if (frame == null || frame.LengthDataAvail < len)
                return false;
            frame.AllocBack(len);

            int offset = 0;
            frame.Write(offset, (byte)Message.Report);
            offset++;

            for (int i = 0; i < nodeCount; i++)
            {
                frame.Write(offset, nodes[i].addr);
                offset += 2;
                frame.Write(offset, nodes[i].rxBps);
                offset += 4;
            }

            return true;
        }
示例#3
0
        /// <summary>
        /// Encode beacon into frame
        /// </summary>
        /// <param name="frame">target frame</param>
        /// <returns>True on success</returns>
        public bool WriteToFrame(Frame frame)
        {
            int len = Length();
            if (frame == null || frame.LengthDataAvail < len || frame.LengthDataUsed > 0)
                return false;
            if (payload != null)
                len -= payload.LengthDataUsed;
            frame.AllocBack(len);

            int offset = 0;

            // 7.2.2.1.2 Superframe Specification field
            int i;
            i = (beaconOrder & 0xf) |
                ((superframeOrder & 0xf) << 4) |
                ((finalCapSlot & 0xf) << 8) |
                ((batteryLifeExtension & 1) << 12) |
                ((panCoordinator & 1) << 14) |
                ((associationPermit & 1) << 15);
            frame.Write(offset, (UInt16)i);
            offset += 2;

            // 7.2.2.1.3 GTS Specification field
            if (gtsLength > 7)
                return false; // assert
            i = (gtsLength & 7) |
                 ((gtsPermit & 1) << 7);
            frame.Write(offset, (Byte)i);
            offset += 1;

            // 7.2.2.1.4 GTS Directions field
            if (gtsLength > 0)
            {
                i = (gtsDirectionsMask & 0x7F); // 7 bits
                frame.Write(offset, (Byte)i);
                offset += 1;
            }

            // 7.2.2.1.5 GTS List field
            for (int k = 0; k < gtsLength; k++)
            {
                frame.Write(offset, gtsDescriptor[k].deviceShortAddr);
                offset += 2;
                i = (gtsDescriptor[k].gtsStartingSlot & 0xF) |
                    ((gtsDescriptor[k].gtsLength & 0xF) << 4);
                frame.Write(offset, (Byte)i);
                offset++;
            }

            // 7.2.2.1.6 Pending Address Specification field
            i = (pendingShort & 7) |
                ((pendingExt & 7) << 4);
            frame.Write(offset, (Byte)i);
            offset++;

            // 7.2.2.1.7 Address List field
            for (int k = 0; k < pendingShort; k++)
            {
                frame.Write(offset, shortAddrPending[k]);
                offset += 2;
            }

            for (int k = 0; k < pendingExt; k++)
            {
                frame.Write(offset, extAddrPending[k]);
                offset += 8;
            }

            // 7.2.2.1.8 Beacon Payload field
            if (payload != null)
                frame.WriteToBack(payload);

            return true;
        }
示例#4
0
        /// <summary>
        /// Encodes the header into the front of the frame
        /// </summary>
        /// <param name="frame">The header is placed at the front of this frame</param>
        /// <returns>True on success, false if the frame is too small or the header is invalid</returns>
        public bool WriteToFrameHeader(Frame frame)
        {
            int len = Length();
            if (frame.LengthHeaderAvail < len)
                return false;

            frame.AllocFront(len);
            frame.WriteCanonical(0, fcs.Value);
            frame.Write(2, seqNo);
            int offset = 3;
            AddressingMode dstMode = fcs.DstAddrMode;
            AddressingMode srcMode = fcs.SrcAddrMode;
            bool panIdCompression = fcs.PanIdCompression;

            if (dstMode == AddressingMode.Reserved || srcMode == AddressingMode.Reserved ||
                (panIdCompression && dstMode == AddressingMode.None))
                return false;

            if (dstMode != AddressingMode.None)
            { // dstPanId
                frame.WriteCanonical(offset, dstPanId);
                offset += 2;
            }

            if (dstMode == AddressingMode.Short)
            { // dstAddrShort
                frame.WriteCanonical(offset, dstAddrShort);
                offset += 2;
            }

            if (dstMode == AddressingMode.Extended)
            { // dstAddrShort
                frame.WriteCanonical(offset, dstAddrExt);
                offset += 8;
            }

            if (srcMode != AddressingMode.None && !panIdCompression)
            { // srcPanId
                frame.WriteCanonical(offset, srcPanId);
                offset += 2;
            }

            if (srcMode == AddressingMode.Short)
            { // dstAddrShort
                frame.WriteCanonical(offset, srcAddrShort);
                offset += 2;
            }

            if (srcMode == AddressingMode.Extended)
            { // dstAddrShort
                frame.WriteCanonical(offset, srcAddrExt);
                offset += 8;
            }

            // FIXME: secHeader
            return true;
        }
示例#5
0
        public bool WriteToFrame(Frame frame)
        {
            int len = Length();
            if (frame == null || frame.LengthDataAvail < len)
                return false;
            frame.AllocBack(len);

            int offset = 0;
            frame.Write(offset, (byte)Message.Neighbors);
            offset++;

            for (int i = 0; i < neighborCount; i++)
            {
                frame.Write(offset, neighbors[i].shortAdr);
                offset += 2;
                frame.Write(offset, neighbors[i].lqi);
                offset += 1;
            }

            return true;
        }
 protected override void EncodePayload(Frame frame)
 {
     int i = gtsLength | (gtsDirection << 4) | (characteristicsType << 5);
     frame.Write(0, (byte)i);
 }
 protected override void EncodePayload(Frame frame)
 {
     frame.Write(0, panId);
     frame.Write(2, coordinatorShortAddr);
     frame.Write(4, channel);
     frame.Write(5, shortAddr);
     if (channelPagePresent)
         frame.Write(7, channelPage);
     else
         frame.DeleteFromBack(1);
 }
 protected override void EncodePayload(Frame frame)
 {
     frame.Write(0, (byte)reason);
 }
 protected override void EncodePayload(Frame frame)
 {
     frame.Write(0, shortAddr);
     frame.Write(2, (byte)status);
 }
示例#10
0
 protected override void EncodePayload(Frame frame)
 {
     frame.Write(0, capabilities.ToByte());
 }