diff options
-rwxr-xr-x | gr-uhd/apps/uhd_fft.py | 109 | ||||
-rwxr-xr-x | gr-uhd/apps/uhd_rx_cfile.py | 11 | ||||
-rw-r--r-- | gr-uhd/include/gr_uhd_usrp_source.h | 9 | ||||
-rw-r--r-- | gr-uhd/lib/gr_uhd_usrp_source.cc | 19 |
4 files changed, 95 insertions, 53 deletions
diff --git a/gr-uhd/apps/uhd_fft.py b/gr-uhd/apps/uhd_fft.py index a9bb1435e..f311a903b 100755 --- a/gr-uhd/apps/uhd_fft.py +++ b/gr-uhd/apps/uhd_fft.py @@ -48,7 +48,7 @@ class app_top_block(stdgui2.std_top_block): parser.add_option("-a", "--args", type="string", default="", help="UHD device address args , [default=%default]") parser.add_option("", "--spec", type="string", default=None, - help="Subdevice of UHD device where appropriate") + help="Subdevice of UHD device where appropriate") parser.add_option("-A", "--antenna", type="string", default=None, help="select Rx Antenna where appropriate") parser.add_option("-s", "--samp-rate", type="eng_float", default=1e6, @@ -61,25 +61,31 @@ class app_top_block(stdgui2.std_top_block): help="Enable waterfall display") parser.add_option("-S", "--oscilloscope", action="store_true", default=False, help="Enable oscilloscope display") - parser.add_option("", "--avg-alpha", type="eng_float", default=1e-1, - help="Set fftsink averaging factor, default=[%default]") - parser.add_option ("", "--averaging", action="store_true", default=False, + parser.add_option("", "--avg-alpha", type="eng_float", default=1e-1, + help="Set fftsink averaging factor, default=[%default]") + parser.add_option ("", "--averaging", action="store_true", default=False, help="Enable fftsink averaging, default=[%default]") - parser.add_option("", "--ref-scale", type="eng_float", default=1.0, - help="Set dBFS=0dB input value, default=[%default]") - parser.add_option("--fft-size", type="int", default=1024, + parser.add_option("", "--ref-scale", type="eng_float", default=1.0, + help="Set dBFS=0dB input value, default=[%default]") + parser.add_option("", "--fft-size", type="int", default=1024, help="Set number of FFT bins [default=%default]") - parser.add_option("--fft-rate", type="int", default=30, + parser.add_option("", "--fft-rate", type="int", default=30, help="Set FFT update rate, [default=%default]") + parser.add_option("", "--wire-format", type="string", default="sc16", + help="Set wire format from USRP [default=%default]") + parser.add_option("", "--scalar", type="int", default=1024, + help="Set scalar multiplier value sc8 wire format [default=%default]") (options, args) = parser.parse_args() if len(args) != 0: parser.print_help() sys.exit(1) - self.options = options + self.options = options self.show_debug_info = True + scalar="scalar="+str(options.scalar) self.u = uhd.usrp_source(device_addr=options.args, - stream_args=uhd.stream_args('fc32')) + stream_args=uhd.stream_args(cpu_format='fc32', + otw_format=options.wire_format, args=scalar)) # Set the subdevice spec if(options.spec): @@ -104,20 +110,20 @@ class app_top_block(stdgui2.std_top_block): self.scope = fftsink2.fft_sink_c (panel, fft_size=options.fft_size, sample_rate=input_rate, - ref_scale=options.ref_scale, + ref_scale=options.ref_scale, ref_level=20.0, y_divs = 12, average=options.averaging, - avg_alpha=options.avg_alpha, + avg_alpha=options.avg_alpha, fft_rate=options.fft_rate) self.frame.SetMinSize((800, 420)) self.connect(self.u, self.scope) self._build_gui(vbox) - self._setup_events() + self._setup_events() - + # set initial values if options.gain is None: @@ -162,18 +168,18 @@ class app_top_block(stdgui2.std_top_block): hbox.Add((5,0), 0, 0) g = self.u.get_gain_range() - # some configurations don't have gain control - if g.stop() > g.start(): - myform['gain'] = form.slider_field(parent=self.panel, - sizer=hbox, label="Gain", - weight=3, - min=int(g.start()), max=int(g.stop()), - callback=self.set_gain) + # some configurations don't have gain control + if g.stop() > g.start(): + myform['gain'] = form.slider_field(parent=self.panel, + sizer=hbox, label="Gain", + weight=3, + min=int(g.start()), max=int(g.stop()), + callback=self.set_gain) - hbox.Add((5,0), 0, 0) - vbox.Add(hbox, 0, wx.EXPAND) + hbox.Add((5,0), 0, 0) + vbox.Add(hbox, 0, wx.EXPAND) - self._build_subpanel(vbox) + self._build_subpanel(vbox) def _build_subpanel(self, vbox_arg): # build a secondary information panel (sometimes hidden) @@ -223,15 +229,15 @@ class app_top_block(stdgui2.std_top_block): self.myform['freq'].set_value(self.u.get_center_freq()) self.myform['rffreq'].set_value(r.actual_rf_freq) self.myform['dspfreq'].set_value(r.actual_dsp_freq) - if not self.options.oscilloscope: - self.scope.set_baseband_freq(target_freq) - return True + if not self.options.oscilloscope: + self.scope.set_baseband_freq(target_freq) + return True return False def set_gain(self, gain): - if self.myform.has_key('gain'): - self.myform['gain'].set_value(gain) # update displayed value + if self.myform.has_key('gain'): + self.myform['gain'].set_value(gain) # update displayed value self.u.set_gain(gain, 0) def set_samp_rate(self, samp_rate): @@ -245,31 +251,32 @@ class app_top_block(stdgui2.std_top_block): return True def _setup_events(self): - if not self.options.waterfall and not self.options.oscilloscope: - self.scope.win.Bind(wx.EVT_LEFT_DCLICK, self.evt_left_dclick) - + if not self.options.waterfall and not self.options.oscilloscope: + self.scope.win.Bind(wx.EVT_LEFT_DCLICK, self.evt_left_dclick) + def evt_left_dclick(self, event): - (ux, uy) = self.scope.win.GetXY(event) - if event.CmdDown(): - # Re-center on maximum power - points = self.scope.win._points - if self.scope.win.peak_hold: - if self.scope.win.peak_vals is not None: - ind = numpy.argmax(self.scope.win.peak_vals) - else: - ind = int(points.shape()[0]/2) - else: - ind = numpy.argmax(points[:,1]) + (ux, uy) = self.scope.win.GetXY(event) + if event.CmdDown(): + # Re-center on maximum power + points = self.scope.win._points + if self.scope.win.peak_hold: + if self.scope.win.peak_vals is not None: + ind = numpy.argmax(self.scope.win.peak_vals) + else: + ind = int(points.shape()[0]/2) + else: + ind = numpy.argmax(points[:,1]) + (freq, pwr) = points[ind] - target_freq = freq/self.scope.win._scale_factor - print ind, freq, pwr + target_freq = freq/self.scope.win._scale_factor + print ind, freq, pwr self.set_freq(target_freq) - else: - # Re-center on clicked frequency - target_freq = ux/self.scope.win._scale_factor - self.set_freq(target_freq) - - + else: + # Re-center on clicked frequency + target_freq = ux/self.scope.win._scale_factor + self.set_freq(target_freq) + + def main (): app = stdgui2.stdapp(app_top_block, "UHD FFT", nstatus=1) app.MainLoop() diff --git a/gr-uhd/apps/uhd_rx_cfile.py b/gr-uhd/apps/uhd_rx_cfile.py index ea2aad8fe..de44d4f56 100755 --- a/gr-uhd/apps/uhd_rx_cfile.py +++ b/gr-uhd/apps/uhd_rx_cfile.py @@ -39,12 +39,15 @@ class rx_cfile_block(gr.top_block): def __init__(self, options, filename): gr.top_block.__init__(self) + scalar="scalar="+str(options.scalar) # Create a UHD device source if options.output_shorts: - self._u = uhd.usrp_source(device_addr=options.args, stream_args=uhd.stream_args('sc16')) + self._u = uhd.usrp_source(device_addr=options.args, stream_args=uhd.stream_args('sc16', + options.wire_format, args=scalar)) self._sink = gr.file_sink(gr.sizeof_short*2, filename) else: - self._u = uhd.usrp_source(device_addr=options.args, stream_args=uhd.stream_args('fc32')) + self._u = uhd.usrp_source(device_addr=options.args, stream_args=uhd.stream_args('fc32', + options.wire_format, args=scalar)) self._sink = gr.file_sink(gr.sizeof_gr_complex, filename) # Set the subdevice spec @@ -127,6 +130,10 @@ def get_options(): help="verbose output") parser.add_option("", "--lo-offset", type="eng_float", default=None, help="set daughterboard LO offset to OFFSET [default=hw default]") + parser.add_option("", "--wire-format", type="string", default="sc16", + help="set wire format from USRP [default=%default") + parser.add_option("", "--scalar", type="int", default=1024, + help="set scalar multiplier value for sc8 wire format [default=%default]") (options, args) = parser.parse_args () if len(args) != 1: diff --git a/gr-uhd/include/gr_uhd_usrp_source.h b/gr-uhd/include/gr_uhd_usrp_source.h index e9fc41b93..8a799b397 100644 --- a/gr-uhd/include/gr_uhd_usrp_source.h +++ b/gr-uhd/include/gr_uhd_usrp_source.h @@ -455,6 +455,15 @@ public: * \return the multi usrp device object */ virtual uhd::usrp::multi_usrp::sptr get_device(void) = 0; + + /*! + * Convenience function for finite data acquisition. + * This is not to be used with the scheduler; rather, + * one can request samples from the USRP in python. + * //TODO multi-channel + * //TODO assumes fc32 + */ + virtual std::vector<std::complex<float> > finite_acquisition(const size_t nsamps) = 0; }; #endif /* INCLUDED_GR_UHD_USRP_SOURCE_H */ diff --git a/gr-uhd/lib/gr_uhd_usrp_source.cc b/gr-uhd/lib/gr_uhd_usrp_source.cc index 51a756908..2244238bd 100644 --- a/gr-uhd/lib/gr_uhd_usrp_source.cc +++ b/gr-uhd/lib/gr_uhd_usrp_source.cc @@ -409,6 +409,25 @@ public: return true; } + std::vector<std::complex<float> > finite_acquisition(const size_t nsamps){ + #ifdef GR_UHD_USE_STREAM_API + uhd::stream_cmd_t cmd(uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE); + cmd.num_samps = nsamps; + cmd.stream_now = true; + _dev->issue_stream_cmd(cmd); + + std::vector<std::complex<float> > samps(nsamps); + const size_t actual_num_samps = _rx_stream->recv( + &samps.front(), nsamps, _metadata, 0.1 + ); + samps.resize(actual_num_samps); + + return samps; + #else + throw std::runtime_error("not implemented in this version"); + #endif + } + private: uhd::usrp::multi_usrp::sptr _dev; const uhd::stream_args_t _stream_args; |