public void Run() { ConfigureGeneration(); ConfigureMeasurement(); ConfigureServo(); ConfigureSweep(); rfsgSession.Initiate(); // Define sweep Stopwatch watch = new Stopwatch(); watch.Reset(); StreamWriter stream = new StreamWriter(File.Create("data.csv")); stream.WriteLine(string.Join(", ", "Frequency", "Averages", "Symbols")); var sweep = new Sweep(sweepSteps, () => { // get rid of first run jitter wlan.Initiate("", ""); wlan.WaitForMeasurementComplete("", 10.0); wlan.OfdmModAcc.Configuration.GetAveragingCount("", out int numAverages); wlan.OfdmModAcc.Results.GetNumberOfSymbolsUsed("", out int numSymbolsUsed); wlan.OfdmModAcc.Results.GetCompositeRmsEvmMean("", out double evm); wlan.GetCenterFrequency("", out double centFreq); string currentPoints = string.Join(", ", centFreq.ToString(), sweepSteps[1].GetCurrentPoint().ToString(), sweepSteps[2].GetCurrentPoint().ToString()); stream.Write(currentPoints); Console.WriteLine(currentPoints); for (int i = 0; i < repeatabilityCount; i++) { powerServo.Disable(); powerServo.Enable(); watch.Restart(); wlan.Initiate("", ""); powerServo.Start(); powerServo.Wait(ServoTimeout, out ushort servoNumberOfAveragesCaptured, out bool servoDone, out bool servoFailed); // powerServo.GetDigitalGain(out double servoRawDigitalGain, out double servoDigitalGain); // powerServo.GetServoSteps(servoNumberOfAveragesCaptured, servoContinuous, false, 0, out servoMeasurementTimes, out servoMeasurementLevels); wlan.WaitForMeasurementComplete("", 10.0); wlan.OfdmModAcc.Configuration.GetAveragingCount("", out numAverages); wlan.OfdmModAcc.Results.GetCompositeRmsEvmMean("", out evm); wlan.OfdmModAcc.Results.GetNumberOfSymbolsUsed("", out numSymbolsUsed); watch.Stop(); if (numAverages != (int)sweepSteps[1].GetCurrentPoint() || numSymbolsUsed != (int)sweepSteps[2].GetCurrentPoint()) { throw new Exception(); } stream.Write(", " + evm.ToString()); stream.Write(", " + watch.ElapsedMilliseconds.ToString()); }
static void LoadAndRunMeasurements(string instrName, string inputPath, string outputPath) { inputPath = Path.GetFullPath(inputPath); RFmxInstrMX instr = null; NIRfsa rfsa = null; IntPtr rfsaHandle; try { Console.WriteLine($"Initializing RFmx session with instrument \"{instrName}\"..."); instr = new RFmxInstrMX(instrName, ""); Console.WriteLine($"Loading configuration from \"{Path.GetFileName(inputPath)}\"..."); instr.LoadAllConfigurations(inputPath, true); instr.DangerousGetNIRfsaHandle(out rfsaHandle); rfsa = new NIRfsa(rfsaHandle); string[] signalNames = new string[0]; RFmxInstrMXPersonalities[] personalities = new RFmxInstrMXPersonalities[0]; Console.WriteLine("Configuration loaded successfully."); instr.GetSignalConfigurationNames("", RFmxInstrMXPersonalities.All, ref signalNames, ref personalities); for (int i = 0; i < signalNames.Length; i++) { Console.WriteLine(""); ConsoleKeyInfo info; switch (personalities[i]) { case RFmxInstrMXPersonalities.BT: RFmxBTMX bt = instr.GetBTSignalConfiguration(signalNames[i]); Console.WriteLine($"Enter 'y' to initiate acquisition for RFmx Bluetooth with signal \"{signalNames[i]}\"; any other key to skip."); info = Console.ReadKey(); Console.WriteLine(); if (info.KeyChar == 'y') { bt.Initiate("", ""); bt.WaitForMeasurementComplete("", 10); FetchAndLog(rfsa, personalities[i], signalNames[i], outputPath); } bt.Dispose(); break; case RFmxInstrMXPersonalities.Wlan: RFmxWlanMX wlan = instr.GetWlanSignalConfiguration(signalNames[i]); Console.WriteLine($"Enter 'y' to initiate acquisition for RFmx WLAN with signal \"{signalNames[i]}\"; any other key to skip."); info = Console.ReadKey(); Console.WriteLine(); if (info.KeyChar == 'y') { wlan.Initiate("", ""); wlan.WaitForMeasurementComplete("", 10); FetchAndLog(rfsa, personalities[i], signalNames[i], outputPath); } wlan.Dispose(); break; case RFmxInstrMXPersonalities.SpecAn: RFmxSpecAnMX specAn = instr.GetSpecAnSignalConfiguration(signalNames[i]); Console.WriteLine($"Enter 'y' to initiate acquisition for RFmx SpecAn with signal \"{signalNames[i]}\"; any other key to skip."); info = Console.ReadKey(); Console.WriteLine(); if (info.KeyChar == 'y') { specAn.Initiate("", ""); specAn.WaitForMeasurementComplete("", 10); FetchAndLog(rfsa, personalities[i], signalNames[i], outputPath); } specAn.Dispose(); break; case RFmxInstrMXPersonalities.NR: RFmxNRMX nr = instr.GetNRSignalConfiguration(signalNames[i]); Console.WriteLine($"Enter 'y' to initiate acquisition for RFmx NR with signal \"{signalNames[i]}\"; any other key to skip."); info = Console.ReadKey(); Console.WriteLine(); if (info.KeyChar == 'y') { nr.Initiate("", ""); nr.WaitForMeasurementComplete("", 10); FetchAndLog(rfsa, personalities[i], signalNames[i], outputPath); } nr.Dispose(); break; case RFmxInstrMXPersonalities.Lte: RFmxLteMX lte = instr.GetLteSignalConfiguration(signalNames[i]); Console.WriteLine($"Enter 'y' to initiate acquisition for RFmx LTE with signal \"{signalNames[i]}\"; any other key to skip."); info = Console.ReadKey(); Console.WriteLine(); if (info.KeyChar == 'y') { lte.Initiate("", ""); lte.WaitForMeasurementComplete("", 10); FetchAndLog(rfsa, personalities[i], signalNames[i], outputPath); } lte.Dispose(); break; default: throw new System.NotImplementedException($"The \"{personalities[i].ToString()}\" personality has not been implemented."); } } Console.WriteLine("All measurements complete."); } catch (Exception ex) { Console.WriteLine("Exception occurred: " + ex.Message); Console.WriteLine("Location: " + ex.StackTrace); } finally { if (instr != null) { instr.Dispose(); } } }