diff options
-rw-r--r-- | gnuradio-examples/python/Makefile.am | 1 | ||||
-rw-r--r-- | gnuradio-examples/python/multi_usrp/.gitignore | 10 | ||||
-rw-r--r-- | gnuradio-examples/python/multi_usrp/Makefile.am | 31 | ||||
-rw-r--r-- | gnuradio-examples/python/multi_usrp/README | 266 | ||||
-rwxr-xr-x | gnuradio-examples/python/multi_usrp/multi_usrp_oscope.py | 343 | ||||
-rwxr-xr-x | gnuradio-examples/python/multi_usrp/multi_usrp_rx_cfile.py | 131 |
6 files changed, 0 insertions, 782 deletions
diff --git a/gnuradio-examples/python/Makefile.am b/gnuradio-examples/python/Makefile.am index 80a319dd7..4327fd359 100644 --- a/gnuradio-examples/python/Makefile.am +++ b/gnuradio-examples/python/Makefile.am @@ -23,7 +23,6 @@ include $(top_srcdir)/Makefile.common SUBDIRS = \ mp-sched \ - multi_usrp \ network \ pfb \ tags diff --git a/gnuradio-examples/python/multi_usrp/.gitignore b/gnuradio-examples/python/multi_usrp/.gitignore deleted file mode 100644 index c400497f5..000000000 --- a/gnuradio-examples/python/multi_usrp/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -/Makefile -/Makefile.in -/.la -/.lo -/.deps -/.libs -/*.la -/*.lo -/*.pyc -/*.pyo diff --git a/gnuradio-examples/python/multi_usrp/Makefile.am b/gnuradio-examples/python/multi_usrp/Makefile.am deleted file mode 100644 index 2ef10b6e8..000000000 --- a/gnuradio-examples/python/multi_usrp/Makefile.am +++ /dev/null @@ -1,31 +0,0 @@ -# -# Copyright 2006,2009 Free Software Foundation, Inc. -# -# This file is part of GNU Radio -# -# GNU Radio is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3, or (at your option) -# any later version. -# -# GNU Radio is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Radio; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, -# Boston, MA 02110-1301, USA. -# - -include $(top_srcdir)/Makefile.common - -ourdatadir = $(exampledir)/multi_usrp - -dist_ourdata_DATA = \ - README - -dist_ourdata_SCRIPTS = \ - multi_usrp_oscope.py \ - multi_usrp_rx_cfile.py diff --git a/gnuradio-examples/python/multi_usrp/README b/gnuradio-examples/python/multi_usrp/README deleted file mode 100644 index 057239104..000000000 --- a/gnuradio-examples/python/multi_usrp/README +++ /dev/null @@ -1,266 +0,0 @@ -# -# N.B., these files have not been converted to top_block/hier_block2 because -# those of doing the conversion don't have the setup to test this. -# As a result, these programs will no longer run until updated. -# - -Quick start multi-usrp: - -Unpack, build and install usrp, gnuradio-core and gr-usrp -Versions need to be more recent then 2.7cvs/svn 11 may 2006 - -Make sure usrp/fpga/rbf/rev2/multi*.rbf is installed in /usr/local/share/usrp/rev2/ -Make sure usrp/fpga/rbf/rev4/multi*.rbf is installed in /usr/local/share/usrp/rev4/ -(If in doubt, copy manually) - -build and install gr-wxgui gr-audio-xxx and so on. - -unpack gnuradio-examples. - -There is a gnuradio-examples/python/multi_usrp directory which contains examples - - -Put at least a basic RX or dbsrx board in RXA of the master and RXA of the slave board. -Make sure that the usrps have a serial or unique identifier programmed in their eeprom. -(All new rev 4.1 boards have this) -You can do without a serial but then you never know which usrp is the master and which is the slave. - - -CONNECTING THE CABLES -Now connect the 64MHz clocks between the boards with a short sma coax cable. -(See the wiki on how to enable clock-out and clock-in -http://gnuradio.org/trac/wiki/USRPClockingNotes ) - -You need one board with a clock out and one board with a clock in. - -You can choose any of the two boards as master or slave, this is not dependant on which board has the clock-out or in. -In my experiments I had fewer problems when the board that has the clock-in will be the master board. - -You can use a standard 16-pole flatcable to connect tvrx, basic-rx or dbsrx boards. -Of this 16pin flatcable only two pins are used (io15 and ground) -For all new daughterboards which use up a lot of io pins you have to use a cable with fewer connections. -The savest is using a 2pin headercable connected to io15,gnd (a cable like the ones used to connect frontpanel leds to the mainboard of a PC) - -If using basic rx board: - Connect a 16-pole flatcable from J25 on basicrx/dbs_rx in rxa of the master usrp to J25 on basicrx/dbsrx in RXA of the slave usrp - Don't twist the cable (Make sure the pin1 marker (red line on the flatcable) is on the same side of the connector (at io-8 on the master and at io8 on the slave.)) - For basic_rx this means the marker should be on the side of the dboard with the sma connectors. - For dbs_rx this means the marker should be on the side of the dboard with the two little chips. - In other words, don't twist the cable, you will burn your board if you do. - -You can also connect a flatcable with multiple connectors from master-J25 to slave1-J25 to slave2-J25 to ... -You will however have to think of something to create a common 64Mhz clock for more then two usrps. - -For all other daughterboards, connect a 2wire cable from masterRXA J25 io15,gnd to slaveRXA J25 io15,gnd - - -So now the hardware is setup, software is setup. Lets do some tests. - -Connect power to both usrps. -unpack the gnuradio_examples somewhere (cvs version later then 11 may 2006) -go to the gnuradio-examples/python/multi_usrp folder. - -Now run - ./multi_usrp_oscope.py -x 12345678 - -It should tell you that usrp 12345678 is not found and tell you which serials are available. - -Now run ./multi_usrp_oscope.py -x actualserialnum -You should now get an oscope with two channels, one is from the master and one is from the slave -It will which show the I-signal from channel 0 of the master usrp and I-signal from channel 0 of the slave usrp. -(For testing connect the same signal source to the inputs of both boards) -The signals should be aligned. -If you click the sync button, it will resync the master and slave (should never be needed) - -Now run -./multi_usrp_oscope.py --help -To see all available options. - - -Now you are ready to do phase-locked aligned signal processing. - -You can also capture to file with: -./multi_usrp_rx_cfile.py - -run ./multi_usrp_rx_cfile.py --help to see all available options. - - - -Here follows a description of the detail blocks used in usrp_multi.py - -Multi usrp - -With this code you can connect two or more usrps (with a locked clock) and get synchronised samples. -You must connect a (flat)cable between a dboard on the master in RXA and a dboard on the slave in RXA. -You then put one usrp in master mode, put the other in slave mode. - -The easiest thing to see how this works is just looking at the code in - multi_usrp_oscope.py - multi_usrp_rx_cfile.py - -Use the usrp_multi block which is installed by gr-usrp. -instantiate in the following way: - - self.multi=usrp_multi.multi_source_align( fg=self, master_serialno=options.master_serialno, decim=options.decim, nchan=options.nchan ) - -nchan should be 2 or 4. - -You determine which is the master by master_serialno (this is a text string a hexadecimal number). -If you enter a serial number which is not found it will print the serial numbers which are available. -If you give no serial number (master_serialno=None), the code will pick a Master for you. - -You can get a reference to the master and the slave usrp in the following way: - - self.um=self.multi.get_master_usrp() - self.us=self.multi.get_slave_usrp() - -You only need these references for setting freqs/gains or getting info about daughterboards. -Don't use the output directly but use the aligned output from multi.get_master_source_c() and multi.get_slave_source_c() - -You get references to the aligned output samples in the following way: -aligned_master_source_c=self.multi.get_master_source_c() -aligned_slave_source_c=self.multi.get_slave_source_c() - -These blocks have multiple outputs. -output 0 is the sample counter (high bits in I, low bits in Q) -You normally don't need the samplecounters so you can ignore output 0 - -output 1 is the first aligend output channel (if you enable 2 or 4 channels) -output 2 is the second output channel (only if you enable 4 channels) - -so the usefull 4 channels are: -self.aligned_master_chan1=(self.multi.get_master_source_c(),1) -self.aligned_master_chan2=(self.multi.get_master_source_c(),2) -self.aligned_slave_chan1=(self.multi.get_slave_source_c(),1) -self.aligned_slave_chan2=(self.multi.get_slave_source_c(),2) - -The two samplecounters are: -self.aligned_master_samplecounter=(self.multi.get_master_source_c(),0) -self.aligned_slave_samplecounter=(self.multi.get_slave_source_c(),0) - -You can set the gain or tune the frequency for all 4 receive daughetrboards at once: - self.multi.set_gain_all_rx(options.gain) - result,r1,r2,r3,r4 = self.multi.tune_all_rx(options.freq) - -This will only work reliably when you have all the same daughterboards. -Otherwise set all freqs and gains individually. - -You must call self.multi.sync() at least once AFTER the flowgraph has started running. -(This will synchronise the streams of the two usrps) - -This work was funded by Toby Oliver at Sensus Analytics / Path Intelligence. -Many Thanks for making this possible. - -It was written by Martin Dudok van Heel at Olifantasia. - - - -Here follows a brief of the new blocks and (changes)functionality written for multi-usrp support. - -You can also look at the generated documentation in -/usr/local/share/doc/gnuradio-core-X.X -/usr/local/share/doc/usrp-X.X -(Make sure to build and install the documentation, go to the doc directory of the sourcetree and issue make doc; make install) - - -gnuradio-examples: -new/changed files: -multi_usrp/multi_usrp_oscope.py -multi_usrp/multi_usrp_rx_cfile.py - - -gnuradio-core: -gr.align_on_samplenumbers_ss (int nchan,int align_interval) - -align several complex short (interleaved short) input channels with corresponding unsigned 32 bit sample_counters (provided as interleaved 16 bit values) - -Parameters: - nchan number of complex_short input channels (including the 32 bit counting channel) - align_interval interval at which the samples are aligned, ignored for now. - -Pay attention on how you connect this block It expects a minimum of 2 usrp_source_s with nchan number of channels and as mode usrp_prims.bmFR_MODE_RX_COUNTING_32BIT enabled. This means that the first complex_short channel is an interleaved 32 bit counter. The samples are aligned by dropping samples untill the samplenumbers match. - -files: -gnuradio-core/src/lib/general/gr_align_on_samplenumbers_ss.cc -gnuradio-core/src/lib/general/gr_align_on_samplenumbers_ss.h -gnuradio-core/src/lib/general/gr_align_on_samplenumbers_ss.i - - -gr-usrp - added _write_fpga_reg_masked - added usrp_multi.py - new usrp_multi block which can instantiate two linked usrps as master and slave and alignes their output. - It has a sync() function which should be called AFTER the flowgraph has started running. - bool sync(); - \brief Call this on a master usrp to sync master and slave by outputing a sync pulse on rx_a_io[15]. - The 32 bit samplecounter of master and slave will be reset to zero and all phase and buffer related things in the usrps are reset. - Call this only after the flowgraph has been started, otherwise there will be no effect since everything is kept in reset state as long as the flowgraph is not running. - \returns true if successfull. - -files: -configure.ac -src/Makefile.am -src/usrp1.i -src/usrp1_source_base.cc -src/usrp1_source_base.h -src/usrp_multi.py - -usrp-0.11cvsmulti: -usrp: - new constant bmFR_MODE_RX_COUNTING_32BIT (could also be added as extra mode like FPGA_MODE_COUNTING_32BIT) - Use this for the mode parameter when creating a usrp when you want to use the master/slave setup or if you want to use the 32 bit counter for other things, like testing with gr.check_counting_s(True) - - added register FR_RX_MASTER_SLAVE - added bitno and bitmaskes: - bmFR_MODE_RX_COUNTING_32BIT - - bitnoFR_RX_SYNC - bitnoFR_RX_SYNC_MASTER - bitnoFR_RX_SYNC_SLAVE - - bitnoFR_RX_SYNC_INPUT_IOPIN 15 - bmFR_RX_SYNC_INPUT_IOPIN (1<<bitnoFR_RX_SYNC_INPUT_IOPIN) - bitnoFR_RX_SYNC_OUTPUT_IOPIN 15 - bmFR_RX_SYNC_OUTPUT_IOPIN (1<<bitnoFR_RX_SYNC_OUTPUT_IOPIN) - - added _write_fpga_reg_masked() - added new toplevel folder usrp_multi - added usrp_multi.v and master_control_multi.v - added new MULTI_ON and COUNTER_32BIT_ON defines - If these are turned off usrp_multi.v will behave exactly as usrp_std.v - - added setting_reg_masked.v - changed reset behaviour of phase_acc.v and rx_buffer.v - - changed generate_regs.py to handle bm and bitno defines - - -files: -firmware/include/fpga_regs_standard.v -firmware/include/fpga_regs_common.h -firmware/include/generate_regs.py -firmware/include/fpga_regs_standard.h -host/lib/usrp_basic.h -host/lib/usrp_basic.cc -host/lib/usrp_standard.h -fpga/rbf/Makefile.am -fpga/toplevel/usrp_std/usrp_std.v -fpga/toplevel/usrp_multi/usrp_multi.esf -fpga/toplevel/usrp_multi/usrp_multi.vh -fpga/toplevel/usrp_multi/usrp_std.vh -fpga/toplevel/usrp_multi/usrp_multi_config_2rxhb_0tx.vh -fpga/toplevel/usrp_multi/usrp_multi_config_2rxhb_2tx.vh -fpga/toplevel/usrp_multi/usrp_multi.v -fpga/toplevel/usrp_multi/usrp_multi.qpf -fpga/toplevel/usrp_multi/usrp_multi.psf -fpga/toplevel/usrp_multi/usrp_multi_config_2rx_0tx.vh -fpga/toplevel/usrp_multi/usrp_multi.qsf -fpga/toplevel/usrp_multi/usrp_multi_config_4rx_0tx.vh -fpga/toplevel/usrp_multi/usrp_multi.csf -fpga/toplevel/usrp_multi/.cvsignore -fpga/sdr_lib/rx_buffer.v -fpga/sdr_lib/master_control_multi.v -fpga/sdr_lib/phase_acc.v -fpga/sdr_lib/setting_reg_masked.v - - diff --git a/gnuradio-examples/python/multi_usrp/multi_usrp_oscope.py b/gnuradio-examples/python/multi_usrp/multi_usrp_oscope.py deleted file mode 100755 index 512b125a4..000000000 --- a/gnuradio-examples/python/multi_usrp/multi_usrp_oscope.py +++ /dev/null @@ -1,343 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2004,2005,2006 Free Software Foundation, Inc. -# -# This file is part of GNU Radio -# -# GNU Radio is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3, or (at your option) -# any later version. -# -# GNU Radio is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Radio; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, -# Boston, MA 02110-1301, USA. -# - -# print "Loading revised usrp_oscope with additional options for scopesink..." - -from gnuradio import gr, gru -from gnuradio import usrp -from gnuradio import eng_notation -from gnuradio.eng_option import eng_option -from gnuradio.wxgui import stdgui, fftsink, waterfallsink, scopesink, form, slider -from optparse import OptionParser -import wx -import sys - -import time -from gnuradio import usrp_multi - - -def pick_subdevice(u): - """ - The user didn't specify a subdevice on the command line. - If there's a daughterboard on A, select A. - If there's a daughterboard on B, select B. - Otherwise, select A. - """ - if u.db(0, 0).dbid() >= 0: # dbid is < 0 if there's no d'board or a problem - return (0, 0) - if u.db(0, 0).dbid() >= 0: - return (1, 0) - return (0, 0) - - -class app_flow_graph(stdgui.gui_flow_graph): - def __init__(self, frame, panel, vbox, argv): - stdgui.gui_flow_graph.__init__(self) - - self.frame = frame - self.panel = panel - - parser = OptionParser(option_class=eng_option) - parser.add_option("-R", "--rx-subdev-spec", type="subdev", default=None, - help="select USRP Rx side A or B (default=first one with a daughterboard)") - parser.add_option("-d", "--decim", type="int", default=128, - help="set fgpa decimation rate to DECIM [default=%default]") - parser.add_option("-f", "--freq", type="eng_float", default=None, - help="set frequency to FREQ", metavar="FREQ") - parser.add_option("-g", "--gain", type="eng_float", default=None, - help="set gain in dB (default is midpoint)") - #align interval is default not yet enabled in gr.align_on_samplenumbers_ss - #parser.add_option("-a", "--align_interval", type="int", default=-1, - # help="Align master and slave every so much samples.") - - # width 8 does not work yet with multi_usrp because it interferes with the 32 bit samplecounter - #parser.add_option("-8", "--width-8", action="store_true", default=False, - # help="Enable 8-bit samples across USB") - parser.add_option("-m", "--mux", type="intx", default=None, - help="set fpga FR_RX_MUX register to MUX") - parser.add_option("-n", "--frame-decim", type="int", default=1, - help="set oscope frame decimation factor to n [default=1]") - parser.add_option("-N", "--nchan", type="int", default=2, - help="set nchannels to NCHAN") - parser.add_option("-q", "--show-q", action="store_true", default=False, - help="show the q value of the complex samples") - parser.add_option("-s", "--show-counters", action="store_true", default=False, - help="show the counters") - parser.add_option("-v", "--v-scale", type="eng_float", default=1000, - help="set oscope initial V/div to SCALE [default=%default]") - parser.add_option("-t", "--t-scale", type="eng_float", default=49e-6, - help="set oscope initial s/div to SCALE [default=50us]") - parser.add_option("-x", "--master-serialno", type="string", default=None, - help="Serial_no of the usrp which should be the MASTER (default= select any)") - (options, args) = parser.parse_args() - if len(args) != 0: - parser.print_help() - sys.exit(1) - - self.show_debug_info = True - - # build the graph - - #self.u = usrp.source_c(which=options.which_usrp,decim_rate=options.decim) - if (options.mux is None) | (4==options.nchan): - init_mux=None #use default mux which is 0x10321032 - else: - init_mux=options.mux - - init_gain=0.0 - init_freq=0.0 - init_align_interval=-1 - - self.multi=usrp_multi.multi_source_align( self, options.master_serialno, options.decim, - options.nchan, init_gain, init_freq, init_mux, init_align_interval) - self.um=self.multi.get_master_usrp() - self.us=self.multi.get_slave_usrp() - - if options.rx_subdev_spec is None: - options.rx_subdev_spec = pick_subdevice(self.um) - if (options.mux==None) and (options.nchan!=4): - mux=usrp.determine_rx_mux_value(self.um, options.rx_subdev_spec) - mux= (mux<<8 & 0xffffffff) | (mux & 0xff) - self.um.set_mux(mux) - self.us.set_mux(mux) - - # width 8 does not work yet with multi_usrp because it interferes with the 32 bit samplecounter - #if options.width_8: - # width = 8 - # shift = 8 - # format = self.um.make_format(width, shift) - # r = self.um.set_format(format) - # r = self.us.set_format(format) - - # determine the daughterboard subdevice of the first channel we're using - self.subdevm = usrp.selected_subdev(self.um, options.rx_subdev_spec) - self.subdevs = usrp.selected_subdev(self.us, options.rx_subdev_spec) - - input_rate = self.um.adc_freq() / self.um.decim_rate() - - self.scope = scopesink.scope_sink_f(self, panel, sample_rate=input_rate, - frame_decim=options.frame_decim, - v_scale=options.v_scale, - t_scale=options.t_scale) - self.sink_count=0 - self.add_to_scope((self.multi.get_master_source_c(),1),options.show_q) - self.add_to_scope((self.multi.get_slave_source_c(),1),options.show_q) - if 4==options.nchan: - self.add_to_scope((self.multi.get_master_source_c(),2),options.show_q) - self.add_to_scope((self.multi.get_slave_source_c(),2),options.show_q) - - if options.show_counters: - self.add_to_scope((self.multi.get_master_source_c(),0),options.show_q) - self.add_to_scope((self.multi.get_slave_source_c(),0),options.show_q) - - self._build_gui(vbox) - - # set initial values - - if options.gain is None: - # if no gain was specified, use the mid-point in dB - g = self.subdevm.gain_range() - options.gain = float(g[0]+g[1])/2 - - if options.freq is None: - # if no freq was specified, use the mid-point - r = self.subdevm.freq_range() - options.freq = float(r[0]+r[1])/2 - - self.set_gain(options.gain) - - if self.show_debug_info: - self.myform['decim'].set_value(self.um.decim_rate()) - self.myform['fs@usb'].set_value(self.um.adc_freq() / self.um.decim_rate()) - self.myform['dbname'].set_value(self.subdevm.name()) - self.myform['baseband'].set_value(0) - self.myform['ddc'].set_value(0) - - if not(self.set_freq(options.freq)): - self._set_status_msg("Failed to set initial frequency") - - self.multi.print_db_info() - self.unsynced=True - frame.Bind(wx.EVT_IDLE, self.onIdle) - - def add_to_scope(self,source_c,show_q): - c2f= gr.complex_to_float () - self.connect(source_c, c2f) - self.connect((c2f,0), (self.scope,self.sink_count)) - self.sink_count=self.sink_count+1 - if show_q: - self.connect((c2f,1), (self.scope,self.sink_count)) - self.sink_count=self.sink_count+1 - - - def _set_status_msg(self, msg): - self.frame.GetStatusBar().SetStatusText(msg, 0) - - def _build_gui(self, vbox): - - def _form_set_freq(kv): - return self.set_freq(kv['freq']) - - vbox.Add(self.scope.win, 10, wx.EXPAND) - - # add control area at the bottom - self.myform = myform = form.form() - hbox = wx.BoxSizer(wx.HORIZONTAL) - hbox.Add((5,0), 0, 0) - myform['freq'] = form.float_field( - parent=self.panel, sizer=hbox, label="Center freq", weight=1, - callback=myform.check_input_and_call(_form_set_freq, self._set_status_msg)) - - hbox.Add((5,0), 0, 0) - g = self.subdevm.gain_range() - myform['gain'] = form.slider_field(parent=self.panel, sizer=hbox, label="Gain", - weight=3, - min=int(g[0]), max=int(g[1]), - callback=self.set_gain) - - hbox.Add((5,0), 0, 0) - buttonSync = form.button_with_callback(parent=self.panel, label='sync',callback=self.sync_usrps) - hbox.Add(buttonSync,0,wx.EXPAND) - - hbox.Add((5,0), 0, 0) - vbox.Add(hbox, 0, wx.EXPAND) - - self._build_subpanel(vbox) - - def _build_subpanel(self, vbox_arg): - # build a secondary information panel (sometimes hidden) - - # FIXME figure out how to have this be a subpanel that is always - # created, but has its visibility controlled by foo.Show(True/False) - - if not(self.show_debug_info): - return - - panel = self.panel - vbox = vbox_arg - myform = self.myform - - #panel = wx.Panel(self.panel, -1) - #vbox = wx.BoxSizer(wx.VERTICAL) - - hbox = wx.BoxSizer(wx.HORIZONTAL) - hbox.Add((5,0), 0) - myform['decim'] = form.static_float_field( - parent=panel, sizer=hbox, label="Decim") - - hbox.Add((5,0), 1) - myform['fs@usb'] = form.static_float_field( - parent=panel, sizer=hbox, label="Fs@USB") - - hbox.Add((5,0), 1) - myform['dbname'] = form.static_text_field( - parent=panel, sizer=hbox) - - hbox.Add((5,0), 1) - myform['baseband'] = form.static_float_field( - parent=panel, sizer=hbox, label="Analog BB") - - hbox.Add((5,0), 1) - myform['ddc'] = form.static_float_field( - parent=panel, sizer=hbox, label="DDC") - - hbox.Add((5,0), 0) - vbox.Add(hbox, 0, wx.EXPAND) - - - def set_freq(self, target_freq, sync=True): - """ - Set the center frequency we're interested in for all channels, - on all rx daughterboards on MASTER and SLAVE. - - @param target_freq: frequency in Hz - @param sync: sync the usrps after setting the freqs (this will clear any phase differences in the DDCS) - @rypte: bool - - Tuning is a two step process. First we ask the front-end to - tune as close to the desired frequency as it can. Then we use - the result of that operation and our target_frequency to - determine the value for the digital down converter. - """ - result,r1,r2,r3,r4 = self.multi.tune_all_rx(target_freq) - if sync: - self.sync_usrps() #sync master and slave and clear any DDC phase differences - if r1: - self.myform['freq'].set_value(target_freq) # update displayed value - if self.show_debug_info: - self.myform['baseband'].set_value(r1.baseband_freq) - self.myform['ddc'].set_value(r1.dxc_freq) - return result - - def set_freq_chan0(self, target_freq, sync=True): - """ - Set the center frequency we're interested in for rx chan 0 only on MASTER and SLAVE. - - @param target_freq: frequency in Hz - @param sync: sync the usrps after setting the freqs (this will clear any phase differences in the DDCS) - @rypte: bool - - Tuning is a two step process. First we ask the front-end to - tune as close to the desired frequency as it can. Then we use - the result of that operation and our target_frequency to - determine the value for the digital down converter. - """ - rm = usrp.tune(self.um, 0, self.subdevm, target_freq) - rs = usrp.tune(self.us, 0, self.subdevs, target_freq) - r=rm - if sync: - self.sync_usrps() #sync master and slave and clear any DDC phase differences - if r: - self.myform['freq'].set_value(target_freq) # update displayed value - if self.show_debug_info: - self.myform['baseband'].set_value(r.baseband_freq) - self.myform['ddc'].set_value(r.dxc_freq) - return True - - return False - - def set_gain(self, gain): - self.myform['gain'].set_value(gain) # update displayed value - self.multi.set_gain_all_rx(gain) - - def set_gain_chan0(self, gain): - self.myform['gain'].set_value(gain) # update displayed value - self.subdevm.set_gain(gain) - self.subdevs.set_gain(gain) - - def onIdle(self,evt): - if self.unsynced: - time.sleep(0.5) - self.unsynced=True - self.multi.sync() - self.unsynced=False - #print 'synced' - - def sync_usrps(self): - self.multi.sync() - -def main (): - app = stdgui.stdapp(app_flow_graph, "MULTI_USRP O'scope", nstatus=1) - app.MainLoop() - -if __name__ == '__main__': - main () diff --git a/gnuradio-examples/python/multi_usrp/multi_usrp_rx_cfile.py b/gnuradio-examples/python/multi_usrp/multi_usrp_rx_cfile.py deleted file mode 100755 index ca0ec97c2..000000000 --- a/gnuradio-examples/python/multi_usrp/multi_usrp_rx_cfile.py +++ /dev/null @@ -1,131 +0,0 @@ -#!/usr/bin/env python - -""" -Read samples 2 from two linked synchronised USRP's and write to file formatted as binary -single-precision complex values. -Make sure you read README on how to link the two usrps - -""" - -from gnuradio import gr, eng_notation -from gnuradio import audio -from gnuradio import usrp -from gnuradio.eng_option import eng_option -from optparse import OptionParser -import sys - -import time -from gnuradio import usrp_multi - -class my_top_block(gr.top_block): - - def __init__(self): - gr.top_block.__init__(self) - - usage="%prog: [options] output_filename" - parser = OptionParser(option_class=eng_option, usage=usage) - 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("-d", "--decim", type="int", default=128, - help="set selfpa decimation rate to DECIM [default=%default]") - parser.add_option("-f", "--freq", type="eng_float", default=0.0, - help="set frequency to FREQ", metavar="FREQ") - parser.add_option("-g", "--gain", type="eng_float", default=None, - help="set gain in dB (default is midpoint)") - parser.add_option("-n", "--nchan", type="intx", default=2, - help="set nchannels to NCHAN") - parser.add_option("-N", "--nsamples", type="eng_float", default=None, - help="number of samples to collect [default=+inf]") - parser.add_option ("-o", "--output-file-m", default="usrp_rx_m.dat", - help="write master data to FILE", metavar="FILE") - parser.add_option ("--output-file-m2", default="usrp_rx_m2.dat", - help="write master data from second channel to FILE", metavar="FILE") - parser.add_option ("-p", "--output-file-s", default="usrp_rx_s.dat", - help="write slave data to FILE", metavar="FILE") - parser.add_option ("--output-file-s2", default="usrp_rx_s2.dat", - help="write slave data from second channel to FILE", metavar="FILE") - parser.add_option("-x", "--master-serialno", type="string", default=None, - help="Serial_no of the usrp which should be the MASTER (default= select any)") - (options, args) = parser.parse_args () - if len(args) != 0: - parser.print_help() - raise SystemExit, 1 - - if options.freq is None: - parser.print_help() - sys.stderr.write('You must specify the frequency with -f FREQ\n'); - raise SystemExit, 1 - - # build the graph - self.multi=usrp_multi.multi_source_align( fg=self, master_serialno=options.master_serialno, decim=options.decim, - nchan=options.nchan ) - self.um=self.multi.get_master_usrp() - self.us=self.multi.get_slave_usrp() - - dst_m=gr.file_sink (gr.sizeof_gr_complex, options.output_file_m) - dst_s=gr.file_sink (gr.sizeof_gr_complex, options.output_file_s) - if options.nsamples is None: - self.connect((self.multi.get_master_source_c(),1),dst_m) - self.connect((self.multi.get_slave_source_c(),1),dst_s) - else: - head_m = gr.head(gr.sizeof_gr_complex, int(options.nsamples)) - head_s = gr.head(gr.sizeof_gr_complex, int(options.nsamples)) - self.connect((self.multi.get_master_source_c(),1),head_m,dst_m) - self.connect((self.multi.get_slave_source_c(),1),head_s,dst_s) - - if(4==options.nchan): - dst_m2=gr.file_sink (gr.sizeof_gr_complex, options.output_file_m2) - dst_s2=gr.file_sink (gr.sizeof_gr_complex, options.output_file_s2) - if options.nsamples is None: - self.connect((self.multi.get_master_source_c(),2),dst_m2) - self.connect((self.multi.get_slave_source_c(),2),dst_s2) - else: - head_m2 = gr.head(gr.sizeof_gr_complex, int(options.nsamples)) - head_s2 = gr.head(gr.sizeof_gr_complex, int(options.nsamples)) - self.connect((self.multi.get_master_source_c(),2),head_m2,dst_m2) - self.connect((self.multi.get_slave_source_c(),2),head_s2,dst_s2) - - if options.rx_subdev_spec is None: - options.rx_subdev_spec = usrp.pick_rx_subdevice(self.um) - - if (options.nchan!=4): - mux=usrp.determine_rx_mux_value(self.um, options.rx_subdev_spec) - mux= (mux<<8 & 0xffffffff) | (mux & 0xff) - self.um.set_mux(mux) - self.us.set_mux(mux) - - # determine the daughterboard subdevice we're using - self.subdevm = usrp.selected_subdev(self.um, options.rx_subdev_spec) - self.subdevs = usrp.selected_subdev(self.us, options.rx_subdev_spec) - print "Using MASTER RX d'board %s" % (self.subdevm.side_and_name(),) - print "Using SLAVE RX d'board %s" % (self.subdevs.side_and_name(),) - input_rate = self.um.adc_freq() / self.um.decim_rate() - print "USB sample rate %s" % (eng_notation.num_to_str(input_rate)) - - if options.gain is None: - # if no gain was specified, use the mid-point in dB - g = self.subdevm.gain_range() - options.gain = float(g[0]+g[1])/2 - - self.multi.set_gain_all_rx(options.gain) - result,r1,r2,r3,r4 = self.multi.tune_all_rx(options.freq) - if not result: - sys.stderr.write('Failed to set frequency\n') - raise SystemExit, 1 - - def sync_usrps(self): - self.multi.sync() - - -if __name__ == '__main__': - tb=my_top_block() - tb.start() - #time.sleep(0.5) - tb.sync_usrps() - raw_input ('Press Enter to quit: ') - tb.stop() - #try: - # fg.start() - # fg.sync_usrps() - #except KeyboardInterrupt: - # pass |