summaryrefslogtreecommitdiff
path: root/gnuradio-runtime/python/gnuradio/ctrlport/gr-ctrlport-monitor
diff options
context:
space:
mode:
Diffstat (limited to 'gnuradio-runtime/python/gnuradio/ctrlport/gr-ctrlport-monitor')
-rw-r--r--gnuradio-runtime/python/gnuradio/ctrlport/gr-ctrlport-monitor157
1 files changed, 88 insertions, 69 deletions
diff --git a/gnuradio-runtime/python/gnuradio/ctrlport/gr-ctrlport-monitor b/gnuradio-runtime/python/gnuradio/ctrlport/gr-ctrlport-monitor
index 01b6a84d3f..c8c4771e45 100644
--- a/gnuradio-runtime/python/gnuradio/ctrlport/gr-ctrlport-monitor
+++ b/gnuradio-runtime/python/gnuradio/ctrlport/gr-ctrlport-monitor
@@ -11,12 +11,16 @@
from PyQt5 import QtCore, Qt
from argparse import ArgumentParser
-import os, sys, time, struct
+import os
+import sys
+import time
+import struct
from gnuradio import gr, ctrlport
from gnuradio.ctrlport.GrDataPlotter import *
from gnuradio.ctrlport.GNURadioControlPortClient import GNURadioControlPortClient
+
class RateDialog(Qt.QDialog):
def __init__(self, delay, parent=None):
super(RateDialog, self).__init__(parent)
@@ -24,19 +28,23 @@ class RateDialog(Qt.QDialog):
self.setWindowTitle("Update Delay (ms)")
self.delay = Qt.QLineEdit(self)
self.delay.setText(str(delay))
- self.buttonBox = Qt.QDialogButtonBox(Qt.QDialogButtonBox.Ok | Qt.QDialogButtonBox.Cancel)
+ self.buttonBox = Qt.QDialogButtonBox(
+ Qt.QDialogButtonBox.Ok | Qt.QDialogButtonBox.Cancel)
self.gridLayout.addWidget(self.delay)
self.gridLayout.addWidget(self.buttonBox)
self.buttonBox.accepted.connect(self.accept)
self.buttonBox.rejected.connect(self.reject)
+
def accept(self):
self.done(1)
+
def reject(self):
self.done(0)
+
class MAINWindow(Qt.QMainWindow):
def minimumSizeHint(self):
- return Qt.QSize(800,600)
+ return Qt.QSize(800, 600)
def __init__(self, radioclient):
@@ -65,7 +73,7 @@ class MAINWindow(Qt.QMainWindow):
self.setUnifiedTitleAndToolBarOnMac(True)
self.newCon(radioclient)
- icon = Qt.QIcon(ctrlport.__path__[0] + "/icon.png" )
+ icon = Qt.QIcon(ctrlport.__path__[0] + "/icon.png")
self.setWindowIcon(icon)
# Locally turn off ControlPort export from GR. This prevents
@@ -74,14 +82,14 @@ class MAINWindow(Qt.QMainWindow):
# been specified).
os.environ['GR_CONF_CONTROLPORT_ON'] = 'False'
- def setUpdateRate(self,nur):
+ def setUpdateRate(self, nur):
self.updateRate = int(nur)
for c in self.conns:
c.updateRate = self.updateRate
c.timer.setInterval(self.updateRate)
def newCon(self, radioclient=None):
- child = MForm(radioclient, len(self.conns), parent = self)
+ child = MForm(radioclient, len(self.conns), parent=self)
if(child.radioclient is not None):
child.setWindowTitle(str(child.radioclient))
self.mdiArea.addSubWindow(child)
@@ -95,7 +103,7 @@ class MAINWindow(Qt.QMainWindow):
props = radio.properties([key])
- pmin,pmax = get_minmax(props[key])
+ pmin, pmax = get_minmax(props[key])
# Use display option mask of item to set up available plot
# types and default options.
@@ -166,8 +174,8 @@ class MAINWindow(Qt.QMainWindow):
knobprop = self.knobprops[uid][tag]
strr = str(tree.radioclient)
- title = strr #title = "{0}:{1}".format(r[3], r[5])
- pmin,pmax = get_minmax(knobprop)
+ title = strr # title = "{0}:{1}".format(r[3], r[5])
+ pmin, pmax = get_minmax(knobprop)
disp = knobprop.display
if(disp & gr.DISPTIME):
@@ -217,7 +225,8 @@ class MAINWindow(Qt.QMainWindow):
self.mdiArea.addSubWindow(plot)
plot.setWindowTitle("{0}: {1}".format(title, plot.name()))
- plot.qwidget().destroyed.connect(lambda obj=None, plot=plot: self.destroyPlot(plot=plot)),
+ plot.qwidget().destroyed.connect(lambda obj=None,
+ plot=plot: self.destroyPlot(plot=plot)),
# when the plot is updated via drag-and-drop, we need to be
# notified of the new qwidget that's created so we can
@@ -232,8 +241,8 @@ class MAINWindow(Qt.QMainWindow):
for i, plots in enumerate(self.plots):
for p in plots:
if(p == q):
- #plots.remove(p)
- #plots.append(q)
+ # plots.remove(p)
+ # plots.append(q)
q.qwidget().destroyed.connect(lambda obj=None, plot=p: self.destroyPlot(plot=plot))
break
@@ -290,7 +299,7 @@ class MAINWindow(Qt.QMainWindow):
# If it's a byte stream, Python thinks it's a string.
# Unpack and convert to floats for plotting.
if(type(d) == str and n.find('probe2_b') == 0):
- d = struct.unpack(len(d)*'b', d)
+ d = struct.unpack(len(d) * 'b', d)
d = [float(di) for di in d]
data.append(d)
@@ -303,59 +312,58 @@ class MAINWindow(Qt.QMainWindow):
if window:
self.mdiArea.setActiveSubWindow(window)
-
def createActions(self):
self.newConAct = Qt.QAction("&New Connection",
- self, shortcut=Qt.QKeySequence.New,
- statusTip="Create a new file", triggered=lambda x: self.newCon(None))
+ self, shortcut=Qt.QKeySequence.New,
+ statusTip="Create a new file", triggered=lambda x: self.newCon(None))
self.exitAct = Qt.QAction("E&xit", self, shortcut="Ctrl+Q",
- statusTip="Exit the application",
- triggered=Qt.qApp.closeAllWindows)
+ statusTip="Exit the application",
+ triggered=Qt.qApp.closeAllWindows)
self.closeAct = Qt.QAction("Cl&ose", self, shortcut="Ctrl+F4",
- statusTip="Close the active window",
- triggered=self.mdiArea.closeActiveSubWindow)
+ statusTip="Close the active window",
+ triggered=self.mdiArea.closeActiveSubWindow)
self.closeAllAct = Qt.QAction("Close &All", self,
- statusTip="Close all the windows",
- triggered=self.mdiArea.closeAllSubWindows)
+ statusTip="Close all the windows",
+ triggered=self.mdiArea.closeAllSubWindows)
self.urAct = Qt.QAction("Update Rate", self, shortcut="F5",
- statusTip="Change Update Rate",
- triggered=self.updateRateShow)
+ statusTip="Change Update Rate",
+ triggered=self.updateRateShow)
qks = Qt.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_T)
self.tileAct = Qt.QAction("&Tile", self,
- statusTip="Tile the windows",
- triggered=self.mdiArea.tileSubWindows,
- shortcut=qks)
+ statusTip="Tile the windows",
+ triggered=self.mdiArea.tileSubWindows,
+ shortcut=qks)
qks = Qt.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_C)
self.cascadeAct = Qt.QAction("&Cascade", self,
- statusTip="Cascade the windows", shortcut=qks,
- triggered=self.mdiArea.cascadeSubWindows)
+ statusTip="Cascade the windows", shortcut=qks,
+ triggered=self.mdiArea.cascadeSubWindows)
self.nextAct = Qt.QAction("Ne&xt", self,
- shortcut=Qt.QKeySequence.NextChild,
- statusTip="Move the focus to the next window",
- triggered=self.mdiArea.activateNextSubWindow)
+ shortcut=Qt.QKeySequence.NextChild,
+ statusTip="Move the focus to the next window",
+ triggered=self.mdiArea.activateNextSubWindow)
self.previousAct = Qt.QAction("Pre&vious", self,
- shortcut=Qt.QKeySequence.PreviousChild,
- statusTip="Move the focus to the previous window",
- triggered=self.mdiArea.activatePreviousSubWindow)
+ shortcut=Qt.QKeySequence.PreviousChild,
+ statusTip="Move the focus to the previous window",
+ triggered=self.mdiArea.activatePreviousSubWindow)
self.separatorAct = Qt.QAction(self)
self.separatorAct.setSeparator(True)
self.aboutAct = Qt.QAction("&About", self,
- statusTip="Show the application's About box",
- triggered=self.about)
+ statusTip="Show the application's About box",
+ triggered=self.about)
self.aboutQtAct = Qt.QAction("About &Qt", self,
- statusTip="Show the Qt library's About box",
- triggered=Qt.qApp.aboutQt)
+ statusTip="Show the Qt library's About box",
+ triggered=Qt.qApp.aboutQt)
def createMenus(self):
self.fileMenu = self.menuBar().addMenu("&File")
@@ -395,7 +403,6 @@ class MAINWindow(Qt.QMainWindow):
def createStatusBar(self):
self.statusBar().showMessage("Ready")
-
def activeMdiChild(self):
activeSubWindow = self.mdiArea.activeSubWindow()
if activeSubWindow:
@@ -426,7 +433,7 @@ class MAINWindow(Qt.QMainWindow):
def about(self):
about_info = \
-'''Copyright 2012 Free Software Foundation, Inc.\n
+ '''Copyright 2012 Free Software Foundation, Inc.\n
This program is part of GNU Radio.\n
GNU Radio is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version.\n
GNU Radio is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n
@@ -441,13 +448,13 @@ class ConInfoDialog(Qt.QDialog):
self.gridLayout = Qt.QGridLayout(self)
-
self.host = Qt.QLineEdit(self)
self.port = Qt.QLineEdit(self)
self.host.setText("localhost")
self.port.setText("43243")
- self.buttonBox = Qt.QDialogButtonBox(Qt.QDialogButtonBox.Ok | Qt.QDialogButtonBox.Cancel)
+ self.buttonBox = Qt.QDialogButtonBox(
+ Qt.QDialogButtonBox.Ok | Qt.QDialogButtonBox.Cancel)
self.gridLayout.addWidget(self.host)
self.gridLayout.addWidget(self.port)
@@ -456,7 +463,6 @@ class ConInfoDialog(Qt.QDialog):
self.buttonBox.accepted.connect(self.accept)
self.buttonBox.rejected.connect(self.reject)
-
def accept(self):
self.done(1)
@@ -471,7 +477,7 @@ class UpdaterWindow(Qt.QDialog):
self.key = key
self.radio = radio
- self.resize(300,200)
+ self.resize(300, 200)
self.layout = Qt.QVBoxLayout()
self.props = radio.properties([key])[key]
@@ -487,7 +493,6 @@ class UpdaterWindow(Qt.QDialog):
except:
has_set = False
-
if(has_set is False):
self.cancelButton = Qt.QPushButton("Ok")
self.cancelButton.clicked.connect(self.reject)
@@ -496,7 +501,7 @@ class UpdaterWindow(Qt.QDialog):
self.buttonlayout.addWidget(self.cancelButton)
self.layout.addLayout(self.buttonlayout)
- else: # we have a set function
+ else: # we have a set function
self.textInput = Qt.QLineEdit()
self.layout.addWidget(self.textInput)
@@ -507,7 +512,7 @@ class UpdaterWindow(Qt.QDialog):
rv = radio.getKnobs([key])
val = rv[key].value
if(type(val) == ControlPort.complex):
- val = val.re + val.im*1j
+ val = val.re + val.im * 1j
self.textInput.setText(str(val))
self.sv = rv[key]
@@ -516,15 +521,18 @@ class UpdaterWindow(Qt.QDialog):
self.setButton.clicked.connect(self._set)
self.cancelButton.clicked.connect(self.reject)
- self.is_num = ((type(self.sv.value)==float) or (type(self.sv.value)==int))
+ self.is_num = ((type(self.sv.value) == float) or
+ (type(self.sv.value) == int))
if(self.is_num):
self.sliderlayout = Qt.QHBoxLayout()
self.slider = Qt.QSlider(QtCore.Qt.Horizontal)
- self.sliderlayout.addWidget(Qt.QLabel(str(self.props.min.value)))
+ self.sliderlayout.addWidget(
+ Qt.QLabel(str(self.props.min.value)))
self.sliderlayout.addWidget(self.slider)
- self.sliderlayout.addWidget(Qt.QLabel(str(self.props.max.value)))
+ self.sliderlayout.addWidget(
+ Qt.QLabel(str(self.props.max.value)))
self.steps = 10000
self.valspan = self.props.max.value - self.props.min.value
@@ -548,10 +556,12 @@ class UpdaterWindow(Qt.QDialog):
self.setLayout(self.layout)
def _set_slider_value(self, val):
- self.slider.setValue(self.steps*(val-self.props.min.value)/self.valspan)
+ self.slider.setValue(
+ self.steps * (val - self.props.min.value) / self.valspan)
def _slide(self):
- val = self.props.min.value + (self.slider.value()/float(self.steps)*self.valspan)
+ val = self.props.min.value + \
+ (self.slider.value() / float(self.steps) * self.valspan)
self.textInput.setText(str(val))
def _apply(self):
@@ -568,7 +578,8 @@ class UpdaterWindow(Qt.QDialog):
val.re = t.real
val.im = t.imag
else:
- sys.stderr.write("set type not supported! ({0})\n".format(type(self.sv.value)))
+ sys.stderr.write(
+ "set type not supported! ({0})\n".format(type(self.sv.value)))
return
self.sv.value = val
@@ -589,11 +600,13 @@ class MForm(Qt.QWidget):
st = time.time()
knobs = self.radioclient.getKnobs([])
ft = time.time()
- latency = ft-st
- self.parent.statusBar().showMessage("Current GNU Radio Control Port Query Latency: %f ms"%(latency*1000))
+ latency = ft - st
+ self.parent.statusBar().showMessage(
+ "Current GNU Radio Control Port Query Latency: %f ms" % (latency * 1000))
except Exception as e:
- sys.stderr.write("ctrlport-monitor: lost connection ({0}).\n".format(e))
+ sys.stderr.write(
+ "ctrlport-monitor: lost connection ({0}).\n".format(e))
if(type(self.parent) is MAINWindow):
# Find window of connection
remove = []
@@ -623,13 +636,12 @@ class MForm(Qt.QWidget):
tableitems = knobs.keys()
- #UPDATE TABLE:
+ # UPDATE TABLE:
self.table.updateItems(knobs, self.knobprops)
- #UPDATE PLOTS
+ # UPDATE PLOTS
self.parent.update(knobs, self.uid)
-
def __init__(self, radioclient, uid=0, updateRate=2000, parent=None):
super(MForm, self).__init__()
@@ -642,7 +654,8 @@ class MForm(Qt.QWidget):
port = str(askinfo.port.text())
try:
- self.radioclient = GNURadioControlPortClient(host, port, 'thrift').client
+ self.radioclient = GNURadioControlPortClient(
+ host, port, 'thrift').client
print("Connected to %s:%s" % (host, port))
except:
print("Cannot connect to %s:%s" % (host, port))
@@ -659,17 +672,19 @@ class MForm(Qt.QWidget):
self.knobprops = self.radioclient.properties([])
self.parent.knobprops.append(self.knobprops)
- self.resize(775,500)
+ self.resize(775, 500)
self.timer = QtCore.QTimer()
self.constupdatediv = 0
self.tableupdatediv = 0
- plotsize=250
+ plotsize = 250
# make table
self.table = GrDataPlotterValueTable(uid, self, 0, 0, 400, 200)
- sizePolicy = Qt.QSizePolicy(Qt.QSizePolicy.Preferred, Qt.QSizePolicy.Preferred)
+ sizePolicy = Qt.QSizePolicy(
+ Qt.QSizePolicy.Preferred, Qt.QSizePolicy.Preferred)
self.table.treeWidget.setSizePolicy(sizePolicy)
- self.table.treeWidget.setEditTriggers(Qt.QAbstractItemView.EditKeyPressed)
+ self.table.treeWidget.setEditTriggers(
+ Qt.QAbstractItemView.EditKeyPressed)
self.table.treeWidget.setSortingEnabled(True)
self.table.treeWidget.setDragEnabled(True)
@@ -721,24 +736,27 @@ def get_minmax(p):
if pmin == []:
pmin = None
else:
- pmin = 1.1*float(pmin)
+ pmin = 1.1 * float(pmin)
if pmax == []:
pmax = None
else:
- pmax = 1.1*float(pmax)
+ pmax = 1.1 * float(pmax)
return pmin, pmax
+
class MyApp(object):
def __init__(self, args):
parser = ArgumentParser(description="GNU Radio Control Port Monitor")
- parser.add_argument("host", nargs="?", default="localhost", help="host name or IP")
+ parser.add_argument("host", nargs="?",
+ default="localhost", help="host name or IP")
parser.add_argument("port", help="port")
args = parser.parse_args()
try:
- GNURadioControlPortClient(args.host, args.port, 'thrift', self.run, Qt.QApplication(sys.argv).exec_)
+ GNURadioControlPortClient(
+ args.host, args.port, 'thrift', self.run, Qt.QApplication(sys.argv).exec_)
except:
print("ControlPort failed to connect. Check the config of your endpoint.")
print("\t[ControlPort] on = True")
@@ -749,4 +767,5 @@ class MyApp(object):
def run(self, client):
MAINWindow(client).show()
+
MyApp(sys.argv)