def __init__(self): super().__init__() self.threadpool = QtCore.QThreadPool() print("Max thread count " + str(self.threadpool.maxThreadCount())) self.worker = SweepWorker(self) self.noSweeps = 1 # Number of sweeps to run self.serialLock = threading.Lock() self.serial = serial.Serial() self.dataLock = threading.Lock() self.data : List[Datapoint] = [] self.data21 : List[Datapoint] = [] self.referenceS11data : List[Datapoint] = [] self.referenceS21data : List[Datapoint] = [] self.calibration = Calibration() self.markers = [] self.serialPort = self.getport() # self.serialSpeed = "115200" self.color = QtGui.QColor(160, 140, 20, 128) self.referenceColor = QtGui.QColor(0, 0, 255, 32) self.setWindowTitle("NanoVNA Saver") layout = QtWidgets.QGridLayout() scrollarea = QtWidgets.QScrollArea() outer = QtWidgets.QVBoxLayout() outer.addWidget(scrollarea) self.setLayout(outer) scrollarea.setWidgetResizable(True) self.resize(1150, 950) scrollarea.setSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding) self.setSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding) widget = QtWidgets.QWidget() widget.setLayout(layout) scrollarea.setWidget(widget) self.s11SmithChart = SmithChart("S11") self.s21SmithChart = SmithChart("S21") self.s11LogMag = LogMagChart("S11 Return Loss") self.s21LogMag = LogMagChart("S21 Gain") self.charts : List[Chart] = [] self.charts.append(self.s11SmithChart) self.charts.append(self.s21SmithChart) self.charts.append(self.s11LogMag) self.charts.append(self.s21LogMag) left_column = QtWidgets.QVBoxLayout() right_column = QtWidgets.QVBoxLayout() layout.addLayout(left_column, 0, 0) layout.addLayout(right_column, 0, 1) ################################################################################################################ # Sweep control ################################################################################################################ sweep_control_box = QtWidgets.QGroupBox() sweep_control_box.setMaximumWidth(400) sweep_control_box.setTitle("Sweep control") sweep_control_layout = QtWidgets.QFormLayout(sweep_control_box) self.sweepStartInput = QtWidgets.QLineEdit("") self.sweepStartInput.setAlignment(QtCore.Qt.AlignRight) sweep_control_layout.addRow(QtWidgets.QLabel("Sweep start"), self.sweepStartInput) self.sweepEndInput = QtWidgets.QLineEdit("") self.sweepEndInput.setAlignment(QtCore.Qt.AlignRight) sweep_control_layout.addRow(QtWidgets.QLabel("Sweep end"), self.sweepEndInput) self.sweepCountInput = QtWidgets.QLineEdit("") self.sweepCountInput.setAlignment(QtCore.Qt.AlignRight) self.sweepCountInput.setText("1") sweep_control_layout.addRow(QtWidgets.QLabel("Sweep count"), self.sweepCountInput) self.btnColorPicker = QtWidgets.QPushButton("█") self.btnColorPicker.setFixedWidth(20) self.setSweepColor(self.color) self.btnColorPicker.clicked.connect(lambda: self.setSweepColor(QtWidgets.QColorDialog.getColor(self.color, options=QtWidgets.QColorDialog.ShowAlphaChannel))) sweep_control_layout.addRow("Sweep color", self.btnColorPicker) self.sweepProgressBar = QtWidgets.QProgressBar() self.sweepProgressBar.setMaximum(100) self.sweepProgressBar.setValue(0) sweep_control_layout.addRow(self.sweepProgressBar) self.btnSweep = QtWidgets.QPushButton("Sweep") self.btnSweep.clicked.connect(self.sweep) sweep_control_layout.addRow(self.btnSweep) left_column.addWidget(sweep_control_box) ################################################################################################################ # Marker control ################################################################################################################ marker_control_box = QtWidgets.QGroupBox() marker_control_box.setTitle("Markers") marker_control_box.setMaximumWidth(400) marker_control_layout = QtWidgets.QFormLayout(marker_control_box) mouse_marker = Marker("Mouse marker", QtGui.QColor(20, 255, 20)) mouse_marker.updated.connect(self.dataUpdated) self.markers.append(mouse_marker) marker1 = Marker("Marker 1", QtGui.QColor(255, 0, 20)) marker1.updated.connect(self.dataUpdated) label, layout = marker1.getRow() marker_control_layout.addRow(label, layout) self.markers.append(marker1) marker2 = Marker("Marker 2", QtGui.QColor(20, 0, 255)) marker2.updated.connect(self.dataUpdated) label, layout = marker2.getRow() marker_control_layout.addRow(label, layout) self.markers.append(marker2) self.s11SmithChart.setMarkers(self.markers) self.s21SmithChart.setMarkers(self.markers) self.mousemarkerlabel = QtWidgets.QLabel("") self.mousemarkerlabel.setMinimumWidth(160) marker_control_layout.addRow(QtWidgets.QLabel("Mouse marker:"), self.mousemarkerlabel) self.marker1label = QtWidgets.QLabel("") marker_control_layout.addRow(QtWidgets.QLabel("Marker 1:"), self.marker1label) self.marker2label = QtWidgets.QLabel("") marker_control_layout.addRow(QtWidgets.QLabel("Marker 2:"), self.marker2label) left_column.addWidget(marker_control_box) ################################################################################################################ # Statistics/analysis ################################################################################################################ s11_control_box = QtWidgets.QGroupBox() s11_control_box.setTitle("S11") s11_control_layout = QtWidgets.QFormLayout() s11_control_box.setLayout(s11_control_layout) s11_control_box.setMaximumWidth(400) self.s11_min_swr_label = QtWidgets.QLabel() s11_control_layout.addRow("Min VSWR:", self.s11_min_swr_label) self.s11_min_rl_label = QtWidgets.QLabel() s11_control_layout.addRow("Return loss:", self.s11_min_rl_label) left_column.addWidget(s11_control_box) s21_control_box = QtWidgets.QGroupBox() s21_control_box.setTitle("S21") s21_control_layout = QtWidgets.QFormLayout() s21_control_box.setLayout(s21_control_layout) s21_control_box.setMaximumWidth(400) self.s21_min_gain_label = QtWidgets.QLabel() s21_control_layout.addRow("Min gain:", self.s21_min_gain_label) self.s21_max_gain_label = QtWidgets.QLabel() s21_control_layout.addRow("Max gain:", self.s21_max_gain_label) left_column.addWidget(s21_control_box) tdr_control_box = QtWidgets.QGroupBox() tdr_control_box.setTitle("TDR") tdr_control_layout = QtWidgets.QFormLayout() tdr_control_box.setLayout(tdr_control_layout) tdr_control_box.setMaximumWidth(400) self.tdr_velocity_dropdown = QtWidgets.QComboBox() self.tdr_velocity_dropdown.addItem("Jelly filled (0.64)", 0.64) self.tdr_velocity_dropdown.addItem("Polyethylene (0.66)", 0.66) self.tdr_velocity_dropdown.addItem("PTFE (Teflon) (0.70)", 0.70) self.tdr_velocity_dropdown.addItem("Pulp Insulation (0.72)", 0.72) self.tdr_velocity_dropdown.addItem("Foam or Cellular PE (0.78)", 0.78) self.tdr_velocity_dropdown.addItem("Semi-solid PE (SSPE) (0.84)", 0.84) self.tdr_velocity_dropdown.addItem("Air (Helical spacers) (0.94)", 0.94) self.tdr_velocity_dropdown.insertSeparator(7) self.tdr_velocity_dropdown.addItem("RG174 (0.66)", 0.66) self.tdr_velocity_dropdown.addItem("RG316 (0.69)", 0.69) self.tdr_velocity_dropdown.addItem("RG402 (0.695)", 0.695) self.tdr_velocity_dropdown.insertSeparator(11) self.tdr_velocity_dropdown.addItem("Custom", -1) self.tdr_velocity_dropdown.setCurrentIndex(1) # Default to PE (0.66) self.tdr_velocity_dropdown.currentIndexChanged.connect(self.updateTDR) tdr_control_layout.addRow(self.tdr_velocity_dropdown) self.tdr_velocity_input = QtWidgets.QLineEdit() self.tdr_velocity_input.setDisabled(True) self.tdr_velocity_input.setText("0.66") self.tdr_velocity_input.textChanged.connect(self.updateTDR) tdr_control_layout.addRow("Velocity factor", self.tdr_velocity_input) self.tdr_result_label = QtWidgets.QLabel() tdr_control_layout.addRow("Estimated cable length:", self.tdr_result_label) left_column.addWidget(tdr_control_box) ################################################################################################################ # Calibration ################################################################################################################ calibration_control_box = QtWidgets.QGroupBox("Calibration") calibration_control_box.setMaximumWidth(400) calibration_control_layout = QtWidgets.QFormLayout(calibration_control_box) b = QtWidgets.QPushButton("Calibration ...") self.calibrationWindow = CalibrationWindow(self) b.clicked.connect(self.calibrationWindow.show) calibration_control_layout.addRow(b) left_column.addWidget(calibration_control_box) ################################################################################################################ # Spacer ################################################################################################################ left_column.addSpacerItem(QtWidgets.QSpacerItem(1, 1, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Expanding)) ################################################################################################################ # Reference control ################################################################################################################ reference_control_box = QtWidgets.QGroupBox() reference_control_box.setMaximumWidth(400) reference_control_box.setTitle("Reference sweep") reference_control_layout = QtWidgets.QFormLayout(reference_control_box) btnSetReference = QtWidgets.QPushButton("Set current as reference") btnSetReference.clicked.connect(self.setReference) self.btnResetReference = QtWidgets.QPushButton("Reset reference") self.btnResetReference.clicked.connect(self.resetReference) self.btnResetReference.setDisabled(True) self.btnReferenceColorPicker = QtWidgets.QPushButton("█") self.btnReferenceColorPicker.setFixedWidth(20) self.setReferenceColor(self.referenceColor) self.btnReferenceColorPicker.clicked.connect(lambda: self.setReferenceColor( QtWidgets.QColorDialog.getColor(self.referenceColor, options=QtWidgets.QColorDialog.ShowAlphaChannel))) set_reference_layout = QtWidgets.QHBoxLayout() set_reference_layout.addWidget(btnSetReference) set_reference_layout.addWidget(self.btnReferenceColorPicker) reference_control_layout.addRow(set_reference_layout) reference_control_layout.addRow(self.btnResetReference) left_column.addWidget(reference_control_box) ################################################################################################################ # Serial control ################################################################################################################ serial_control_box = QtWidgets.QGroupBox() serial_control_box.setMaximumWidth(400) serial_control_box.setTitle("Serial port control") serial_control_layout = QtWidgets.QFormLayout(serial_control_box) self.serialPortInput = QtWidgets.QLineEdit(self.serialPort) self.serialPortInput.setAlignment(QtCore.Qt.AlignRight) # self.serialSpeedInput = QtWidgets.QLineEdit(str(self.serialSpeed)) # self.serialSpeedInput.setValidator(QtGui.QIntValidator()) # self.serialSpeedInput.setAlignment(QtCore.Qt.AlignRight) serial_control_layout.addRow(QtWidgets.QLabel("Serial port"), self.serialPortInput) # serial_control_layout.addRow(QtWidgets.QLabel("Speed"), self.serialSpeedInput) self.btnSerialToggle = QtWidgets.QPushButton("Open serial") self.btnSerialToggle.clicked.connect(self.serialButtonClick) serial_control_layout.addRow(self.btnSerialToggle) left_column.addWidget(serial_control_box) ################################################################################################################ # File control ################################################################################################################ self.fileWindow = QtWidgets.QWidget() self.fileWindow.setWindowTitle("Files") file_window_layout = QtWidgets.QVBoxLayout() self.fileWindow.setLayout(file_window_layout) reference_file_control_box = QtWidgets.QGroupBox("Import file") reference_file_control_layout = QtWidgets.QFormLayout(reference_file_control_box) self.referenceFileNameInput = QtWidgets.QLineEdit("") btnReferenceFilePicker = QtWidgets.QPushButton("...") btnReferenceFilePicker.setMaximumWidth(25) btnReferenceFilePicker.clicked.connect(self.pickReferenceFile) referenceFileNameLayout = QtWidgets.QHBoxLayout() referenceFileNameLayout.addWidget(self.referenceFileNameInput) referenceFileNameLayout.addWidget(btnReferenceFilePicker) reference_file_control_layout.addRow(QtWidgets.QLabel("Filename"), referenceFileNameLayout) file_window_layout.addWidget(reference_file_control_box) btnLoadReference = QtWidgets.QPushButton("Load reference") btnLoadReference.clicked.connect(self.loadReferenceFile) btnLoadSweep = QtWidgets.QPushButton("Load as sweep") btnLoadSweep.clicked.connect(self.loadSweepFile) reference_file_control_layout.addRow(btnLoadReference) reference_file_control_layout.addRow(btnLoadSweep) file_control_box = QtWidgets.QGroupBox() file_control_box.setTitle("Export file") file_control_box.setMaximumWidth(400) file_control_layout = QtWidgets.QFormLayout(file_control_box) self.fileNameInput = QtWidgets.QLineEdit("") btnFilePicker = QtWidgets.QPushButton("...") btnFilePicker.setMaximumWidth(25) btnFilePicker.clicked.connect(self.pickFile) fileNameLayout = QtWidgets.QHBoxLayout() fileNameLayout.addWidget(self.fileNameInput) fileNameLayout.addWidget(btnFilePicker) file_control_layout.addRow(QtWidgets.QLabel("Filename"), fileNameLayout) self.btnExportFile = QtWidgets.QPushButton("Export data S1P") self.btnExportFile.clicked.connect(self.exportFileS1P) file_control_layout.addRow(self.btnExportFile) self.btnExportFile = QtWidgets.QPushButton("Export data S2P") self.btnExportFile.clicked.connect(self.exportFileS2P) file_control_layout.addRow(self.btnExportFile) file_window_layout.addWidget(file_control_box) file_control_box = QtWidgets.QGroupBox() file_control_box.setTitle("Files") file_control_box.setMaximumWidth(400) file_control_layout = QtWidgets.QFormLayout(file_control_box) btnOpenFileWindow = QtWidgets.QPushButton("Files ...") file_control_layout.addWidget(btnOpenFileWindow) btnOpenFileWindow.clicked.connect(lambda: self.fileWindow.show()) left_column.addWidget(file_control_box) ################################################################################################################ # Right side ################################################################################################################ self.lister = QtWidgets.QPlainTextEdit() self.lister.setFixedHeight(80) charts = QtWidgets.QGridLayout() charts.addWidget(self.s11SmithChart, 0, 0) charts.addWidget(self.s21SmithChart, 1, 0) charts.addWidget(self.s11LogMag, 0, 1) charts.addWidget(self.s21LogMag, 1, 1) self.s11LogMag.setMarkers(self.markers) self.s21LogMag.setMarkers(self.markers) right_column.addLayout(charts) right_column.addWidget(self.lister) self.worker.signals.updated.connect(self.dataUpdated) self.worker.signals.finished.connect(self.sweepFinished)
def __init__(self): super().__init__() self.threadpool = QtCore.QThreadPool() print("Max thread count " + str(self.threadpool.maxThreadCount())) self.worker = SweepWorker(self) self.noSweeps = 1 # Number of sweeps to run self.serialLock = threading.Lock() self.serial = serial.Serial() self.dataLock = threading.Lock() self.values = [] self.frequencies = [] self.data : List[Datapoint] = [] self.data12 : List[Datapoint] = [] self.markers = [] self.serialPort = "COM11" # self.serialSpeed = "115200" self.setWindowTitle("NanoVNA Saver") layout = QtWidgets.QGridLayout() self.setLayout(layout) self.smithChart = SmithChart("S11") self.s12SmithChart = SmithChart("S12") left_column = QtWidgets.QVBoxLayout() right_column = QtWidgets.QVBoxLayout() layout.addLayout(left_column, 0, 0) layout.addLayout(right_column, 0, 1) ################################################################################################################ # Sweep control ################################################################################################################ sweep_control_box = QtWidgets.QGroupBox() sweep_control_box.setMaximumWidth(400) sweep_control_box.setTitle("Sweep control") sweep_control_layout = QtWidgets.QFormLayout(sweep_control_box) self.sweepStartInput = QtWidgets.QLineEdit("") self.sweepStartInput.setAlignment(QtCore.Qt.AlignRight) sweep_control_layout.addRow(QtWidgets.QLabel("Sweep start"), self.sweepStartInput) self.sweepEndInput = QtWidgets.QLineEdit("") self.sweepEndInput.setAlignment(QtCore.Qt.AlignRight) sweep_control_layout.addRow(QtWidgets.QLabel("Sweep end"), self.sweepEndInput) self.sweepCountInput = QtWidgets.QLineEdit("") self.sweepCountInput.setAlignment(QtCore.Qt.AlignRight) self.sweepCountInput.setText("1") sweep_control_layout.addRow(QtWidgets.QLabel("Sweep count"), self.sweepCountInput) self.sweepProgressBar = QtWidgets.QProgressBar() self.sweepProgressBar.setMaximum(100) self.sweepProgressBar.setValue(0) sweep_control_layout.addRow(self.sweepProgressBar) self.btnSweep = QtWidgets.QPushButton("Sweep") self.btnSweep.clicked.connect(self.sweep) sweep_control_layout.addRow(self.btnSweep) left_column.addWidget(sweep_control_box) ################################################################################################################ # Marker control ################################################################################################################ marker_control_box = QtWidgets.QGroupBox() marker_control_box.setTitle("Markers") marker_control_box.setMaximumWidth(400) marker_control_layout = QtWidgets.QFormLayout(marker_control_box) marker1 = Marker("Marker 1", QtGui.QColor(255, 0, 20)) marker1.updated.connect(self.dataUpdated) label, layout = marker1.getRow() marker_control_layout.addRow(label, layout) self.markers.append(marker1) marker2 = Marker("Marker 2", QtGui.QColor(20, 0, 255)) marker2.updated.connect(self.dataUpdated) label, layout = marker2.getRow() marker_control_layout.addRow(label, layout) self.markers.append(marker2) self.smithChart.setMarkers(self.markers) self.s12SmithChart.setMarkers(self.markers) self.marker1label = QtWidgets.QLabel("") marker_control_layout.addRow(QtWidgets.QLabel("Marker 1: "), self.marker1label) self.marker2label = QtWidgets.QLabel("") marker_control_layout.addRow(QtWidgets.QLabel("Marker 2: "), self.marker2label) left_column.addWidget(marker_control_box) left_column.addSpacerItem(QtWidgets.QSpacerItem(1, 1, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Expanding)) ################################################################################################################ # Serial control ################################################################################################################ serial_control_box = QtWidgets.QGroupBox() serial_control_box.setMaximumWidth(400) serial_control_box.setTitle("Serial port control") serial_control_layout = QtWidgets.QFormLayout(serial_control_box) self.serialPortInput = QtWidgets.QLineEdit(self.serialPort) self.serialPortInput.setAlignment(QtCore.Qt.AlignRight) # self.serialSpeedInput = QtWidgets.QLineEdit(str(self.serialSpeed)) # self.serialSpeedInput.setValidator(QtGui.QIntValidator()) # self.serialSpeedInput.setAlignment(QtCore.Qt.AlignRight) serial_control_layout.addRow(QtWidgets.QLabel("Serial port"), self.serialPortInput) # serial_control_layout.addRow(QtWidgets.QLabel("Speed"), self.serialSpeedInput) self.btnSerialToggle = QtWidgets.QPushButton("Open serial") self.btnSerialToggle.clicked.connect(self.serialButtonClick) serial_control_layout.addRow(self.btnSerialToggle) left_column.addWidget(serial_control_box) ################################################################################################################ # File control ################################################################################################################ file_control_box = QtWidgets.QGroupBox() file_control_box.setTitle("Export file") file_control_box.setMaximumWidth(400) file_control_layout = QtWidgets.QFormLayout(file_control_box) self.fileNameInput = QtWidgets.QLineEdit("") self.fileNameInput.setAlignment(QtCore.Qt.AlignRight) btnFilePicker = QtWidgets.QPushButton("...") btnFilePicker.setMaximumWidth(25) btnFilePicker.clicked.connect(self.pickFile) fileNameLayout = QtWidgets.QHBoxLayout() fileNameLayout.addWidget(self.fileNameInput) fileNameLayout.addWidget(btnFilePicker) file_control_layout.addRow(QtWidgets.QLabel("Filename"), fileNameLayout) self.btnExportFile = QtWidgets.QPushButton("Export data S1P") self.btnExportFile.clicked.connect(self.exportFileS11) file_control_layout.addRow(self.btnExportFile) left_column.addWidget(file_control_box) ################################################################################################################ # Right side ################################################################################################################ self.lister = QtWidgets.QPlainTextEdit() self.lister.setFixedHeight(100) self.s11LogMag = LogMagChart("S11") self.s12LogMag = LogMagChart("S12") charts = QtWidgets.QGridLayout() charts.addWidget(self.smithChart, 0, 0) charts.addWidget(self.s12SmithChart, 1, 0) charts.addWidget(self.s11LogMag, 0, 1) charts.addWidget(self.s12LogMag, 1, 1) self.s11LogMag.setMarkers(self.markers) self.s12LogMag.setMarkers(self.markers) right_column.addLayout(charts) right_column.addWidget(self.lister) self.worker.signals.updated.connect(self.dataUpdated) self.worker.signals.finished.connect(self.sweepFinished)