commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r5932 - in grc/trunk: notes src/SignalBlockDefs


From: jblum
Subject: [Commit-gnuradio] r5932 - in grc/trunk: notes src/SignalBlockDefs
Date: Wed, 11 Jul 2007 12:13:10 -0600 (MDT)

Author: jblum
Date: 2007-07-11 12:13:09 -0600 (Wed, 11 Jul 2007)
New Revision: 5932

Added:
   grc/trunk/src/SignalBlockDefs/Audio.py
Modified:
   grc/trunk/notes/notes.txt
   grc/trunk/src/SignalBlockDefs/Custom.py
   grc/trunk/src/SignalBlockDefs/Misc.py
   grc/trunk/src/SignalBlockDefs/SignalBlockConstants.py
   grc/trunk/src/SignalBlockDefs/SignalBlockTree.py
   grc/trunk/src/SignalBlockDefs/Sinks.py
   grc/trunk/src/SignalBlockDefs/Sources.py
   grc/trunk/src/SignalBlockDefs/USRP.py
Log:
audio block wrappers and trial usrp dual source

Modified: grc/trunk/notes/notes.txt
===================================================================
--- grc/trunk/notes/notes.txt   2007-07-11 03:35:13 UTC (rev 5931)
+++ grc/trunk/notes/notes.txt   2007-07-11 18:13:09 UTC (rev 5932)
@@ -1,7 +1,7 @@
 ############   Blocks to Add:  ####################
 -ofdm
 -usrp misc settings
--usrp dual and quad souce 
+-usrp quad souce, set z == 1 to ignore Q inputs 
 -blks blocks, add filesave for logging
 -combine add/mult with add/mult vector
 -tun/tap block (with input and output)

Added: grc/trunk/src/SignalBlockDefs/Audio.py
===================================================================
--- grc/trunk/src/SignalBlockDefs/Audio.py                              (rev 0)
+++ grc/trunk/src/SignalBlockDefs/Audio.py      2007-07-11 18:13:09 UTC (rev 
5932)
@@ -0,0 +1,134 @@
+"""
+Copyright 2007 Free Software Foundation, Inc.
+This file is part of GNU Radio
+
+GNU Radio Companion 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 2
+of the License, or (at your option) any later version.
+
+GNU Radio Companion 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 this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+"""
address@hidden SignalBlockDefs.Audio
+#Wrappers and definitions for the audio source and sink.
address@hidden Josh Blum
+
+from DataTypes import *
+from gnuradio import gr
+
+##possible audio rates for audio source/sink
+audio_rates = [
+       ('16KHz', int(16e3)),
+       ('22.05KHz', int(22.05e3)),
+       ('24KHz', int(24e3)),
+       ('32KHz', int(32e3)),
+       ('44.1KHz', int(44.1e3)),
+       ('48KHz', int(48e3)),
+]
+
+##index of the default audio rate
+default_audio_rate_index = 3
+
+##type source
+SOURCE = 'source'
+
+##type sink
+SINK = 'sink'
+
+class AudioHelper(gr.hier_block2):
+       """This block deletes and creates an internal audio block 
+       to avoid problems with stopping the audio device."""
+       
+       def __init__(self, samp_rate, type):
+               """!
+               AudioHelper contructor.
+               @param samp_rate audio sampling rate
+               @param type SOURCE or SINK
+               """             
+               self.type = type
+               assert(type in (SOURCE, SINK))
+               if self.type == SINK:
+                       gr.hier_block2.__init__(
+                               self, "audio_sink_helper",
+                               gr.io_signature(1, 2, Float().get_num_bytes()),
+                               gr.io_signature(0, 0, 0),
+                       )
+               elif self.type == SOURCE:
+                       gr.hier_block2.__init__(
+                               self, "audio_source_helper",
+                               gr.io_signature(0, 0, 0),
+                               gr.io_signature(1, 2, Float().get_num_bytes()),
+                       )
+               self.samp_rate = samp_rate
+               self._create_and_connect()
+               
+       def _create_and_connect(self):
+               """Create a new audio block and connect its 2 ports"""
+               from gnuradio import audio      
+               if self.type == SINK:   #connect if sink
+                       self.audio_block = audio.sink(self.samp_rate)
+                       self.connect((self, 0), (self.audio_block, 0))
+                       self.connect((self, 1), (self.audio_block, 1))
+               elif self.type == SOURCE:       #connect if source
+                       self.audio_block = audio.source(self.samp_rate)
+                       self.connect((self.audio_block, 0), (self, 0))
+                       self.connect((self.audio_block, 1), (self, 1))          
+               
+       def reconstruct(self, samp_rate):
+               """!
+               In a lock/unlock sequence: 
+               disconnect the audio sink,
+               delete the audio sink,
+               and call create and connect.
+               @param samp_rate the new sampling rate
+               """             
+               self._hb.lock()
+               self.samp_rate = samp_rate #set the new samp rate
+               if self.type == SINK:   #disconnect if sink
+                       self.disconnect((self, 0), (self.audio_block, 0))
+                       self.disconnect((self, 1), (self.audio_block, 1))
+               elif self.type == SOURCE:       #disconnect if source
+                       self.disconnect((self.audio_block, 0), (self, 0))
+                       self.disconnect((self.audio_block, 1), (self, 1))       
+               del self.audio_block    #must delete the block (file descriptor 
is bad) 
+               self._create_and_connect()
+               self._hb.unlock()               
+               
+#######################################################################################
+##     Selector Defs for Audio Source and Audio Sink
+#######################################################################################
                                
