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); }
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)); }