Advertisement
Guest User

AsyncMsgSource

a guest
Jan 7th, 2016
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.38 KB | None | 0 0
  1. import numpy
  2. import pmt
  3. from gnuradio import gr
  4.  
  5. class AsyncMsgSourceC(gr.sync_block):
  6.     """
  7.    Transmits zeros when no messages in queue
  8.    and their payload (complex samples) when present.
  9.    """
  10.     def __init__(self):
  11.         gr.sync_block.__init__(self,
  12.             name="async_msg_source_c",
  13.             in_sig=None,
  14.             out_sig=[numpy.complex64])
  15.  
  16.         self.ready_samples = numpy.empty((0,))
  17.  
  18.         self.message_port_register_in(pmt.intern('pdus'))
  19.         self.set_msg_handler(pmt.intern('pdus'), self.msg_handler)
  20.  
  21.     def msg_handler(self, msg):
  22.  
  23.         pdu = pmt.cdr(msg)
  24.         new_samples = pmt.to_python(pdu)
  25.        
  26.         self.ready_samples = numpy.concatenate((
  27.                                 self.ready_samples,
  28.                                 new_samples
  29.                              ))
  30.  
  31.     def work(self, input_items, output_items):
  32.         out = output_items[0]
  33.  
  34.         n_demanded = len(out)
  35.         n_ready    = len(self.ready_samples)
  36.  
  37.         n_zeros = max(0, n_demanded - n_ready)
  38.         zeros = numpy.zeros(n_zeros)
  39.  
  40.         n_consumed = max(0, min(n_ready, n_demanded))
  41.         samples = self.ready_samples[0:n_consumed]
  42.  
  43.         out[0:n_consumed] = samples
  44.         out[n_consumed:]  = zeros
  45.  
  46.         self.ready_samples = self.ready_samples[n_consumed:]
  47.  
  48.         # TODO: add sob/eob tags
  49.  
  50.         return n_demanded
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement