diff options
author | jcorgan | 2008-08-23 02:26:15 +0000 |
---|---|---|
committer | jcorgan | 2008-08-23 02:26:15 +0000 |
commit | d52c462e5fd3eae7d00505a64a013e811d43234c (patch) | |
tree | 6b2a9e77c095ecc273e8b2b33a4bab37cfdf2fcd /grc/src/grc_gnuradio/blks2/queue.py | |
parent | 5c02ea03e1226ed706abeede426f0e1727f1ea25 (diff) | |
download | gnuradio-d52c462e5fd3eae7d00505a64a013e811d43234c.tar.gz gnuradio-d52c462e5fd3eae7d00505a64a013e811d43234c.tar.bz2 gnuradio-d52c462e5fd3eae7d00505a64a013e811d43234c.zip |
Merged changeset r9285:9377 from jblum/grc into trunk, with distcheck fixes
and local modifications.
Integrates previously separate GNU Radio Companion into top-level component
'grc'. (Josh Blum)
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@9378 221aa14e-8319-0410-a670-987f0aec2ac5
Diffstat (limited to 'grc/src/grc_gnuradio/blks2/queue.py')
-rw-r--r-- | grc/src/grc_gnuradio/blks2/queue.py | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/grc/src/grc_gnuradio/blks2/queue.py b/grc/src/grc_gnuradio/blks2/queue.py new file mode 100644 index 000000000..cec35e52a --- /dev/null +++ b/grc/src/grc_gnuradio/blks2/queue.py @@ -0,0 +1,178 @@ +# Copyright 2008 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GNU Radio is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +from gnuradio import gr +import gnuradio.gr.gr_threading as _threading +import numpy + +####################################################################################### +## Queue Sink Thread +####################################################################################### +class queue_sink_thread(_threading.Thread): + """! + Read samples from the queue sink and execute the callback. + """ + + def __init__(self, queue_sink, callback): + """! + Queue sink thread contructor. + @param queue_sink the queue to pop messages from + @param callback the function of one argument + """ + self._queue_sink = queue_sink + self._callback = callback + _threading.Thread.__init__(self) + self.setDaemon(1) + self.keep_running = True + self.start() + + def run(self): + while self.keep_running: + self._callback(self._queue_sink.pop()) + +####################################################################################### +## Queue Sink +####################################################################################### +class _queue_sink_base(gr.hier_block2): + """! + Queue sink base, a queue sink for any size queue. + Easy read access to a gnuradio data stream from python. + Call pop to read a sample from a gnuradio data stream. + Samples are cast as python data types, complex, float, or int. + """ + + def __init__(self, vlen=1): + """! + Queue sink base contructor. + @param vlen the vector length + """ + self._vlen = vlen + #initialize hier2 + gr.hier_block2.__init__( + self, + "queue_sink", + gr.io_signature(1, 1, self._item_size*self._vlen), # Input signature + gr.io_signature(0, 0, 0) # Output signature + ) + #create message sink + self._msgq = gr.msg_queue(1) + message_sink = gr.message_sink(self._item_size*self._vlen, self._msgq, False) #False -> blocking + #connect + self.connect(self, message_sink) + self.arr = '' + + def pop(self): + """! + Pop a new sample off the front of the queue. + @return a new sample + """ + while len(self.arr) < self._item_size*self._vlen: + msg = self._msgq.delete_head() + self.arr = self.arr + msg.to_string() + sample = self.arr[:self._item_size*self._vlen] + self.arr = self.arr[self._item_size*self._vlen:] + sample = map(self._cast, numpy.fromstring(sample, self._numpy)) + if self._vlen == 1: return sample[0] + return sample + +class queue_sink_c(_queue_sink_base): + _item_size = gr.sizeof_gr_complex + _numpy = numpy.complex64 + def _cast(self, arg): return complex(arg.real, arg.imag) + +class queue_sink_f(_queue_sink_base): + _item_size = gr.sizeof_float + _numpy = numpy.float32 + _cast = float + +class queue_sink_i(_queue_sink_base): + _item_size = gr.sizeof_int + _numpy = numpy.int32 + _cast = int + +class queue_sink_s(_queue_sink_base): + _item_size = gr.sizeof_short + _numpy = numpy.int16 + _cast = int + +class queue_sink_b(_queue_sink_base): + _item_size = gr.sizeof_char + _numpy = numpy.int8 + _cast = int + +####################################################################################### +## Queue Source +####################################################################################### +class _queue_source_base(gr.hier_block2): + """! + Queue source base, a queue source for any size queue. + Easy write access to a gnuradio data stream from python. + Call push to to write a sample into the gnuradio data stream. + """ + + def __init__(self, vlen=1): + """! + Queue source base contructor. + @param vlen the vector length + """ + self._vlen = vlen + #initialize hier2 + gr.hier_block2.__init__( + self, + "queue_source", + gr.io_signature(0, 0, 0), # Input signature + gr.io_signature(1, 1, self._item_size*self._vlen) # Output signature + ) + #create message sink + message_source = gr.message_source(self._item_size*self._vlen, 1) + self._msgq = message_source.msgq() + #connect + self.connect(message_source, self) + + def push(self, item): + """! + Push an item into the back of the queue. + @param item the item + """ + if self._vlen == 1: item = [item] + arr = numpy.array(item, self._numpy) + msg = gr.message_from_string(arr.tostring(), 0, self._item_size, self._vlen) + self._msgq.insert_tail(msg) + +class queue_source_c(_queue_source_base): + _item_size = gr.sizeof_gr_complex + _numpy = numpy.complex64 + +class queue_source_f(_queue_source_base): + _item_size = gr.sizeof_float + _numpy = numpy.float32 + +class queue_source_i(_queue_source_base): + _item_size = gr.sizeof_int + _numpy = numpy.int32 + +class queue_source_s(_queue_source_base): + _item_size = gr.sizeof_short + _numpy = numpy.int16 + +class queue_source_b(_queue_source_base): + _item_size = gr.sizeof_char + _numpy = numpy.int8 + |