<font size="4">Hi all and Josh,</font><div><font size="4"><br></font></div><div><font size="4">What I want to do is to control the streaming from the USRP by my own python code.</font></div><div><font size="4">usrp_source provides the start() and the stop() to control the streaming by issuing the command to USRP.</font></div>
<div><font size="4">However, when I try to use them in my python code, lots of problems block me.</font></div><div><font size="4"><br></font></div><div><font size="4">As my observation, when the flow graph is started, the gr_block.start() is actually called automatically. And the streaming is started right after the tb.start(). I want the streaming to be held until I explicitly call the usrp_source.start(). So I firstly tried usrp_source.stop() firstly as below:</font></div>
<div><font face="courier new, monospace"><br></font></div><div><div><font face="courier new, monospace">  tb.start()    # start flow graph</font></div><div><font face="courier new, monospace">  self.source.u.stop()</font></div>
<div><font face="courier new, monospace">  time.sleep(10) # wait 10 seconds to start the streaming</font></div><div><font face="courier new, monospace">  tb.source.u.start()</font></div><div style="font-size:large"> </div>
<div><font size="4">But the flow graph exits instantly at the stop(), as the usrp_source.work() will return WORK_DONE due to the streaming timeout (see gr_uhd_usrp_source.cc).</font></div><div style="font-size:large"><font size="4"><br>
</font></div><div style="font-size:large"><font size="4">Thus, I decide to change the code in <font face="courier new, monospace">gr_uhd_usrp_source.cc</font> as below:</font></div><div><ol style="font-size:large"><li><font size="4">When the usrp_source.start() is firstly called by the constructor of</font>gr_block_executor, I hold the streaming command. So the streaming will not be started when tb.start().</li>
<li>When usrp_source.start() is called in the second times, the streaming command is really issued to USRP. Code is like this:</li></ol><div><div><font face="courier new, monospace">  bool start(void){</font></div><div>
<font face="courier new, monospace">    #ifdef GR_UHD_USE_STREAM_API</font></div><div><font face="courier new, monospace">    _rx_stream = _dev->get_rx_stream(_stream_args);</font></div><div><font face="courier new, monospace">    _samps_per_packet = _rx_stream->get_max_num_samps();</font></div>
<div><font face="courier new, monospace">    #endif</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    // alex: need to wait the demand to start the streaming</font></div>
<div><font face="courier new, monospace">    // Note, start is firstly called by the gr_block_executor constructor</font></div><div><font face="courier new, monospace">    _start_count++; //update the _start_count to enbale the next start streaming.    </font></div>
<div><font face="courier new, monospace">    if (_start_on_demand == true && _start_count == 1){</font></div><div><font face="courier new, monospace">      return true; //First time called, not streaming</font></div>
<div><font face="courier new, monospace">    }</font></div></div><ol style="font-size:large"><li>In
gr_uhd_usrp_source::work(), if ERROR_CODE_TIMEOUT is reported, the code will try more instead of returning WORK_DONE:</li></ol><div><div><font face="courier new, monospace">    case uhd::rx_metadata_t::ERROR_CODE_TIMEOUT:</font></div>
<div><font face="courier new, monospace">      //Assume that the user called stop() on the flow graph.</font></div><div><font face="courier new, monospace">      //However, a timeout can occur under error conditions.</font></div>
<div><font face="courier new, monospace">      if (_start_on_demand == true)</font></div><div><font face="courier new, monospace">        //Start is first called by the gr_block_executor</font></div><div><font face="courier new, monospace">        //We are still waiting for the mannual start command</font></div>
<div><font face="courier new, monospace">        return work(noutput_items, input_items, output_items);</font></div><div><font face="courier new, monospace">     </font></div><div><font face="courier new, monospace">      return WORK_DONE;</font></div>
</div></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace"><br></font></div><div><font size="4">Unfortunately, although the new code passes the build, the behavior is still strange, for below python code:</font></div>
<div><div><font face="courier new, monospace">  tb.start()    # start flow graph</font></div><div><font face="courier new, monospace">  time.sleep(10) # wait 10 seconds to start the streaming</font></div><div><font face="courier new, monospace">  tb.source.u.start()</font></div>
</div><div><font size="4"><br></font></div><div><font size="4">Now the streaming is not started when tb.start() is called in the beginning. But when 10 seconds sleep ends, the flow graph crashes by reporting: "***glibc detected *** python: corrupted double-linked list: 0x00007fcb640011c0", apparently on calling the usrp_source.start()manually. I seems some memory issue happens, but in usrp_source.start(), it just tries send a command to USRP.</font></div>
<div><font size="4"><br></font></div><div><font size="4">I suppose the streaming start and stop should be used easily but not know why such kind of problem happens.</font></div><div><font size="4">Still debugging it, any comments are appreciated.</font></div>
<div><font size="4"><br></font></div><div><span style="font-size:large">--</span></div><br><font size="4">Alex,</font><div><i><font face="garamond, serif" size="4">Dreams can come true  just believe.</font></i></div><br>

</div>