kopia lustrzana https://github.com/NanoVNA-Saver/nanovna-saver
Markers find their own location, and have their own colour.
rodzic
6b30732853
commit
30d56ed470
30
Marker.py
30
Marker.py
|
@ -1,27 +1,30 @@
|
||||||
# Copyright (c) $year Rune B. Broberg
|
# Copyright (c) $year Rune B. Broberg
|
||||||
|
import collections
|
||||||
|
from typing import List
|
||||||
|
|
||||||
from PyQt5 import QtGui, QtWidgets, QtCore
|
from PyQt5 import QtGui, QtWidgets, QtCore
|
||||||
|
Datapoint = collections.namedtuple('Datapoint', 'freq re im')
|
||||||
|
|
||||||
|
|
||||||
class Marker:
|
class Marker:
|
||||||
name = "Marker"
|
name = "Marker"
|
||||||
frequency = ""
|
frequency = 0
|
||||||
color = QtGui.QColor()
|
color = QtGui.QColor()
|
||||||
|
location = -1
|
||||||
|
|
||||||
def __init__(self, name, initialColor, frequency=""):
|
def __init__(self, name, initialColor, frequency=""):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.name = name
|
self.name = name
|
||||||
self.color = initialColor
|
|
||||||
self.frequency = frequency
|
if frequency.isnumeric():
|
||||||
|
self.frequency = int(frequency)
|
||||||
self.frequencyInput = QtWidgets.QLineEdit(frequency)
|
self.frequencyInput = QtWidgets.QLineEdit(frequency)
|
||||||
self.frequencyInput.setAlignment(QtCore.Qt.AlignRight)
|
self.frequencyInput.setAlignment(QtCore.Qt.AlignRight)
|
||||||
self.frequencyInput.returnPressed.connect(lambda: self.setFrequency(self.frequencyInput.text()))
|
self.frequencyInput.returnPressed.connect(lambda: self.setFrequency(self.frequencyInput.text()))
|
||||||
|
|
||||||
self.btnColorPicker = QtWidgets.QPushButton("█")
|
self.btnColorPicker = QtWidgets.QPushButton("█")
|
||||||
self.btnColorPicker.setFixedWidth(20)
|
self.btnColorPicker.setFixedWidth(20)
|
||||||
p = self.btnColorPicker.palette()
|
self.setColor(initialColor)
|
||||||
p.setColor(QtGui.QPalette.ButtonText, self.color)
|
|
||||||
self.btnColorPicker.setPalette(p)
|
|
||||||
self.btnColorPicker.clicked.connect(lambda: self.setColor(QtWidgets.QColorDialog.getColor()))
|
self.btnColorPicker.clicked.connect(lambda: self.setColor(QtWidgets.QColorDialog.getColor()))
|
||||||
|
|
||||||
self.layout = QtWidgets.QHBoxLayout()
|
self.layout = QtWidgets.QHBoxLayout()
|
||||||
|
@ -29,10 +32,21 @@ class Marker:
|
||||||
self.layout.addWidget(self.btnColorPicker)
|
self.layout.addWidget(self.btnColorPicker)
|
||||||
|
|
||||||
def setFrequency(self, frequency):
|
def setFrequency(self, frequency):
|
||||||
self.frequency = frequency
|
self.frequency = int(frequency)
|
||||||
|
|
||||||
def setColor(self, color):
|
def setColor(self, color):
|
||||||
self.color = color
|
self.color = color
|
||||||
|
p = self.btnColorPicker.palette()
|
||||||
|
p.setColor(QtGui.QPalette.ButtonText, self.color)
|
||||||
|
self.btnColorPicker.setPalette(p)
|
||||||
|
|
||||||
def getRow(self):
|
def getRow(self):
|
||||||
return (QtWidgets.QLabel(self.name), self.layout)
|
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
|
||||||
|
|
|
@ -31,6 +31,7 @@ class NanoVNASaver(QtWidgets.QWidget):
|
||||||
self.values = []
|
self.values = []
|
||||||
self.frequencies = []
|
self.frequencies = []
|
||||||
self.data : List[Datapoint] = []
|
self.data : List[Datapoint] = []
|
||||||
|
self.markers = []
|
||||||
|
|
||||||
self.serialPort = "COM11"
|
self.serialPort = "COM11"
|
||||||
# self.serialSpeed = "115200"
|
# self.serialSpeed = "115200"
|
||||||
|
@ -92,13 +93,17 @@ class NanoVNASaver(QtWidgets.QWidget):
|
||||||
marker_control_box.setMaximumWidth(400)
|
marker_control_box.setMaximumWidth(400)
|
||||||
marker_control_layout = QtWidgets.QFormLayout(marker_control_box)
|
marker_control_layout = QtWidgets.QFormLayout(marker_control_box)
|
||||||
|
|
||||||
self.marker1 = Marker("Marker 1", QtGui.QColor(255, 0, 20))
|
marker1 = Marker("Marker 1", QtGui.QColor(255, 0, 20))
|
||||||
label, layout = self.marker1.getRow()
|
label, layout = marker1.getRow()
|
||||||
marker_control_layout.addRow(label, layout)
|
marker_control_layout.addRow(label, layout)
|
||||||
|
self.markers.append(marker1)
|
||||||
|
|
||||||
self.marker2 = Marker("Marker 2", QtGui.QColor(20, 0, 255))
|
marker2 = Marker("Marker 2", QtGui.QColor(20, 0, 255))
|
||||||
label, layout = self.marker2.getRow()
|
label, layout = marker2.getRow()
|
||||||
marker_control_layout.addRow(label, layout)
|
marker_control_layout.addRow(label, layout)
|
||||||
|
self.markers.append(marker2)
|
||||||
|
|
||||||
|
self.smithChart.setMarkers(self.markers)
|
||||||
|
|
||||||
self.marker1label = QtWidgets.QLabel("")
|
self.marker1label = QtWidgets.QLabel("")
|
||||||
marker_control_layout.addRow(QtWidgets.QLabel("Marker 1: "), self.marker1label)
|
marker_control_layout.addRow(QtWidgets.QLabel("Marker 1: "), self.marker1label)
|
||||||
|
@ -161,6 +166,7 @@ class NanoVNASaver(QtWidgets.QWidget):
|
||||||
right_column.addWidget(self.smithChart)
|
right_column.addWidget(self.smithChart)
|
||||||
|
|
||||||
self.worker.signals.updated.connect(self.dataUpdated)
|
self.worker.signals.updated.connect(self.dataUpdated)
|
||||||
|
self.worker.signals.finished.connect(self.sweepFinished)
|
||||||
|
|
||||||
def exportFile(self):
|
def exportFile(self):
|
||||||
print("Save file to " + self.fileNameInput.text())
|
print("Save file to " + self.fileNameInput.text())
|
||||||
|
@ -198,7 +204,13 @@ class NanoVNASaver(QtWidgets.QWidget):
|
||||||
self.serial.timeout = 0.05
|
self.serial.timeout = 0.05
|
||||||
|
|
||||||
self.serialLock.release()
|
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()
|
self.sweep()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -285,18 +297,6 @@ class NanoVNASaver(QtWidgets.QWidget):
|
||||||
self.serialLock.release()
|
self.serialLock.release()
|
||||||
return values[1:102]
|
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):
|
def saveData(self, data):
|
||||||
if self.dataLock.acquire(blocking=True):
|
if self.dataLock.acquire(blocking=True):
|
||||||
self.data = data
|
self.data = data
|
||||||
|
@ -306,6 +306,8 @@ class NanoVNASaver(QtWidgets.QWidget):
|
||||||
|
|
||||||
def dataUpdated(self):
|
def dataUpdated(self):
|
||||||
if self.dataLock.acquire(blocking=True):
|
if self.dataLock.acquire(blocking=True):
|
||||||
|
for m in self.markers:
|
||||||
|
m.findLocation(self.data)
|
||||||
self.smithChart.setData(self.data)
|
self.smithChart.setData(self.data)
|
||||||
self.sweepProgressBar.setValue(self.worker.percentage)
|
self.sweepProgressBar.setValue(self.worker.percentage)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -4,6 +4,8 @@ from typing import List
|
||||||
|
|
||||||
from PyQt5 import QtWidgets, QtGui, QtCore
|
from PyQt5 import QtWidgets, QtGui, QtCore
|
||||||
|
|
||||||
|
from Marker import Marker
|
||||||
|
|
||||||
Datapoint = collections.namedtuple('Datapoint', 'freq re im')
|
Datapoint = collections.namedtuple('Datapoint', 'freq re im')
|
||||||
|
|
||||||
class SmithChart(QtWidgets.QWidget):
|
class SmithChart(QtWidgets.QWidget):
|
||||||
|
@ -22,10 +24,7 @@ class SmithChart(QtWidgets.QWidget):
|
||||||
self.values = []
|
self.values = []
|
||||||
self.frequencies = []
|
self.frequencies = []
|
||||||
self.data : List[Datapoint] = []
|
self.data : List[Datapoint] = []
|
||||||
self.marker1 = -1
|
self.markers : List[Marker] = []
|
||||||
self.marker2 = -1
|
|
||||||
self.marker1Location = -1
|
|
||||||
self.marker2Location = -1
|
|
||||||
|
|
||||||
self.marker1Color = QtGui.QColor(255, 0, 20)
|
self.marker1Color = QtGui.QColor(255, 0, 20)
|
||||||
self.marker2Color = QtGui.QColor(20, 0, 255)
|
self.marker2Color = QtGui.QColor(20, 0, 255)
|
||||||
|
@ -77,42 +76,17 @@ class SmithChart(QtWidgets.QWidget):
|
||||||
marker1 = -1
|
marker1 = -1
|
||||||
marker2 = -1
|
marker2 = -1
|
||||||
for i in range(len(self.data)):
|
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
|
x = self.width()/2 + self.data[i].re * self.chartWidth/2
|
||||||
y = self.height()/2 + self.data[i].im * -1 * self.chartHeight/2
|
y = self.height()/2 + self.data[i].im * -1 * self.chartHeight/2
|
||||||
qp.drawPoint(int(x), int(y))
|
qp.drawPoint(int(x), int(y))
|
||||||
# Now draw the markers
|
# Now draw the markers
|
||||||
if marker1 != -1:
|
for m in self.markers:
|
||||||
highlighter.setColor(self.marker1Color)
|
if m.location != -1:
|
||||||
qp.setPen(highlighter)
|
highlighter.setColor(m.color)
|
||||||
x = self.width() / 2 + self.data[marker1].re * self.chartWidth / 2
|
qp.setPen(highlighter)
|
||||||
y = self.height() / 2 + self.data[marker1].im * -1 * self.chartHeight / 2
|
x = self.width() / 2 + self.data[m.location].re * self.chartWidth / 2
|
||||||
qp.drawPoint(int(x), int(y))
|
y = self.height() / 2 + self.data[m.location].im * -1 * self.chartHeight / 2
|
||||||
self.marker1Location = marker1
|
qp.drawPoint(int(x), int(y))
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
def setValues(self, values, frequencies):
|
def setValues(self, values, frequencies):
|
||||||
print("### Updating values ###")
|
print("### Updating values ###")
|
||||||
|
@ -125,18 +99,5 @@ class SmithChart(QtWidgets.QWidget):
|
||||||
self.data = data
|
self.data = data
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
def setMarker1(self, value):
|
def setMarkers(self, markers):
|
||||||
self.marker1Location = -1
|
self.markers = markers
|
||||||
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()
|
|
Ładowanie…
Reference in New Issue