Hello,

I am am new to the gnuradio system and I have a USRP1 board running gnuradio-3.0.2 (I have a box that was setup with this older version).

I modified the usrp_oscope.py and scopesink.py code to run without the gui (files attached). I then decided to measure the time taken to retrieve a message from the msgq. I find that the time taken (at a decimrate of 256, 128, or 64) to get a single msg from the msgq (using msgq.delete_head()) to be anywhere between 30 - 60ms. This seems to be particularly high. I do have USB 2.0 on my machine. I also tried this with different fusb_nlocks and fusb_block_size params but I still get the same delay.

I have looked at the mailing list archive and I haven't really a post with the same issue.

Would anybody know why I might be seeing this error?

thanks,
Rohan
#!/usr/bin/env python
from gnuradio import gr, gru
from gnuradio import usrp
from gnuradio import eng_notation
from gnuradio.eng_option import eng_option
from optparse import OptionParser
import sys
import rnm_scopesink

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[1][0].dbid() >= 0:
        return (1, 0)
    return (0, 0)

class app_flow_graph(gr.flow_graph):
    def __init__(self):
        gr.flow_graph.__init__(self)

        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=16,
                          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)")
        parser.add_option("-8", "--width-8", action="store_true", default=False,
                          help="Enable 8-bit samples across USB")
        parser.add_option("-n", "--frame-decim", type="int", default=1,
                          help="set oscope frame decimation factor to n [default=1]")
        parser.add_option("-v", "--v-scale", type="eng_float", default=1000,
                          help="set oscope frame decimation factor to n [default=1]")
        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]")

        (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(decim_rate=options.decim,
                               nchan=1,
                               fusb_block_size=2048,
                               fusb_nblocks=4)
        if options.rx_subdev_spec is None:
            options.rx_subdev_spec = pick_subdevice(self.u)
        self.u.set_mux(usrp.determine_rx_mux_value(self.u, options.rx_subdev_spec))
    
        if options.width_8:
            width = 8
            shift = 8
            format = self.u.make_format(width, shift)
            print "format =", hex(format)
            r = self.u.set_format(format)
                          
        # determine the daughterboard subdevice we're using
        self.subdev = usrp.selected_subdev(self.u, options.rx_subdev_spec)
        
        input_rate = self.u.adc_freq() / self.u.decim_rate()
        
        self.scope = modified_scopesink.scope_sink_c(self, sample_rate=input_rate,
                                            frame_decim=options.frame_decim,
                                            v_scale=options.v_scale,
                                            t_scale=options.t_scale)
      self.connect(self.u, self.scope)
        
                          
        # set initial values
        
        if options.gain is None:
            # if no gain was specified, use the mid-point in dB
            g = self.subdev.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.subdev.freq_range()
            options.freq = float(r[0]+r[1])/2
        
        self.set_gain(options.gain)
                               
        if not(self.set_freq(options.freq)):  
            print "Failed to set initial frequency"
            
        
    def set_freq(self, target_freq):
        """
        Set the center frequency we're interested in.
            
        @param target_freq: frequency in Hz
        @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.
        """
        r = usrp.tune(self.u, 0, self.subdev, target_freq)
        
        if r:
            # update displayed value
            #print "Setting freq to " + str(target_freq)
            # update displayed value
            #print "Setting freq to " + str(target_freq)
            return True
        return False
                          
    def set_gain(self, gain):
        #print "Setting gain to " + str(gain)
       self.subdev.set_gain(gain)
            
    def set_decim(self, decim):
        ok = self.u.set_decim_rate(decim)
        if not ok:
            print "set_decim failed"
        input_rate = self.u.adc_freq() / self.u.decim_rate()
        self.scope.set_sample_rate(input_rate)
        if self.show_debug_info:  # update displayed values
            print "decim = " + str(self.u.decim_rate())
            print "[EMAIL PROTECTED] = " + str(self.u.adc_freq() / self.u.decim_rate())
        return ok              
        
def main():
    fg = app_flow_graph()
    fg.run()
    
if __name__ == '__main__':
    main()
            
        
        
            
        

#!/usr/bin/env python

from gnuradio import gr, gru, eng_notation
import Numeric
import threading
import struct
import sys
import os
import time


default_scopesink_size = (640, 240)
default_v_scale = 1000
default_frame_decim = 25

class scope_sink_f(gr.hier_block):
    def __init__(self, fg, sample_rate=1,
                 size=default_scopesink_size, frame_decim=default_frame_decim,
                 v_scale=default_v_scale, t_scale=None):
        msgq = gr.msg_queue(16)         # message queue that holds at most 2 messages
        self.guts = gr.oscope_sink_f(sample_rate, msgq)
        gr.hier_block.__init__(self, fg, self.guts, self.guts)

    def set_sample_rate(self, sample_rate):
        self.guts.set_sample_rate(sample_rate)
        self.win.info.set_sample_rate(sample_rate)

class scope_sink_c(gr.hier_block):
    def __init__(self, fg, sample_rate=1,
                 size=default_scopesink_size, frame_decim=default_frame_decim,
                 v_scale=default_v_scale, t_scale=None):
        self.msgq = gr.msg_queue(16)         # message queue that holds at most 2 messages
        c2f = gr.complex_to_float()
        self.guts = gr.oscope_sink_f(sample_rate, self.msgq)
        fg.connect((c2f, 0), (self.guts, 0))
        fg.connect((c2f, 1), (self.guts, 1))
        gr.hier_block.__init__(self, fg, c2f, self.guts)
        self.input_watcher = input_watcher(self, frame_decim)
        
    def set_sample_rate(self, sample_rate):
        self.guts.set_sample_rate(sample_rate)

class input_watcher (threading.Thread):
    def __init__ (self, fg, frame_decim, name="inputwatcher"):
        threading.Thread.__init__ (self, name="inputwatcher")
        self.setDaemon (1)
        self.fg = fg
        self.msgq = fg.msgq
        self.frame_decim = frame_decim
        self.iscan = 0
        self.keep_running = True
        self.count = 0  
        self.start ()

    
    def run (self):
                 
        while count < 500:
            t0 = time.time()
            msg = self.msgq.delete_head()
            t1 = time.time()
            diff = (t1 - t0) * 1000   #in ms
            print `dt`
        return
_______________________________________________
Discuss-gnuradio mailing list
Discuss-gnuradio@gnu.org
http://lists.gnu.org/mailman/listinfo/discuss-gnuradio

Reply via email to