[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Discuss-gnuradio] using general_work when output rate is not fixed

From: Rahman, Muhammad Mahboob Ur
Subject: [Discuss-gnuradio] using general_work when output rate is not fixed
Date: Sun, 9 Sep 2012 22:39:16 +0000


I have made a simple custom block (derived from gr_block class) whose general_work() function is given below:

int howto_my_custom_blk::general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items){
  const gr_complex *in = (const gr_complex *) input_items[0];
  const short *trigger = (const short *) input_items[1];
  gr_complex *out = (gr_complex *) output_items[0];

  int ninput_items_used_in_this_work_call;
  ninput_items_used_in_this_work_call = 0;

  for (int i = 0; i < noutput_items; i++){
    if (trigger[i] > 0) {
        out[i] = in[i];
         if (!tx_sob_sent) { this->make_sob_tag(this->nitems_written(0) + i); tx_sob_sent = true; tx_eob_sent = false;} 
    else {
        if (!tx_eob_sent) { this->make_eob_tag(this->nitems_written(0) + i-1); tx_eob_sent = true; tx_sob_sent = false; }    
  consume_each (ninput_items[0]);

  return ninput_items_used_in_this_work_call;

Some comments about the block ports:
In above custom block code,
in is an input which comes from uhd_usrp_source and consists of set of packets sent by some packet transmitter. 
trigger is an input which goes high (>0) every time a packet is detected and remains high thereafter for the duration of packet. It is essentially Tom's energy detection mechanism borrowed from uhd_burst_detector.py.
out is the block output which goes to uhd_usrp_sink.
In short, my custom block receives a set of packets and forwards it to the tx side of the usrp.

Now, I have some questions which are as follows:

-  When trigger goes high, the input samples at in (which correspond to the received packet) should be copied to the output and then sent to the uhd_usrp sink. But this is not the case, as I see using the external oscilloscope (and by recording the output out of the block into a file) that instead the noise samples are copied to output. Why it is so?
- As can be seen, general_work() returns ninput_items_used_in_this_work_call every time it is called by scheduler. Since trigger remains low most of the time, it means general_work() will produce no output samples most of the times it is called. But the output port out is connected to uhd_usrp_source which will produce underruns every time my custom block does not produce an output. I have put sob and eob tags to eliminate this problem but did not succeed. Any ideas, what might be wrong?
- Since my custom block is not a fixed ratio block, how should I override the forecast function, or, is it optional and meant for efficiency purposes?


reply via email to

[Prev in Thread] Current Thread [Next in Thread]