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