|
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 |
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
|
[Prev in Thread] | Current Thread | [Next in Thread] |