diff options
author | max <max@65a5c917-d112-43f1-993d-58c26a4786be> | 2011-07-08 20:58:59 +0000 |
---|---|---|
committer | max <max@65a5c917-d112-43f1-993d-58c26a4786be> | 2011-07-08 20:58:59 +0000 |
commit | ad335ff1e62abeee6454cd6d8b55908483155854 (patch) | |
tree | c70a1b9bdd4a0d7812e4fbcd7f4e610caaad1f0f | |
parent | 20fd5593ad259da8ed5702ccd415af0c3b9128ac (diff) |
add audio-if,wireshark,constellation with population,fixes
git-svn-id: http://op25.osmocom.org/svn/trunk@290 65a5c917-d112-43f1-993d-58c26a4786be
-rwxr-xr-x | repeater/src/python/scope.py | 67 |
1 files changed, 50 insertions, 17 deletions
diff --git a/repeater/src/python/scope.py b/repeater/src/python/scope.py index f851c19..bc6eb24 100755 --- a/repeater/src/python/scope.py +++ b/repeater/src/python/scope.py @@ -43,6 +43,8 @@ import gnuradio.wxgui.plot as plot speeds = [300, 600, 900, 1200, 1440, 1800, 1920, 2400, 2880, 3200, 3600, 3840, 4000, 4800, 6400, 7200, 8000, 9600, 14400, 19200] +WIRESHARK_PORT = 23456 + # The P25 receiver # class p25_rx_block (stdgui2.std_top_block): @@ -56,16 +58,18 @@ class p25_rx_block (stdgui2.std_top_block): # command line argument parsing parser = OptionParser(option_class=eng_option) parser.add_option("-a", "--audio", action="store_true", default=False, help="use direct audio input") + parser.add_option("-A", "--audio-if", action="store_true", default=False, help="soundcard IF mode (use --calibration to set IF freq)") parser.add_option("-I", "--audio-input", type="string", default="", help="pcm input device name. E.g., hw:0,0 or /dev/dsp") parser.add_option("-i", "--input", default=None, help="input file name") - parser.add_option("-b", "--excess-bw", type="eng_float", default=0.2, help="offset frequency", metavar="Hz") + parser.add_option("-b", "--excess-bw", type="eng_float", default=0.2, help="for RRC filter", metavar="Hz") parser.add_option("-c", "--calibration", type="eng_float", default=0.0, help="offset frequency", metavar="Hz") - parser.add_option("-o", "--offset", type="eng_float", default=0.0, help="offset frequency", metavar="Hz") - parser.add_option("-C", "--costas-alpha", type="eng_float", default=0.10, help="offset frequency", metavar="Hz") + parser.add_option("-C", "--costas-alpha", type="eng_float", default=0.125, help="offset frequency", metavar="Hz") parser.add_option("-f", "--frequency", type="eng_float", default=0.0, help="USRP center frequency", metavar="Hz") parser.add_option("-d", "--decim", type="int", default=200, help="source decimation factor") parser.add_option("-v", "--verbosity", type="int", default=10, help="message debug level") - parser.add_option("-w", "--wait", action="store_true", default=False, help="block on startup") + parser.add_option("-p", "--pause", action="store_true", default=False, help="block on startup") + parser.add_option("-w", "--wireshark", action="store_true", default=False, help="output data to Wireshark") + parser.add_option("-W", "--wireshark-host", type="string", default="127.0.0.1", help="Wireshark host") parser.add_option("-R", "--rx-subdev-spec", type="subdev", default=(0, 0), help="select USRP Rx side A or B (default=A)") parser.add_option("-g", "--gain", type="eng_float", default=None, help="set USRP gain in dB (default is midpoint) (or audio gain)") parser.add_option("-G", "--gain-mu", type="eng_float", default=0.025, help="gardner gain") @@ -90,6 +94,9 @@ class p25_rx_block (stdgui2.std_top_block): self.channel_rate = 48000 self.baseband_input = True + if options.audio_if: + self.channel_rate = 96000 + # setup (read-only) attributes self.symbol_rate = 4800 self.symbol_deviation = 600.0 @@ -114,7 +121,7 @@ class p25_rx_block (stdgui2.std_top_block): self.__init_gui(frame, panel, vbox) # wait for gdb - if options.wait: + if options.pause: print 'Ready for GDB to attach (pid = %d)' % (os.getpid(),) raw_input("Press 'Enter' to continue...") @@ -123,7 +130,10 @@ class p25_rx_block (stdgui2.std_top_block): self.open_file(options.input) elif options.frequency: self._set_state("CAPTURING") - self.open_usrp(options.rx_subdev_spec, options.decim, options.gain, options.frequency + options.offset, True) + self.open_usrp(options.rx_subdev_spec, options.decim, options.gain, options.frequency, True) + elif options.audio_if: + self._set_state("CAPTURING") + self.open_audio_c(self.channel_rate, options.gain, options.audio_input) elif options.audio: self._set_state("CAPTURING") self.open_audio(self.channel_rate, options.gain, options.audio_input) @@ -136,6 +146,7 @@ class p25_rx_block (stdgui2.std_top_block): # def __build_graph(self, source, capture_rate): global speeds + global WIRESHARK_PORT # tell the scope the source rate self.spectrum.set_sample_rate(capture_rate) # channel filter @@ -163,7 +174,10 @@ class p25_rx_block (stdgui2.std_top_block): self.buffer = gr.copy(gr.sizeof_float) msgq = gr.msg_queue(2) - self.sink_s = repeater.p25_frame_assembler('', 0, self.options.verbosity, 0, 0, 0, msgq) + udp_port = 0 + if self.options.wireshark: + udp_port = WIRESHARK_PORT + self.sink_s = repeater.p25_frame_assembler(self.options.wireshark_host, udp_port, self.options.verbosity, 0, 0, 0, msgq) if self.baseband_input: gain = 50.0 @@ -202,7 +216,10 @@ class p25_rx_block (stdgui2.std_top_block): self.channel_filter = gr.freq_xlating_fir_filter_ccf(channel_decim, coeffs, 0.0, capture_rate) self.set_channel_offset(0.0, 0, "") # local osc - self.lo = gr.sig_source_c (channel_rate, gr.GR_SIN_WAVE, 0.0, 1.0, 0) + self.lo_freq = 0.0 + if self.options.audio_if: + self.lo_freq = self.options.calibration + self.lo = gr.sig_source_c (channel_rate, gr.GR_SIN_WAVE, self.lo_freq, 1.0, 0) self.mixer = gr.multiply_cc() self.decim_sink = gr.file_sink(gr.sizeof_gr_complex, "32k-complex.dat") lpf_coeffs = gr.firdes.low_pass(1.0, self.channel_rate, 12000, 1200, gr.firdes.WIN_HANN) @@ -212,11 +229,10 @@ class p25_rx_block (stdgui2.std_top_block): nphases = 64 frac_bw = 0.25 - samp_rate = 320e3 rs_taps = gr.firdes.low_pass(nphases, nphases, frac_bw, 0.5-frac_bw) self.arb_resampler = blks2.pfb_arb_resampler_ccf( - float(self.basic_rate)/samp_rate, + float(self.basic_rate)/float(capture_rate), (rs_taps), nphases, ) @@ -232,12 +248,11 @@ class p25_rx_block (stdgui2.std_top_block): ntaps) self.symbol_filter_c = gr.interp_fir_filter_ccf(1, rrc_taps) - samp_rate = self.symbol_rate self.resamplers = [] for speed in speeds: resampler = blks2.pfb_arb_resampler_ccf( - float(speed)/float(samp_rate), + float(speed)/float(self.symbol_rate), (rs_taps), nphases, ) @@ -325,9 +340,11 @@ class p25_rx_block (stdgui2.std_top_block): if cscope != self.cscope_state: self.cscope_state = cscope if cscope == 0: - self.disconnect(self.diffdec, self.complex_scope) + # self.disconnect(self.diffdec, self.complex_scope) + self.disconnect(self.clock, self.complex_scope) else: - self.connect(self.diffdec, self.complex_scope) + # self.connect(self.diffdec, self.complex_scope) + self.connect(self.clock, self.complex_scope) if fscope != self.fscope_state: self.fscope_state = fscope @@ -529,7 +546,7 @@ class p25_rx_block (stdgui2.std_top_block): def set_freq_tune(self, val): self.myform['freq_tune'].set_value(val) - self.lo.set_frequency(val) + self.lo.set_frequency(val + self.lo_freq) def set_freq(self, target_freq): """ @@ -829,6 +846,22 @@ class p25_rx_block (stdgui2.std_top_block): except Exception, x: wx.MessageBox("Cannot open capture file: " + x.message, "File Error", wx.CANCEL | wx.ICON_EXCLAMATION) + def open_audio_c(self, capture_rate, gain, audio_input_filename): + self.info = { + "capture-rate": capture_rate, + "center-freq": 0, + "source-dev": "AUDIO", + "source-decim": 1 } + self.audio_source = audio.source(capture_rate, audio_input_filename) + self.audio_cvt = gr.float_to_complex() + self.connect((self.audio_source, 0), (self.audio_cvt, 0)) + self.connect((self.audio_source, 1), (self.audio_cvt, 1)) + self.source = gr.multiply_const_cc(gain) + self.connect(self.audio_cvt, self.source) + self.__set_rx_from_audio(capture_rate) + self._set_titlebar("Capturing") + self._set_state("CAPTURING") + def open_audio(self, capture_rate, gain, audio_input_filename): self.info = { "capture-rate": capture_rate, @@ -1596,7 +1629,7 @@ class constellation_plot_graph_window (plot.PlotCanvas): self.flag = False - def format_data (self, evt): + def format_data_orig (self, evt): if not self.info.running: return @@ -1633,7 +1666,7 @@ class constellation_plot_graph_window (plot.PlotCanvas): y_range = (-1.0, 1.0) self.Draw (graphics, xAxis=x_range, yAxis=y_range) - def format_data_pop (self, evt): + def format_data (self, evt): if not self.info.running: return |