summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Rondeau <trondeau@vt.edu>2013-02-20 21:30:02 -0500
committerTom Rondeau <trondeau@vt.edu>2013-02-21 11:57:13 -0500
commit18b20e591ffb20951605dfc4b7cbe5964b5159fa (patch)
treec5ecd53f2211e163500a7e129ce74f3f82193d28
parent9c27fc06bd0b473de50e76b845e25b835e26b6ff (diff)
qtgui: adding time raster static plot tool.
-rw-r--r--gr-qtgui/apps/CMakeLists.txt3
-rwxr-xr-xgr-qtgui/apps/gr_time_raster_b78
-rw-r--r--gr-qtgui/apps/plot_base.py2
-rw-r--r--gr-qtgui/apps/plot_form.py66
-rw-r--r--gr-qtgui/apps/plot_time_raster_base.py183
-rw-r--r--gr-qtgui/apps/plot_time_raster_form.py157
-rw-r--r--gr-qtgui/include/qtgui/time_raster_sink_b.h15
-rw-r--r--gr-qtgui/include/qtgui/time_raster_sink_f.h15
-rw-r--r--gr-qtgui/lib/TimeRasterDisplayPlot.cc30
-rw-r--r--gr-qtgui/lib/TimeRasterDisplayPlot.h5
-rw-r--r--gr-qtgui/lib/time_raster_sink_b_impl.cc85
-rw-r--r--gr-qtgui/lib/time_raster_sink_b_impl.h15
-rw-r--r--gr-qtgui/lib/time_raster_sink_f_impl.cc85
-rw-r--r--gr-qtgui/lib/time_raster_sink_f_impl.h15
-rw-r--r--gr-qtgui/lib/timerasterdisplayform.cc41
-rw-r--r--gr-qtgui/lib/timerasterdisplayform.h10
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);