pull/44/head
Rune B. Broberg 2019-10-13 17:35:32 +02:00
rodzic 6c1da0cdf9
commit 0e18bbb095
2 zmienionych plików z 143 dodań i 15 usunięć

Wyświetl plik

@ -15,7 +15,7 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
import collections
import math
from typing import List
from typing import List, Set
import numpy as np
import logging
@ -37,9 +37,12 @@ class Chart(QtWidgets.QWidget):
backgroundColor: QtGui.QColor = QtGui.QColor(QtCore.Qt.white)
foregroundColor: QtGui.QColor = QtGui.QColor(QtCore.Qt.lightGray)
textColor: QtGui.QColor = QtGui.QColor(QtCore.Qt.black)
swrColor: QtGui.QColor = QtGui.QColor(QtCore.Qt.red)
swrColor.setAlpha(128)
data: List[Datapoint] = []
reference: List[Datapoint] = []
markers: List[Marker] = []
swrMarkers: Set[float] = set()
bands = None
draggedMarker: Marker = None
name = ""
@ -61,6 +64,8 @@ class Chart(QtWidgets.QWidget):
self.action_popout.triggered.connect(lambda: self.popoutRequested.emit(self))
self.addAction(self.action_popout)
self.swrMarkers = set()
def setSweepColor(self, color : QtGui.QColor):
self.sweepColor = color
self.update()
@ -188,12 +193,35 @@ class Chart(QtWidgets.QWidget):
new_chart.setBackgroundColor(self.backgroundColor)
new_chart.textColor = self.textColor
new_chart.foregroundColor = self.foregroundColor
new_chart.swrColor = self.swrColor
new_chart.markers = self.markers
new_chart.swrMarkers = self.swrMarkers
new_chart.bands = self.bands
new_chart.drawLines = self.drawLines
new_chart.resize(self.width(), self.height())
return new_chart
def addSWRMarker(self, swr: float):
self.swrMarkers.add(swr)
self.update()
def removeSWRMarker(self, swr: float):
try:
self.swrMarkers.remove(swr)
except KeyError:
logger.debug("KeyError from %s", self.name)
return
finally:
self.update()
def clearSWRMarkers(self):
self.swrMarkers.clear()
self.update()
def setSWRColor(self, color: QtGui.QColor):
self.swrColor = color
self.update()
class FrequencyChart(Chart):
fstart = 0
@ -793,10 +821,15 @@ class VSWRChart(FrequencyChart):
else:
vswrstr = str(round(maxVSWR, digits))
qp.drawText(3, 35, vswrstr)
# qp.drawText(3, self.chartHeight + self.topMargin, str(minVSWR))
# At least 100 px between ticks
self.drawFrequencyTicks(qp)
qp.setPen(self.swrColor)
for vswr in self.swrMarkers:
y = self.topMargin + round((self.maxVSWR - vswr) / self.span * self.chartHeight)
qp.drawLine(self.leftMargin, y, self.leftMargin + self.chartWidth, y)
qp.drawText(self.leftMargin + 3, y - 1, str(vswr))
self.drawData(qp, self.data, self.sweepColor)
self.drawData(qp, self.reference, self.referenceColor)
self.drawMarkers(qp)
@ -988,6 +1021,13 @@ class SmithChart(SquareChart):
qp.drawArc(centerX - self.chartWidth*2, centerY, self.chartWidth*5, self.chartHeight*5, int(93.85*16), int(18.85*16)) # Im(Z) = -0.2
qp.drawArc(centerX - self.chartWidth*2, centerY, self.chartWidth*5, -self.chartHeight*5, int(-93.85 * 16), int(-18.85 * 16)) # Im(Z) = 0.2
qp.setPen(self.swrColor)
for swr in self.swrMarkers:
gamma = (swr - 1)/(swr + 1)
r = round(gamma * self.chartWidth/2)
qp.drawEllipse(QtCore.QPoint(centerX, centerY), r, r)
qp.drawText(QtCore.QRect(centerX - 50, centerY - 4 + r, 100, 20), QtCore.Qt.AlignCenter, str(swr))
def drawValues(self, qp: QtGui.QPainter):
if len(self.data) == 0 and len(self.reference) == 0:
return
@ -1232,6 +1272,16 @@ class LogMagChart(FrequencyChart):
qp.drawText(3, self.topMargin + 4, str(maxValue))
qp.drawText(3, self.chartHeight+self.topMargin, str(minValue))
self.drawFrequencyTicks(qp)
qp.setPen(self.swrColor)
for vswr in self.swrMarkers:
logMag = 20 * math.log10((vswr-1)/(vswr+1))
if self.isInverted:
logMag = logMag * -1
y = self.topMargin + round((self.maxValue - logMag) / self.span * self.chartHeight)
qp.drawLine(self.leftMargin, y, self.leftMargin + self.chartWidth, y)
qp.drawText(self.leftMargin + 3, y - 1, "VSWR: " + str(vswr))
self.drawData(qp, self.data, self.sweepColor)
self.drawData(qp, self.reference, self.referenceColor)
self.drawMarkers(qp)