+                               
+def AudioSink(sb):
+       from gnuradio import audio #imports
+       sb.add_input_socket('lin', Float())
+       sb.add_input_socket('rin', Float(), optional=True)
+       sb.add_param('Sampling Rate', Enum(audio_rates, 
default_audio_rate_index), type=True, variable=True)    
+       sb.set_docs('''\
+The left input must be connected, The right input is optional. \
+If only one audio stream is connected, both channels will receive the 
stream.''')
+       def make(fg, samp_rate):
+               block = AudioHelper(samp_rate.parse(), SINK)
+               fg.add_callback(block.reconstruct, samp_rate)
+               return block
+       return sb, make 
+       
+def AudioSource(sb):
+       from gnuradio import audio      #imports
+       sb.add_output_socket('lout', Float())
+       sb.add_output_socket('rout', Float(), optional=True)
+       sb.add_param('Sampling Rate', Enum(audio_rates, 
default_audio_rate_index), type=True, variable=True)
+       sb.set_docs('''The left output must be connected, The right output is 
optional.''')
+       def make(fg, samp_rate):
+               block = AudioHelper(samp_rate.parse(), SOURCE)
+               fg.add_callback(block.reconstruct, samp_rate)
+               return block
+       return sb, make 
+       
+       
\ No newline at end of file

Modified: grc/trunk/src/SignalBlockDefs/Custom.py
===================================================================
--- grc/trunk/src/SignalBlockDefs/Custom.py     2007-07-11 03:35:13 UTC (rev 
5931)
+++ grc/trunk/src/SignalBlockDefs/Custom.py     2007-07-11 18:13:09 UTC (rev 
5932)
@@ -31,7 +31,7 @@
 
 #def CustomBlockDef1(sb):
 #...
-#...
+#...z
 
 ###########################################################################
 #Add custom blocks to the list below, 

Modified: grc/trunk/src/SignalBlockDefs/Misc.py
===================================================================
--- grc/trunk/src/SignalBlockDefs/Misc.py       2007-07-11 03:35:13 UTC (rev 
5931)
+++ grc/trunk/src/SignalBlockDefs/Misc.py       2007-07-11 18:13:09 UTC (rev 
5932)
@@ -103,7 +103,7 @@
                gr.hier_block2.__init__(
                        self, 'selector', 
                        gr.io_signature(num_inputs, num_inputs, item_size), 
-                       gr.io_signature(num_outputs, num_outputs, item_size)
+                       gr.io_signature(num_outputs, num_outputs, item_size),
                )
                #terminator blocks for unused inputs and outputs        
                self.input_terminators = [gr.null_sink(item_size) for i in 
range(num_inputs)]

Modified: grc/trunk/src/SignalBlockDefs/SignalBlockConstants.py
===================================================================
--- grc/trunk/src/SignalBlockDefs/SignalBlockConstants.py       2007-07-11 
03:35:13 UTC (rev 5931)
+++ grc/trunk/src/SignalBlockDefs/SignalBlockConstants.py       2007-07-11 
18:13:09 UTC (rev 5932)
@@ -36,7 +36,7 @@
                gr.hier_block2.__init__(
                        self, "throttle_helper",
                        gr.io_signature(1, 1, item_size),
-                       gr.io_signature(1, 1, item_size)
+                       gr.io_signature(1, 1, item_size),
                )
                throttle = gr.throttle(item_size, samp_rate)
                if position: self.connect(self, throttle, block, self)
@@ -90,19 +90,6 @@
 ##default sampling rate
 default_samp_rate = '$samp_rate'
 
