3 # Copyright 2009 Free Software Foundation, Inc.
5 # This file is part of GNU Radio
7 # GNU Radio is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3, or (at your option)
12 # GNU Radio is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with GNU Radio; see the file COPYING. If not, write to
19 # the Free Software Foundation, Inc., 51 Franklin Street,
20 # Boston, MA 02110-1301, USA.
24 from gnuradio import gr
25 from gnuradio.gr.pubsub import pubsub
26 from gnuradio.wxgui import gui, forms
30 class app_gui(pubsub):
31 def __init__(self, frame, panel, vbox, top_block, options, args):
33 self.frame = frame # Use for top-level application window frame
34 self.panel = panel # Use as parent class for created windows
35 self.vbox = vbox # Use as sizer for created windows
36 self.tb = top_block # GUI-unaware flowgraph class
37 self.options = options # Supplied command-line options
38 self.args = args # Supplied command-line arguments
41 # Event response handlers
42 def evt_set_status_msg(self, msg):
43 self.frame.SetStatusText(msg, 0)
47 self.vbox.AddSpacer(5)
48 self.vbox.AddStretchSpacer()
49 ##################################################
51 ##################################################
52 bb_vbox = forms.static_box_sizer(parent=self.panel, label="Baseband Modulation", orient=wx.VERTICAL, bold=True)
53 self.vbox.Add(bb_vbox, 0, wx.EXPAND)
54 sine_bb_hbox = wx.BoxSizer(wx.HORIZONTAL)
55 sweep_bb_hbox = wx.BoxSizer(wx.HORIZONTAL)
56 tone_bb_hbox = wx.BoxSizer(wx.HORIZONTAL)
57 self.vbox.AddSpacer(10)
58 self.vbox.AddStretchSpacer()
59 #callback to show/hide forms
61 sine_bb_hbox.ShowItems(type == gr.GR_SIN_WAVE)
62 sweep_bb_hbox.ShowItems(type == 'sweep')
63 tone_bb_hbox.ShowItems(type == '2tone')
65 self.tb.subscribe(usrp_siggen.TYPE_KEY, set_type)
67 sine_bb_hbox.AddSpacer(10)
69 parent=self.panel, sizer=sine_bb_hbox,
70 label='Frequency (Hz)',
72 key=usrp_siggen.WAVEFORM_FREQ_KEY,
73 converter=forms.float_converter(),
75 sine_bb_hbox.AddStretchSpacer()
77 sweep_bb_hbox.AddSpacer(10)
79 parent=self.panel, sizer=sweep_bb_hbox,
80 label='Sweep Width (Hz)',
82 key=usrp_siggen.WAVEFORM_FREQ_KEY,
83 converter=forms.float_converter(),
85 sweep_bb_hbox.AddStretchSpacer()
87 parent=self.panel, sizer=sweep_bb_hbox,
88 label='Sweep Rate (Hz)',
90 key=usrp_siggen.WAVEFORM2_FREQ_KEY,
91 converter=forms.float_converter(),
93 sweep_bb_hbox.AddStretchSpacer()
95 tone_bb_hbox.AddSpacer(10)
97 parent=self.panel, sizer=tone_bb_hbox,
100 key=usrp_siggen.WAVEFORM_FREQ_KEY,
101 converter=forms.float_converter(),
103 tone_bb_hbox.AddStretchSpacer()
105 parent=self.panel, sizer=tone_bb_hbox,
108 key=usrp_siggen.WAVEFORM2_FREQ_KEY,
109 converter=forms.float_converter(),
111 tone_bb_hbox.AddStretchSpacer()
113 parent=self.panel, sizer=bb_vbox,
114 choices=usrp_siggen.waveforms.keys(),
115 labels=usrp_siggen.waveforms.values(),
117 key=usrp_siggen.TYPE_KEY,
118 style=wx.NO_BORDER | wx.RA_HORIZONTAL,
120 bb_vbox.AddSpacer(10)
121 bb_vbox.Add(sine_bb_hbox, 0, wx.EXPAND)
122 bb_vbox.Add(sweep_bb_hbox, 0, wx.EXPAND)
123 bb_vbox.Add(tone_bb_hbox, 0, wx.EXPAND)
124 set_type(self.tb[usrp_siggen.TYPE_KEY])
125 ##################################################
127 ##################################################
128 fc_vbox = forms.static_box_sizer(parent=self.panel, label="Center Frequency", orient=wx.VERTICAL, bold=True)
130 # First row of frequency controls (center frequency)
131 freq_hbox = wx.BoxSizer(wx.HORIZONTAL)
132 fc_vbox.Add(freq_hbox, 0, wx.EXPAND)
133 fc_vbox.AddSpacer(10)
134 # Second row of frequency controls (results)
135 tr_hbox = wx.BoxSizer(wx.HORIZONTAL)
136 fc_vbox.Add(tr_hbox, 0, wx.EXPAND)
138 # Add frequency controls to top window sizer
139 self.vbox.Add(fc_vbox, 0, wx.EXPAND)
140 self.vbox.AddSpacer(10)
141 self.vbox.AddStretchSpacer()
142 freq_hbox.AddSpacer(5)
144 parent=self.panel, sizer=freq_hbox,
146 converter=forms.float_converter(),
148 key=usrp_siggen.TX_FREQ_KEY,
150 freq_hbox.AddSpacer(10)
152 parent=self.panel, sizer=freq_hbox,
155 key=usrp_siggen.TX_FREQ_KEY,
156 minimum=self.tb[usrp_siggen.FREQ_RANGE_KEY][0],
157 maximum=self.tb[usrp_siggen.FREQ_RANGE_KEY][1],
160 freq_hbox.AddSpacer(5)
163 parent=self.panel, sizer=tr_hbox,
164 label='Daughterboard (Hz)',
166 key=usrp_siggen.BB_FREQ_KEY,
167 converter=forms.float_converter(),
170 tr_hbox.AddSpacer(10)
172 parent=self.panel, sizer=tr_hbox,
173 label='USRP DDC (Hz)',
175 key=usrp_siggen.DDC_FREQ_KEY,
176 converter=forms.float_converter(),
180 ##################################################
182 ##################################################
183 amp_hbox = forms.static_box_sizer(parent=self.panel, label="Amplitude", orient=wx.VERTICAL, bold=True)
184 amp_hbox.AddSpacer(5)
185 # First row of amp controls (ampl)
186 lvl_hbox = wx.BoxSizer(wx.HORIZONTAL)
187 amp_hbox.Add(lvl_hbox, 0, wx.EXPAND)
188 amp_hbox.AddSpacer(10)
189 # Second row of amp controls (tx gain)
190 gain_hbox = wx.BoxSizer(wx.HORIZONTAL)
191 amp_hbox.Add(gain_hbox, 0, wx.EXPAND)
192 amp_hbox.AddSpacer(5)
193 self.vbox.Add(amp_hbox, 0, wx.EXPAND)
194 self.vbox.AddSpacer(10)
195 self.vbox.AddStretchSpacer()
196 lvl_hbox.AddSpacer(5)
198 parent=self.panel, sizer=lvl_hbox,
200 converter=forms.float_converter(),
202 key=usrp_siggen.AMPLITUDE_KEY,
203 label="Level (0.0-1.0)",
205 lvl_hbox.AddSpacer(10)
207 parent=self.panel, sizer=lvl_hbox,
210 key=usrp_siggen.AMPLITUDE_KEY,
216 lvl_hbox.AddSpacer(5)
217 if self.tb[usrp_siggen.GAIN_RANGE_KEY][0] < self.tb[usrp_siggen.GAIN_RANGE_KEY][1]:
218 gain_hbox.AddSpacer(5)
220 parent=self.panel, sizer=gain_hbox,
222 converter=forms.float_converter(),
224 key=usrp_siggen.GAIN_KEY,
225 label="TX Gain (dB)",
227 gain_hbox.AddSpacer(10)
229 parent=self.panel, sizer=gain_hbox,
232 key=usrp_siggen.GAIN_KEY,
233 minimum=self.tb[usrp_siggen.GAIN_RANGE_KEY][0],
234 maximum=self.tb[usrp_siggen.GAIN_RANGE_KEY][1],
235 step_size=self.tb[usrp_siggen.GAIN_RANGE_KEY][2],
237 gain_hbox.AddSpacer(5)
238 ##################################################
239 # Sample Rate controls
240 ##################################################
241 sam_hbox = forms.static_box_sizer(parent=self.panel, label="Sample Rate", orient=wx.HORIZONTAL, bold=True)
242 self.vbox.Add(sam_hbox, 0, wx.EXPAND)
243 self.vbox.AddSpacer(10)
244 self.vbox.AddStretchSpacer()
245 sam_hbox.AddSpacer(5)
247 parent=self.panel, sizer=sam_hbox,
248 converter=forms.int_converter(),
250 key=usrp_siggen.INTERP_KEY,
251 label="Interpolation",
253 sam_hbox.AddStretchSpacer(20)
255 parent=self.panel, sizer=sam_hbox,
256 label='Sample Rate (sps)',
258 key=usrp_siggen.SAMP_RATE_KEY,
259 converter=forms.float_converter(),
261 sam_hbox.AddStretchSpacer(20)
263 parent=self.panel, sizer=sam_hbox,
264 label='Link Rate (bits/sec)',
266 key=usrp_siggen.LINK_RATE_KEY,
267 converter=forms.float_converter(),
269 sam_hbox.AddSpacer(5)
270 ##################################################
272 ##################################################
273 u2_hbox = forms.static_box_sizer(parent=self.panel, label="USRP Status", orient=wx.HORIZONTAL, bold=True)
274 self.vbox.Add(u2_hbox, 0, wx.EXPAND)
275 self.vbox.AddSpacer(10)
276 self.vbox.AddStretchSpacer()
277 u2_hbox.AddSpacer(10)
279 parent=self.panel, sizer=u2_hbox,
281 key=usrp_siggen.DESC_KEY,
282 converter=forms.str_converter(),
284 self.vbox.AddSpacer(5)
285 self.vbox.AddStretchSpacer()
287 if __name__ == "__main__":
289 # Get command line parameters
290 (options, args) = usrp_siggen.get_options()
292 # Create the top block using these
293 tb = usrp_siggen.top_block(options, args)
295 # Create the GUI application
296 app = gui.app(top_block=tb, # Constructed top block
297 gui=app_gui, # User interface class
298 options=options, # Command line options
299 args=args, # Command line args
300 title="USRP Signal Generator", # Top window title
301 nstatus=1, # Number of status lines
302 start=True, # Whether to start flowgraph
303 realtime=True) # Whether to set realtime priority
308 except RuntimeError, e: