📄 radio.py
字号:
#!/usr/bin/env python# GUI interactions and high level connections handled here.## Interacts with classes defined by wxGlade in ui.py.## The usual gnuradio copyright boilerplate incorperated here by reference.## M. Revnell 2006-Janfrom threading import *import wximport wx.lib.evtmgr as emimport timefrom gnuradio import gr, gru, eng_notation, optfirfrom gnuradio import audiofrom gnuradio import usrpfrom gnuradio import blksfrom gnuradio.wxgui import fftsinkfrom gnuradio.wxgui import waterfallsinkfrom gnuradio.wxgui import scopesinkfrom input import *from output import *from ssbdemod import *from ssbagc import *from ui import *from math import log10class graph( gr.hier_block ): def __init__( self, fg ): self.graph = fg self.fe_decim = 250 self.src = input( self.fe_decim ) self.adc_rate = self.src.adc_rate self.fe_rate = self.adc_rate / self.fe_decim self.filter_decim = 1 self.audio_decim = 16 self.demod_rate = self.fe_rate / self.filter_decim self.audio_rate = self.demod_rate / self.audio_decim self.demod = ssb_demod( fg, self.demod_rate, self.audio_rate ) self.agc = agc( fg ) #self.agc = gr.agc_ff() self.out = output( fg, self.audio_rate ) fg.connect( self.src.src, self.demod, self.agc, self.out ) gr.hier_block.__init__( self, fg, None, None ) def tune( self, freq ): fe_target = -freq self.src.set_freq( fe_target ) fe_freq = self.src.src.rx_freq( 0 ) demod_cf = fe_target - fe_freq self.demod.tune( demod_cf )class radio_frame( ui_frame ): def __init__( self, block, *args, **kwds ): ui_frame.__init__( self, *args, **kwds ) self.block = block self.freq_disp.SetRange(0, 30e6) f = self.block.src.freq self.freq_disp.SetValue( -f ) self.volume.SetRange( 0, 20 ) self.pga.SetRange( 0, 20 ) self.rssi_range = 1 self.rssi.SetRange( self.rssi_range ) self.agc_max.SetValue( str( self.rssi_range ) ) self.spin_e0.SetValue( 50 ) self.spin_e1.SetValue( 50 ) self.spin_e2.SetValue( 50 ) self.spin_e3.SetValue( 50 ) self.spin_e4.SetValue( 50 ) self.spin_e5.SetValue( 50 ) self.spin_e6.SetValue( 50 ) bw = 3.3e3 self.bandwidth.SetValue( str( bw ) ) self.block.demod.set_bw( bw ) self.bw_spin.SetValue( 5 ) agc_gain = self.block.agc.gain.k() self.agc_gain_s.SetValue( 5 ) self.agc_gain.SetValue( str( agc_gain ) ) agc_ref = self.block.agc.offs.k() self.agc_ref.SetValue( str( agc_ref ) ) self.agc_ref_s.SetValue( 5 ) self.fespectrum = fftsink.fft_sink_c( self.block.graph, self.fe_panel, fft_size=512, sample_rate = block.fe_rate, baseband_freq = 0, average = False, size = ( 680, 140 ) ) self.ifspectrum = fftsink.fft_sink_c( self.block.graph, self.if_panel, fft_size=512, sample_rate = block.audio_rate, baseband_freq = 0, average = False, size = ( 680, 140 ) ) em.eventManager.Register( self.fe_mouse, wx.EVT_MOTION, self.fespectrum.win ) em.eventManager.Register( self.fe_click, wx.EVT_LEFT_DOWN, self.fespectrum.win ) block.graph.connect( block.src.src, self.fespectrum ) block.graph.connect( block.demod.xlate, self.ifspectrum ) def agc_ref_up( self, event ): self.agc_ref_s.SetValue( 5 ) r = float( self.agc_ref.GetValue() ) r = r + 5 self.agc_ref.SetValue( str( r ) ) self.block.agc.offs.set_k( r ) def agc_ref_down( self, event ): self.agc_ref_s.SetValue( 5 ) r = float( self.agc_ref.GetValue() ) r = r - 5 self.agc_ref.SetValue( str( r ) ) self.block.agc.offs.set_k( r ) def agc_gain_up( self, event ): self.agc_gain_s.SetValue( 5 ) g = float(self.agc_gain.GetValue()) g = g + 10 self.agc_gain.SetValue( str( g ) ) self.block.agc.gain.set_k( g ) def agc_gain_down( self, event ): self.agc_gain_s.SetValue( 5 ) g = float(self.agc_gain.GetValue()) g = g - 10 self.agc_gain.SetValue( str( g ) ) self.block.agc.gain.set_k( g ) def fe_mouse( self, event ): f = int(self.freq_disp.GetValue()) f = f+((event.GetX()-346.)*(400./610.))*1000 self.fespectrum.win.SetToolTip( wx.ToolTip( eng_notation.num_to_str(f))) def fe_click( self, event ): f = int(self.freq_disp.GetValue()) f = f+((event.GetX()-346.)*(400./610.))*1000 self.tune( f ) def setrssi( self, level ): if level < 0: level = 0 if level > self.rssi_range: self.rssi_range = level self.rssi.SetRange( level ) self.agc_max.SetValue( str( level )) self.rssi.SetValue( level ) self.agc_level.SetValue( str( level )) def tune_evt( self, event ): f = self.freq_disp.GetValue() self.tune( f ) def tune( self, frequency ): self.freq_disp.SetValue( frequency ) self.block.tune( frequency ) def up_e0( self, event ): self.spin_e0.SetValue( 50 ) self.tune( self.freq_disp.GetValue() + 1e0 ) def down_e0( self, event ): self.spin_e0.SetValue( 50 ) self.tune( self.freq_disp.GetValue() - 1e0 ) def up_e1( self, event ): self.spin_e1.SetValue( 50 ) self.tune( self.freq_disp.GetValue() + 1e1 ) def down_e1( self, event ): self.spin_e1.SetValue( 50 ) self.tune( self.freq_disp.GetValue() - 1e1 ) def up_e2( self, event ): self.spin_e2.SetValue( 50 ) self.tune( self.freq_disp.GetValue() + 1e2 ) def down_e2( self, event ): self.spin_e2.SetValue( 50 ) self.tune( self.freq_disp.GetValue() - 1e2 ) def up_e3( self, event ): self.spin_e3.SetValue( 50 ) self.tune( self.freq_disp.GetValue() + 1e3 ) def down_e3( self, event ): self.spin_e3.SetValue( 50 ) self.tune( self.freq_disp.GetValue() - 1e3 ) def up_e4( self, event ): self.spin_e4.SetValue( 50 ) self.tune( self.freq_disp.GetValue() + 1e4 ) def down_e4( self, event ): self.spin_e4.SetValue( 50 ) self.tune( self.freq_disp.GetValue() - 1e4 ) def up_e5( self, event ): self.spin_e5.SetValue( 50 ) self.tune( self.freq_disp.GetValue() + 1e5 ) def down_e5( self, event ): self.spin_e5.SetValue( 50 ) self.tune( self.freq_disp.GetValue() - 1e5 ) def up_e6( self, event ): self.spin_e6.SetValue( 50 ) self.tune( self.freq_disp.GetValue() + 1e6 ) def down_e6( self, event ): self.spin_e6.SetValue( 50 ) self.tune( self.freq_disp.GetValue() - 1e6 ) def event_pga( self, event ): self.block.src.src.set_pga( 0, self.pga.GetValue()) def event_vol( self, event ): self.block.out.set( self.volume.GetValue()/20.0 ) def set_usb( self, event ): self.block.demod.upper_sb() def set_lsb( self, event ): self.block.demod.lower_sb() def set_am( self, event ): self.block.demod.set_am() def bw_up( self, event ): self.bw_spin.SetValue( 5 ) bw = float(self.bandwidth.GetValue()) bw = bw + 20.0 if bw > 10e3: bw = 10e3 self.bandwidth.SetValue( str( bw ) ) self.block.demod.set_bw( bw ) def bw_down( self, event ): self.bw_spin.SetValue( 5 ) bw = float(self.bandwidth.GetValue()) bw = bw - 20.0 if bw < 50: bw = 50 self.bandwidth.SetValue( str( bw ) ) self.block.demod.set_bw( bw )class radio( wx.App ): def OnInit( self ): self.graph = gr.flow_graph() self.block = graph( self.graph ) self.frame = radio_frame( self.block, None, -1, "Title" ) self.frame.Show( True ) self.SetTopWindow( self.frame ) return Truea=radio( 0 )l=gr.probe_signal_f()#l=gr.probe_avg_mag_sqrd_f(1,.001)a.graph.connect(a.block.agc.offs,l )#a.graph.connect(a.block.demod,l)def main_function(): global a a.MainLoop()def rssi_function(): global a global l while 1: level = l.level() wx.CallAfter( a.frame.setrssi, level ) time.sleep( .1 )thread1 = Thread( target = main_function )thread2 = Thread( target = rssi_function )thread1.start()thread2.start()a.graph.start()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -