diff options
Diffstat (limited to 'gr-zeromq/examples/python/gui.py')
-rwxr-xr-x | gr-zeromq/examples/python/gui.py | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/gr-zeromq/examples/python/gui.py b/gr-zeromq/examples/python/gui.py new file mode 100755 index 0000000000..91223dd734 --- /dev/null +++ b/gr-zeromq/examples/python/gui.py @@ -0,0 +1,164 @@ +# +# Copyright 2013 Free Software Foundation, Inc. +# +# This file is part of GNU Radio. +# +# This 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. +# +# This software 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. +# +# You should have received a copy of the GNU General Public License +# along with this software; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +############################################################################### +# Imports +############################################################################### +from optparse import OptionParser +from gnuradio.eng_option import eng_option +import gui +import sys +import os +from PyQt4 import Qt, QtGui, QtCore, uic +import PyQt4.Qwt5 as Qwt +from gnuradio import zeromq +import signal + +class gui(QtGui.QMainWindow): + def __init__(self, window_name, options, parent=None): + QtGui.QMainWindow.__init__(self, parent) + + # give Ctrl+C back to system + signal.signal(signal.SIGINT, signal.SIG_DFL) + + self.gui = uic.loadUi(os.path.join(os.path.dirname(__file__),'main_window.ui'), self) + + self.update_timer = Qt.QTimer() + + # socket addresses + rpc_adr_server = "tcp://"+options.servername+":6666" + rpc_adr_client = "tcp://"+options.clientname+":6667" + probe_adr_server = "tcp://"+options.servername+":5556" + probe_adr_client = "tcp://"+options.clientname+":5557" + + # ZeroMQ + self.probe_manager = zeromq.probe_manager() + self.probe_manager.add_socket(probe_adr_server, 'float32', self.plot_data_server) + self.probe_manager.add_socket(probe_adr_client, 'float32', self.plot_data_client) + + self.rpc_mgr_server = zeromq.rpc_manager() + self.rpc_mgr_server.set_request_socket(rpc_adr_server) + self.rpc_mgr_client = zeromq.rpc_manager() + self.rpc_mgr_client.set_request_socket(rpc_adr_client) + + self.gui.setWindowTitle(window_name) + self.gui.qwtPlotServer.setTitle("Signal Scope") + self.gui.qwtPlotServer.setAxisTitle(Qwt.QwtPlot.xBottom, "Samples") + self.gui.qwtPlotServer.setAxisTitle(Qwt.QwtPlot.yLeft, "Amplitude") + self.gui.qwtPlotServer.setAxisScale(Qwt.QwtPlot.xBottom, 0, 100) + self.gui.qwtPlotServer.setAxisScale(Qwt.QwtPlot.yLeft, -2, 2) + self.gui.qwtPlotClient.setTitle("Signal Scope") + self.gui.qwtPlotClient.setAxisTitle(Qwt.QwtPlot.xBottom, "Samples") + self.gui.qwtPlotClient.setAxisTitle(Qwt.QwtPlot.yLeft, "Amplitude") + self.gui.qwtPlotClient.setAxisScale(Qwt.QwtPlot.xBottom, 0, 100) + self.gui.qwtPlotClient.setAxisScale(Qwt.QwtPlot.yLeft, -2, 2) + + # Grid + pen = Qt.QPen(Qt.Qt.DotLine) + pen.setColor(Qt.Qt.black) + pen.setWidth(0) + grid_server = Qwt.QwtPlotGrid() + grid_client = Qwt.QwtPlotGrid() + grid_server.setPen(pen) + grid_client.setPen(pen) + grid_server.attach(self.gui.qwtPlotServer) + grid_client.attach(self.gui.qwtPlotClient) + + #Signals + self.connect(self.update_timer, QtCore.SIGNAL("timeout()"), self.probe_manager.watcher) + self.connect(self.gui.pushButtonRunServer, QtCore.SIGNAL("clicked()"), self.start_fg_server) + self.connect(self.gui.pushButtonStopServer, QtCore.SIGNAL("clicked()"), self.stop_fg_server) + self.connect(self.gui.pushButtonRunClient, QtCore.SIGNAL("clicked()"), self.start_fg_client) + self.connect(self.gui.pushButtonStopClient, QtCore.SIGNAL("clicked()"), self.stop_fg_client) + self.connect(self.gui.comboBox, QtCore.SIGNAL("currentIndexChanged(QString)"), self.set_waveform) + self.connect(self.gui.spinBox, QtCore.SIGNAL("valueChanged(int)"), self.set_gain) + self.shortcut_start = QtGui.QShortcut(Qt.QKeySequence("Ctrl+S"), self.gui) + self.shortcut_stop = QtGui.QShortcut(Qt.QKeySequence("Ctrl+C"), self.gui) + self.shortcut_exit = QtGui.QShortcut(Qt.QKeySequence("Ctrl+D"), self.gui) + self.connect(self.shortcut_exit, QtCore.SIGNAL("activated()"), self.gui.close) + + # start update timer + self.update_timer.start(30) + + def start_fg_server(self): + self.rpc_mgr_server.request("start_fg") + + def stop_fg_server(self): + self.rpc_mgr_server.request("stop_fg") + + def start_fg_client(self): + self.rpc_mgr_client.request("start_fg") + + def stop_fg_client(self): + self.rpc_mgr_client.request("stop_fg") + + # plot the data from the queues + def plot_data(self, plot, samples): + self.x = range(0,len(samples),1) + self.y = samples + # clear the previous points from the plot + plot.clear() + # draw curve with new points and plot + curve = Qwt.QwtPlotCurve() + curve.setPen(Qt.QPen(Qt.Qt.blue, 2)) + curve.attach(plot) + curve.setData(self.x, self.y) + plot.replot() + + def plot_data_server(self, samples): + self.plot_data(self.gui.qwtPlotServer, samples) + + def plot_data_client(self, samples): + self.plot_data(self.gui.qwtPlotClient, samples) + + def set_waveform(self, waveform_str): + self.rpc_mgr_server.request("set_waveform",str(waveform_str)) + + def set_gain(self, gain): + self.rpc_set_gain(gain) + + def rpc_set_gain(self, gain): + self.rpc_mgr_server.request("set_k",gain) + +############################################################################### +# Options Parser +############################################################################### +def parse_options(): + """ Options parser. """ + parser = OptionParser(option_class=eng_option, usage="%prog: [options]") + parser.add_option("-s", "--servername", type="string", default="localhost", + help="Server hostname") + parser.add_option("-c", "--clientname", type="string", default="localhost", + help="Server hostname") + (options, args) = parser.parse_args() + return options + + +############################################################################### +# Main +############################################################################### +if __name__ == "__main__": + options = parse_options() + qapp = Qt.QApplication(sys.argv) + qapp.main_window = gui("Remote GNU Radio GUI",options) + qapp.main_window.show() + qapp.exec_() + |