Wyświetl plik

@ -1040,9 +1040,12 @@ class DisplaySettingsWindow(QtWidgets.QWidget):
shortcut = QtWidgets.QShortcut(QtCore.Qt.Key_Escape, self, self.hide)
layout = QtWidgets.QVBoxLayout()
layout = QtWidgets.QHBoxLayout()
self.setLayout(layout)
left_layout = QtWidgets.QVBoxLayout()
layout.addLayout(left_layout)
display_options_box = QtWidgets.QGroupBox("Options")
display_options_layout = QtWidgets.QFormLayout(display_options_box)
@ -1116,8 +1119,6 @@ class DisplaySettingsWindow(QtWidgets.QWidget):
display_options_layout.addRow("Second reference color", self.btnSecondaryReferenceColorPicker)
layout.addWidget(display_options_box)
color_options_box = QtWidgets.QGroupBox("Chart colors")
color_options_layout = QtWidgets.QFormLayout(color_options_box)
@ -1143,7 +1144,8 @@ class DisplaySettingsWindow(QtWidgets.QWidget):
color_options_layout.addRow("Chart text", self.btn_text_picker)
layout.addWidget(color_options_box)
right_layout = QtWidgets.QVBoxLayout()
layout.addLayout(right_layout)
font_options_box = QtWidgets.QGroupBox("Font")
font_options_layout = QtWidgets.QFormLayout(font_options_box)
@ -1158,8 +1160,6 @@ class DisplaySettingsWindow(QtWidgets.QWidget):
self.font_dropdown.currentTextChanged.connect(self.changeFont)
font_options_layout.addRow("Font size", self.font_dropdown)
layout.addWidget(font_options_box)
bands_box = QtWidgets.QGroupBox("Bands")
bands_layout = QtWidgets.QFormLayout(bands_box)
@ -1181,7 +1181,38 @@ class DisplaySettingsWindow(QtWidgets.QWidget):
bands_layout.addRow(self.btn_manage_bands)
layout.addWidget(bands_box)
vswr_marker_box = QtWidgets.QGroupBox("VSWR Markers")
vswr_marker_layout = QtWidgets.QFormLayout(vswr_marker_box)
self.vswrMarkers: List[float] = self.app.settings.value("VSWRMarkers", [], float)
self.btn_vswr_picker = QtWidgets.QPushButton("")
self.btn_vswr_picker.setFixedWidth(20)
self.btn_vswr_picker.clicked.connect(lambda: self.setColor("vswr", QtWidgets.QColorDialog.getColor(self.vswrColor, options=QtWidgets.QColorDialog.ShowAlphaChannel)))
vswr_marker_layout.addRow("VSWR Markers", self.btn_vswr_picker)
self.vswr_marker_dropdown = QtWidgets.QComboBox()
vswr_marker_layout.addRow(self.vswr_marker_dropdown)
if len(self.vswrMarkers) == 0:
self.vswr_marker_dropdown.addItem("None")
else:
for m in self.vswrMarkers:
self.vswr_marker_dropdown.addItem(str(m))
for c in self.app.s11charts:
c.addSWRMarker(m)
self.vswr_marker_dropdown.setCurrentIndex(0)
btn_add_marker = QtWidgets.QPushButton("Add ...")
btn_remove_marker = QtWidgets.QPushButton("Remove")
vswr_marker_btn_layout = QtWidgets.QHBoxLayout()
vswr_marker_btn_layout.addWidget(btn_add_marker)
vswr_marker_btn_layout.addWidget(btn_remove_marker)
vswr_marker_layout.addRow(vswr_marker_btn_layout)
btn_add_marker.clicked.connect(self.addVSWRMarker)
btn_remove_marker.clicked.connect(self.removeVSWRMarker)
charts_box = QtWidgets.QGroupBox("Displayed charts")
charts_layout = QtWidgets.QGridLayout(charts_box)
@ -1245,10 +1276,6 @@ class DisplaySettingsWindow(QtWidgets.QWidget):
self.changeChart(1, 1, chart11_selection.currentText())
self.changeChart(1, 2, chart12_selection.currentText())
layout.addWidget(charts_box)
self.dark_mode_option.setChecked(self.app.settings.value("DarkMode", False, bool))
self.show_lines_option.setChecked(self.app.settings.value("ShowLines", False, bool))
self.backgroundColor = self.app.settings.value("BackgroundColor", defaultValue=QtGui.QColor("white"),
type=QtGui.QColor)
self.foregroundColor = self.app.settings.value("ForegroundColor", defaultValue=QtGui.QColor("lightgray"),
@ -1258,6 +1285,11 @@ class DisplaySettingsWindow(QtWidgets.QWidget):
self.bandsColor = self.app.settings.value("BandsColor", defaultValue=QtGui.QColor(128, 128, 128, 48),
type=QtGui.QColor)
self.app.bands.color = self.bandsColor
self.vswrColor = self.app.settings.value("VSWRColor", defaultValue=QtGui.QColor(192, 0, 0, 128),
type=QtGui.QColor)
self.dark_mode_option.setChecked(self.app.settings.value("DarkMode", False, bool))
self.show_lines_option.setChecked(self.app.settings.value("ShowLines", False, bool))
if self.app.settings.value("UseCustomColors", defaultValue=False, type=bool):
self.dark_mode_option.setDisabled(True)
@ -1284,6 +1316,19 @@ class DisplaySettingsWindow(QtWidgets.QWidget):
p.setColor(QtGui.QPalette.ButtonText, self.bandsColor)
self.btn_bands_picker.setPalette(p)
p = self.btn_vswr_picker.palette()
p.setColor(QtGui.QPalette.ButtonText, self.vswrColor)
self.btn_vswr_picker.setPalette(p)
left_layout.addWidget(display_options_box)
left_layout.addWidget(charts_box)
left_layout.addStretch(1)
right_layout.addWidget(color_options_box)
right_layout.addWidget(font_options_box)
right_layout.addWidget(bands_box)
right_layout.addWidget(vswr_marker_box)
def changeChart(self, x, y, chart):
found = None
for c in self.app.selectable_charts:
@ -1330,11 +1375,13 @@ class DisplaySettingsWindow(QtWidgets.QWidget):
c.setBackgroundColor(QtGui.QColor(QtCore.Qt.black))
c.setForegroundColor(QtGui.QColor(QtCore.Qt.lightGray))
c.setTextColor(QtGui.QColor(QtCore.Qt.white))
c.setSWRColor(self.vswrColor)
else:
for c in self.app.subscribing_charts:
c.setBackgroundColor(QtGui.QColor(QtCore.Qt.white))
c.setForegroundColor(QtGui.QColor(QtCore.Qt.lightGray))
c.setTextColor(QtGui.QColor(QtCore.Qt.black))
c.setSWRColor(self.vswrColor)
def changeCustomColors(self):
self.app.settings.setValue("UseCustomColors", self.use_custom_colors.isChecked())
@ -1381,6 +1428,12 @@ class DisplaySettingsWindow(QtWidgets.QWidget):
self.bandsColor = color
self.app.settings.setValue("BandsColor", color)
self.app.bands.setColor(color)
elif name == "vswr":
p = self.btn_vswr_picker.palette()
p.setColor(QtGui.QPalette.ButtonText, color)
self.btn_vswr_picker.setPalette(p)
self.vswrColor = color
self.app.settings.setValue("VSWRColor", color)
self.changeCustomColors()
def setSweepColor(self, color: QtGui.QColor):
@ -1448,6 +1501,31 @@ class DisplaySettingsWindow(QtWidgets.QWidget):
self.bandsWindow.show()
QtWidgets.QApplication.setActiveWindow(self.bandsWindow)
def addVSWRMarker(self):
value, selected = QtWidgets.QInputDialog.getDouble(self, "Add VSWR Marker",
"VSWR value to show:", min=1.001, decimals=3)
if selected:
self.vswrMarkers.append(value)
if self.vswr_marker_dropdown.itemText(0) == "None":
self.vswr_marker_dropdown.removeItem(0)
self.vswr_marker_dropdown.addItem(str(value))
self.vswr_marker_dropdown.setCurrentText(str(value))
for c in self.app.s11charts:
c.addSWRMarker(value)
self.app.settings.setValue("VSWRMarkers", self.vswrMarkers)
def removeVSWRMarker(self):
value_str = self.vswr_marker_dropdown.currentText()
if value_str != "None":
value = float(value_str)
self.vswrMarkers.remove(value)
self.vswr_marker_dropdown.removeItem(self.vswr_marker_dropdown.currentIndex())
if self.vswr_marker_dropdown.count() == 0:
self.vswr_marker_dropdown.addItem("None")
for c in self.app.s11charts:
c.removeSWRMarker(value)
self.app.settings.setValue("VSWRMarkers", self.vswrMarkers)
class AboutWindow(QtWidgets.QWidget):
def __init__(self, app: NanoVNASaver):
@ -1503,7 +1581,7 @@ class AboutWindow(QtWidgets.QWidget):
check_for_updates = self.app.settings.value("CheckForUpdates", "Ask")
if check_for_updates == "Yes":
self.updateCheckBox.setChecked(True)
self.findUpdates(automatic = True)
self.findUpdates(automatic=True)
elif check_for_updates == "No":
self.updateCheckBox.setChecked(False)
else: