summaryrefslogtreecommitdiff
path: root/gr-qtgui/apps/plot_time_raster_base.py
diff options
context:
space:
mode:
Diffstat (limited to 'gr-qtgui/apps/plot_time_raster_base.py')
-rw-r--r--gr-qtgui/apps/plot_time_raster_base.py183
1 files changed, 183 insertions, 0 deletions
diff --git a/gr-qtgui/apps/plot_time_raster_base.py b/gr-qtgui/apps/plot_time_raster_base.py
new file mode 100644
index 0000000000..ff3cc2869d
--- /dev/null
+++ b/gr-qtgui/apps/plot_time_raster_base.py
@@ -0,0 +1,183 @@
+#!/usr/bin/env python
+#
+# Copyright 2013 Free Software Foundation, Inc.
+#
+# This file is part of GNU Radio
+#
+# 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.
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+#
+
+from gnuradio import gr, blocks
+from gnuradio.eng_option import eng_option
+from optparse import OptionParser
+import os, sys
+
+try:
+ from gnuradio import qtgui
+ from PyQt4 import QtGui, QtCore
+ import sip
+except ImportError:
+ print "Error: Program requires PyQt4 and gr-qtgui."
+ sys.exit(1)
+
+try:
+ import scipy
+except ImportError:
+ print "Error: Scipy required (www.scipy.org)."
+ sys.exit(1)
+
+try:
+ from gnuradio.qtgui.plot_form import *
+ from gnuradio.qtgui.plot_base import *
+except ImportError:
+ from plot_form import *
+ from plot_base import *
+
+class plot_base(gr.top_block):
+ def __init__(self, filelist, samp_rate, start,
+ nsamples, max_nsamples,
+ auto_scale):
+ gr.top_block.__init__(self)
+
+ self._filelist = filelist
+ self._samp_rate = samp_rate
+ self._center_freq = 0
+ self._start = start
+ self._max_nsamps = max_nsamples
+ self._nsigs = len(self._filelist)
+ self._auto_scale = auto_scale
+ self._nsamps = nsamples
+ self._is_setup = False
+
+ self._y_min = -20
+ self._y_max = 20
+ self._y_range = 2
+ self._y_value = 1
+ self.gui_y_axis = None
+
+ self.qapp = QtGui.QApplication(sys.argv)
+
+ def setup(self):
+ self.skip = gr.skiphead(self.dsize, self._start)
+
+ n = 0
+ self.srcs = list()
+ self._data_min = sys.maxint
+ self._data_max = -sys.maxint - 1
+ for f in self._filelist:
+ data,_min,_max = self.read_samples(f, self._start, self._nsamps)
+ if(_min < self._data_min):
+ self._data_min = _min
+ if(_max > self._data_max):
+ self._data_max = _max
+
+ self.srcs.append(self.src_type(data))
+
+ # Set default labels based on file names
+ fname = f.split("/")[-1]
+ #self.gui_snk.set_line_label(n, "{0}".format(fname))
+ n += 1
+
+ self.connect(self.srcs[0], self.skip)
+ self.connect(self.skip, (self.gui_snk, 0))
+
+ for i,s in enumerate(self.srcs[1:]):
+ self.connect(s, (self.gui_snk, i+1))
+
+ self.gui_snk.set_update_time(0)
+ self.gui_snk.enable_menu(False)
+ self.auto_scale(self._auto_scale)
+
+ # Get Python Qt references
+ pyQt = self.gui_snk.pyqwidget()
+ self.pyWin = sip.wrapinstance(pyQt, QtGui.QWidget)
+
+ self._is_setup = True
+
+ def is_setup(self):
+ return self._is_setup
+
+ def set_y_axis(self, y_min, y_max):
+ if(not self._auto_scale):
+ self.gui_snk.set_intensity_range(y_min, y_max)
+ return y_min, y_max
+ else:
+ return None
+
+ def get_gui(self):
+ if(self.is_setup()):
+ return self.pyWin
+ else:
+ return None
+
+ def reset(self, newstart, newnsamps):
+ self.stop()
+ self.wait()
+
+ self._start = newstart
+
+ self._data_min = sys.maxint
+ self._data_max = -sys.maxint - 1
+ for s,f in zip(self.srcs, self._filelist):
+ data,_min,_max = self.read_samples(f, self._start, newnsamps)
+ if(_min < self._data_min):
+ self._data_min = _min
+ if(_max > self._data_max):
+ self._data_max = _max
+
+ s.set_data(data)
+ if(len(data) < newnsamps):
+ newnsamps = len(data)
+
+ self.auto_scale(self._auto_scale)
+ self._nsamps = newnsamps
+ self.start()
+
+ def auto_scale(self, state):
+ if(state > 0):
+ self.gui_snk.set_intensity_range(self._data_min, self._data_max)
+ self._auto_scale = True
+ self._y_value = self._data_max
+ self._y_range = self._data_max - self._data_min
+ self._y_min = 10*self._data_min
+ self._y_max = 10*self._data_max
+
+ if(self.gui_y_axis):
+ self.gui_y_axis(self._data_min, self._data_max)
+ else:
+ self._auto_scale = False
+
+def setup_options(desc):
+ parser = OptionParser(option_class=eng_option, description=desc,
+ conflict_handler="resolve")
+ parser.add_option("-N", "--nsamples", type="int", default=1000000,
+ help="Set the number of samples to display [default=%default]")
+ parser.add_option("-S", "--start", type="int", default=0,
+ help="Starting sample number [default=%default]")
+ parser.add_option("-C", "--ncols", type="int", default=100,
+ help="Number of columns [default=%default]")
+ parser.add_option("-R", "--nrows", type="int", default=100,
+ help="Number of rows [default=%default]")
+ parser.add_option("-r", "--sample-rate", type="eng_float", default=1.0,
+ help="Set the sample rate of the signal [default=%default]")
+ parser.add_option("", "--no-auto-scale", action="store_true", default=False,
+ help="Do not auto-scale the plot [default=%default]")
+ (options,args) = parser.parse_args()
+ if(len(args) < 1):
+ parser.print_help()
+ sys.exit(0)
+ return (options,args)
+