-##possible audio rates for audio source/sink
-audio_rates = [
-       ('16KHz', int(16e3)),
-       ('22.05KHz', int(22.05e3)),
-       ('24KHz', int(24e3)),
-       ('32KHz', int(32e3)),
-       ('44.1KHz', int(44.1e3)),
-       ('48KHz', int(48e3)),
-]
-
-##index of the default audio rate
-default_audio_rate_index = 3
-
 ##default udp port for udp source/sink
 default_udp_port = 3456
 

Modified: grc/trunk/src/SignalBlockDefs/SignalBlockTree.py
===================================================================
--- grc/trunk/src/SignalBlockDefs/SignalBlockTree.py    2007-07-11 03:35:13 UTC 
(rev 5931)
+++ grc/trunk/src/SignalBlockDefs/SignalBlockTree.py    2007-07-11 18:13:09 UTC 
(rev 5932)
@@ -23,6 +23,7 @@
 from Elements import SignalBlock
 import Sources
 import Sinks
+import Audio
 import GraphicalSinks
 import Conversions
 import Operators
@@ -45,15 +46,16 @@
                                ('Null Source', Sources.NullSource),    
                                ('File Source', Sources.FileSource),
                                ('UDP Source', Sources.UDPSource),              
                
-                               ('Audio Source', Sources.AudioSource),
+                               ('Audio Source', Audio.AudioSource),
                                ('USRP Source', USRP.USRPSource),
