From 46b41a4a0432ffb0b31658c2fa0b1a71125e8c69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20K=C3=A4berich?= Date: Sat, 19 Nov 2022 15:47:08 +0100 Subject: [PATCH] Further integration tests --- Software/Integrationtests/Integrationtest.py | 6 ++-- Software/Integrationtests/tests/TestBase.py | 12 ++++--- .../Integrationtests/tests/TestVNASweep.py | 33 +++++++++++++++---- .../LibreVNA-GUI/Traces/tracewidget.cpp | 26 ++++++++------- .../PC_Application/LibreVNA-GUI/VNA/vna.cpp | 28 ++++++++++------ .../PC_Application/LibreVNA-GUI/VNA/vna.h | 1 + 6 files changed, 71 insertions(+), 35 deletions(-) diff --git a/Software/Integrationtests/Integrationtest.py b/Software/Integrationtests/Integrationtest.py index d745dcb..b7987f9 100644 --- a/Software/Integrationtests/Integrationtest.py +++ b/Software/Integrationtests/Integrationtest.py @@ -1,9 +1,9 @@ import unittest testmodules = [ -# 'tests.TestConnect', -# 'tests.TestMode', -# 'tests.TestVNASweep', + 'tests.TestConnect', + 'tests.TestMode', + 'tests.TestVNASweep', 'tests.TestCalibration', ] diff --git a/Software/Integrationtests/tests/TestBase.py b/Software/Integrationtests/tests/TestBase.py index 4e3a4e7..81b7362 100644 --- a/Software/Integrationtests/tests/TestBase.py +++ b/Software/Integrationtests/tests/TestBase.py @@ -8,7 +8,7 @@ from signal import SIGINT class TestBase(unittest.TestCase): def setUp(self): - self.gui = subprocess.Popen([defs.GUI_PATH, '-p', '19543'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + self.gui = subprocess.Popen([defs.GUI_PATH, '-p', '19544'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) # wait for the SCPI server to become available timeout = time.time() + 3; @@ -18,13 +18,17 @@ class TestBase(unittest.TestCase): poll_result = poll_obj.poll(0) if poll_result: line = self.gui.stdout.readline().decode().strip() - if "Listening on port 19543" in line: + if "Listening on port 19544" in line: break time.sleep(0.2) - self.vna = libreVNA('localhost', 19543) - self.vna.cmd(":DEV:CONN") + self.vna = libreVNA('localhost', 19544) + try: + self.vna.cmd(":DEV:CONN") + except Exception as e: + self.tearDown() + raise e if self.vna.query(":DEV:CONN?") == "Not connected": self.tearDown() raise AssertionError("Not connected") diff --git a/Software/Integrationtests/tests/TestVNASweep.py b/Software/Integrationtests/tests/TestVNASweep.py index 5a15458..4de1568 100644 --- a/Software/Integrationtests/tests/TestVNASweep.py +++ b/Software/Integrationtests/tests/TestVNASweep.py @@ -2,6 +2,13 @@ from tests.TestBase import TestBase import time class TestVNASweep(TestBase): + def waitSweepTimeout(self, timeout = 1): + self.assertEqual(self.vna.query(":VNA:ACQ:FIN?"), "FALSE") + stoptime = time.time() + timeout + while self.vna.query(":VNA:ACQ:FIN?") == "FALSE": + if time.time() > stoptime: + raise AssertionError("Sweep timed out") + def test_sweep_frequency(self): self.vna.cmd(":DEV:MODE VNA") self.vna.cmd(":VNA:SWEEP FREQUENCY") @@ -11,8 +18,7 @@ class TestVNASweep(TestBase): self.vna.cmd(":VNA:ACQ:POINTS 501") self.vna.cmd(":VNA:FREQuency:START 1000000") self.vna.cmd(":VNA:FREQuency:STOP 6000000000") - while self.vna.query(":VNA:ACQ:FIN?") == "FALSE": - time.sleep(0.1) + self.waitSweepTimeout(2) S11 = self.vna.parse_trace_data(self.vna.query(":VNA:TRACE:DATA? S11")) self.assertEqual(S11[0][0], 1000000) @@ -28,8 +34,7 @@ class TestVNASweep(TestBase): self.vna.cmd(":VNA:FREQuency:START 500000000") self.vna.cmd(":VNA:FREQuency:STOP 1500000000") self.vna.cmd(":VNA:FREQuency:ZERO 1500000000") - while self.vna.query(":VNA:ACQ:FIN?") == "FALSE": - time.sleep(0.1) + self.waitSweepTimeout(2) S11 = self.vna.parse_trace_data(self.vna.query(":VNA:TRACE:DATA? S11")) self.assertEqual(S11[0][0], 0.0) @@ -46,9 +51,23 @@ class TestVNASweep(TestBase): self.vna.cmd(":VNA:ACQ:POINTS 501") self.vna.cmd(":VNA:POWER:START -30") self.vna.cmd(":VNA:POWER:STOP -10") - while self.vna.query(":VNA:ACQ:FIN?") == "FALSE": - time.sleep(0.1) + self.waitSweepTimeout(2) S11 = self.vna.parse_trace_data(self.vna.query(":VNA:TRACE:DATA? S11")) self.assertEqual(S11[0][0], -30) - self.assertEqual(S11[-1][0], -10) \ No newline at end of file + self.assertEqual(S11[-1][0], -10) + + def test_fast_single_sweeps(self): + self.vna.cmd(":DEV:MODE VNA") + self.vna.cmd(":VNA:SWEEP FREQUENCY") + self.vna.cmd(":VNA:STIM:LVL -10") + self.vna.cmd(":VNA:ACQ:IFBW 50000") + self.vna.cmd(":VNA:ACQ:AVG 1") + self.vna.cmd(":VNA:ACQ:POINTS 501") + self.vna.cmd(":VNA:FREQuency:START 1000000") + self.vna.cmd(":VNA:FREQuency:STOP 6000000000") + + for i in range(10): + # Change something irrelevant (to force reconfiguration of device) + self.vna.cmd(":VNA:FREQuency:START "+str(1000000+i)) + self.waitSweepTimeout(2) \ No newline at end of file diff --git a/Software/PC_Application/LibreVNA-GUI/Traces/tracewidget.cpp b/Software/PC_Application/LibreVNA-GUI/Traces/tracewidget.cpp index 974ef69..998eb71 100644 --- a/Software/PC_Application/LibreVNA-GUI/Traces/tracewidget.cpp +++ b/Software/PC_Application/LibreVNA-GUI/Traces/tracewidget.cpp @@ -208,19 +208,23 @@ void TraceWidget::SetupSCPI() return "ERROR"; } QString ret; - for(unsigned int i=0;isize();i++) { - auto d = t->sample(i); - int precision = 0; - switch(t->outputType()) { - case Trace::DataType::Invalid: - case Trace::DataType::Frequency: precision = 0; break; - case Trace::DataType::Time: precision = 12; break; - case Trace::DataType::Power: precision = 3; break; - case Trace::DataType::TimeZeroSpan: precision = 4; break; + if(t->size() > 0) { + for(unsigned int i=0;isize();i++) { + auto d = t->sample(i); + int precision = 0; + switch(t->outputType()) { + case Trace::DataType::Invalid: + case Trace::DataType::Frequency: precision = 0; break; + case Trace::DataType::Time: precision = 12; break; + case Trace::DataType::Power: precision = 3; break; + case Trace::DataType::TimeZeroSpan: precision = 4; break; + } + ret += "[" + QString::number(d.x, 'f', precision) + ","+createStringFromData(t, d)+"],"; } - ret += "[" + QString::number(d.x, 'f', precision) + ","+createStringFromData(t, d)+"],"; + ret.chop(1); + } else { + ret = "EMPTY"; } - ret.chop(1); return ret; })); add(new SCPICommand("AT", nullptr, [=](QStringList params) -> QString { diff --git a/Software/PC_Application/LibreVNA-GUI/VNA/vna.cpp b/Software/PC_Application/LibreVNA-GUI/VNA/vna.cpp index 32b468b..7c1c992 100644 --- a/Software/PC_Application/LibreVNA-GUI/VNA/vna.cpp +++ b/Software/PC_Application/LibreVNA-GUI/VNA/vna.cpp @@ -909,6 +909,8 @@ void VNA::UpdateAverageCount() void VNA::SettingsChanged() { configurationTimer.start(100); + changingSettings = true; + ResetLiveTraces(); } void VNA::StartImpedanceMatching() @@ -938,6 +940,7 @@ void VNA::SetSweepType(SweepType sw) if(settings.sweepType != sw) { settings.sweepType = sw; emit sweepTypeChanged(sw); + ConstrainAndUpdateFrequencies(); SettingsChanged(); } } @@ -1085,6 +1088,7 @@ void VNA::SetPowerSweepFrequency(double freq) { settings.Power.frequency = freq; emit powerSweepFrequencyChanged(freq); + ConstrainAndUpdateFrequencies(); SettingsChanged(); } @@ -1220,7 +1224,8 @@ void VNA::SetupSCPI() if(params.size() >= 1) { if(params[0] == "FREQUENCY") { SetSweepType(SweepType::Frequency); - return ""; + ResetLiveTraces(); + return SCPI::getResultName(SCPI::Result::Empty); } else if(params[0] == "POWER") { SetSweepType(SweepType::Power); return SCPI::getResultName(SCPI::Result::Empty); @@ -1280,6 +1285,7 @@ void VNA::SetupSCPI() scpi_freq->add(new SCPICommand("FULL", [=](QStringList params) -> QString { Q_UNUSED(params) SetFullSpan(); + ResetLiveTraces(); return SCPI::getResultName(SCPI::Result::Empty); }, nullptr)); scpi_freq->add(new SCPICommand("ZERO", [=](QStringList params) -> QString { @@ -1653,11 +1659,7 @@ void VNA::ConfigureDevice(bool resetTraces, std::function cb) { if(running) { if (resetTraces) { - settings.activeSegment = 0; - average.reset(settings.npoints); - traceModel.clearLiveData(); - UpdateAverageCount(); - UpdateCalWidget(); + ResetLiveTraces(); } changingSettings = true; // assemble VNA protocol settings @@ -1713,10 +1715,7 @@ void VNA::ConfigureDevice(bool resetTraces, std::function cb) window->getDevice()->setVNA(s, [=](bool res){ // device received command, reset traces now if (resetTraces) { - average.reset(settings.npoints); - traceModel.clearLiveData(); - UpdateAverageCount(); - UpdateCalWidget(); + ResetLiveTraces(); } if(cb) { cb(res); @@ -1743,6 +1742,15 @@ void VNA::ConfigureDevice(bool resetTraces, std::function cb) } } +void VNA::ResetLiveTraces() +{ + settings.activeSegment = 0; + average.reset(settings.npoints); + traceModel.clearLiveData(); + UpdateAverageCount(); + UpdateCalWidget(); +} + bool VNA::LoadCalibration(QString filename) { return cal.fromFile(filename); diff --git a/Software/PC_Application/LibreVNA-GUI/VNA/vna.h b/Software/PC_Application/LibreVNA-GUI/VNA/vna.h index 12b2b5f..5a983e0 100644 --- a/Software/PC_Application/LibreVNA-GUI/VNA/vna.h +++ b/Software/PC_Application/LibreVNA-GUI/VNA/vna.h @@ -132,6 +132,7 @@ private slots: void Run(); void Stop(); void ConfigureDevice(bool resetTraces = true, std::function cb = nullptr); + void ResetLiveTraces(); private: Settings settings; unsigned int averages;