From ddb4c1d744b417e79cf2d263d6cd8db37c4dbcb2 Mon Sep 17 00:00:00 2001
From: Johnathan Corgan <johnathan@corganlabs.com>
Date: Tue, 6 May 2014 13:40:15 -0700
Subject: zeromq: cleanup docs and examples

---
 gr-zeromq/examples/python/gui.py | 164 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 164 insertions(+)
 create mode 100755 gr-zeromq/examples/python/gui.py

(limited to 'gr-zeromq/examples/python/gui.py')

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_()
+
-- 
cgit v1.2.3