+                               ('USRP Dual Source', USRP.USRPDualSource),
                        ]),
                        ('Sinks', [             
                                ('Variable Sink', Sinks.VariableSink),          
                        
                                ('Null Sink', Sinks.NullSink),
                                ('File Sink', Sinks.FileSink),  
                                ('UDP Sink', Sinks.UDPSink),                    
        
-                               ('Audio Sink', Sinks.AudioSink),
+                               ('Audio Sink', Audio.AudioSink),
                                ('USRP Sink', USRP.USRPSink),
                                ('USRP Dual Sink', USRP.USRPDualSink),
                                ('Tun Sink', Packet.TunSink),

Modified: grc/trunk/src/SignalBlockDefs/Sinks.py
===================================================================
--- grc/trunk/src/SignalBlockDefs/Sinks.py      2007-07-11 03:35:13 UTC (rev 
5931)
+++ grc/trunk/src/SignalBlockDefs/Sinks.py      2007-07-11 18:13:09 UTC (rev 
5932)
@@ -48,16 +48,6 @@
 Manually connect a throttle to the file sink to save the CPU.''')
        return sb, lambda fg, type, file_path, vlen: 
gr.file_sink(type.parse().get_num_bytes()*vlen.parse(), file_path.parse()) 
        
-def AudioSink(sb):
-       from gnuradio import audio
-       sb.add_input_socket('lin', Float())
-       sb.add_input_socket('rin', Float(), optional=True)
-       sb.add_param('Sampling Rate', Enum(audio_rates, 
default_audio_rate_index), type=True)   
-       sb.set_docs('''\
-The left input must be connected, The right input is optional. \
-If only one audio stream is connected, both channels will receive the 
stream.''')
-       return sb, lambda fg, samp_rate: audio.sink(samp_rate.parse())
-       
 def UDPSink(sb):
        fcn = gr.udp_sink       
        type = Enum(all_choices, 1)

Modified: grc/trunk/src/SignalBlockDefs/Sources.py
===================================================================
--- grc/trunk/src/SignalBlockDefs/Sources.py    2007-07-11 03:35:13 UTC (rev 
5931)
+++ grc/trunk/src/SignalBlockDefs/Sources.py    2007-07-11 18:13:09 UTC (rev 
5932)
@@ -97,14 +97,6 @@
        sb.add_param('Vector Length', vlen)
        return sb, lambda fg, type, file_path, repeat, vlen: 
gr.file_source(type.parse().get_num_bytes()*vlen.parse(), file_path.parse(), 
repeat.parse())       
        
-def AudioSource(sb):
-       from gnuradio import audio      
-       sb.add_output_socket('lout', Float())
-       sb.add_output_socket('rout', Float(), optional=True)
-       sb.add_param('Sampling Rate', Enum(audio_rates, 
default_audio_rate_index), type=True)
-       sb.set_docs('''The left input must be connected, The right input is 
optional.''')
-       return sb, lambda fg, samp_rate: audio.source(samp_rate.parse())
-               
 def VectorSource(sb):
        enum_all_vector_data_types = Enum([
                ('Complex Vector', (gr.vector_source_c, ComplexVector(), 
Complex())),

Modified: grc/trunk/src/SignalBlockDefs/USRP.py
===================================================================
--- grc/trunk/src/SignalBlockDefs/USRP.py       2007-07-11 03:35:13 UTC (rev 
5931)
+++ grc/trunk/src/SignalBlockDefs/USRP.py       2007-07-11 18:13:09 UTC (rev 
5932)
@@ -92,7 +92,7 @@
                ('Side B', (1, 0)),
        ]))
        sb.add_param('Frequency', Float(), variable=True)
-       sb.add_param('Interpolation', Int(200, min=1))
+       sb.add_param('Interpolation', Int(400, min=1))
        sb.add_param('Gain', Float(0), variable=True)   
        sb.add_param('Mux', Hex())
        sb.set_docs('''\
@@ -127,7 +127,7 @@
        sb.add_param('Unit Number', Int(0, min=0))
        sb.add_param('FrequencyA', Float(), variable=True)
        sb.add_param('FrequencyB', Float(), variable=True)
-       sb.add_param('Interpolation', Int(200, min=1))
+       sb.add_param('Interpolation', Int(400, min=1))
        sb.add_param('GainA', Float(0), variable=True)  
        sb.add_param('GainB', Float(0), variable=True)
        sb.add_param('Mux', Hex(default_mux))   
@@ -161,4 +161,61 @@
                fg.connect(inter, u)
                return inter
        return sb, make
+
+def USRPDualSource(sb):
+       from gnuradio import usrp
+       default_mux = '0x3210'
+       type = Enum([('Complex', (usrp.source_c, Complex())), ('IShort', 
(usrp.source_s, Short()))])
+       sb.add_output_socket('out0', Variable(type, index=1))
+       sb.add_output_socket('out1', Variable(type, index=1))
+       sb.add_param('Output Type', type, False, type=True)
+       sb.add_param('Unit Number', Int(0, min=0))
+       sb.add_param('Ch0: Side:Subdevice', Enum([
+               ('Side A:0', (0, 0)), 
+               ('Side B:0', (1, 0)),
+               ('Side A:1', (0, 1)), 
+               ('Side B:1', (1, 1)),
+       ]))
+       sb.add_param('Ch1: Side:Subdevice', Enum([
+               ('Side A:0', (0, 0)), 
+               ('Side B:0', (1, 0)),
+               ('Side A:1', (0, 1)), 
+               ('Side B:1', (1, 1)),
+       ]))
+       sb.add_param('Frequency0', Float(), variable=True)
+       sb.add_param('Frequency1', Float(), variable=True)
+       sb.add_param('Decimation', Int(200, min=1))
+       sb.add_param('Gain0', Float(0), variable=True)  
+       sb.add_param('Gain1', Float(0), variable=True)
+       sb.add_param('Mux', Hex(default_mux))   
+       sb.set_docs('''\
+The USRP source outputs 64 Megasamples per second / decimation. \
+Default mux is %s.
+Channel 0 (I & Q) will get ADC0 and ADC1
+Channel 1 (I & Q) will get ADC2 and ADC3'''%default_mux)
+       def make(fg, type, number, subdev_spec_0, subdev_spec_1, frequency_0, 
frequency_1, decim, gain_0, gain_1, mux):
+               number = number.parse()
+               u = type.parse()[0](number, nchan=2)            
+               u.set_decim_rate(decim.parse())
+               u.set_mux(mux.parse())
+               # setup 0       #               
+               subdev_0 = usrp.selected_subdev(u, subdev_spec_0.parse())#get 
the subdev
+               subdev_0.set_auto_tr(True)
+               subdev_0.set_gain(gain_0.parse())
+               set_freq(u, 0, subdev_0, frequency_0.parse(), verbose=True)     
#use DDC0
+               fg.add_callback(lambda f: set_freq(u, 0, subdev_0, f), 
frequency_0)
+               fg.add_callback(subdev_0.set_gain, gain_0) #callback for gain 
setting
+               #       setup 1 #
+               subdev_1 = usrp.selected_subdev(u, subdev_spec_1.parse())#get 
the subdev
+               subdev_1.set_auto_tr(True)
+               subdev_1.set_gain(gain_1.parse())
+               set_freq(u, 1, subdev_1, frequency_1.parse(), verbose=True)     
#use DDC1
+               fg.add_callback(lambda f: set_freq(u, 1, subdev_1, f), 
frequency_1)
+               fg.add_callback(subdev_1.set_gain, gain_1) #callback for gain 
setting
+               ###     Create an interleaver for the 2 data streams    ###
+               deinter = gr.deinterleave(type.parse()[1].get_num_bytes())
+               fg.connect(u, deinter)
+               return deinter
+       return sb, make 
+       
        
\ No newline at end of file





reply via email to

[Prev in Thread] Current Thread [Next in Thread]