From 3fa625e808b1142e11e53a9a8f3af15aa2d73a47 Mon Sep 17 00:00:00 2001 From: Songhua Liu Date: Sun, 19 Jan 2025 18:35:39 +0800 Subject: [PATCH] Add support for NanoVNA F V3 for reaching valid data points upto 801 (#751) * add nanovna-f v3 support --- src/NanoVNASaver/Hardware/Hardware.py | 5 +- src/NanoVNASaver/Hardware/NanoVNA_F_V3.py | 68 +++++++++++++++++++++++ 2 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 src/NanoVNASaver/Hardware/NanoVNA_F_V3.py diff --git a/src/NanoVNASaver/Hardware/Hardware.py b/src/NanoVNASaver/Hardware/Hardware.py index 4965f19f..096ff57f 100644 --- a/src/NanoVNASaver/Hardware/Hardware.py +++ b/src/NanoVNASaver/Hardware/Hardware.py @@ -30,6 +30,7 @@ from NanoVNASaver.Hardware.NanoVNA import NanoVNA from NanoVNASaver.Hardware.NanoVNA_F import NanoVNA_F from NanoVNASaver.Hardware.NanoVNA_F_V2 import NanoVNA_F_V2 +from NanoVNASaver.Hardware.NanoVNA_F_V3 import NanoVNA_F_V3 from NanoVNASaver.Hardware.NanoVNA_H import NanoVNA_H from NanoVNASaver.Hardware.NanoVNA_H4 import NanoVNA_H4 from NanoVNASaver.Hardware.NanoVNA_V2 import NanoVNA_V2 @@ -58,6 +59,7 @@ "H4": NanoVNA_H4, "H": NanoVNA_H, "F_V2": NanoVNA_F_V2, + "F_V3": NanoVNA_F_V3, "F": NanoVNA_F, "NanoVNA": NanoVNA, "tinySA": TinySA, @@ -140,12 +142,10 @@ def get_VNA(iface: Interface) -> VNA: # serial_port.timeout = TIMEOUT return NAME2DEVICE[iface.comment](iface) - def get_comment(iface: Interface) -> str: logger.info("Finding correct VNA type...") with iface.lock: vna_version = detect_version(iface) - if vna_version == "v2": return "S-A-A-2" @@ -156,6 +156,7 @@ def get_comment(iface: Interface) -> str: ("NanoVNA-H 4", "H4"), ("NanoVNA-H", "H"), ("NanoVNA-F_V2", "F_V2"), + ("NanoVNA-F_V3", "F_V3"), ("NanoVNA-F", "F"), ("NanoVNA", "NanoVNA"), ("tinySA4", "tinySA_Ultra"), diff --git a/src/NanoVNASaver/Hardware/NanoVNA_F_V3.py b/src/NanoVNASaver/Hardware/NanoVNA_F_V3.py new file mode 100644 index 00000000..6f69382d --- /dev/null +++ b/src/NanoVNASaver/Hardware/NanoVNA_F_V3.py @@ -0,0 +1,68 @@ +# NanoVNASaver +# +# A python program to view and export Touchstone data from a NanoVNA +# Copyright (C) 2019, 2020 Rune B. Broberg +# Copyright (C) 2020,2021 NanoVNA-Saver Authors +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +import logging + +import serial +from PyQt6.QtGui import QImage, QPixmap + +from NanoVNASaver.Hardware.NanoVNA import NanoVNA +from NanoVNASaver.Hardware.Serial import Interface + +logger = logging.getLogger(__name__) + + +class NanoVNA_F_V3(NanoVNA): + name = "NanoVNA-F_V3" + screenwidth = 800 + screenheight = 480 + valid_datapoints = (101, 11, 51, 201, 301, 401, 501, 601, 701, 801) + sweep_points_min = 11 + sweep_points_max = 801 + + def __init__(self, iface: Interface): + super().__init__(iface) + self.sweep_max_freq_Hz = 6.3e9 + + def getScreenshot(self) -> QPixmap: + logger.debug("Capturing screenshot...") + if not self.connected(): + return QPixmap() + try: + rgba_array = self._capture_data() + image = QImage( + rgba_array, + self.screenwidth, + self.screenheight, + QImage.Format.Format_RGB16, + ) + logger.debug("Captured screenshot") + return QPixmap(image) + except serial.SerialException as exc: + logger.exception("Exception while capturing screenshot: %s", exc) + return QPixmap() + + def read_features(self): + super().read_features() + result = " ".join(self.exec_command("help")).split() + if "sn:" or "SN:" in result: + self.features.add("SN") + self.SN = self.getSerialNumber() + + def getSerialNumber(self) -> str: + return " ".join(list(self.exec_command("SN"))) if 'SN:' in " ".join(self.exec_command("help")).split() else " ".join(list(self.exec_command("sn")))