All,

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];
        ninput_items_used_in_this_work_call++;
         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?


Thanks,
Mahboob

_______________________________________________
Discuss-gnuradio mailing list
Discuss-gnuradio@gnu.org
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio

Reply via email to