3
# Copyright 2011 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.
23
# GUI interactions and high level connections handled here.
25
# Interacts with classes defined by wxGlade in ui.py.
29
from threading import *
31
import wx.lib.evtmgr as em
34
from gnuradio import gr, gru, eng_notation, optfir
35
from gnuradio import audio
36
from gnuradio import uhd
37
from gnuradio import blks2
38
from gnuradio.wxgui import fftsink2
39
from gnuradio.wxgui import waterfallsink2
40
from gnuradio.wxgui import scopesink2
44
from ssbdemod import *
47
from math import log10
49
class radio_top_block( gr.top_block ):
51
gr.top_block.__init__(self, "radio_top_block")
53
self.address = "addr=192.168.11.2"
54
self.samp_rate = 256e3
57
self.src = uhd_input( self.address,
59
self.src.set_freq(self.freq)
60
self.src.set_gain(self.gain)
62
self.fe_rate = self.src.usrp_rate
65
self.demod_rate = self.fe_rate / self.filter_decim
66
self.audio_rate = self.demod_rate / self.audio_decim
67
self.audio_dev = "pulse"
69
self.demod = ssb_demod( self.demod_rate, self.audio_rate )
71
self.out = output( self.audio_rate, self.audio_dev )
73
self.connect( self.src, self.demod, self.agc, self.out )
75
def tune( self, freq ):
77
self.src.set_freq( fe_target )
78
demod_cf = fe_target - self.src.get_freq()
79
self.demod.tune( demod_cf )
81
class radio_frame( ui_frame ):
82
def __init__( self, block, *args, **kwds ):
83
ui_frame.__init__( self, *args, **kwds )
85
self.freq_disp.SetRange(0, 30e6)
86
f = self.block.src.freq
87
self.freq_disp.SetValue( -f )
88
self.volume.SetRange( 0, 20 )
89
self.pga.SetRange( 0, 20 )
91
self.rssi.SetRange( self.rssi_range )
92
self.agc_max.SetValue( str( self.rssi_range ) )
93
self.spin_e0.SetValue( 50 )
94
self.spin_e1.SetValue( 50 )
95
self.spin_e2.SetValue( 50 )
96
self.spin_e3.SetValue( 50 )
97
self.spin_e4.SetValue( 50 )
98
self.spin_e5.SetValue( 50 )
99
self.spin_e6.SetValue( 50 )
101
self.bandwidth.SetValue( str( bw ) )
102
self.block.demod.set_bw( bw )
103
self.bw_spin.SetValue( 5 )
104
agc_gain = self.block.agc.gain.k()
105
self.agc_gain_s.SetValue( 5 )
106
self.agc_gain.SetValue( str( agc_gain ) )
107
agc_ref = self.block.agc.offs.k()
108
self.agc_ref.SetValue( str( agc_ref ) )
109
self.agc_ref_s.SetValue( 5 )
111
self.fespectrum = fftsink2.fft_sink_c(
114
sample_rate = block.fe_rate,
120
self.ifspectrum = fftsink2.fft_sink_c(
123
sample_rate = block.audio_rate,
129
self.fespectrum.win.Bind( wx.EVT_MOTION, self.fe_mouse)
130
self.fespectrum.win.Bind( wx.EVT_LEFT_DOWN, self.fe_click)
132
block.connect( block.src.src, self.fespectrum )
133
block.connect( block.demod.xlate, self.ifspectrum )
135
def agc_ref_up( self, event ):
136
self.agc_ref_s.SetValue( 5 )
137
r = float( self.agc_ref.GetValue() )
139
self.agc_ref.SetValue( str( r ) )
140
self.block.agc.offs.set_k( r )
142
def agc_ref_down( self, event ):
143
self.agc_ref_s.SetValue( 5 )
144
r = float( self.agc_ref.GetValue() )
146
self.agc_ref.SetValue( str( r ) )
147
self.block.agc.offs.set_k( r )
149
def agc_gain_up( self, event ):
150
self.agc_gain_s.SetValue( 5 )
151
g = float(self.agc_gain.GetValue())
153
self.agc_gain.SetValue( str( g ) )
154
self.block.agc.gain.set_k( g )
156
def agc_gain_down( self, event ):
157
self.agc_gain_s.SetValue( 5 )
158
g = float(self.agc_gain.GetValue())
160
self.agc_gain.SetValue( str( g ) )
161
self.block.agc.gain.set_k( g )
163
def fe_mouse( self, event ):
164
f = int(self.freq_disp.GetValue())
165
f = f+((event.GetX()-346.)*(400./610.))*1000
166
self.fespectrum.win.SetToolTip(
167
wx.ToolTip( eng_notation.num_to_str(f)))
169
def fe_click( self, event ):
170
f = int(self.freq_disp.GetValue())
171
f = f+((event.GetX()-346.)*(400./610.))*1000
174
def setrssi( self, level ):
177
if level > self.rssi_range:
178
self.rssi_range = level
179
self.rssi.SetRange( level )
180
self.agc_max.SetValue( str( level ))
181
self.rssi.SetValue( level )
182
self.agc_level.SetValue( str( level ))
184
def tune_evt( self, event ):
185
f = self.freq_disp.GetValue()
188
def tune( self, frequency ):
189
self.freq_disp.SetValue( frequency )
190
self.block.tune( frequency )
192
def up_e0( self, event ):
193
self.spin_e0.SetValue( 50 )
194
self.tune( self.freq_disp.GetValue() + 1e0 )
196
def down_e0( self, event ):
197
self.spin_e0.SetValue( 50 )
198
self.tune( self.freq_disp.GetValue() - 1e0 )
200
def up_e1( self, event ):
201
self.spin_e1.SetValue( 50 )
202
self.tune( self.freq_disp.GetValue() + 1e1 )
204
def down_e1( self, event ):
205
self.spin_e1.SetValue( 50 )
206
self.tune( self.freq_disp.GetValue() - 1e1 )
208
def up_e2( self, event ):
209
self.spin_e2.SetValue( 50 )
210
self.tune( self.freq_disp.GetValue() + 1e2 )
212
def down_e2( self, event ):
213
self.spin_e2.SetValue( 50 )
214
self.tune( self.freq_disp.GetValue() - 1e2 )
216
def up_e3( self, event ):
217
self.spin_e3.SetValue( 50 )
218
self.tune( self.freq_disp.GetValue() + 1e3 )
220
def down_e3( self, event ):
221
self.spin_e3.SetValue( 50 )
222
self.tune( self.freq_disp.GetValue() - 1e3 )
224
def up_e4( self, event ):
225
self.spin_e4.SetValue( 50 )
226
self.tune( self.freq_disp.GetValue() + 1e4 )
228
def down_e4( self, event ):
229
self.spin_e4.SetValue( 50 )
230
self.tune( self.freq_disp.GetValue() - 1e4 )
232
def up_e5( self, event ):
233
self.spin_e5.SetValue( 50 )
234
self.tune( self.freq_disp.GetValue() + 1e5 )
236
def down_e5( self, event ):
237
self.spin_e5.SetValue( 50 )
238
self.tune( self.freq_disp.GetValue() - 1e5 )
240
def up_e6( self, event ):
241
self.spin_e6.SetValue( 50 )
242
self.tune( self.freq_disp.GetValue() + 1e6 )
244
def down_e6( self, event ):
245
self.spin_e6.SetValue( 50 )
246
self.tune( self.freq_disp.GetValue() - 1e6 )
248
def event_pga( self, event ):
249
self.block.src.set_gain(self.pga.GetValue())
251
def event_vol( self, event ):
252
self.block.out.set( self.volume.GetValue()/20.0 )
254
def set_usb( self, event ):
255
self.block.demod.upper_sb()
257
def set_lsb( self, event ):
258
self.block.demod.lower_sb()
260
def set_am( self, event ):
261
self.block.demod.set_am()
263
def bw_up( self, event ):
264
self.bw_spin.SetValue( 5 )
265
bw = float(self.bandwidth.GetValue())
269
self.bandwidth.SetValue( str( bw ) )
270
self.block.demod.set_bw( bw )
272
def bw_down( self, event ):
273
self.bw_spin.SetValue( 5 )
274
bw = float(self.bandwidth.GetValue())
278
self.bandwidth.SetValue( str( bw ) )
279
self.block.demod.set_bw( bw )
282
class radio( wx.App ):
284
self.block = radio_top_block()
285
self.frame = radio_frame( self.block, None, -1, "HF Receiver" )
286
self.frame.Show( True )
287
self.SetTopWindow( self.frame )
298
level = sig_probe.level()
299
wx.CallAfter( radio_obj.frame.setrssi, level )
305
global radio_obj, sig_probe
307
radio_obj = radio( 0 )
308
sig_probe = gr.probe_signal_f()
309
radio_obj.block.connect(radio_obj.block.agc.offs, sig_probe)
311
thread2 = Thread( target = rssi_function )
317
if __name__ == "__main__":