Esempio n. 1
0
        CSIPacket ReadCSIPacket(FileStream file)
        {
            var buffer    = new byte[CSIBufferSize];
            var bytesRead = file.Read(buffer, 0, CSIBufferSize);

            if (bytesRead <= 0) //(bytesRead < CSIBufferSize)
            {
                //Console.WriteLine("No bytes read");
                return(null);
            }

            var span      = new Span <byte>(buffer);
            var csiPacket = new CSIPacket();

            int csiPacketLength = Marshal.SizeOf(typeof(CSIStatusPacket));
            //var statusBuffer = new Span<byte>(buffer, csiPacketLength);

            var handle       = GCHandle.Alloc(buffer, GCHandleType.Pinned);
            var statusPacket = (CSIStatusPacket)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(CSIStatusPacket));

            csiPacket.StatusPacket = statusPacket;

            if (statusPacket.NumReceivingAntennas == 0 || statusPacket.NumTransmittingAntennas == 0)
            {
                Console.WriteLine("Num transmitting or receiving antennas is 0, skipping packet");
                return(null);
            }

            if (statusPacket.PhyError != PHYErrorCode.OK)
            {
                Console.WriteLine("Error in packet: " + statusPacket.PhyError.ToString());
            }

            var matrixSlice   = span.Slice(csiPacketLength);
            var csiDataLength = statusPacket.CSIDataLength;

            if (csiDataLength == 0)
            {
                //Console.WriteLine("CSI Data length is 0, skipping packet");
                return(null);
            }
            csiPacket.CSIMatrix = ReadCSIMatrix(matrixSlice, statusPacket.NumReceivingAntennas, statusPacket.NumTransmittingAntennas, statusPacket.NumSubcarriers);

            //var copyStartIndex = csiPacketLength + csiDataLength;
            var payloadSlice = matrixSlice.Slice(statusPacket.CSIDataLength, statusPacket.PayloadLength);

            csiPacket.PayloadData = new byte[statusPacket.PayloadLength];
            payloadSlice.CopyTo(csiPacket.PayloadData);
            //Array.Copy(buffer, copyStartIndex, csiPayload.Data, 0, payloadLength);

            return(csiPacket);
        }
Esempio n. 2
0
        static void HandleNewPacket(CSIPacket packet)
        {
            lock (Packets)
            {
                if (!Packets.Any())
                {
                    var statusPacket = packet.StatusPacket;

                    var dbgString = "Got First CSI packet! ";
                    dbgString += $"RX_Ant: {statusPacket.NumReceivingAntennas}, TX_Ant: {statusPacket.NumTransmittingAntennas} ";
                    dbgString += $"Num_Subc: {statusPacket.NumSubcarriers}, Channel {statusPacket.Channel} with BW {statusPacket.ChannelBandwidth} ";
                    dbgString += $"RSSI: {statusPacket.RxRSSIAll}, CSI_Payload_Len: {statusPacket.CSIDataLength}";

                    Console.WriteLine(dbgString);
                }
                Packets.Add(packet);
            }

            var matrix            = packet.CSIMatrix;
            var displaySubcarrier = 1;

            var csiValues = new List <Complex>();

            for (int r = 0; r < packet.StatusPacket.NumReceivingAntennas; r++)
            {
                for (int t = 0; t < packet.StatusPacket.NumTransmittingAntennas; t++)
                {
                    csiValues.Add(matrix[r, t, displaySubcarrier]);
                }
            }

            var csiDisplay = csiValues.Select(nr =>
                                              $"({nr.Magnitude.ToString("0.00").PadLeft(7)}, {ToDeg(nr.Phase).ToString("0.00").PadLeft(7)})"
                                              );

            Console.WriteLine(string.Join(',', csiDisplay));
        }