kopia lustrzana https://github.com/NanoVNA-Saver/nanovna-saver
Fix data stream.
rodzic
5e3c6908be
commit
dcd5022f4c
20
main.py
20
main.py
|
@ -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()
|
||||
|
|
|
@ -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():
|
||||
|
|
|
@ -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
|
||||
|
|
Ładowanie…
Reference in New Issue