diff options
Diffstat (limited to 'gr-qtgui/apps/plot_time_raster_base.py')
-rw-r--r-- | gr-qtgui/apps/plot_time_raster_base.py | 183 |
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) + |