コード例 #1
0
        internal DataPacket(byte[] packet, long receivedTimeStamp)
        {
            raw             = packet;
            Received        = receivedTimeStamp;
            ScanHead        = packet[4];
            Camera          = (Camera)packet[5];
            Laser           = (Laser)packet[6];
            ExposureTime    = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(packet, 2));
            Timestamp       = IPAddress.NetworkToHostOrder(BitConverter.ToInt64(packet, 8));
            Source          = packet[4] << 3 | packet[5] << 2 | packet[6];
            PartNum         = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(packet, 24));
            NumParts        = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(packet, 28));
            LaserOnTime     = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(packet, 16));
            Contents        = (DataType)IPAddress.NetworkToHostOrder(BitConverter.ToInt16(packet, 18));
            PayloadLength   = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(packet, 20));
            NumContentTypes = Contents.BitsSet();
            NumEncoderVals  = packet[22];
            EncoderVals     = new long[NumEncoderVals];
            int encOffset = (NumContentTypes * 2) + 4; // offset from the end of the header at byte 32

            for (int i = 0; i < NumEncoderVals; i++)
            {
                EncoderVals[i] = IPAddress.NetworkToHostOrder(BitConverter.ToInt64(packet, 32 + encOffset + (i * 8)));
            }

            // Contents now holds a bitfield for how many data types are present
            StartColumn = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(packet, 32));
            EndColumn   = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(packet, 34));

            FragmentLayouts = new Dictionary <DataType, FragmentLayout>();
            int offset     = 0;
            int dataOffset = 32 + 4 + (NumEncoderVals * 8) + (NumContentTypes * 2);

            foreach (var dt in Contents.GetFlags())
            {
                short step = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(packet, 32 + 4 + offset));

                int payloadsize;
                int numVals;
                if (dt != DataType.IM)
                {
                    int numCols = EndColumn - StartColumn + 1;
                    numVals = numCols / (NumParts * step);
                    // If the data doesn't divide evenly into the DataPackets, each DataPacket starting
                    // from the first will have 1 additional value of the type in question.
                    if (((numCols / step) % NumParts) > PartNum)
                    {
                        numVals++;
                    }

                    payloadsize = dt.Size() * numVals;
                }
                else
                {
                    numVals     = PayloadLength;
                    payloadsize = PayloadLength;
                }

                var fl = new FragmentLayout()
                {
                    step        = step,
                    numVals     = numVals,
                    payloadsize = payloadsize,
                    offset      = dataOffset
                };

                dataOffset         += fl.payloadsize;
                FragmentLayouts[dt] = fl;
                offset += 2;
            }
        }