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
|
||||
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)
|
||||
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.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:
|
||||
|
|
|
@ -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()
|
||||
def setMarkers(self, markers):
|
||||
self.markers = markers
|
Ładowanie…
Reference in New Issue