diff --git a/src/NanoVNASaver/Hardware/Hardware.py b/src/NanoVNASaver/Hardware/Hardware.py index 327e849..20713cb 100644 --- a/src/NanoVNASaver/Hardware/Hardware.py +++ b/src/NanoVNASaver/Hardware/Hardware.py @@ -30,11 +30,13 @@ from NanoVNASaver.Hardware.AVNA import AVNA 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.JNCRadio_VNA_3G import JNCRadio_VNA_3G from NanoVNASaver.Hardware.NanoVNA_H import NanoVNA_H from NanoVNASaver.Hardware.NanoVNA_H4 import NanoVNA_H4 from NanoVNASaver.Hardware.NanoVNA_V2 import NanoVNA_V2 from NanoVNASaver.Hardware.TinySA import TinySA, TinySA_Ultra +from NanoVNASaver.Hardware.JNCRadio_VNA_3G import JNCRadio_VNA_3G +from NanoVNASaver.Hardware.SV4401A import SV4401A +from NanoVNASaver.Hardware.SV6301A import SV6301A from NanoVNASaver.Hardware.Serial import drain_serial, Interface logger = logging.getLogger(__name__) @@ -56,11 +58,13 @@ NAME2DEVICE = { "H4": NanoVNA_H4, "H": NanoVNA_H, "F_V2": NanoVNA_F_V2, - "JNCRadio": JNCRadio_VNA_3G, "F": NanoVNA_F, "NanoVNA": NanoVNA, "tinySA": TinySA, "tinySA_Ultra": TinySA_Ultra, + "JNCRadio": JNCRadio_VNA_3G, + "SV4401A": SV4401A, + "SV6301A": SV6301A, "Unknown": NanoVNA, } @@ -152,11 +156,13 @@ def get_comment(iface: Interface) -> str: ("NanoVNA-H 4", "H4"), ("NanoVNA-H", "H"), ("NanoVNA-F_V2", "F_V2"), - ("JNCRadio_VNA_3G", "JNCRadio"), ("NanoVNA-F", "F"), ("NanoVNA", "NanoVNA"), ("tinySA4", "tinySA_Ultra"), ("tinySA", "tinySA"), + ("JNCRadio_VNA_3G", "JNCRadio"), + ("SV4401A", "SV4401A"), + ("SV6301A", "SV6301A"), ): if info.find(search) >= 0: return name diff --git a/src/NanoVNASaver/Hardware/JNCRadio_VNA_3G.py b/src/NanoVNASaver/Hardware/JNCRadio_VNA_3G.py index 18a9d50..ce87ef4 100644 --- a/src/NanoVNASaver/Hardware/JNCRadio_VNA_3G.py +++ b/src/NanoVNASaver/Hardware/JNCRadio_VNA_3G.py @@ -55,3 +55,8 @@ class JNCRadio_VNA_3G(NanoVNA): except serial.SerialException as exc: logger.exception("Exception while capturing screenshot: %s", exc) return QPixmap() + + def setSweep(self, start, stop): + self.start = start + self.stop = stop + list(self.exec_command(f"scan {start} {stop} {self.datapoints}")) diff --git a/src/NanoVNASaver/Hardware/SV4401A.py b/src/NanoVNASaver/Hardware/SV4401A.py new file mode 100644 index 0000000..a281ce2 --- /dev/null +++ b/src/NanoVNASaver/Hardware/SV4401A.py @@ -0,0 +1,64 @@ +# 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 SV4401A(NanoVNA): + name = "SV4401A" + screenwidth = 1024 + screenheight = 600 + valid_datapoints = (101, 301, 501) + sweep_points_max = 101 + sweep_points_max = 501 + + def __init__(self, iface: Interface): + super().__init__(iface) + self.sweep_max_freq_Hz = 4.4e9 + + def getScreenshot(self) -> QPixmap: + logger.debug("Capturing screenshot...") + self.serial.timeout=8 + 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 setSweep(self, start, stop): + self.start = start + self.stop = stop + list(self.exec_command(f"scan {start} {stop} {self.datapoints}")) diff --git a/src/NanoVNASaver/Hardware/SV6301A.py b/src/NanoVNASaver/Hardware/SV6301A.py new file mode 100644 index 0000000..d0bb831 --- /dev/null +++ b/src/NanoVNASaver/Hardware/SV6301A.py @@ -0,0 +1,64 @@ +# 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 SV6301A(NanoVNA): + name = "SV6301A" + screenwidth = 1024 + screenheight = 600 + valid_datapoints = (101, 301, 501) + sweep_points_max = 101 + sweep_points_max = 501 + + def __init__(self, iface: Interface): + super().__init__(iface) + self.sweep_max_freq_Hz = 6.3e9 + + def getScreenshot(self) -> QPixmap: + logger.debug("Capturing screenshot...") + self.serial.timeout=8 + 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 setSweep(self, start, stop): + self.start = start + self.stop = stop + list(self.exec_command(f"scan {start} {stop} {self.datapoints}"))