From 30d56ed4707428cb7a46d4fb9d11d6a891468628 Mon Sep 17 00:00:00 2001 From: "Rune B. Broberg" Date: Thu, 29 Aug 2019 15:04:40 +0200 Subject: [PATCH] Markers find their own location, and have their own colour. --- Marker.py | 30 ++++++++++++++++------- NanoVNASaver.py | 36 +++++++++++++++------------- SmithChart.py | 63 ++++++++++--------------------------------------- 3 files changed, 53 insertions(+), 76 deletions(-) diff --git a/Marker.py b/Marker.py index d70fd2e..d61fd9b 100644 --- a/Marker.py +++ b/Marker.py @@ -1,27 +1,30 @@ # Copyright (c) $year Rune B. Broberg +import collections +from typing import List from PyQt5 import QtGui, QtWidgets, QtCore +Datapoint = collections.namedtuple('Datapoint', 'freq re im') class Marker: name = "Marker" - frequency = "" + frequency = 0 color = QtGui.QColor() + location = -1 def __init__(self, name, initialColor, frequency=""): super().__init__() self.name = name - self.color = initialColor - self.frequency = frequency + + if frequency.isnumeric(): + self.frequency = int(frequency) self.frequencyInput = QtWidgets.QLineEdit(frequency) self.frequencyInput.setAlignment(QtCore.Qt.AlignRight) self.frequencyInput.returnPressed.connect(lambda: self.setFrequency(self.frequencyInput.text())) self.btnColorPicker = QtWidgets.QPushButton("█") self.btnColorPicker.setFixedWidth(20) - p = self.btnColorPicker.palette() - p.setColor(QtGui.QPalette.ButtonText, self.color) - self.btnColorPicker.setPalette(p) + self.setColor(initialColor) self.btnColorPicker.clicked.connect(lambda: self.setColor(QtWidgets.QColorDialog.getColor())) self.layout = QtWidgets.QHBoxLayout() @@ -29,10 +32,21 @@ class Marker: self.layout.addWidget(self.btnColorPicker) def setFrequency(self, frequency): - self.frequency = frequency + self.frequency = int(frequency) def setColor(self, color): self.color = color + p = self.btnColorPicker.palette() + p.setColor(QtGui.QPalette.ButtonText, self.color) + self.btnColorPicker.setPalette(p) def getRow(self): - return (QtWidgets.QLabel(self.name), self.layout) \ No newline at end of file + return (QtWidgets.QLabel(self.name), self.layout) + + def findLocation(self, data: List[Datapoint]): + self.location = -1 + stepsize = data[1].freq-data[0].freq + for i in range(len(data)): + if abs(data[i].freq-self.frequency) <= (stepsize/2): + self.location = i + return diff --git a/NanoVNASaver.py b/NanoVNASaver.py index 88cca8f..3d5f385 100644 --- a/NanoVNASaver.py +++ b/NanoVNASaver.py @@ -31,6 +31,7 @@ class NanoVNASaver(QtWidgets.QWidget): self.values = [] self.frequencies = [] self.data : List[Datapoint] = [] + self.markers = [] self.serialPort = "COM11" # self.serialSpeed = "115200" @@ -92,13 +93,17 @@ class NanoVNASaver(QtWidgets.QWidget): marker_control_box.setMaximumWidth(400) marker_control_layout = QtWidgets.QFormLayout(marker_control_box) - self.marker1 = Marker("Marker 1", QtGui.QColor(255, 0, 20)) - label, layout = self.marker1.getRow() + marker1 = Marker("Marker 1", QtGui.QColor(255, 0, 20)) + label, layout = marker1.getRow() marker_control_layout.addRow(label, layout) + self.markers.append(marker1) - self.marker2 = Marker("Marker 2", QtGui.QColor(20, 0, 255)) - label, layout = self.marker2.getRow() + marker2 = Marker("Marker 2", QtGui.QColor(20, 0, 255)) + label, layout = marker2.getRow() marker_control_layout.addRow(label, layout) + self.markers.append(marker2) + + self.smithChart.setMarkers(self.markers) self.marker1label = QtWidgets.QLabel("") marker_control_layout.addRow(QtWidgets.QLabel("Marker 1: "), self.marker1label) @@ -161,6 +166,7 @@ class NanoVNASaver(QtWidgets.QWidget): right_column.addWidget(self.smithChart) self.worker.signals.updated.connect(self.dataUpdated) + self.worker.signals.finished.connect(self.sweepFinished) def exportFile(self): print("Save file to " + self.fileNameInput.text()) @@ -198,7 +204,13 @@ class NanoVNASaver(QtWidgets.QWidget): self.serial.timeout = 0.05 self.serialLock.release() - sleep(0.25) + sleep(0.05) + + frequencies = self.readValues("frequencies") + + self.sweepStartInput.setText(str(frequencies[0])) + self.sweepEndInput.setText(str(frequencies[100])) + self.sweep() return @@ -285,18 +297,6 @@ class NanoVNASaver(QtWidgets.QWidget): self.serialLock.release() return values[1:102] - def setMarker1Color(self, color): - self.smithChart.marker1Color = color - p = self.btnMarker1ColorPicker.palette() - p.setColor(QtGui.QPalette.ButtonText, color) - self.btnMarker1ColorPicker.setPalette(p) - - def setMarker2Color(self, color): - self.smithChart.marker2Color = color - p = self.btnMarker2ColorPicker.palette() - p.setColor(QtGui.QPalette.ButtonText, color) - self.btnMarker2ColorPicker.setPalette(p) - def saveData(self, data): if self.dataLock.acquire(blocking=True): self.data = data @@ -306,6 +306,8 @@ class NanoVNASaver(QtWidgets.QWidget): def dataUpdated(self): if self.dataLock.acquire(blocking=True): + for m in self.markers: + m.findLocation(self.data) self.smithChart.setData(self.data) self.sweepProgressBar.setValue(self.worker.percentage) else: diff --git a/SmithChart.py b/SmithChart.py index 5d07906..eea3bfd 100644 --- a/SmithChart.py +++ b/SmithChart.py @@ -4,6 +4,8 @@ from typing import List from PyQt5 import QtWidgets, QtGui, QtCore +from Marker import Marker + Datapoint = collections.namedtuple('Datapoint', 'freq re im') class SmithChart(QtWidgets.QWidget): @@ -22,10 +24,7 @@ class SmithChart(QtWidgets.QWidget): self.values = [] self.frequencies = [] self.data : List[Datapoint] = [] - self.marker1 = -1 - self.marker2 = -1 - self.marker1Location = -1 - self.marker2Location = -1 + self.markers : List[Marker] = [] self.marker1Color = QtGui.QColor(255, 0, 20) self.marker2Color = QtGui.QColor(20, 0, 255) @@ -77,42 +76,17 @@ class SmithChart(QtWidgets.QWidget): marker1 = -1 marker2 = -1 for i in range(len(self.data)): - # TODO: Make this check for being "nearest" neater - if self.marker1 != -1 and abs(int(self.data[i].freq) - self.marker1) < (int(self.data[2].freq) - int(self.data[1].freq)): - if marker1 != -1: - # Are we closer than the other spot? - if abs(int(self.data[i].freq) - self.marker1) < abs(int(self.data[marker1].freq) - self.marker1): - marker1 = i - else: - marker1 = i - - if self.marker2 != -1 and abs(int(self.data[i].freq) - self.marker2) < (int(self.data[2].freq) - int(self.data[1].freq)): - if marker2 != -1: - # Are we closer than the other spot? - if abs(int(self.data[i].freq) - self.marker2) < abs(int(self.data[marker2].freq) - self.marker2): - marker2 = i - else: - marker2 = i - x = self.width()/2 + self.data[i].re * self.chartWidth/2 y = self.height()/2 + self.data[i].im * -1 * self.chartHeight/2 qp.drawPoint(int(x), int(y)) # Now draw the markers - if marker1 != -1: - highlighter.setColor(self.marker1Color) - qp.setPen(highlighter) - x = self.width() / 2 + self.data[marker1].re * self.chartWidth / 2 - y = self.height() / 2 + self.data[marker1].im * -1 * self.chartHeight / 2 - qp.drawPoint(int(x), int(y)) - self.marker1Location = marker1 - - if marker2 != -1: - highlighter.setColor(self.marker2Color) - qp.setPen(highlighter) - x = self.width() / 2 + self.data[marker2].re * self.chartWidth / 2 - y = self.height() / 2 + self.data[marker2].im * -1 * self.chartHeight / 2 - qp.drawPoint(int(x), int(y)) - self.marker2Location = marker2 + for m in self.markers: + if m.location != -1: + highlighter.setColor(m.color) + qp.setPen(highlighter) + x = self.width() / 2 + self.data[m.location].re * self.chartWidth / 2 + y = self.height() / 2 + self.data[m.location].im * -1 * self.chartHeight / 2 + qp.drawPoint(int(x), int(y)) def setValues(self, values, frequencies): print("### Updating values ###") @@ -125,18 +99,5 @@ class SmithChart(QtWidgets.QWidget): self.data = data self.update() - def setMarker1(self, value): - self.marker1Location = -1 - if value.isnumeric(): - self.marker1 = int(value) - else: - self.marker1 = -1 - self.update() - - def setMarker2(self, value): - self.marker2Location = -1 - if value.isnumeric(): - self.marker2 = int(value) - else: - self.marker2 = -1 - self.update() \ No newline at end of file + def setMarkers(self, markers): + self.markers = markers \ No newline at end of file