summaryrefslogtreecommitdiff
path: root/gr-qtgui
diff options
context:
space:
mode:
Diffstat (limited to 'gr-qtgui')
-rw-r--r--gr-qtgui/Makefile.am7
-rw-r--r--gr-qtgui/grc/.gitignore2
-rw-r--r--gr-qtgui/grc/Makefile.am33
-rw-r--r--gr-qtgui/grc/qtgui_check_box.xml83
-rw-r--r--gr-qtgui/grc/qtgui_chooser.xml251
-rw-r--r--gr-qtgui/grc/qtgui_entry.xml68
-rw-r--r--gr-qtgui/grc/qtgui_label.xml66
-rw-r--r--gr-qtgui/grc/qtgui_range.xml211
-rw-r--r--gr-qtgui/grc/qtgui_sink_x.xml136
-rw-r--r--gr-qtgui/grc/qtgui_tab_widget.xml84
-rw-r--r--gr-qtgui/src/lib/.gitignore3
-rw-r--r--gr-qtgui/src/lib/FrequencyDisplayPlot.h1
-rw-r--r--gr-qtgui/src/lib/Makefile.am30
-rw-r--r--gr-qtgui/src/lib/Makefile.swig.gen214
-rw-r--r--gr-qtgui/src/lib/SpectrumGUIClass.cc4
-rw-r--r--gr-qtgui/src/lib/SpectrumGUIClass.h4
-rw-r--r--gr-qtgui/src/lib/TimeDomainDisplayPlot.h1
-rw-r--r--gr-qtgui/src/lib/WaterfallDisplayPlot.cc40
-rw-r--r--gr-qtgui/src/lib/WaterfallDisplayPlot.h13
-rw-r--r--gr-qtgui/src/lib/plot_waterfall.h4
-rw-r--r--gr-qtgui/src/lib/qtgui.h17
-rw-r--r--gr-qtgui/src/lib/qtgui.i9
-rw-r--r--gr-qtgui/src/lib/qtgui_sink_c.cc13
-rw-r--r--gr-qtgui/src/lib/qtgui_sink_c.h4
-rw-r--r--gr-qtgui/src/lib/qtgui_sink_f.cc13
-rw-r--r--gr-qtgui/src/lib/qtgui_sink_f.h4
-rw-r--r--gr-qtgui/src/python/Makefile.am2
27 files changed, 1069 insertions, 248 deletions
diff --git a/gr-qtgui/Makefile.am b/gr-qtgui/Makefile.am
index d53f96c1f..e794266cb 100644
--- a/gr-qtgui/Makefile.am
+++ b/gr-qtgui/Makefile.am
@@ -1,5 +1,5 @@
#
-# Copyright 2008 Free Software Foundation, Inc.
+# Copyright 2008-2010 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -23,3 +23,8 @@ include $(top_srcdir)/Makefile.common
SUBDIRS = src
DIST_SUBDIRS = src
+
+if PYTHON
+SUBDIRS += grc
+DIST_SUBDIRS += grc
+endif
diff --git a/gr-qtgui/grc/.gitignore b/gr-qtgui/grc/.gitignore
new file mode 100644
index 000000000..b336cc7ce
--- /dev/null
+++ b/gr-qtgui/grc/.gitignore
@@ -0,0 +1,2 @@
+/Makefile
+/Makefile.in
diff --git a/gr-qtgui/grc/Makefile.am b/gr-qtgui/grc/Makefile.am
new file mode 100644
index 000000000..b3114268c
--- /dev/null
+++ b/gr-qtgui/grc/Makefile.am
@@ -0,0 +1,33 @@
+#
+# Copyright 2010-2011 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.
+#
+
+include $(top_srcdir)/Makefile.common
+
+grcblocksdir = $(grc_blocksdir)
+
+dist_grcblocks_DATA = \
+ qtgui_check_box.xml \
+ qtgui_entry.xml \
+ qtgui_label.xml \
+ qtgui_range.xml \
+ qtgui_sink_x.xml \
+ qtgui_tab_widget.xml \
+ qtgui_chooser.xml
diff --git a/gr-qtgui/grc/qtgui_check_box.xml b/gr-qtgui/grc/qtgui_check_box.xml
new file mode 100644
index 000000000..95f4f968a
--- /dev/null
+++ b/gr-qtgui/grc/qtgui_check_box.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+##Variable Check Box:
+## a gui check box form
+###################################################
+ -->
+<block>
+ <name>QT GUI Check Box</name>
+ <key>variable_qtgui_check_box</key>
+ <category>QT GUI Widgets</category>
+ <import>from PyQt4 import Qt</import>
+ <var_make>self.$(id) = $(id) = $value</var_make>
+ <make>#set $win = '_%s_check_box'%$id
+#if not $label()
+ #set $label = '"%s"'%$id
+#end if
+$win = Qt.QCheckBox($label)
+self._$(id)_choices = {True: $true, False: $false}
+self._$(id)_choices_inv = dict((v,k) for k,v in self._$(id)_choices.iteritems())
+self._$(id)_callback = lambda i: $(win).setChecked(self._$(id)_choices_inv[i])
+self._$(id)_callback(self.$id)
+$(win).stateChanged.connect(lambda i: self.set_$(id)(self._$(id)_choices[bool(i)]))
+$(gui_hint()($win))</make>
+ <callback>self.set_$(id)($value)</callback>
+ <callback>self._$(id)_callback($id)</callback>
+ <param>
+ <name>Label</name>
+ <key>label</key>
+ <value></value>
+ <type>string</type>
+ <hide>#if $label() then 'none' else 'part'#</hide>
+ </param>
+ <param>
+ <name>Type</name>
+ <key>type</key>
+ <value>int</value>
+ <type>enum</type>
+ <hide>part</hide>
+ <option><name>Float</name><key>real</key><opt>conv:float</opt></option>
+ <option><name>Integer</name><key>int</key><opt>conv:int</opt></option>
+ <option><name>String</name><key>string</key><opt>conv:str</opt></option>
+ <option><name>Boolean</name><key>bool</key><opt>conv:bool</opt></option>
+ <option><name>Any</name><key>raw</key><opt>conv:eval</opt></option>
+ </param>
+ <param>
+ <name>Default Value</name>
+ <key>value</key>
+ <value>True</value>
+ <type>$type</type>
+ </param>
+ <param>
+ <name>True</name>
+ <key>true</key>
+ <value>True</value>
+ <type>$type</type>
+ </param>
+ <param>
+ <name>False</name>
+ <key>false</key>
+ <value>False</value>
+ <type>$type</type>
+ </param>
+ <param>
+ <name>GUI Hint</name>
+ <key>gui_hint</key>
+ <value></value>
+ <type>gui_hint</type>
+ <hide>part</hide>
+ </param>
+ <check>$value in ($true, $false)</check>
+ <doc>
+This block creates a variable check box. \
+Leave the label blank to use the variable id as the label.
+
+A check box selects between two values of similar type. \
+Te values do not necessarily need to be of boolean type.
+
+The GUI hint can be used to position the widget within the application. \
+The hint is of the form [tab_id@tab_index]: [row, col, row_span, col_span]. \
+Both the tab specification and the grid position are optional.
+ </doc>
+</block>
diff --git a/gr-qtgui/grc/qtgui_chooser.xml b/gr-qtgui/grc/qtgui_chooser.xml
new file mode 100644
index 000000000..cb5090289
--- /dev/null
+++ b/gr-qtgui/grc/qtgui_chooser.xml
@@ -0,0 +1,251 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+##Variable Chooser:
+## A chooser, radio buttons
+###################################################
+ -->
+<block>
+ <name>QT GUI Chooser</name>
+ <key>variable_qtgui_chooser</key>
+ <category>QT GUI Widgets</category>
+ <import>from PyQt4 import Qt</import>
+ <var_make>self.$(id) = $(id) = $value</var_make>
+ <make>#slurp
+#set $all_options = [$option0, $option1, $option2, $option3, $option4][:int($num_opts())]
+#set $all_labels = [$label0, $label1, $label2, $label3, $label4][:int($num_opts())]
+#if not $label()
+ #set $label = '"%s"'%$id
+#end if
+########################################################################
+## Create the options list
+########################################################################
+#if int($num_opts())
+self._$(id)_options = (#slurp
+ #for $ch in $all_options
+$ch, #slurp
+ #end for
+)
+#else
+self._$(id)_options = $options
+#end if
+########################################################################
+## Create the labels list
+########################################################################
+#if int($num_opts())
+self._$(id)_labels = (#slurp
+ #for i, $lbl in enumerate($all_labels)
+ #if $lbl()
+$lbl, #slurp
+ #else
+str(self._$(id)_options[$i]), #slurp
+ #end if
+ #end for
+)
+#elif $labels()
+self._$(id)_labels = $labels
+#else
+self._$(id)_labels = map(str, self._$(id)_options)
+#end if
+########################################################################
+## Create the combo box
+########################################################################
+#if $widget() == 'combo_box'
+#set $win = 'self._%s_tool_bar'%$id
+$win = Qt.QToolBar(self)
+$(win).addWidget(Qt.QLabel($label+": "))
+self._$(id)_combo_box = Qt.QComboBox()
+$(win).addWidget(self._$(id)_combo_box)
+for label in self._$(id)_labels: self._$(id)_combo_box.addItem(label)
+self._$(id)_callback = lambda i: self._$(id)_combo_box.setCurrentIndex(self._$(id)_options.index(i))
+self._$(id)_callback(self.$id)
+self._$(id)_combo_box.currentIndexChanged.connect(
+ lambda i: self.set_$(id)(self._$(id)_options[i]))
+#end if
+########################################################################
+## Create the radio buttons
+########################################################################
+#if $widget() == 'radio_buttons'
+#set $win = 'self._%s_group_box'%$id
+$win = Qt.QGroupBox($label)
+self._$(id)_box = $(orient)()
+self._$(id)_button_group = Qt.QButtonGroup()
+$(win).setLayout(self._$(id)_box)
+for i, label in enumerate(self._$(id)_labels):
+ radio_button = Qt.QRadioButton(label)
+ self._$(id)_box.addWidget(radio_button)
+ self._$(id)_button_group.addButton(radio_button, i)
+self._$(id)_callback = lambda i: self._$(id)_button_group.button(self._$(id)_options.index(i)).setChecked(True)
+self._$(id)_callback(self.$id)
+self._$(id)_button_group.buttonClicked[int].connect(
+ lambda i: self.set_$(id)(self._$(id)_options[i]))
+#end if
+$(gui_hint()($win))</make>
+ <callback>self.set_$(id)($value)</callback>
+ <callback>self._$(id)_callback($id)</callback>
+ <param>
+ <name>Label</name>
+ <key>label</key>
+ <value></value>
+ <type>string</type>
+ <hide>#if $label() then 'none' else 'part'#</hide>
+ </param>
+ <param>
+ <name>Type</name>
+ <key>type</key>
+ <value>int</value>
+ <type>enum</type>
+ <hide>part</hide>
+ <option><name>Float</name><key>real</key></option>
+ <option><name>Integer</name><key>int</key></option>
+ <option><name>String</name><key>string</key></option>
+ <option><name>Any</name><key>raw</key></option>
+ </param>
+ <param>
+ <name>Num Options</name>
+ <key>num_opts</key>
+ <value>3</value>
+ <type>enum</type>
+ <option><name>List</name><key>0</key></option>
+ <option><name>1</name><key>1</key></option>
+ <option><name>2</name><key>2</key></option>
+ <option><name>3</name><key>3</key></option>
+ <option><name>4</name><key>4</key></option>
+ <option><name>5</name><key>5</key></option>
+ </param>
+ <param>
+ <name>Default Value</name>
+ <key>value</key>
+ <value>0</value>
+ <type>$type</type>
+ </param>
+ <param>
+ <name>Options</name>
+ <key>options</key>
+ <value>[0, 1, 2]</value>
+ <type>raw</type>
+ <hide>#if int($num_opts()) then 'all' else 'none'#</hide>
+ </param>
+ <param>
+ <name>Labels</name>
+ <key>labels</key>
+ <value>[]</value>
+ <type>raw</type>
+ <hide>#if int($num_opts()) then 'all' else 'none'#</hide>
+ </param>
+ <param>
+ <name>Option 0</name>
+ <key>option0</key>
+ <value>0</value>
+ <type>$type</type>
+ <hide>#if int($num_opts()) > 0 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Label 0</name>
+ <key>label0</key>
+ <value></value>
+ <type>string</type>
+ <hide>$((int($num_opts()) > 0) and ($label0() and 'none' or 'part') or 'all')</hide>
+ </param>
+ <param>
+ <name>Option 1</name>
+ <key>option1</key>
+ <value>1</value>
+ <type>$type</type>
+ <hide>#if int($num_opts()) > 1 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Label 1</name>
+ <key>label1</key>
+ <value></value>
+ <type>string</type>
+ <hide>$((int($num_opts()) > 1) and ($label1() and 'none' or 'part') or 'all')</hide>
+ </param>
+ <param>
+ <name>Option 2</name>
+ <key>option2</key>
+ <value>2</value>
+ <type>$type</type>
+ <hide>#if int($num_opts()) > 2 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Label 2</name>
+ <key>label2</key>
+ <value></value>
+ <type>string</type>
+ <hide>$((int($num_opts()) > 2) and ($label2() and 'none' or 'part') or 'all')</hide>
+ </param>
+ <param>
+ <name>Option 3</name>
+ <key>option3</key>
+ <value>3</value>
+ <type>$type</type>
+ <hide>#if int($num_opts()) > 3 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Label 3</name>
+ <key>label3</key>
+ <value></value>
+ <type>string</type>
+ <hide>$((int($num_opts()) > 3) and ($label3() and 'none' or 'part') or 'all')</hide>
+ </param>
+ <param>
+ <name>Option 4</name>
+ <key>option4</key>
+ <value>4</value>
+ <type>$type</type>
+ <hide>#if int($num_opts()) > 4 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Label 4</name>
+ <key>label4</key>
+ <value></value>
+ <type>string</type>
+ <hide>$((int($num_opts()) > 4) and ($label4() and 'none' or 'part') or 'all')</hide>
+ </param>
+ <param>
+ <name>Widget</name>
+ <key>widget</key>
+ <value>combo_box</value>
+ <type>enum</type>
+ <hide>part</hide>
+ <option><name>Combo Box</name><key>combo_box</key></option>
+ <option><name>Radio Buttons</name><key>radio_buttons</key></option>
+ </param>
+ <param>
+ <name>Orientation</name>
+ <key>orient</key>
+ <value>Qt.QVBoxLayout</value>
+ <type>enum</type>
+ <hide>#if $widget() == 'radio_buttons' then 'part' else 'all'#</hide>
+ <option>
+ <name>Horizontal</name>
+ <key>Qt.QHBoxLayout</key>
+ </option>
+ <option>
+ <name>Vertical</name>
+ <key>Qt.QVBoxLayout</key>
+ </option>
+ </param>
+ <param>
+ <name>GUI Hint</name>
+ <key>gui_hint</key>
+ <value></value>
+ <type>gui_hint</type>
+ <hide>part</hide>
+ </param>
+ <doc>
+This block creates a variable with enumerated options. \
+The gui widget is implemented as a combo box or radio button group. \
+Leave the label blank to use the variable id as the label.
+
+Choose the number of options available to your chooser. \
+When the label is left blank, the option will be used as the label. \
+Set the number of options to "list" to enter a single list of options and labels. \
+When the labels is an empty list, the options will be used as the label.
+
+The GUI hint can be used to position the widget within the application. \
+The hint is of the form [tab_id@tab_index]: [row, col, row_span, col_span]. \
+Both the tab specification and the grid position are optional.
+ </doc>
+</block>
diff --git a/gr-qtgui/grc/qtgui_entry.xml b/gr-qtgui/grc/qtgui_entry.xml
new file mode 100644
index 000000000..1a98402a0
--- /dev/null
+++ b/gr-qtgui/grc/qtgui_entry.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+##Variable Text Entry:
+## a gui text box form
+###################################################
+ -->
+<block>
+ <name>QT GUI Entry</name>
+ <key>variable_qtgui_entry</key>
+ <category>QT GUI Widgets</category>
+ <import>from PyQt4 import Qt</import>
+ <import>from gnuradio import eng_notation</import>
+ <var_make>self.$(id) = $(id) = $value</var_make>
+ <make>#set $win = 'self._%s_tool_bar'%$id
+$win = Qt.QToolBar(self)
+#if not $label()
+ #set $label = '"%s"'%$id
+#end if
+$(win).addWidget(Qt.QLabel($label+": "))
+self._$(id)_line_edit = Qt.QLineEdit(str(self.$id))
+self._$(id)_tool_bar.addWidget(self._$(id)_line_edit)
+self._$(id)_line_edit.returnPressed.connect(
+ lambda: self.set_$(id)($(type.conv)(self._$(id)_line_edit.text().toAscii())))
+$(gui_hint()($win))</make>
+ <callback>self.set_$(id)($value)</callback>
+ <callback>self._$(id)_line_edit.setText($(type.str)($id))</callback>
+ <param>
+ <name>Label</name>
+ <key>label</key>
+ <value></value>
+ <type>string</type>
+ <hide>#if $label() then 'none' else 'part'#</hide>
+ </param>
+ <param>
+ <name>Type</name>
+ <key>type</key>
+ <value>int</value>
+ <type>enum</type>
+ <hide>part</hide>
+ <option><name>Float</name><key>real</key><opt>conv:eng_notation.str_to_num</opt><opt>str:eng_notation.num_to_str</opt></option>
+ <option><name>Integer</name><key>int</key><opt>conv:int</opt><opt>str:str</opt></option>
+ <option><name>String</name><key>string</key><opt>conv:str</opt><opt>str:str</opt></option>
+ <option><name>Boolean</name><key>bool</key><opt>conv:bool</opt><opt>str:str</opt></option>
+ <option><name>Any</name><key>raw</key><opt>conv:eval</opt><opt>str:repr</opt></option>
+ </param>
+ <param>
+ <name>Default Value</name>
+ <key>value</key>
+ <value>0</value>
+ <type>$type</type>
+ </param>
+ <param>
+ <name>GUI Hint</name>
+ <key>gui_hint</key>
+ <value></value>
+ <type>gui_hint</type>
+ <hide>part</hide>
+ </param>
+ <doc>
+This block creates a variable with a text entry box. \
+Leave the label blank to use the variable id as the label.
+
+The GUI hint can be used to position the widget within the application. \
+The hint is of the form [tab_id@tab_index]: [row, col, row_span, col_span]. \
+Both the tab specification and the grid position are optional.
+ </doc>
+</block>
diff --git a/gr-qtgui/grc/qtgui_label.xml b/gr-qtgui/grc/qtgui_label.xml
new file mode 100644
index 000000000..5049118c4
--- /dev/null
+++ b/gr-qtgui/grc/qtgui_label.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+##Variable Label Text:
+## a gui static text form
+###################################################
+ -->
+<block>
+ <name>QT GUI Label</name>
+ <key>variable_qtgui_label</key>
+ <category>QT GUI Widgets</category>
+ <import>from PyQt4 import Qt</import>
+ <import>from gnuradio import eng_notation</import>
+ <var_make>self.$(id) = $(id) = $value</var_make>
+ <make>#set $win = 'self._%s_tool_bar'%$id
+$win = Qt.QToolBar(self)
+#if not $label()
+ #set $label = '"%s"'%$id
+#end if
+$(win).addWidget(Qt.QLabel($label+": "))
+self._$(id)_label = Qt.QLabel(str(self.$id))
+self._$(id)_tool_bar.addWidget(self._$(id)_label)
+$(gui_hint()($win))</make>
+ <callback>self.set_$(id)($value)</callback>
+ <callback>self._$(id)_label.setText($(type.str)($id))</callback>
+ <param>
+ <name>Label</name>
+ <key>label</key>
+ <value></value>
+ <type>string</type>
+ <hide>#if $label() then 'none' else 'part'#</hide>
+ </param>
+ <param>
+ <name>Type</name>
+ <key>type</key>
+ <value>int</value>
+ <type>enum</type>
+ <hide>part</hide>
+ <option><name>Float</name><key>real</key><opt>conv:eng_notation.str_to_num</opt><opt>str:eng_notation.num_to_str</opt></option>
+ <option><name>Integer</name><key>int</key><opt>conv:int</opt><opt>str:str</opt></option>
+ <option><name>String</name><key>string</key><opt>conv:str</opt><opt>str:str</opt></option>
+ <option><name>Boolean</name><key>bool</key><opt>conv:bool</opt><opt>str:str</opt></option>
+ <option><name>Any</name><key>raw</key><opt>conv:eval</opt><opt>str:repr</opt></option>
+ </param>
+ <param>
+ <name>Default Value</name>
+ <key>value</key>
+ <value>0</value>
+ <type>$type</type>
+ </param>
+ <param>
+ <name>GUI Hint</name>
+ <key>gui_hint</key>
+ <value></value>
+ <type>gui_hint</type>
+ <hide>part</hide>
+ </param>
+ <doc>
+This block creates a variable with a label widget for text. \
+Leave the label blank to use the variable id as the label.
+
+The GUI hint can be used to position the widget within the application. \
+The hint is of the form [tab_id@tab_index]: [row, col, row_span, col_span]. \
+Both the tab specification and the grid position are optional.
+ </doc>
+</block>
diff --git a/gr-qtgui/grc/qtgui_range.xml b/gr-qtgui/grc/qtgui_range.xml
new file mode 100644
index 000000000..6b0555f98
--- /dev/null
+++ b/gr-qtgui/grc/qtgui_range.xml
@@ -0,0 +1,211 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+##Variable Range:
+## ranged widgets like a slider or a knob
+###################################################
+ -->
+<block>
+ <name>QT GUI Range</name>
+ <key>variable_qtgui_range</key>
+ <category>QT GUI Widgets</category>
+ <import>from PyQt4 import Qt</import>
+ <import>import PyQt4.Qwt5 as Qwt</import>
+ <var_make>self.$(id) = $(id) = $value</var_make>
+ <make>#set $win = 'self._%s_layout'%$id
+#if not $label()
+ #set $label = '"%s"'%$id
+#end if
+########################################################################
+#if $widget() == "knob"
+########################################################################
+$win = Qt.QVBoxLayout()
+self._$(id)_knob = Qwt.QwtKnob()
+self._$(id)_knob.setRange($start, $stop, $step)
+self._$(id)_knob.setValue(self.$id)
+self._$(id)_knob.valueChanged.connect(self.set_$(id))
+$(win).addWidget(self._$(id)_knob)
+self._$(id)_label = Qt.QLabel($label)
+self._$(id)_label.setAlignment(Qt.Qt.AlignTop | Qt.Qt.AlignHCenter)
+$(win).addWidget(self._$(id)_label)
+#end if
+########################################################################
+#if $widget() == "thermo"
+########################################################################
+$win = Qt.QVBoxLayout()
+self._$(id)_label = Qt.QLabel($label)
+self._$(id)_thermo = Qwt.QwtThermo()
+self._$(id)_thermo.setScalePosition(Qwt.QwtThermo.$orient.scalepos)
+self._$(id)_thermo.setRange($start, $stop)
+self._$(id)_thermo.setValue(self.$id)
+self._$(id)_thermo.$(orient.minfcn)($min_len)
+#if 'horizontal' in $orient().lower()
+self._$(id)_label.setAlignment(Qt.Qt.AlignBottom | Qt.Qt.AlignHCenter)
+$(win).addWidget(self._$(id)_label)
+$(win).addWidget(self._$(id)_thermo)
+#elif 'vertical' in $orient().lower()
+self._$(id)_label.setAlignment(Qt.Qt.AlignTop)
+$(win).addWidget(self._$(id)_thermo)
+$(win).addWidget(self._$(id)_label)
+#end if
+#end if
+########################################################################
+#if $widget() == "counter"
+########################################################################
+$win = Qt.QHBoxLayout()
+$(win).addWidget(Qt.QLabel($label+": "))
+self._$(id)_counter = Qwt.QwtCounter()
+self._$(id)_counter.setRange($start, $stop, $step)
+self._$(id)_counter.setNumButtons(2)
+self._$(id)_counter.setMinimumWidth($min_len)
+self._$(id)_counter.setValue(self.$id)
+$(win).addWidget(self._$(id)_counter)
+self._$(id)_counter.valueChanged.connect(self.set_$(id))
+#end if
+########################################################################
+#if $widget() == "slider"
+########################################################################
+$win = Qt.QVBoxLayout()
+self._$(id)_label = Qt.QLabel($label)
+self._$(id)_slider = Qwt.QwtSlider(None, Qt.$orient, Qwt.QwtSlider.$orient.scalepos, Qwt.QwtSlider.BgSlot)
+self._$(id)_slider.setRange($start, $stop, $step)
+self._$(id)_slider.setValue(self.$id)
+self._$(id)_slider.$(orient.minfcn)($min_len)
+self._$(id)_slider.valueChanged.connect(self.set_$(id))
+#if 'horizontal' in $orient().lower()
+self._$(id)_label.setAlignment(Qt.Qt.AlignBottom | Qt.Qt.AlignHCenter)
+$(win).addWidget(self._$(id)_label)
+$(win).addWidget(self._$(id)_slider)
+#elif 'vertical' in $orient().lower()
+self._$(id)_label.setAlignment(Qt.Qt.AlignTop)
+$(win).addWidget(self._$(id)_slider)
+$(win).addWidget(self._$(id)_label)
+#end if
+#end if
+########################################################################
+#if $widget() == "counter_slider"
+########################################################################
+$win = Qt.QVBoxLayout()
+self._$(id)_tool_bar = Qt.QToolBar(self)
+$(win).addWidget(self._$(id)_tool_bar)
+self._$(id)_tool_bar.addWidget(Qt.QLabel($label+": "))
+self._$(id)_counter = Qwt.QwtCounter()
+self._$(id)_counter.setRange($start, $stop, $step)
+self._$(id)_counter.setNumButtons(2)
+self._$(id)_counter.setValue(self.$id)
+self._$(id)_tool_bar.addWidget(self._$(id)_counter)
+self._$(id)_counter.valueChanged.connect(self.set_$(id))
+self._$(id)_slider = Qwt.QwtSlider(None, Qt.Qt.Horizontal, Qwt.QwtSlider.BottomScale, Qwt.QwtSlider.BgSlot)
+self._$(id)_slider.setRange($start, $stop, $step)
+self._$(id)_slider.setValue(self.$id)
+self._$(id)_slider.setMinimumWidth($min_len)
+self._$(id)_slider.valueChanged.connect(self.set_$(id))
+$(win).addWidget(self._$(id)_slider)
+#end if
+$(gui_hint()($win))</make>
+ <callback>self.set_$(id)($value)</callback>
+ <callback>#if $widget() == "knob"
+self._$(id)_knob.setValue($id)
+#end if
+#if $widget() == "thermo"
+self._$(id)_thermo.setValue($id)
+#end if
+#if $widget() == "counter"
+self._$(id)_counter.setValue($id)
+#end if
+#if $widget() == "slider"
+self._$(id)_slider.setValue($id)
+#end if
+#if $widget() == "counter_slider"
+self._$(id)_counter.setValue($id)
+self._$(id)_slider.setValue($id)
+#end if</callback>
+ <param>
+ <name>Label</name>
+ <key>label</key>
+ <value></value>
+ <type>string</type>
+ <hide>#if $label() then 'none' else 'part'#</hide>
+ </param>
+ <param>
+ <name>Default Value</name>
+ <key>value</key>
+ <value>50</value>
+ <type>real</type>
+ </param>
+ <param>
+ <name>Start</name>
+ <key>start</key>
+ <value>0</value>
+ <type>real</type>
+ </param>
+ <param>
+ <name>Stop</name>
+ <key>stop</key>
+ <value>100</value>
+ <type>real</type>
+ </param>
+ <param>
+ <name>Step</name>
+ <key>step</key>
+ <value>1</value>
+ <type>real</type>
+ </param>
+ <param>
+ <name>Widget</name>
+ <key>widget</key>
+ <value>counter_slider</value>
+ <type>enum</type>
+ <hide>part</hide>
+ <option><name>Counter + Slider</name><key>counter_slider</key></option>
+ <option><name>Counter</name><key>counter</key></option>
+ <option><name>Slider</name><key>slider</key></option>
+ <option><name>Knob</name><key>knob</key></option>
+ <option><name>Thermo</name><key>thermo</key></option>
+ </param>
+ <param>
+ <name>Orientation</name>
+ <key>orient</key>
+ <value>Qt.Horizontal</value>
+ <type>enum</type>
+ <hide>#if $widget() in ("slider", "thermo") then 'part' else 'all'#</hide>
+ <option>
+ <name>Horizontal</name>
+ <key>Qt.Horizontal</key>
+ <opt>scalepos:BottomScale</opt>
+ <opt>minfcn:setMinimumWidth</opt>
+ </option>
+ <option>
+ <name>Vertical</name>
+ <key>Qt.Vertical</key>
+ <opt>scalepos:LeftScale</opt>
+ <opt>minfcn:setMinimumHeight</opt>
+ </option>
+ </param>
+ <param>
+ <name>Minimum Length</name>
+ <key>min_len</key>
+ <value>200</value>
+ <type>int</type>
+ <hide>#if $widget().split('_')[0] in ("slider", "counter", "thermo") then 'part' else 'all'#</hide>
+ </param>
+ <param>
+ <name>GUI Hint</name>
+ <key>gui_hint</key>
+ <value></value>
+ <type>gui_hint</type>
+ <hide>part</hide>
+ </param>
+ <check>$start &lt;= $value &lt;= $stop</check>
+ <check>$start &lt; $stop</check>
+ <doc>
+This block creates a variable with a slider. \
+Leave the label blank to use the variable id as the label. \
+The value must be a real number. \
+The value must be between the start and the stop.
+
+The GUI hint can be used to position the widget within the application. \
+The hint is of the form [tab_id@tab_index]: [row, col, row_span, col_span]. \
+Both the tab specification and the grid position are optional.
+ </doc>
+</block>
diff --git a/gr-qtgui/grc/qtgui_sink_x.xml b/gr-qtgui/grc/qtgui_sink_x.xml
new file mode 100644
index 000000000..7a5f5ec13
--- /dev/null
+++ b/gr-qtgui/grc/qtgui_sink_x.xml
@@ -0,0 +1,136 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+##QT GUI Sink
+###################################################
+ -->
+<block>
+ <name>QT GUI Sink</name>
+ <key>qtgui_sink_x</key>
+ <category>QT GUI Widgets</category>
+ <import>from PyQt4 import Qt</import>
+ <import>from gnuradio.qtgui import qtgui</import>
+ <import>from gnuradio.gr import firdes</import>
+ <import>import sip</import>
+ <make>#set $win = 'self._%s_win'%$id
+qtgui.$(type.fcn)(
+ $fftsize, \#fftsize
+ $wintype, \#wintype
+ $fc, \#fc
+ $bw, \#bw
+ $name, \#name
+ $plotfreq, \#plotfreq
+ $plotwaterfall, \#plotwaterfall
+ $plotwaterfall3d, \#plotwaterfall3d
+ $plottime, \#plottime
+ $plotconst, \#plotconst
+)
+self._$(id)_win = sip.wrapinstance(self.$(id).pyqwidget(), Qt.QWidget)
+$(gui_hint()($win))</make>
+ <callback>set_frequency_range($fc, $bw)</callback>
+ <param>
+ <name>Type</name>
+ <key>type</key>
+ <value>complex</value>
+ <type>enum</type>
+ <option><name>Complex</name><key>complex</key><opt>fcn:sink_c</opt></option>
+ <option><name>Float</name><key>float</key><opt>fcn:sink_f</opt></option>
+ </param>
+ <param>
+ <name>Name</name>
+ <key>name</key>
+ <value>QT GUI Plot</value>
+ <type>string</type>
+ </param>
+ <param>
+ <name>FFT Size</name>
+ <key>fftsize</key>
+ <value>1024</value>
+ <type>int</type>
+ </param>
+ <param>
+ <name>Window Type</name>
+ <key>wintype</key>
+ <value>firdes.WIN_BLACKMAN_hARRIS</value>
+ <type>int</type>
+ <hide>part</hide>
+ <option>
+ <name>Blackman-harris</name>
+ <key>firdes.WIN_BLACKMAN_hARRIS</key>
+ </option>
+ </param>
+ <param>
+ <name>Center Frequency (Hz)</name>
+ <key>fc</key>
+ <value>0</value>
+ <type>real</type>
+ </param>
+ <param>
+ <name>Bandwidth (Hz)</name>
+ <key>bw</key>
+ <value>samp_rate</value>
+ <type>real</type>
+ </param>
+ <param>
+ <name>Plot Frequency</name>
+ <key>plotfreq</key>
+ <value>True</value>
+ <type>bool</type>
+ <hide>part</hide>
+ <option><name>On</name><key>True</key></option>
+ <option><name>Off</name><key>False</key></option>
+ </param>
+ <param>
+ <name>Plot Waterfall</name>
+ <key>plotwaterfall</key>
+ <value>True</value>
+ <type>bool</type>
+ <hide>part</hide>
+ <option><name>On</name><key>True</key></option>
+ <option><name>Off</name><key>False</key></option>
+ </param>
+ <param>
+ <name>Plot Waterfall 3D</name>
+ <key>plotwaterfall3d</key>
+ <value>True</value>
+ <type>bool</type>
+ <hide>part</hide>
+ <option><name>On</name><key>True</key></option>
+ <option><name>Off</name><key>False</key></option>
+ </param>
+ <param>
+ <name>Plot Time</name>
+ <key>plottime</key>
+ <value>True</value>
+ <type>bool</type>
+ <hide>part</hide>
+ <option><name>On</name><key>True</key></option>
+ <option><name>Off</name><key>False</key></option>
+ </param>
+ <param>
+ <name>Plot Const</name>
+ <key>plotconst</key>
+ <value>True</value>
+ <type>bool</type>
+ <hide>part</hide>
+ <option><name>On</name><key>True</key></option>
+ <option><name>Off</name><key>False</key></option>
+ </param>
+ <param>
+ <name>GUI Hint</name>
+ <key>gui_hint</key>
+ <value></value>
+ <type>gui_hint</type>
+ <hide>part</hide>
+ </param>
+ <sink>
+ <name>in</name>
+ <type>$type</type>
+ <nports>$num_inputs</nports>
+ </sink>
+ <doc>
+The GUI hint can be used to position the widget within the application. \
+The hint is of the form [tab_id@tab_index]: [row, col, row_span, col_span]. \
+Both the tab specification and the grid position are optional.
+ </doc>
+</block>
diff --git a/gr-qtgui/grc/qtgui_tab_widget.xml b/gr-qtgui/grc/qtgui_tab_widget.xml
new file mode 100644
index 000000000..f90054109
--- /dev/null
+++ b/gr-qtgui/grc/qtgui_tab_widget.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+##WX GUI Notebook
+###################################################
+ -->
+<block>
+ <name>QT GUI Tab Widget</name>
+ <key>qtgui_tab_widget</key>
+ <category>QT GUI Widgets</category>
+ <import>from PyQt4 import Qt</import>
+ <make>#set $win = 'self.%s'%$id
+Qt.QTabWidget()
+#set $all_labels = [$label0, $label1, $label2, $label3, $label4][:int($num_tabs())]
+#for i, label in enumerate($all_labels)
+self.$(id)_widget_$(i) = Qt.QWidget()
+self.$(id)_layout_$(i) = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom, self.$(id)_widget_$(i))
+self.$(id)_grid_layout_$(i) = Qt.QGridLayout()
+self.$(id)_layout_$(i).addLayout(self.$(id)_grid_layout_$(i))
+$(win).addTab(self.$(id)_widget_$(i), $label)
+#end for
+$(gui_hint()($win))</make>
+ <param>
+ <name>Num Tabs</name>
+ <key>num_tabs</key>
+ <value>1</value>
+ <type>enum</type>
+ <option><name>1</name><key>1</key></option>
+ <option><name>2</name><key>2</key></option>
+ <option><name>3</name><key>3</key></option>
+ <option><name>4</name><key>4</key></option>
+ <option><name>5</name><key>5</key></option>
+ </param>
+ <param>
+ <name>Label 0</name>
+ <key>label0</key>
+ <value>Tab 0</value>
+ <type>string</type>
+ <hide>#if int($num_tabs()) > 0 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Label 1</name>
+ <key>label1</key>
+ <value>Tab 1</value>
+ <type>string</type>
+ <hide>#if int($num_tabs()) > 1 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Label 2</name>
+ <key>label2</key>
+ <value>Tab 2</value>
+ <type>string</type>
+ <hide>#if int($num_tabs()) > 2 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Label 3</name>
+ <key>label3</key>
+ <value>Tab 3</value>
+ <type>string</type>
+ <hide>#if int($num_tabs()) > 3 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>Label 4</name>
+ <key>label4</key>
+ <value>Tab 4</value>
+ <type>string</type>
+ <hide>#if int($num_tabs()) > 4 then 'none' else 'all'#</hide>
+ </param>
+ <param>
+ <name>GUI Hint</name>
+ <key>gui_hint</key>
+ <value></value>
+ <type>gui_hint</type>
+ <hide>part</hide>
+ </param>
+ <doc>
+This block creates a tabbed widget to organize other widgets. \
+The ID of this block can be used as the tab_id in the GUI hints of other widgets.
+
+The GUI hint can be used to position the widget within the application. \
+The hint is of the form [tab_id@tab_index]: [row, col, row_span, col_span]. \
+Both the tab specification and the grid position are optional.
+ </doc>
+</block>
diff --git a/gr-qtgui/src/lib/.gitignore b/gr-qtgui/src/lib/.gitignore
index 11bb4342a..61b9ca8c1 100644
--- a/gr-qtgui/src/lib/.gitignore
+++ b/gr-qtgui/src/lib/.gitignore
@@ -11,3 +11,6 @@
/spectrumdisplayform.ui.h
/FrequencyDisplayPlot.moc.cc
/ConstellationDisplayPlot.moc.cc
+/gnuradio
+/guile
+/python
diff --git a/gr-qtgui/src/lib/FrequencyDisplayPlot.h b/gr-qtgui/src/lib/FrequencyDisplayPlot.h
index c78e1667e..3c22c1397 100644
--- a/gr-qtgui/src/lib/FrequencyDisplayPlot.h
+++ b/gr-qtgui/src/lib/FrequencyDisplayPlot.h
@@ -1,6 +1,7 @@
#ifndef FREQUENCY_DISPLAY_PLOT_HPP
#define FREQUENCY_DISPLAY_PLOT_HPP
+#include <stdint.h>
#include <cstdio>
#include <qwt_plot.h>
#include <qwt_painter.h>
diff --git a/gr-qtgui/src/lib/Makefile.am b/gr-qtgui/src/lib/Makefile.am
index 1ee3c8e3d..446a07fd0 100644
--- a/gr-qtgui/src/lib/Makefile.am
+++ b/gr-qtgui/src/lib/Makefile.am
@@ -20,9 +20,12 @@
#
include $(top_srcdir)/Makefile.common
+include $(top_srcdir)/Makefile.swig
+
+EXTRA_DIST += spectrumdisplayform.ui
AM_CPPFLAGS = -I. $(STD_DEFINES_AND_INCLUDES) $(PYTHON_CPPFLAGS) \
- $(QT_INCLUDES) $(WITH_INCLUDES)
+ $(QT_INCLUDES) $(BOOST_CPPFLAGS) $(WITH_INCLUDES)
# Only include these files in the build if qtgui passes configure checks
# This is mostly to help make distcheck pass
@@ -34,9 +37,7 @@ QMAKE_SOURCES = \
ConstellationDisplayPlot.moc.cc \
spectrumdisplayform.ui.h
-EXTRA_DIST = spectrumdisplayform.ui
-
-BUILT_SOURCES = $(QMAKE_SOURCES)
+BUILT_SOURCES += $(QMAKE_SOURCES)
# Build the normal library for C++ apps to link against
lib_LTLIBRARIES = libgnuradio-qtgui.la
@@ -55,7 +56,7 @@ libgnuradio_qtgui_la_SOURCES = \
qtgui_sink_c.cc \
qtgui_sink_f.cc
-nodist_libgnuradio_qtgui_la_SOURCES=$(BUILT_SOURCES)
+nodist_libgnuradio_qtgui_la_SOURCES=$(QMAKE_SOURCES)
# These headers get installed in ${prefix}/include/gnuradio
grinclude_HEADERS = \
@@ -81,16 +82,18 @@ QT_MOC_FLAGS=-DQT_SHARED -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LI
$(QT_UIC_EXEC) $< -o $@
# magic flags
-libgnuradio_qtgui_la_LDFLAGS = $(NO_UNDEFINED) $(LTVERSIONFLAGS)
+libgnuradio_qtgui_la_LDFLAGS = $(NO_UNDEFINED) $(BOOST_LDFLAGS) $(LTVERSIONFLAGS)
libgnuradio_qtgui_la_LIBADD = \
$(GNURADIO_CORE_LA) \
+ $(BOOST_THREAD_LIB) \
+ $(BOOST_DATE_TIME_LIB) \
-lstdc++ \
$(QT_LIBS)
-if PYTHON
+
##############################
-# SWIG interface and library
+# SWIG interfaces and libraries
TOP_SWIG_IFILES = \
qtgui.i
@@ -105,14 +108,3 @@ qtgui_pythondir_category = \
# additional libraries for linking with the SWIG-generated library
qtgui_la_swig_libadd = \
libgnuradio-qtgui.la
-
-include $(top_srcdir)/Makefile.swig
-
-# add some of the variables generated inside the Makefile.swig.gen
-BUILT_SOURCES += \
- $(swig_built_sources)
-endif
-
-# Do not distribute built sources, they may contain generated paths
-# which are invalid on other systems
-no_dist_files = $(BUILT_SOURCES)
diff --git a/gr-qtgui/src/lib/Makefile.swig.gen b/gr-qtgui/src/lib/Makefile.swig.gen
index f40f0d881..9c4c0b58c 100644
--- a/gr-qtgui/src/lib/Makefile.swig.gen
+++ b/gr-qtgui/src/lib/Makefile.swig.gen
@@ -38,6 +38,16 @@ qtgui_pylibdir_category ?= $(qtgui_pythondir_category)
qtgui_pythondir = $(pythondir)/$(qtgui_pythondir_category)
qtgui_pylibdir = $(pyexecdir)/$(qtgui_pylibdir_category)
+# The .so libraries for the guile modules get installed whereever guile
+# is installed, usually /usr/lib/guile/gnuradio/
+# FIXME: determince whether these should be installed with gnuradio.
+qtgui_scmlibdir = $(libdir)
+
+# The scm files for the guile modules get installed where ever guile
+# is installed, usually /usr/share/guile/site/qtgui
+# FIXME: determince whether these should be installed with gnuradio.
+qtgui_scmdir = $(guiledir)
+
## SWIG headers are always installed into the same directory.
qtgui_swigincludedir = $(swigincludedir)
@@ -57,23 +67,10 @@ qtgui_swigincludedir = $(swigincludedir)
## right thing. For more info, see <
## http://sources.redhat.com/automake/automake.html#Multiple-Outputs >
-## Stamps used to ensure parallel make does the right thing. These
-## are removed by "make clean", but otherwise unused except during the
-## parallel built. These will not be included in a tarball, because
-## the SWIG-generated files will be removed from the distribution.
-
-STAMPS += $(DEPDIR)/qtgui-generate-*
-
## Other cleaned files: dependency files generated by SWIG or this Makefile
MOSTLYCLEANFILES += $(DEPDIR)/*.S*
-## Add the .py and .cc files to the list of SWIG built sources. The
-## .h file is sometimes built, but not always ... so that one has to
-## be added manually by the including Makefile.am .
-
-swig_built_sources += qtgui.py qtgui.cc
-
## Various SWIG variables. These can be overloaded in the including
## Makefile.am by setting the variable value there, then including
## Makefile.swig .
@@ -82,13 +79,18 @@ qtgui_swiginclude_HEADERS = \
qtgui.i \
$(qtgui_swiginclude_headers)
+if PYTHON
qtgui_pylib_LTLIBRARIES = \
_qtgui.la
_qtgui_la_SOURCES = \
- qtgui.cc \
+ python/qtgui.cc \
$(qtgui_la_swig_sources)
+qtgui_python_PYTHON = \
+ qtgui.py \
+ $(qtgui_python)
+
_qtgui_la_LIBADD = \
$(STD_SWIG_LA_LIB_ADD) \
$(qtgui_la_swig_libadd)
@@ -99,161 +101,45 @@ _qtgui_la_LDFLAGS = \
_qtgui_la_CXXFLAGS = \
$(STD_SWIG_CXX_FLAGS) \
+ -I$(top_builddir) \
$(qtgui_la_swig_cxxflags)
-qtgui_python_PYTHON = \
- qtgui.py \
- $(qtgui_python)
+python/qtgui.cc: qtgui.py
+qtgui.py: qtgui.i
-## Entry rule for running SWIG
+# Include the python dependencies for this file
+-include python/qtgui.d
-qtgui.h qtgui.py qtgui.cc: qtgui.i
-## This rule will get called only when MAKE decides that one of the
-## targets needs to be created or re-created, because:
-##
-## * The .i file is newer than any or all of the generated files;
-##
-## * Any or all of the .cc, .h, or .py files does not exist and is
-## needed (in the case this file is not needed, the rule for it is
-## ignored); or
-##
-## * Some SWIG-based dependecy of the .cc file isn't met and hence the
-## .cc file needs be be regenerated. Explanation: Because MAKE
-## knows how to handle dependencies for .cc files (regardless of
-## their name or extension), then the .cc file is used as a target
-## instead of the .i file -- but with the dependencies of the .i
-## file. It is this last reason why the line:
-##
-## if test -f $@; then :; else
-##
-## cannot be used in this case: If a .i file dependecy is not met,
-## then the .cc file needs to be rebuilt. But if the stamp is newer
-## than the .cc file, and the .cc file exists, then in the original
-## version (with the 'test' above) the internal MAKE call will not
-## be issued and hence the .cc file will not be rebuilt.
-##
-## Once execution gets to here, it should always proceed no matter the
-## state of a stamp (as discussed in link above). The
-## $(DEPDIR)/qtgui-generate stuff is used to allow for parallel
-## builds to "do the right thing". The stamp has no relationship with
-## either the target files or dependency file; it is used solely for
-## the protection of multiple builds during a given call to MAKE.
-##
-## Catch signals SIGHUP (1), SIGINT (2), SIGPIPE (13), and SIGTERM
-## (15). At a caught signal, the quoted command will be issued before
-## exiting. In this case, remove any stamp, whether temporary of not.
-## The trap is valid until the process exits; the process includes all
-## commands appended via "\"s.
-##
- trap 'rm -rf $(DEPDIR)/qtgui-generate-*' 1 2 13 15; \
-##
-## Create a temporary directory, which acts as a lock. The first
-## process to create the directory will succeed and issue the MAKE
-## command to do the actual work, while all subsequent processes will
-## fail -- leading them to wait for the first process to finish.
-##
- if mkdir $(DEPDIR)/qtgui-generate-lock 2>/dev/null; then \
-##
-## This code is being executed by the first process to succeed in
-## creating the directory lock.
-##
-## Remove the stamp associated with this filename.
-##
- rm -f $(DEPDIR)/qtgui-generate-stamp; \
-##
-## Tell MAKE to run the rule for creating this stamp.
-##
- $(MAKE) $(AM_MAKEFLAGS) $(DEPDIR)/qtgui-generate-stamp WHAT=$<; \
-##
-## Now that the .cc, .h, and .py files have been (re)created from the
-## .i file, future checking of this rule during the same MAKE
-## execution will come back that the rule doesn't need to be executed
-## because none of the conditions mentioned at the start of this rule
-## will be positive. Remove the the directory lock, which frees up
-## any waiting process(es) to continue.
-##
- rmdir $(DEPDIR)/qtgui-generate-lock; \
- else \
-##
-## This code is being executed by any follower processes while the
-## directory lock is in place.
-##
-## Wait until the first process is done, testing once per second.
-##
- while test -d $(DEPDIR)/qtgui-generate-lock; do \
- sleep 1; \
- done; \
-##
-## Succeed if and only if the first process succeeded; exit this
-## process returning the status of the generated stamp.
-##
- test -f $(DEPDIR)/qtgui-generate-stamp; \
- exit $$?; \
- fi;
+endif # end of if python
-$(DEPDIR)/qtgui-generate-stamp:
-## This rule will be called only by the first process issuing the
-## above rule to succeed in creating the lock directory, after
-## removing the actual stamp file in order to guarantee that MAKE will
-## execute this rule.
-##
-## Call SWIG to generate the various output files; special
-## post-processing on 'mingw32' host OS for the dependency file.
-##
- if $(SWIG) $(STD_SWIG_PYTHON_ARGS) $(qtgui_swig_args) \
- -MD -MF $(DEPDIR)/qtgui.Std \
- -module qtgui -o qtgui.cc $(WHAT); then \
- if test $(host_os) = mingw32; then \
- $(RM) $(DEPDIR)/qtgui.Sd; \
- $(SED) 's,\\\\,/,g' < $(DEPDIR)/qtgui.Std \
- > $(DEPDIR)/qtgui.Sd; \
- $(RM) $(DEPDIR)/qtgui.Std; \
- $(MV) $(DEPDIR)/qtgui.Sd $(DEPDIR)/qtgui.Std; \
- fi; \
- else \
- $(RM) $(DEPDIR)/qtgui.S*; exit 1; \
- fi;
-##
-## Mess with the SWIG output .Std dependency file, to create a
-## dependecy file valid for the input .i file: Basically, simulate the
-## dependency file created for libraries by GNU's libtool for C++,
-## where all of the dependencies for the target are first listed, then
-## each individual dependency is listed as a target with no further
-## dependencies.
-##
-## (1) remove the current dependency file
-##
- $(RM) $(DEPDIR)/qtgui.d
-##
-## (2) Copy the whole SWIG file:
-##
- cp $(DEPDIR)/qtgui.Std $(DEPDIR)/qtgui.d
-##
-## (3) all a carriage return to the end of the dependency file.
-##
- echo "" >> $(DEPDIR)/qtgui.d
-##
-## (4) from the SWIG file, remove the first line (the target); remove
-## trailing " \" and " " from each line. Append ":" to each line,
-## followed by 2 carriage returns, then append this to the end of
-## the dependency file.
-##
- $(SED) -e '1d;s, \\,,g;s, ,,g' < $(DEPDIR)/qtgui.Std | \
- awk '{ printf "%s:\n\n", $$0 }' >> $(DEPDIR)/qtgui.d
-##
-## (5) remove the SWIG-generated file
-##
- $(RM) $(DEPDIR)/qtgui.Std
-##
-## Create the stamp for this filename generation, to signal success in
-## executing this rule; allows other threads waiting on this process
-## to continue.
-##
- touch $(DEPDIR)/qtgui-generate-stamp
+if GUILE
+
+qtgui_scmlib_LTLIBRARIES = \
+ libguile-gnuradio-qtgui.la
+libguile_gnuradio_qtgui_la_SOURCES = \
+ guile/qtgui.cc \
+ $(qtgui_la_swig_sources)
+nobase_qtgui_scm_DATA = \
+ gnuradio/qtgui.scm \
+ gnuradio/qtgui-primitive.scm
+libguile_gnuradio_qtgui_la_LIBADD = \
+ $(STD_SWIG_LA_LIB_ADD) \
+ $(qtgui_la_swig_libadd)
+libguile_gnuradio_qtgui_la_LDFLAGS = \
+ $(STD_SWIG_LA_LD_FLAGS) \
+ $(qtgui_la_swig_ldflags)
+libguile_gnuradio_qtgui_la_CXXFLAGS = \
+ $(STD_SWIG_CXX_FLAGS) \
+ -I$(top_builddir) \
+ $(qtgui_la_swig_cxxflags)
+
+guile/qtgui.cc: gnuradio/qtgui.scm
+gnuradio/qtgui.scm: qtgui.i
+gnuradio/qtgui-primitive.scm: gnuradio/qtgui.scm
+
+# Include the guile dependencies for this file
+-include guile/qtgui.d
-# KLUDGE: Force runtime include of a SWIG dependency file. This is
-# not guaranteed to be portable, but will probably work. If it works,
-# we have accurate dependencies for our swig stuff, which is good.
+endif # end of GUILE
-@am__include@ @am__quote@./$(DEPDIR)/qtgui.d@am__quote@
diff --git a/gr-qtgui/src/lib/SpectrumGUIClass.cc b/gr-qtgui/src/lib/SpectrumGUIClass.cc
index 563ed34ba..052730fc2 100644
--- a/gr-qtgui/src/lib/SpectrumGUIClass.cc
+++ b/gr-qtgui/src/lib/SpectrumGUIClass.cc
@@ -6,8 +6,8 @@
#include <QEvent>
#include <QCustomEvent>
-const long SpectrumGUIClass::MAX_FFT_SIZE;
-const long SpectrumGUIClass::MIN_FFT_SIZE;
+const long SpectrumGUIClass::MAX_FFT_SIZE = 32768;
+const long SpectrumGUIClass::MIN_FFT_SIZE = 1024;
SpectrumGUIClass::SpectrumGUIClass(const uint64_t maxDataSize,
const uint64_t fftSize,
diff --git a/gr-qtgui/src/lib/SpectrumGUIClass.h b/gr-qtgui/src/lib/SpectrumGUIClass.h
index 63a340c34..57a749a6a 100644
--- a/gr-qtgui/src/lib/SpectrumGUIClass.h
+++ b/gr-qtgui/src/lib/SpectrumGUIClass.h
@@ -67,8 +67,8 @@ public:
void DecrementPendingGUIUpdateEvents();
void ResetPendingGUIUpdateEvents();
- static const long MAX_FFT_SIZE = /*1048576*/32768;
- static const long MIN_FFT_SIZE = 1024;
+ static const long MAX_FFT_SIZE;
+ static const long MIN_FFT_SIZE;
QWidget* qwidget();
diff --git a/gr-qtgui/src/lib/TimeDomainDisplayPlot.h b/gr-qtgui/src/lib/TimeDomainDisplayPlot.h
index 5525bbabe..952b5c8cf 100644
--- a/gr-qtgui/src/lib/TimeDomainDisplayPlot.h
+++ b/gr-qtgui/src/lib/TimeDomainDisplayPlot.h
@@ -1,6 +1,7 @@
#ifndef TIME_DOMAIN_DISPLAY_PLOT_HPP
#define TIME_DOMAIN_DISPLAY_PLOT_HPP
+#include <stdint.h>
#include <cstdio>
#include <qwt_plot.h>
#include <qwt_painter.h>
diff --git a/gr-qtgui/src/lib/WaterfallDisplayPlot.cc b/gr-qtgui/src/lib/WaterfallDisplayPlot.cc
index 680c44756..a8e5361e7 100644
--- a/gr-qtgui/src/lib/WaterfallDisplayPlot.cc
+++ b/gr-qtgui/src/lib/WaterfallDisplayPlot.cc
@@ -12,6 +12,9 @@
#include <qapplication.h>
+#include <boost/date_time/posix_time/posix_time.hpp>
+namespace pt = boost::posix_time;
+
class FreqOffsetAndPrecisionClass
{
public:
@@ -135,16 +138,14 @@ public:
virtual QwtText label(double value) const
{
- QwtText returnLabel("");
-
timespec lineTime = timespec_add(GetZeroTime(), (-value) * GetSecondsPerLine());
- struct tm timeTm;
- gmtime_r(&lineTime.tv_sec, &timeTm);
- returnLabel = (QString("").sprintf("%04d/%02d/%02d\n%02d:%02d:%02d.%03ld",
- timeTm.tm_year+1900, timeTm.tm_mon+1,
- timeTm.tm_mday, timeTm.tm_hour, timeTm.tm_min,
- timeTm.tm_sec, lineTime.tv_nsec/1000000));
- return returnLabel;
+ std::string time_str = pt::to_simple_string(pt::from_time_t(lineTime.tv_sec));
+
+ // lops off the YYYY-mmm-DD part of the string
+ int ind = time_str.find(" ");
+ if(ind != std::string::npos)
+ time_str = time_str.substr(ind);
+ return QwtText(QString("").sprintf("%s.%03ld", time_str.c_str(), lineTime.tv_nsec/1000000));
}
virtual void initiateUpdate()
@@ -189,15 +190,14 @@ protected:
using QwtPlotZoomer::trackerText;
virtual QwtText trackerText( const QwtDoublePoint& p ) const
{
- QString yLabel("");
-
timespec lineTime = timespec_add(GetZeroTime(), (-p.y()) * GetSecondsPerLine());
- struct tm timeTm;
- gmtime_r(&lineTime.tv_sec, &timeTm);
- yLabel = (QString("").sprintf("%04d/%02d/%02d %02d:%02d:%02d.%03ld",
- timeTm.tm_year+1900, timeTm.tm_mon+1,
- timeTm.tm_mday, timeTm.tm_hour, timeTm.tm_min,
- timeTm.tm_sec, lineTime.tv_nsec/1000000));
+ std::string time_str = pt::to_simple_string(pt::from_time_t(lineTime.tv_sec));
+
+ // lops off the YYYY-mmm-DD part of the string
+ int ind = time_str.find(" ");
+ if(ind != std::string::npos)
+ time_str = time_str.substr(ind);
+ QString yLabel(QString("").sprintf("%s.%03ld", time_str.c_str(), lineTime.tv_nsec/1000000));
QwtText t(QString("%1 %2, %3").
arg(p.x(), 0, 'f', GetFrequencyPrecision()).
@@ -210,12 +210,6 @@ private:
};
-const int WaterfallDisplayPlot::INTENSITY_COLOR_MAP_TYPE_MULTI_COLOR;
-const int WaterfallDisplayPlot::INTENSITY_COLOR_MAP_TYPE_WHITE_HOT;
-const int WaterfallDisplayPlot::INTENSITY_COLOR_MAP_TYPE_BLACK_HOT;
-const int WaterfallDisplayPlot::INTENSITY_COLOR_MAP_TYPE_INCANDESCENT;
-const int WaterfallDisplayPlot::INTENSITY_COLOR_MAP_TYPE_USER_DEFINED;
-
WaterfallDisplayPlot::WaterfallDisplayPlot(QWidget* parent)
: QwtPlot(parent)
{
diff --git a/gr-qtgui/src/lib/WaterfallDisplayPlot.h b/gr-qtgui/src/lib/WaterfallDisplayPlot.h
index a5ccaec40..6b4e978bb 100644
--- a/gr-qtgui/src/lib/WaterfallDisplayPlot.h
+++ b/gr-qtgui/src/lib/WaterfallDisplayPlot.h
@@ -1,6 +1,7 @@
#ifndef WATERFALL_DISPLAY_PLOT_HPP
#define WATERFALL_DISPLAY_PLOT_HPP
+#include <stdint.h>
#include <cstdio>
#include <qwt_plot.h>
#include <qwt_plot_zoomer.h>
@@ -39,11 +40,13 @@ public:
const QColor GetUserDefinedLowIntensityColor()const;
const QColor GetUserDefinedHighIntensityColor()const;
- static const int INTENSITY_COLOR_MAP_TYPE_MULTI_COLOR = 0;
- static const int INTENSITY_COLOR_MAP_TYPE_WHITE_HOT = 1;
- static const int INTENSITY_COLOR_MAP_TYPE_BLACK_HOT = 2;
- static const int INTENSITY_COLOR_MAP_TYPE_INCANDESCENT = 3;
- static const int INTENSITY_COLOR_MAP_TYPE_USER_DEFINED = 4;
+ enum{
+ INTENSITY_COLOR_MAP_TYPE_MULTI_COLOR = 0,
+ INTENSITY_COLOR_MAP_TYPE_WHITE_HOT = 1,
+ INTENSITY_COLOR_MAP_TYPE_BLACK_HOT = 2,
+ INTENSITY_COLOR_MAP_TYPE_INCANDESCENT = 3,
+ INTENSITY_COLOR_MAP_TYPE_USER_DEFINED = 4
+ };
public slots:
void resizeSlot( QSize *s );
diff --git a/gr-qtgui/src/lib/plot_waterfall.h b/gr-qtgui/src/lib/plot_waterfall.h
index 2be677b10..a11461611 100644
--- a/gr-qtgui/src/lib/plot_waterfall.h
+++ b/gr-qtgui/src/lib/plot_waterfall.h
@@ -16,12 +16,10 @@ class QwtColorMap;
( the intensity ) is displayed using colors. The colors are calculated
from the values using a color map.
- \image html spectrogram3.png
-
\sa QwtRasterData, QwtColorMap
*/
-class QWT_EXPORT PlotWaterfall: public QwtPlotRasterItem
+class PlotWaterfall: public QwtPlotRasterItem
{
public:
explicit PlotWaterfall(WaterfallData* data, const QString &title = QString::null);
diff --git a/gr-qtgui/src/lib/qtgui.h b/gr-qtgui/src/lib/qtgui.h
index 6edbca12c..9831697ac 100644
--- a/gr-qtgui/src/lib/qtgui.h
+++ b/gr-qtgui/src/lib/qtgui.h
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2008 Free Software Foundation, Inc.
+ * Copyright 2008,2011 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -23,30 +23,31 @@
#ifndef INCLUDED_QTGUI_H
#define INCLUDED_QTGUI_H
+#include <gruel/thread.h>
#include <qapplication.h>
#include "SpectrumGUIClass.h"
class qtgui_event : public QEvent
{
private:
- pthread_mutex_t *pmutex;
+ gruel::mutex &d_mutex;
public:
- qtgui_event(pthread_mutex_t *mut)
- : QEvent((QEvent::Type)(QEvent::User+101))
+ qtgui_event(gruel::mutex &mutex)
+ : QEvent((QEvent::Type)(QEvent::User+101)),
+ d_mutex(mutex)
{
- pmutex = mut;
+ //nop
}
void lock()
{
- pthread_mutex_lock(pmutex);
-
+ d_mutex.lock();
}
void unlock()
{
- pthread_mutex_unlock(pmutex);
+ d_mutex.unlock();
}
};
diff --git a/gr-qtgui/src/lib/qtgui.i b/gr-qtgui/src/lib/qtgui.i
index 1f50bf43c..bb64c6ae2 100644
--- a/gr-qtgui/src/lib/qtgui.i
+++ b/gr-qtgui/src/lib/qtgui.i
@@ -120,3 +120,12 @@ public:
void set_constellation_pen_size(int size);
};
+#if SWIGGUILE
+%scheme %{
+(load-extension-global "libguile-gnuradio-qtgui" "scm_init_gnuradio_qtgui_module")
+%}
+
+%goops %{
+(use-modules (gnuradio gnuradio_core_runtime))
+%}
+#endif
diff --git a/gr-qtgui/src/lib/qtgui_sink_c.cc b/gr-qtgui/src/lib/qtgui_sink_c.cc
index c12c451b0..05c7b28d5 100644
--- a/gr-qtgui/src/lib/qtgui_sink_c.cc
+++ b/gr-qtgui/src/lib/qtgui_sink_c.cc
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2008,2009,2010 Free Software Foundation, Inc.
+ * Copyright 2008,2009,2010,2011 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -72,7 +72,6 @@ qtgui_sink_c::qtgui_sink_c (int fftsize, int wintype,
}
d_main_gui = NULL;
- pthread_mutex_init(&d_pmutex, NULL);
lock();
// Perform fftshift operation;
@@ -107,12 +106,12 @@ qtgui_sink_c::forecast(int noutput_items, gr_vector_int &ninput_items_required)
void qtgui_sink_c::lock()
{
- pthread_mutex_lock(&d_pmutex);
+ d_mutex.lock();
}
void qtgui_sink_c::unlock()
{
- pthread_mutex_unlock(&d_pmutex);
+ d_mutex.unlock();
}
@@ -151,7 +150,7 @@ qtgui_sink_c::initialize(const bool opengl)
set_update_time(0.1);
d_object = new qtgui_obj(d_qApplication);
- qApp->postEvent(d_object, new qtgui_event(&d_pmutex));
+ qApp->postEvent(d_object, new qtgui_event(d_mutex));
}
@@ -289,7 +288,7 @@ qtgui_sink_c::general_work (int noutput_items,
int j=0;
const gr_complex *in = (const gr_complex*)input_items[0];
- pthread_mutex_lock(&d_pmutex);
+ gruel::scoped_lock lock(d_mutex);
// Update the FFT size from the application
fftresize();
@@ -322,8 +321,6 @@ qtgui_sink_c::general_work (int noutput_items,
}
}
- pthread_mutex_unlock(&d_pmutex);
-
consume_each(j);
return j;
}
diff --git a/gr-qtgui/src/lib/qtgui_sink_c.h b/gr-qtgui/src/lib/qtgui_sink_c.h
index 9aee66503..bbf9983b0 100644
--- a/gr-qtgui/src/lib/qtgui_sink_c.h
+++ b/gr-qtgui/src/lib/qtgui_sink_c.h
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2008,2009 Free Software Foundation, Inc.
+ * Copyright 2008,2009,2011 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -76,7 +76,7 @@ private:
double d_bandwidth;
std::string d_name;
- pthread_mutex_t d_pmutex;
+ gruel::mutex d_mutex;
bool d_shift;
gri_fft_complex *d_fft;
diff --git a/gr-qtgui/src/lib/qtgui_sink_f.cc b/gr-qtgui/src/lib/qtgui_sink_f.cc
index ab4fd082d..984c2803c 100644
--- a/gr-qtgui/src/lib/qtgui_sink_f.cc
+++ b/gr-qtgui/src/lib/qtgui_sink_f.cc
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2008,2009,2010 Free Software Foundation, Inc.
+ * Copyright 2008,2009,2010,2011 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -72,7 +72,6 @@ qtgui_sink_f::qtgui_sink_f (int fftsize, int wintype,
}
d_main_gui = NULL;
- pthread_mutex_init(&d_pmutex, NULL);
lock();
// Perform fftshift operation;
@@ -107,12 +106,12 @@ qtgui_sink_f::forecast(int noutput_items, gr_vector_int &ninput_items_required)
void qtgui_sink_f::lock()
{
- pthread_mutex_lock(&d_pmutex);
+ d_mutex.lock();
}
void qtgui_sink_f::unlock()
{
- pthread_mutex_unlock(&d_pmutex);
+ d_mutex.unlock();
}
void
@@ -146,7 +145,7 @@ qtgui_sink_f::initialize(const bool opengl)
set_update_time(0.1);
d_object = new qtgui_obj(d_qApplication);
- qApp->postEvent(d_object, new qtgui_event(&d_pmutex));
+ qApp->postEvent(d_object, new qtgui_event(d_mutex));
}
void
@@ -284,7 +283,7 @@ qtgui_sink_f::general_work (int noutput_items,
int j=0;
const float *in = (const float*)input_items[0];
- pthread_mutex_lock(&d_pmutex);
+ gruel::scoped_lock lock(d_mutex);
// Update the FFT size from the application
fftresize();
@@ -317,8 +316,6 @@ qtgui_sink_f::general_work (int noutput_items,
}
}
- pthread_mutex_unlock(&d_pmutex);
-
consume_each(j);
return j;
}
diff --git a/gr-qtgui/src/lib/qtgui_sink_f.h b/gr-qtgui/src/lib/qtgui_sink_f.h
index 0cac35d90..d80a6a198 100644
--- a/gr-qtgui/src/lib/qtgui_sink_f.h
+++ b/gr-qtgui/src/lib/qtgui_sink_f.h
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2008,2009 Free Software Foundation, Inc.
+ * Copyright 2008,2009,2011 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -74,7 +74,7 @@ private:
double d_bandwidth;
std::string d_name;
- pthread_mutex_t d_pmutex;
+ gruel::mutex d_mutex;
bool d_shift;
gri_fft_complex *d_fft;
diff --git a/gr-qtgui/src/python/Makefile.am b/gr-qtgui/src/python/Makefile.am
index 5544748df..31df63a44 100644
--- a/gr-qtgui/src/python/Makefile.am
+++ b/gr-qtgui/src/python/Makefile.am
@@ -29,7 +29,7 @@ noinst_PYTHON = \
usrp2_display.py \
usrp_display.py
-EXTRA_DIST = \
+EXTRA_DIST += \
qt_digital_window.ui
qtguipythondir = $(grpythondir)/qtgui