Fix data stream.

pull/697/head
tbergkvist 2024-04-12 16:58:53 +02:00
rodzic 5e3c6908be
commit dcd5022f4c
3 zmienionych plików z 69 dodań i 47 usunięć

20
main.py
Wyświetl plik

@ -2,8 +2,22 @@ from src.NanoVNASaverHeadless import NanoVNASaverHeadless
############### TODO: Implement high level script for newbies. #######################
vna = NanoVNASaverHeadless(vna_index=0, verbose=True)
vna.calibrate(None, "Calibration_file_2024-04-12 12:23:02.604314.s2p")
CALIBRATION_FILE = (
"./test_cali.s2p" # "Calibration_file_2024-04-12 12:23:02.604314.s2p"
)
vna = NanoVNASaverHeadless(vna_index=0, verbose=False)
vna.calibrate(None, CALIBRATION_FILE)
vna.set_sweep(2.9e9, 3.1e9, 1, 101)
vna.stream_data()
old = None
# for i in range(100):
new = vna.stream_data()
if new != old:
for data in new:
# print(data)
print("---------------------------------------------------------------")
vna.kill()

Wyświetl plik

@ -3,20 +3,20 @@ from .Calibration import Calibration
from .CalibrationGuide import CalibrationGuide
from .Touchstone import Touchstone
from .SweepWorker import SweepWorker
import matplotlib.pyplot as plt
import math
from datetime import datetime
import threading
class NanoVNASaverHeadless:
def __init__(self, vna_index=0, verbose=False):
def __init__(self, vna_index=0, verbose=False, save_path="./Save.s2p"):
self.verbose = verbose
self.save_path = save_path
self.iface = hw.get_interfaces()[vna_index]
self.vna = hw.get_VNA(self.iface)
self.calibration = Calibration()
self.touchstone = Touchstone("Save.s2p") # s2p for two port nanovnas.
self.touchstone = Touchstone(self.save_path) # s2p for two port nanovnas.
self.worker = SweepWorker(self.vna, self.calibration, self.touchstone, verbose)
self.CalibrationGuide = CalibrationGuide(self.calibration, self.worker)
self.CalibrationGuide = CalibrationGuide(self.calibration, self.worker, verbose)
if self.verbose:
print("VNA is connected: ", self.vna.connected())
print("Firmware: ", self.vna.readFirmware())
@ -35,46 +35,65 @@ class NanoVNASaverHeadless:
def set_sweep(self, start, stop, segments, points):
self.worker.sweep.update(start, stop, segments, points)
print(
"Sweep set from "
+ str(self.worker.sweep.start / 1e9)
+ "e9"
+ " to "
+ str(self.worker.sweep.end / 1e9)
+ "e9"
)
if self.verbose:
print(
"Sweep set from "
+ str(self.worker.sweep.start / 1e9)
+ "e9"
+ " to "
+ str(self.worker.sweep.end / 1e9)
+ "e9"
)
def stream_data(self):
self.worker.sweep.set_mode("CONTINOUS")
self.worker.run()
#await self.loop()
for i in range (0, 20):
data = self.get_data()
print(data[0][30])
self._stream_data()
try:
yield list(
self._access_data()
) # Monitor and process data in the main thread
except Exception as e:
if self.verbose:
print("Exception in data stream: ", e)
finally:
if self.verbose:
print("Stopping worker.")
self._stop_worker()
async def loop(self):
def _stream_data(self):
self.worker.sweep.set_mode("CONTINOUS")
self.worker.run()
# Start the worker in a new thread
self.worker_thread = threading.Thread(target=self.worker.run)
self.worker_thread.start()
def _access_data(self):
# Access data while the worker is running
while self.worker.running:
yield self.get_data()
def _stop_worker(self):
if self.verbose:
print("NanoVNASaverHeadless is stopping sweepworker now.")
self.worker.running = False
self.worker_thread.join()
def get_data(self):
dataS11 = self.worker.data.s11
dataS21 = self.worker.data.s21
data_s11 = self.worker.data11
data_s21 = self.worker.data21
reflRe = []
reflIm = []
thruRe = []
thruIm = []
freq = []
for datapoint in dataS11:
for datapoint in data_s11:
reflRe.append(datapoint.re)
reflIm.append(datapoint.im)
freq.append(datapoint.freq)
for datapoint in dataS21:
for datapoint in data_s21:
thruRe.append(datapoint.re)
thruIm.append(datapoint.im)
return reflRe, reflIm, thruRe, thruIm, freq
def kill(self):
self.vna.disconnect()
if self.vna.connected():

Wyświetl plik

@ -22,8 +22,7 @@ from time import sleep
import numpy as np
import threading
from .RFTools import corr_att_data
from .Sweep import Sweep, SweepMode
from .Sweep import Sweep
from .RFTools import Datapoint
@ -60,7 +59,6 @@ class SweepWorker:
self.calibration = calibration
self.data = data
self.init_data()
self.stopped = False
self.running = False
self.error_message = ""
self.offsetDelay = 0
@ -69,7 +67,7 @@ class SweepWorker:
def saveData(
self, data11, data21
): # This function is werid and should probably be rewritten.
) -> None: # This function is werid and should probably be rewritten.
with self.dataLock:
self.data.s11 = data11
self.data.s21 = data21
@ -114,15 +112,13 @@ class SweepWorker:
self.percentage = 100
if self.verbose:
print('Sending "finished" signal')
print("Sweep is finished.")
self.running = False
def _run_loop(self) -> None:
sweep = self.sweep
averages = (
sweep.properties.averages[0]
if sweep.properties.mode == SweepMode.AVERAGE
else 1
sweep.properties.averages[0] if sweep.properties.mode == "AVERAGE" else 1
)
if self.verbose:
print("%d averages", averages)
@ -131,7 +127,7 @@ class SweepWorker:
for i in range(sweep.segments):
if self.verbose:
print("Sweep segment no %d", i)
if self.stopped:
if not self.running:
if self.verbose:
print("Stopping sweeping as signalled")
break
@ -142,7 +138,7 @@ class SweepWorker:
)
self.percentage = (i + 1) * 100 / sweep.segments
self.updateData(freq, values11, values21, i)
if sweep.properties.mode != SweepMode.CONTINOUS or self.stopped:
if sweep.properties.mode != "CONTINOUS" or not self.running:
break
def init_data(self):
@ -189,8 +185,6 @@ class SweepWorker:
len(self.data21),
)
self.saveData(self.data11, self.data21)
if self.verbose:
print('Sending "updated" signal')
def applyCalibration(
self, raw_data11: list[Datapoint], raw_data21: list[Datapoint]
@ -231,7 +225,7 @@ class SweepWorker:
if self.verbose:
print("Reading from %d to %d. Averaging %d values", start, stop, averages)
for i in range(averages):
if self.stopped:
if not self.running:
if self.verbose:
print("Stopping averaging as signalled.")
if averages == 1:
@ -338,8 +332,3 @@ class SweepWorker:
f"device settings screen."
)
return returndata
def gui_error(self, message: str):
self.error_message = message
self.stopped = True
self.running = False