diff options
author | Tom Rondeau <trondeau@vt.edu> | 2013-02-20 21:30:02 -0500 |
---|---|---|
committer | Tom Rondeau <trondeau@vt.edu> | 2013-02-21 11:57:13 -0500 |
commit | 18b20e591ffb20951605dfc4b7cbe5964b5159fa (patch) | |
tree | c5ecd53f2211e163500a7e129ce74f3f82193d28 | |
parent | 9c27fc06bd0b473de50e76b845e25b835e26b6ff (diff) |
qtgui: adding time raster static plot tool.
-rw-r--r-- | gr-qtgui/apps/CMakeLists.txt | 3 | ||||
-rwxr-xr-x | gr-qtgui/apps/gr_time_raster_b | 78 | ||||
-rw-r--r-- | gr-qtgui/apps/plot_base.py | 2 | ||||
-rw-r--r-- | gr-qtgui/apps/plot_form.py | 66 | ||||
-rw-r--r-- | gr-qtgui/apps/plot_time_raster_base.py | 183 | ||||
-rw-r--r-- | gr-qtgui/apps/plot_time_raster_form.py | 157 | ||||
-rw-r--r-- | gr-qtgui/include/qtgui/time_raster_sink_b.h | 15 | ||||
-rw-r--r-- | gr-qtgui/include/qtgui/time_raster_sink_f.h | 15 | ||||
-rw-r--r-- | gr-qtgui/lib/TimeRasterDisplayPlot.cc | 30 | ||||
-rw-r--r-- | gr-qtgui/lib/TimeRasterDisplayPlot.h | 5 | ||||
-rw-r--r-- | gr-qtgui/lib/time_raster_sink_b_impl.cc | 85 | ||||
-rw-r--r-- | gr-qtgui/lib/time_raster_sink_b_impl.h | 15 | ||||
-rw-r--r-- | gr-qtgui/lib/time_raster_sink_f_impl.cc | 85 | ||||
-rw-r--r-- | gr-qtgui/lib/time_raster_sink_f_impl.h | 15 | ||||
-rw-r--r-- | gr-qtgui/lib/timerasterdisplayform.cc | 41 | ||||
-rw-r--r-- | gr-qtgui/lib/timerasterdisplayform.h | 10 |
16 files changed, 774 insertions, 31 deletions
diff --git a/gr-qtgui/apps/CMakeLists.txt b/gr-qtgui/apps/CMakeLists.txt index dcce338779..591584082e 100644 --- a/gr-qtgui/apps/CMakeLists.txt +++ b/gr-qtgui/apps/CMakeLists.txt @@ -25,11 +25,13 @@ GR_PYTHON_INSTALL( plot_psd_base.py plot_spectrogram_base.py plot_time_base.py + plot_time_raster_base.py plot_form.py plot_constellation_form.py plot_psd_form.py plot_spectrogram_form.py plot_time_form.py + plot_time_raster_form.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/qtgui COMPONENT "qtgui_python" ) @@ -41,6 +43,7 @@ GR_PYTHON_INSTALL( gr_time_plot_i gr_time_plot_s gr_time_plot_b + gr_time_raster_b gr_psd_plot_c gr_psd_plot_f gr_psd_plot_i diff --git a/gr-qtgui/apps/gr_time_raster_b b/gr-qtgui/apps/gr_time_raster_b new file mode 100755 index 0000000000..a326a126c4 --- /dev/null +++ b/gr-qtgui/apps/gr_time_raster_b @@ -0,0 +1,78 @@ +#!/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 +import scipy + +try: + import gnuradio.qtgui.plot_time_raster_base as plot_base +except ImportError: + import plot_time_raster_base as plot_base + +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) + +class plot_time_raster_b(plot_base.plot_base): + def __init__(self, filelist, samp_rate, + start, nsamples, max_nsamples, + nrows, ncols, + auto_scale): + plot_base.plot_base.__init__(self, filelist, samp_rate, + start, nsamples, max_nsamples, + auto_scale) + self._nrows = nrows + self._ncols = ncols + self.read_samples = plot_base.read_samples_b + self.dsize = gr.sizeof_char + self.src_type = gr.vector_source_b + self.gui_snk = qtgui.time_raster_sink_b(self._samp_rate, self._nrows, self._ncols, + [], [], "GNU Radio Time Plot", self._nsigs) + self.setup() + +def main(): + description = "Plots a list of files on a scope plot. Files are a binary list of chars." + (options, args) = plot_base.setup_options(description) + + filelist = list(args) + max_nsamples = plot_base.find_max_nsamples(filelist) + + tb = plot_time_raster_b(filelist, options.sample_rate, + options.start, options.nsamples, max_nsamples, + options.nrows, options.ncols, + not options.no_auto_scale) + + main_box = plot_base.plot_time_raster_form(tb, 'GNU Radio Time Plot') + main_box.show() + + tb.run() + tb.qapp.exec_() + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + pass diff --git a/gr-qtgui/apps/plot_base.py b/gr-qtgui/apps/plot_base.py index 5a784b2dfd..0990a309b7 100644 --- a/gr-qtgui/apps/plot_base.py +++ b/gr-qtgui/apps/plot_base.py @@ -44,11 +44,13 @@ try: from gnuradio.qtgui.plot_psd_form import * from gnuradio.qtgui.plot_spectrogram_form import * from gnuradio.qtgui.plot_time_form import * + from gnuradio.qtgui.plot_time_raster_form import * except ImportError: from plot_constellation_form import * from plot_psd_form import * from plot_spectrogram_form import * from plot_time_form import * + from plot_time_raster_form import * def read_samples(filename, start, in_size, min_size, dtype, dtype_size): # Read in_size number of samples from file diff --git a/gr-qtgui/apps/plot_form.py b/gr-qtgui/apps/plot_form.py index 87c3da416f..6a5d2266ed 100644 --- a/gr-qtgui/apps/plot_form.py +++ b/gr-qtgui/apps/plot_form.py @@ -37,6 +37,7 @@ class plot_form(QtGui.QWidget): self._end = 0 self._y_min = 0 self._y_max = 0 + self._pos_scale = 1 self.top_block = top_block self.top_block.gui_y_axis = self.gui_y_axis @@ -101,12 +102,7 @@ class plot_form(QtGui.QWidget): self.layout.addWidget(self.posbar, 2,2,1,1) # Create Edit boxes for Y-axis min/max - self.y_range_val = QtGui.QDoubleValidator(top_block._y_min, - top_block._y_max, - 4, self) - self.y_max_edit = QtGui.QLineEdit(self) - self.y_max_edit.setValidator(self.y_range_val) self.y_max_edit.setMinimumWidth(100) self.y_max_edit.setMaximumWidth(100) self.left_col_form.addRow("Y Max:", self.y_max_edit) @@ -114,7 +110,6 @@ class plot_form(QtGui.QWidget): self.update_yaxis_pos) self.y_min_edit = QtGui.QLineEdit(self) - self.y_min_edit.setValidator(self.y_range_val) self.y_min_edit.setMinimumWidth(100) self.y_min_edit.setMaximumWidth(100) self.left_col_form.addRow("Y Min:", self.y_min_edit) @@ -126,23 +121,23 @@ class plot_form(QtGui.QWidget): self.set_grid_check) self.left_col_form.addWidget(self.grid_check) - self.gui_y_axis(top_block._y_value-top_block._y_range, top_block._y_value) - # Create a slider to move the plot's y-axis offset _ymax = numpy.int32(min(numpy.iinfo(numpy.int32).max, self.top_block._y_max)) _ymin = numpy.int32(max(numpy.iinfo(numpy.int32).min, self.top_block._y_min)) _yrng = numpy.int32(min(numpy.iinfo(numpy.int32).max, self.top_block._y_range)) _yval = numpy.int32(min(numpy.iinfo(numpy.int32).max, self.top_block._y_value)) self.ybar = QtGui.QSlider(QtCore.Qt.Vertical, self) - self.ybar.setMinimum(1000*_ymin) - self.ybar.setMaximum(1000*_ymax) - self.ybar.setSingleStep(1000*(_yrng/10)) - self.ybar.setPageStep(1000*(_yrng/2)) - self.ybar.setValue(1000*_yval) + self.ybar.setMinimum(self._pos_scale*_ymin) + self.ybar.setMaximum(self._pos_scale*_ymax) + self.ybar.setSingleStep(self._pos_scale*(_yrng/10)) + self.ybar.setPageStep(self._pos_scale*(_yrng/2)) + self.ybar.setValue(self._pos_scale*_yval) self.connect(self.ybar, QtCore.SIGNAL("valueChanged(int)"), self.update_yaxis_slider) self.layout.addWidget(self.ybar, 1,1,1,1) + self.gui_y_axis(top_block._y_value-top_block._y_range, top_block._y_value) + # Create an edit box for the Sample Rate sr = top_block._samp_rate self.samp_rate_edit = QtGui.QLineEdit(self) @@ -321,7 +316,7 @@ class plot_form(QtGui.QWidget): self.posbar.setValue(self._start) def update_xaxis_slider(self, value): - self._start = value + self._start = value/self._pos_scale self._end = value + self.posbar.pageStep() self.start_edit.setText("{0}".format(self._start)) @@ -331,24 +326,34 @@ class plot_form(QtGui.QWidget): self.top_block.reset(self._start, self.posbar.pageStep()) def update_yaxis_pos(self): - newmin = self.y_min_edit.text().toDouble()[0] - newmax = self.y_max_edit.text().toDouble()[0] - if(newmin != self._y_min or newmax != self._y_max): - self._y_min = newmin - self._y_max = newmax - self.top_block._y_range = newmax - newmin - self.ybar.setValue(self._y_max) - self.top_block.set_y_axis(self._y_min, self._y_max) + if(not self.top_block._auto_scale): + newmin = self.y_min_edit.text().toDouble()[0] + newmax = self.y_max_edit.text().toDouble()[0] + if(newmin != self._y_min or newmax != self._y_max): + self._y_min = newmin + self._y_max = newmax + self.top_block._y_range = newmax - newmin + self.top_block.set_y_axis(self._y_min, self._y_max) + self.ybar.setValue(self._y_max) + else: + self.y_min_edit.setText("{0:.4f}".format(self._y_min)) + self.y_max_edit.setText("{0:.4f}".format(self._y_max)) def update_yaxis_slider(self, value): - value = value/1000.0 - self.top_block._y_value = value - self._y_min = value - self.top_block._y_range - self._y_max = value - - self._y_min, self._y_max = self.top_block.set_y_axis(self._y_min, self._y_max) + if(not self.top_block._auto_scale): + value = value/self._pos_scale + self.top_block._y_value = value + self._y_min = value - self.top_block._y_range + self._y_max = value + + ret = self.top_block.set_y_axis(self._y_min, self._y_max) + if(ret): + self._y_min = ret[0] + self._y_max = ret[1] - self.gui_y_axis(self._y_min, self._y_max) + self.gui_y_axis(self._y_min, self._y_max) + else: + self.ybar.setValue(self._y_max) def update_samp_rate(self): sr = self.samp_rate_edit.text().toDouble()[0] @@ -360,6 +365,9 @@ class plot_form(QtGui.QWidget): def gui_y_axis(self, ymin, ymax): self.y_min_edit.setText("{0:.4f}".format(ymin)) self.y_max_edit.setText("{0:.4f}".format(ymax)) + self._y_min = ymin + self._y_max = ymax + self.ybar.setValue(ymax) def set_grid_check(self, state): if(state): 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) + diff --git a/gr-qtgui/apps/plot_time_raster_form.py b/gr-qtgui/apps/plot_time_raster_form.py new file mode 100644 index 0000000000..77a158332d --- /dev/null +++ b/gr-qtgui/apps/plot_time_raster_form.py @@ -0,0 +1,157 @@ +#!/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. +# + +import sys, math +from gnuradio import filter + +try: + from PyQt4 import QtGui, QtCore + import sip +except ImportError: + print "Error: Program requires PyQt4." + sys.exit(1) + +try: + from gnuradio.qtgui.plot_from import plot_form +except ImportError: + from plot_form import plot_form + +class plot_time_raster_form(plot_form): + def __init__(self, top_block, title=''): + plot_form.__init__(self, top_block, title) + + self.right_col_layout = QtGui.QVBoxLayout() + self.right_col_form = QtGui.QFormLayout() + self.right_col_layout.addLayout(self.right_col_form) + self.layout.addLayout(self.right_col_layout, 1,4,1,1) + + self.auto_scale = QtGui.QCheckBox("Auto Scale", self) + if(self.top_block._auto_scale): + self.auto_scale.setChecked(self.top_block._auto_scale) + self.connect(self.auto_scale, QtCore.SIGNAL("stateChanged(int)"), + self.set_auto_scale) + self.right_col_layout.addWidget(self.auto_scale) + + self.ncols_edit = QtGui.QLineEdit(self) + self.ncols_edit.setMinimumWidth(100) + self.ncols_edit.setMaximumWidth(100) + self.ncols_edit.setText(QtCore.QString("%1").arg(top_block._ncols)) + self.right_col_form.addRow("Num. Cols.", self.ncols_edit) + self.connect(self.ncols_edit, QtCore.SIGNAL("returnPressed()"), + self.ncols_update) + + self.nrows_edit = QtGui.QLineEdit(self) + self.nrows_edit.setMinimumWidth(100) + self.nrows_edit.setMaximumWidth(100) + self.nrows_edit.setText(QtCore.QString("%1").arg(top_block._nrows)) + self.right_col_form.addRow("Num. Rows.", self.nrows_edit) + self.connect(self.nrows_edit, QtCore.SIGNAL("returnPressed()"), + self.nrows_update) + + + self.add_raster_control(self.right_col_layout) + + def add_raster_control(self, layout): + self._line_tabs = QtGui.QTabWidget() + + self._line_pages = [] + self._line_forms = [] + self._label_edit = [] + self._size_edit = [] + self._color_edit = [] + self._style_edit = [] + self._marker_edit = [] + self._alpha_edit = [] + for n in xrange(self.top_block._nsigs): + self._line_pages.append(QtGui.QDialog()) + self._line_forms.append(QtGui.QFormLayout(self._line_pages[-1])) + + label = self.top_block.gui_snk.line_label(n) + self._label_edit.append(QtGui.QLineEdit(self)) + self._label_edit[-1].setMinimumWidth(125) + self._label_edit[-1].setMaximumWidth(125) + self._label_edit[-1].setText(QtCore.QString("%1").arg(label)) + self._line_forms[-1].addRow("Label:", self._label_edit[-1]) + self.connect(self._label_edit[-1], QtCore.SIGNAL("returnPressed()"), + self.update_line_label) + + self._qtcolormaps = ["Multi Color", "White Hot", + "Black Hot", "Incandescent"] + self._color_edit.append(QtGui.QComboBox(self)) + self._color_edit[-1].addItems(self._qtcolormaps) + self._color_edit[-1].setCurrentIndex(1) + self._line_forms[-1].addRow("Color Map:", self._color_edit[-1]) + self.connect(self._color_edit[-1], + QtCore.SIGNAL("currentIndexChanged(int)"), + self.update_color_map) + + alpha_val = QtGui.QDoubleValidator(0, 1.0, 2, self) + alpha_val.setTop(1.0) + alpha = self.top_block.gui_snk.line_alpha(n) + self._alpha_edit.append(QtGui.QLineEdit(self)) + self._alpha_edit[-1].setMinimumWidth(50) + self._alpha_edit[-1].setMaximumWidth(100) + self._alpha_edit[-1].setText(QtCore.QString("%1").arg(alpha)) + self._alpha_edit[-1].setValidator(alpha_val) + self._line_forms[-1].addRow("Alpha:", self._alpha_edit[-1]) + self.connect(self._alpha_edit[-1], QtCore.SIGNAL("returnPressed()"), + self.update_line_alpha) + + self._line_tabs.addTab(self._line_pages[-1], "{0}".format(label)) + + layout.addWidget(self._line_tabs) + + def update_color_map(self, c_index): + index = self._line_tabs.currentIndex() + self.top_block.gui_snk.set_color_map(index, c_index) + self.update_line_alpha() + + def set_auto_scale(self, state): + if(state): + self.top_block.auto_scale(True) + else: + self.top_block.auto_scale(False) + + def update_samp_rate(self): + sr = self.samp_rate_edit.text().toDouble()[0] + self.top_block.gui_snk.set_samp_rate(sr) + + nsamps = int(math.ceil((self.top_block._nrows+1)*self.top_block._ncols)) + self.top_block.reset(self._start, nsamps) + + def ncols_update(self): + n = self.ncols_edit.text().toDouble()[0] + self.top_block.gui_snk.set_num_cols(n) + self.top_block._ncols = n + + nsamps = int(math.ceil((self.top_block._nrows+1)*n)) + self.top_block.reset(self._start, nsamps) + + def nrows_update(self): + n = self.nrows_edit.text().toInt()[0] + self.top_block.gui_snk.set_num_rows(n) + self.top_block._nrows = n + + nsamps = int(math.ceil(self.top_block._ncols*(n+1))) + self.top_block.reset(self._start, nsamps) + + diff --git a/gr-qtgui/include/qtgui/time_raster_sink_b.h b/gr-qtgui/include/qtgui/time_raster_sink_b.h index 1b65646b81..1f2a2b09e8 100644 --- a/gr-qtgui/include/qtgui/time_raster_sink_b.h +++ b/gr-qtgui/include/qtgui/time_raster_sink_b.h @@ -80,9 +80,21 @@ namespace gr { virtual void set_line_width(int width) = 0; virtual void set_line_style(Qt::PenStyle style) = 0; virtual void set_line_marker(QwtSymbol::Style marker) = 0; + virtual void set_line_alpha(int which, double alpha) = 0; + virtual void set_color_map(int which, const int color) = 0; + + virtual std::string title() = 0; + virtual std::string line_label(int which) = 0; + virtual std::string line_color(int which) = 0; + virtual int line_width(int which) = 0; + virtual int line_style(int which) = 0; + virtual int line_marker(int which) = 0; + virtual double line_alpha(int which) = 0; + virtual int color_map(int which) = 0; virtual void set_size(int width, int height) = 0; + virtual void set_samp_rate(const double samp_rate) = 0; virtual void set_num_rows(double rows) = 0; virtual void set_num_cols(double cols) = 0; @@ -94,6 +106,9 @@ namespace gr { virtual void set_intensity_range(float min, float max) = 0; + virtual void enable_menu(bool en) = 0; + virtual void enable_grid(bool en) = 0; + virtual void enable_autoscale(bool en) = 0; virtual void reset() = 0; QApplication *d_qApplication; diff --git a/gr-qtgui/include/qtgui/time_raster_sink_f.h b/gr-qtgui/include/qtgui/time_raster_sink_f.h index 1ae4d79bda..c845dbfa7d 100644 --- a/gr-qtgui/include/qtgui/time_raster_sink_f.h +++ b/gr-qtgui/include/qtgui/time_raster_sink_f.h @@ -77,9 +77,21 @@ namespace gr { virtual void set_line_width(int width) = 0; virtual void set_line_style(Qt::PenStyle style) = 0; virtual void set_line_marker(QwtSymbol::Style marker) = 0; + virtual void set_line_alpha(int which, double alpha) = 0; + virtual void set_color_map(int which, const int color) = 0; + + virtual std::string title() = 0; + virtual std::string line_label(int which) = 0; + virtual std::string line_color(int which) = 0; + virtual int line_width(int which) = 0; + virtual int line_style(int which) = 0; + virtual int line_marker(int which) = 0; + virtual double line_alpha(int which) = 0; + virtual int color_map(int which) = 0; virtual void set_size(int width, int height) = 0; + virtual void set_samp_rate(const double samp_rate) = 0; virtual void set_num_rows(double rows) = 0; virtual void set_num_cols(double cols) = 0; @@ -91,6 +103,9 @@ namespace gr { virtual void set_intensity_range(float min, float max) = 0; + virtual void enable_menu(bool en) = 0; + virtual void enable_grid(bool en) = 0; + virtual void enable_autoscale(bool en) = 0; virtual void reset() = 0; QApplication *d_qApplication; diff --git a/gr-qtgui/lib/TimeRasterDisplayPlot.cc b/gr-qtgui/lib/TimeRasterDisplayPlot.cc index 537a7e4ef7..48fb7f7b4a 100644 --- a/gr-qtgui/lib/TimeRasterDisplayPlot.cc +++ b/gr-qtgui/lib/TimeRasterDisplayPlot.cc @@ -336,6 +336,12 @@ TimeRasterDisplayPlot::numCols() const return d_cols; } +int +TimeRasterDisplayPlot::getAlpha(int which) +{ + return d_raster[which]->alpha(); +} + void TimeRasterDisplayPlot::setPlotDimensions(const double rows, const double cols, const double units, const std::string &strunits) @@ -398,6 +404,30 @@ TimeRasterDisplayPlot::setIntensityRange(const double minIntensity, } } +double +TimeRasterDisplayPlot::getMinIntensity(int which) const +{ +#if QWT_VERSION < 0x060000 + QwtDoubleInterval r = d_data[which]->range(); +#else + QwtInterval r = d_data[which]->interval(Qt::ZAxis); +#endif + + return r.minValue(); +} + +double +TimeRasterDisplayPlot::getMaxIntensity(int which) const +{ +#if QWT_VERSION < 0x060000 + QwtDoubleInterval r = d_data[which]->range(); +#else + QwtInterval r = d_data[which]->interval(Qt::ZAxis); +#endif + + return r.maxValue(); +} + void TimeRasterDisplayPlot::replot() { diff --git a/gr-qtgui/lib/TimeRasterDisplayPlot.h b/gr-qtgui/lib/TimeRasterDisplayPlot.h index fca9672b91..e4e292a54d 100644 --- a/gr-qtgui/lib/TimeRasterDisplayPlot.h +++ b/gr-qtgui/lib/TimeRasterDisplayPlot.h @@ -59,6 +59,8 @@ public: double numRows() const; double numCols() const; + int getAlpha(int which); + void setPlotDimensions(const double rows, const double cols, const double units, const std::string &strunits); @@ -78,6 +80,9 @@ public: const QColor getUserDefinedLowIntensityColor() const; const QColor getUserDefinedHighIntensityColor() const; + double getMinIntensity(int which) const; + double getMaxIntensity(int which) const; + signals: void updatedLowerIntensityLevel(const double); void updatedUpperIntensityLevel(const double); diff --git a/gr-qtgui/lib/time_raster_sink_b_impl.cc b/gr-qtgui/lib/time_raster_sink_b_impl.cc index e79b2f1ff4..11821a462c 100644 --- a/gr-qtgui/lib/time_raster_sink_b_impl.cc +++ b/gr-qtgui/lib/time_raster_sink_b_impl.cc @@ -193,12 +193,31 @@ namespace gr { } void + time_raster_sink_b_impl::set_color_map(int which, const int color) + { + d_main_gui->setColorMap(which, color); + } + + void + time_raster_sink_b_impl::set_line_alpha(int which, double alpha) + { + d_main_gui->setAlpha(which, (int)(255.0*alpha)); + } + + void time_raster_sink_b_impl::set_size(int width, int height) { d_main_gui->resize(QSize(width, height)); } void + time_raster_sink_b_impl::set_samp_rate(const double samp_rate) + { + d_samp_rate = samp_rate; + d_main_gui->setSampleRate(d_samp_rate); + } + + void time_raster_sink_b_impl::set_num_rows(double rows) { d_main_gui->setNumRows(rows); @@ -210,6 +229,54 @@ namespace gr { d_main_gui->setNumCols(cols); } + std::string + time_raster_sink_b_impl::title() + { + return d_main_gui->title().toStdString(); + } + + std::string + time_raster_sink_b_impl::line_label(int which) + { + return d_main_gui->lineLabel(which).toStdString(); + } + + std::string + time_raster_sink_b_impl::line_color(int which) + { + return d_main_gui->lineColor(which).toStdString(); + } + + int + time_raster_sink_b_impl::line_width(int which) + { + return d_main_gui->lineWidth(which); + } + + int + time_raster_sink_b_impl::line_style(int which) + { + return d_main_gui->lineStyle(which); + } + + int + time_raster_sink_b_impl::line_marker(int which) + { + return d_main_gui->lineMarker(which); + } + + int + time_raster_sink_b_impl::color_map(int which) + { + return d_main_gui->getColorMap(which); + } + + double + time_raster_sink_b_impl::line_alpha(int which) + { + return (double)(d_main_gui->markerAlpha(which))/255.0; + } + double time_raster_sink_b_impl::num_rows() { @@ -265,6 +332,24 @@ namespace gr { } void + time_raster_sink_b_impl::enable_menu(bool en) + { + d_main_gui->enableMenu(en); + } + + void + time_raster_sink_b_impl::enable_grid(bool en) + { + d_main_gui->setGrid(en); + } + + void + time_raster_sink_b_impl::enable_autoscale(bool en) + { + d_main_gui->autoScale(en); + } + + void time_raster_sink_b_impl::reset() { d_index = 0; diff --git a/gr-qtgui/lib/time_raster_sink_b_impl.h b/gr-qtgui/lib/time_raster_sink_b_impl.h index 1997bacd93..46f5300cc7 100644 --- a/gr-qtgui/lib/time_raster_sink_b_impl.h +++ b/gr-qtgui/lib/time_raster_sink_b_impl.h @@ -82,9 +82,21 @@ namespace gr { void set_line_width(int width); void set_line_style(Qt::PenStyle style); void set_line_marker(QwtSymbol::Style marker); + void set_line_alpha(int which, double alpha); + void set_color_map(int which, const int color); + + std::string title(); + std::string line_label(int which); + std::string line_color(int which); + int line_width(int which); + int line_style(int which); + int line_marker(int which); + double line_alpha(int which); + int color_map(int which); void set_size(int width, int height); + void set_samp_rate(const double samp_rate); void set_num_rows(double rows); void set_num_cols(double cols); @@ -96,6 +108,9 @@ namespace gr { void set_intensity_range(float min, float max); + void enable_menu(bool en); + void enable_grid(bool en); + void enable_autoscale(bool en); void reset(); int work(int noutput_items, diff --git a/gr-qtgui/lib/time_raster_sink_f_impl.cc b/gr-qtgui/lib/time_raster_sink_f_impl.cc index 61d1436529..5def19f406 100644 --- a/gr-qtgui/lib/time_raster_sink_f_impl.cc +++ b/gr-qtgui/lib/time_raster_sink_f_impl.cc @@ -191,12 +191,31 @@ namespace gr { } void + time_raster_sink_f_impl::set_color_map(int which, const int color) + { + d_main_gui->setColorMap(which, color); + } + + void + time_raster_sink_f_impl::set_line_alpha(int which, double alpha) + { + d_main_gui->setAlpha(which, (int)(255.0*alpha)); + } + + void time_raster_sink_f_impl::set_size(int width, int height) { d_main_gui->resize(QSize(width, height)); } void + time_raster_sink_f_impl::set_samp_rate(const double samp_rate) + { + d_samp_rate = samp_rate; + d_main_gui->setSampleRate(d_samp_rate); + } + + void time_raster_sink_f_impl::set_num_rows(double rows) { d_main_gui->setNumRows(rows); @@ -208,6 +227,54 @@ namespace gr { d_main_gui->setNumCols(cols); } + std::string + time_raster_sink_f_impl::title() + { + return d_main_gui->title().toStdString(); + } + + std::string + time_raster_sink_f_impl::line_label(int which) + { + return d_main_gui->lineLabel(which).toStdString(); + } + + std::string + time_raster_sink_f_impl::line_color(int which) + { + return d_main_gui->lineColor(which).toStdString(); + } + + int + time_raster_sink_f_impl::line_width(int which) + { + return d_main_gui->lineWidth(which); + } + + int + time_raster_sink_f_impl::line_style(int which) + { + return d_main_gui->lineStyle(which); + } + + int + time_raster_sink_f_impl::line_marker(int which) + { + return d_main_gui->lineMarker(which); + } + + int + time_raster_sink_f_impl::color_map(int which) + { + return d_main_gui->getColorMap(which); + } + + double + time_raster_sink_f_impl::line_alpha(int which) + { + return (double)(d_main_gui->markerAlpha(which))/255.0; + } + double time_raster_sink_f_impl::num_rows() { @@ -263,6 +330,24 @@ namespace gr { } void + time_raster_sink_f_impl::enable_menu(bool en) + { + d_main_gui->enableMenu(en); + } + + void + time_raster_sink_f_impl::enable_grid(bool en) + { + d_main_gui->setGrid(en); + } + + void + time_raster_sink_f_impl::enable_autoscale(bool en) + { + d_main_gui->autoScale(en); + } + + void time_raster_sink_f_impl::reset() { d_index = 0; diff --git a/gr-qtgui/lib/time_raster_sink_f_impl.h b/gr-qtgui/lib/time_raster_sink_f_impl.h index 9c00ac89ba..922ae6df73 100644 --- a/gr-qtgui/lib/time_raster_sink_f_impl.h +++ b/gr-qtgui/lib/time_raster_sink_f_impl.h @@ -81,9 +81,21 @@ namespace gr { void set_line_width(int width); void set_line_style(Qt::PenStyle style); void set_line_marker(QwtSymbol::Style marker); + void set_line_alpha(int which, double alpha); + void set_color_map(int which, const int color); + + std::string title(); + std::string line_label(int which); + std::string line_color(int which); + int line_width(int which); + int line_style(int which); + int line_marker(int which); + double line_alpha(int which); + int color_map(int which); void set_size(int width, int height); + void set_samp_rate(const double samp_rate); void set_num_rows(double rows); void set_num_cols(double cols); @@ -95,6 +107,9 @@ namespace gr { void set_intensity_range(float min, float max); + void enable_menu(bool en); + void enable_grid(bool en); + void enable_autoscale(bool en); void reset(); int work(int noutput_items, diff --git a/gr-qtgui/lib/timerasterdisplayform.cc b/gr-qtgui/lib/timerasterdisplayform.cc index 6b7a344cd2..ed17cf45ce 100644 --- a/gr-qtgui/lib/timerasterdisplayform.cc +++ b/gr-qtgui/lib/timerasterdisplayform.cc @@ -118,6 +118,31 @@ TimeRasterDisplayForm::numCols() return getPlot()->numCols(); } +int +TimeRasterDisplayForm::getColorMap(int which) +{ + return getPlot()->getIntensityColorMapType(which); +} + +int +TimeRasterDisplayForm::getAlpha(int which) +{ + return getPlot()->getAlpha(which); +} + +double +TimeRasterDisplayForm::getMinIntensity(int which) +{ + return getPlot()->getMinIntensity(which); +} + +double +TimeRasterDisplayForm::getMaxIntensity(int which) +{ + return getPlot()->getMaxIntensity(which); +} + + void TimeRasterDisplayForm::newData(const QEvent *updateEvent) { @@ -151,30 +176,42 @@ void TimeRasterDisplayForm::setNumRows(double rows) { getPlot()->setNumRows(rows); + getPlot()->replot(); } void TimeRasterDisplayForm::setNumRows(QString rows) { getPlot()->setNumRows(rows.toDouble()); + getPlot()->replot(); } void TimeRasterDisplayForm::setNumCols(double cols) { getPlot()->setNumCols(cols); + getPlot()->replot(); } void TimeRasterDisplayForm::setNumCols(QString cols) { getPlot()->setNumCols(cols.toDouble()); + getPlot()->replot(); +} + +void +TimeRasterDisplayForm::setSampleRate(const double rate) +{ + getPlot()->setSampleRate(rate); + getPlot()->replot(); } void TimeRasterDisplayForm::setSampleRate(const QString &rate) { getPlot()->setSampleRate(rate.toDouble()); + getPlot()->replot(); } void @@ -185,12 +222,14 @@ TimeRasterDisplayForm::setColorMap(int which, { getPlot()->setIntensityColorMapType(which, newType, lowColor, highColor); + getPlot()->replot(); } void TimeRasterDisplayForm::setAlpha(int which, int alpha) { getPlot()->setAlpha(which, alpha); + getPlot()->replot(); } void @@ -198,6 +237,7 @@ TimeRasterDisplayForm::setIntensityRange(const double minIntensity, const double maxIntensity) { getPlot()->setIntensityRange(minIntensity, maxIntensity); + getPlot()->replot(); } void @@ -207,4 +247,5 @@ TimeRasterDisplayForm::autoScale(bool en) double max_int = _max_val; getPlot()->setIntensityRange(min_int, max_int); + getPlot()->replot(); } diff --git a/gr-qtgui/lib/timerasterdisplayform.h b/gr-qtgui/lib/timerasterdisplayform.h index 9c6960d0a7..f5341f5ecf 100644 --- a/gr-qtgui/lib/timerasterdisplayform.h +++ b/gr-qtgui/lib/timerasterdisplayform.h @@ -49,6 +49,11 @@ class TimeRasterDisplayForm : public DisplayForm double numRows(); double numCols(); + int getColorMap(int which); + int getAlpha(int which); + double getMinIntensity(int which); + double getMaxIntensity(int which); + public slots: void customEvent(QEvent *e); @@ -58,6 +63,7 @@ public slots: void setNumRows(QString rows); void setNumCols(QString cols); + void setSampleRate(const double samprate); void setSampleRate(const QString &rate); void setIntensityRange(const double minIntensity, @@ -65,8 +71,8 @@ public slots: void setColorMap(int which, const int newType, - const QColor lowColor, - const QColor highColor); + const QColor lowColor=QColor("white"), + const QColor highColor=QColor("white")); void setAlpha(int which, int alpha); |