PiScan/client/py/scanner.py

235 lines
8.9 KiB
Python

from PySide2.QtWidgets import *
from PySide2.QtCore import *
from PySide2.QtGui import *
import common
import sys
sys.path.insert(1, '../../proto')
import messages_pb2
import context_pb2
import request_pb2
import google.protobuf.message as proto
class Scanner:
gainFromContext = False
squelchFromContext = False
def __init__(self, parentWindow):
self.widget = parentWindow.scannerPage
self.contextStack = parentWindow.scanContextStack
self.holdPage = parentWindow.scanner_holdPage
self.scanPage = parentWindow.scanner_scanPage
self.entryTagLabel = parentWindow.scanner_entryTagLabel
self.frequencyLabel = parentWindow.scanner_frequencyLabel
self.modulationLabel = parentWindow.scanner_modulationLabel
self.systemTagLabel = parentWindow.scanner_systemTagLabel
self.entryNumLabel = parentWindow.scanner_entryNumLabel
self.delayLabel = parentWindow.scanner_delayLabel
self.lockoutDurationLabel = parentWindow.scanner_lockoutDurationLabel
self.scanModeLabel = parentWindow.scanner_scanModeLabel
self.lockoutDurationButton = parentWindow.scanner_lockoutDurationButton
self.scanIndicator = parentWindow.scanner_scanIndicator
self.gainSlider = parentWindow.scanner_gainSlider
self.sigStrengthBar = parentWindow.scanner_sigStrengthBar
self.squelchSlider = parentWindow.scanner_squelchSlider
self.fnButtonsWidget = parentWindow.scanner_fnButtonsWidget
self.fnButton1 = parentWindow.scanner_fnButton1
self.fnButton2 = parentWindow.scanner_fnButton2
self.fnButton3 = parentWindow.scanner_fnButton3
self.fnButton4 = parentWindow.scanner_fnButton4
self.sidebarToggleButton = parentWindow.scanner_sidebarToggle
self.sidebarPanel = parentWindow.scanner_sidebarPanel
self.disconnectButton = parentWindow.scanner_disconnectButton
self.settingsButton = parentWindow.scanner_settingsButton
self.connectInfoButton = parentWindow.scanner_connectInfoButton
self.volumeControlPanel = parentWindow.scanner_volumeControl
self.volumeSlider = parentWindow.scanner_volumeSlider
self.muteButton = parentWindow.scanner_volumeMute
self.entryEditButton = parentWindow.scanner_entryEditButton
self.fnButton1.clicked.connect(self.onFnButton1)
self.fnButton2.clicked.connect(self.onFnButton2)
self.fnButton3.clicked.connect(self.onFnButton3)
self.fnButton4.clicked.connect(self.onFnButton4)
self.gainSlider.valueChanged.connect(self.ongainSlider)
self.squelchSlider.valueChanged.connect(self.onsquelchSlider)
self.sidebarToggleButton.clicked.connect(self.onSidebarToggle)
self.sidebarOpen = False
self.sidebarPanel.setVisible(False)
self.disconnectButton.clicked.connect(self.onDisconnectButton)
self.volumeSlider.valueChanged.connect(self.onVolumeSlider)
self.muteButton.toggled.connect(self.onMuteButton)
# TODO TEMPORARY - hiding UI elements for features not added yet
self.volumeControlPanel.setVisible(False)
self.lockoutDurationButton.setVisible(False)
self.lockoutDurationLabel.setVisible(False)
self.fnButton4.setVisible(False)
self.settingsButton.setVisible(False)
self.connectInfoButton.setVisible(False)
self.entryEditButton.setVisible(False)
self.delayLabel.setVisible(False)
self.scanModeLabel.setVisible(False)
parentWindow.line_4.setVisible(False)
movie = QMovie("resources/bar-scan.gif")
movie.start()
self.scanIndicator.setMovie(movie)
labelPalette = QPalette()
labelPalette.setColor(QPalette.WindowText, Qt.white)
labelFont = QFont()
labelFont.setPointSize(12)
squelchLayout = QHBoxLayout(self.squelchSlider)
squelchLayout.setContentsMargins(0, 0, 0, 0)
self.squelchLabel = QLabel()
self.squelchLabel.setAlignment(Qt.AlignTop)
self.squelchLabel.setPalette(labelPalette)
self.squelchLabel.setFont(labelFont)
self.squelchLabel.setText(str(0))
squelchLayout.addWidget(self.squelchLabel)
gainLayout = QHBoxLayout(self.gainSlider)
gainLayout.setContentsMargins(0, 0, 0, 0)
self.gainLabel = QLabel()
self.gainLabel.setAlignment(Qt.AlignTop)
self.gainLabel.setPalette(labelPalette)
self.gainLabel.setFont(labelFont)
self.gainLabel.setText(str(0))
gainLayout.addWidget(self.gainLabel)
#self.setMode(common.ScannerMode.SCANNING)
self.contextStack.setCurrentWidget(self.scanPage)
self.lastGainVal = 0
self.lastSquelchSlide = 0
self.gainTimer = QTimer()
self.gainTimer.setInterval(100)
self.gainTimer.setSingleShot(True)
self.gainTimer.timeout.connect(self.setGain)
#def setMode(self, mode):
# self.contextStack.setCurrentIndex(mode.value)
def updateSignalIndicator(self, level):
self.sigStrengthBar.setValue(level)
def updateScanContext(self, context):
if context.state == context_pb2.ScannerContext.State.Value('SCAN'):
#self.setMode(common.ScannerMode.SCANNING)
self.contextStack.setCurrentWidget(self.scanPage)
self.sigStrengthBar.setValue(0)
common.getApp().setWindowTitleInfo('Scanning')
else:
try:
entry = context.entryData
self.entryNumLabel.setText(entry.entryIndex)
self.systemTagLabel.setText(entry.systemTag)
self.entryTagLabel.setText(entry.entryTag)
freq_formatted = str(float(entry.freq) / 1000000)
self.frequencyLabel.setText((freq_formatted + " MHz"))
self.modulationLabel.setText(entry.modulation)
common.getApp().setWindowTitleInfo(entry.entryIndex + ': ' + entry.entryTag)
except:
print('problem setting values')
if context.state == context_pb2.ScannerContext.State.Value('HOLD'):
self.sigStrengthBar.setValue(0)
#self.setMode(common.ScannerMode.HOLD)
self.contextStack.setCurrentWidget(self.holdPage)
elif context.state == context_pb2.ScannerContext.State.Value('RECEIVE'):
#self.setMode(common.ScannerMode.RECEIVE)
self.contextStack.setCurrentWidget(self.holdPage)
def updateDemodContext(self, context):
squelchFromContext = True
gainFromContext = True
#SquelchScale.configure(value=context.squelch)
self.squelchSlider.setValue(context.squelch)
self.squelchLabel.setText(str(context.squelch))
#GainScale.configure(value=context.gain)
self.gainSlider.setValue(context.gain)
#self.gainLabel.setText(context.gain)
if context.gain < 0:
#GainLabel.configure(text='Auto')
self.gainLabel.setText('Auto')
else:
#GainLabel.configure(text=context.gain)
self.gainLabel.setText(str(int(context.gain)))
def onFnButton1(self):
common.getApp().scan()
def onFnButton2(self):
common.getApp().hold()
def onFnButton3(self):
common.getApp().showManualEntryDialog()
def onFnButton4(self):
common.getApp().showSettingsDialog()
def ongainSlider(self):
if self.gainFromContext:
self.gainFromContext = False
else:
self.lastGainVal = self.gainSlider.value()
self.gainTimer.start()
def setGain(self):
self._job = None
val = float(self.lastGainVal)
common.getApp().setGain(val)
def onsquelchSlider(self):
if self.squelchFromContext:
self.squelchFromContext = False
else:
val = float(self.squelchSlider.value())
#if abs(val - self.lastSquelchSlide) < 0.5:
common.getApp().setSquelch(val)
self.lastSquelchSlide = val
def onSidebarToggle(self):
if self.sidebarOpen:
self.sidebarToggleButton.setText('<')
self.sidebarPanel.setVisible(False)
self.sidebarOpen = False
else:
self.sidebarToggleButton.setText('>')
self.sidebarPanel.setVisible(True)
self.sidebarOpen = True
def setSquelchRange(self, minimum, maximum):
self.squelchSlider.setMinimum(minimum)
self.squelchSlider.setMaximum(maximum)
def setGainRange(self, minimum, maximum):
self.gainSlider.setMinimum(minimum)
self.gainSlider.setMaximum(maximum)
def onDisconnectButton(self):
common.getApp().disconnect()
def onVolumeSlider(self, value):
common.getApp().setAudioVolume(value)
def onMuteButton(self, value):
self.volumeSlider.setEnabled(not value)
common.getApp().setAudioMute(value)
def setVolumeVisible(self, visible):
self.volumeControlPanel.setVisible(visible)