[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r8442 - in grc/trunk: notes src/grc/gui/elements src/g
From: |
jblum |
Subject: |
[Commit-gnuradio] r8442 - in grc/trunk: notes src/grc/gui/elements src/grc_gnuradio/blks2 src/grc_gnuradio/blocks/error_correction src/grc_gnuradio/blocks/modulators src/grc_gnuradio/data src/grc_gnuradio/wxgui |
Date: |
Sun, 18 May 2008 21:01:09 -0600 (MDT) |
Author: jblum
Date: 2008-05-18 21:01:08 -0600 (Sun, 18 May 2008)
New Revision: 8442
Added:
grc/trunk/src/grc_gnuradio/blocks/error_correction/blks2_packet_decoder.xml
grc/trunk/src/grc_gnuradio/blocks/error_correction/blks2_packet_encoder.xml
Removed:
grc/trunk/src/grc_gnuradio/blocks/modulators/blks2_packet_demod.xml
grc/trunk/src/grc_gnuradio/blocks/modulators/blks2_packet_mod.xml
Modified:
grc/trunk/notes/todo.txt
grc/trunk/src/grc/gui/elements/Param.py
grc/trunk/src/grc_gnuradio/blks2/__init__.py
grc/trunk/src/grc_gnuradio/blks2/packet.py
grc/trunk/src/grc_gnuradio/data/block_tree.xml
grc/trunk/src/grc_gnuradio/wxgui/callback_controls.py
Log:
string truncation in param display, renamed and simplified packet
encoder/decoder
Modified: grc/trunk/notes/todo.txt
===================================================================
--- grc/trunk/notes/todo.txt 2008-05-19 02:36:00 UTC (rev 8441)
+++ grc/trunk/notes/todo.txt 2008-05-19 03:01:08 UTC (rev 8442)
@@ -13,7 +13,6 @@
-create sub-flow graphs to be used in larger flow graphs
-copy and paste blocks
-disable blocks (grey out, keep in design file, but generate ignores)
--param display, better string truncate
-param editor, expand entry boxes in focus
-change param dialog to panel within main window
Modified: grc/trunk/src/grc/gui/elements/Param.py
===================================================================
--- grc/trunk/src/grc/gui/elements/Param.py 2008-05-19 02:36:00 UTC (rev
8441)
+++ grc/trunk/src/grc/gui/elements/Param.py 2008-05-19 03:01:08 UTC (rev
8442)
@@ -197,25 +197,13 @@
t = self.get_type()
if self.is_enum():
dt_str =
self.get_option(self.get_value()).get_name()
- elif t in ('file_open', 'file_save'): #file types
- suggested_length = 30
- if len(data) <= suggested_length: dt_str = data
- else: #truncate the tail if there is not enough
space
- tail,head = path.split(data)
- if len(head) >= suggested_length:
dt_str = head
- else: dt_str =
tail[0:suggested_length-len(head)] + '...' + head
elif isinstance(data, (list, tuple, set)): #vector types
- data = map(to_str, data)
- #only keep the first X elements of the list
- X = (100/len(str(data))) + 1 #display more for
non complex vectors
- dt_str = '[' #replace the removed elements with
a '...'
- for i,f in enumerate(data):
- if i < X or i+1 == len(data): #leave
one on the end
- dt_str = dt_str + f
- if i < len(data)-1 and (i+1 !=
X or X+1 == len(data)): dt_str = dt_str + ', '
- elif i == X: dt_str = dt_str + ' ... '
- dt_str = dt_str + ']'
+ dt_str = ', '.join(map(to_str, data))
else: dt_str = to_str(data) #other types
+ #truncate
+ max_len = max(42 - len(self.get_name()), 3)
+ if len(dt_str) > max_len:
+ dt_str = dt_str[:max_len-3] + '...'
return '<b>%s:</b>
%s'%(Utils.xml_encode(self.get_name()), Utils.xml_encode(dt_str))
else: return '<span foreground="red"><b>%s:</b>
error</span>'%Utils.xml_encode(self.get_name())
Modified: grc/trunk/src/grc_gnuradio/blks2/__init__.py
===================================================================
--- grc/trunk/src/grc_gnuradio/blks2/__init__.py 2008-05-19 02:36:00 UTC
(rev 8441)
+++ grc/trunk/src/grc_gnuradio/blks2/__init__.py 2008-05-19 03:01:08 UTC
(rev 8442)
@@ -1,6 +1,5 @@
# make this directory a package
from selector import selector, valve
-from packet import packet_mod, packet_demod
-from packet import mod_pkts, demod_pkts
+from packet import packet_encoder, packet_decoder
from error_rate import error_rate
Modified: grc/trunk/src/grc_gnuradio/blks2/packet.py
===================================================================
--- grc/trunk/src/grc_gnuradio/blks2/packet.py 2008-05-19 02:36:00 UTC (rev
8441)
+++ grc/trunk/src/grc_gnuradio/blks2/packet.py 2008-05-19 03:01:08 UTC (rev
8442)
@@ -33,21 +33,12 @@
DEFAULT_THRESHOLD = 12
#######################################################################################
-## Packet Modulation
+## Packet Encoder
#######################################################################################
-class packet_mod_thread(_threading.Thread):
- """
- Sample the input message queue and call send.
- """
+class _packet_encoder_thread(_threading.Thread):
def __init__(self, msgq, payload_length, send):
- """!
- packet_mod_thread contructor.
- @param msgq the message queue to sample
- @param payload_length number of bytes in a data-stream slice
- @param send a function that takes a payload
- """
self._msgq = msgq
self._payload_length = payload_length
self._send = send
@@ -57,9 +48,6 @@
self.start()
def run(self):
- """
- Run this thread by sampling the message queue in and cutting
out chunks of size payload.
- """
sample = '' #residual sample
while self.keep_running:
msg = self._msgq.delete_head() #blocking read of
message queue
@@ -69,58 +57,23 @@
sample = sample[self._payload_length:]
self._send(payload)
-class packet_mod(gr.hier_block2):
+class packet_encoder(gr.hier_block2):
"""
Hierarchical block for wrapping packet-based modulators.
"""
- def __init__(self, item_size_in, item_size_out, modulator,
payload_length=-1):
+ def __init__(self, item_size_in, samples_per_symbol, bits_per_symbol,
access_code='', pad_for_usrp=True, payload_length=-1):
"""!
packet_mod constructor.
@param item_size_in the size of the input data stream in bytes
- @param item_size_out the size of the output data stream in bytes
- @param modulator the packet-based modulator
- @param payload_length number of bytes in a data-stream slice
- """
- #setup
- self._item_size_in = item_size_in
- self._item_size_out = item_size_out
- if payload_length < 0: #get packet length
- payload_length = DEFAULT_PAYLOAD_LEN
- if payload_length%self._item_size_in != 0: #verify that
packet length is a multiple of the stream size
- raise ValueError, 'The packet length: "%d" is not a
mutiple of the stream size: "%d".'%(payload_length, self._item_size_in)
- self._payload_length = payload_length
- self._modulator = modulator
- #create blocks
- self._msgq_in = gr.msg_queue(DEFAULT_MSGQ_LIMIT)
- msg_sink = gr.message_sink(self._item_size_in, self._msgq_in,
False) #False -> blocking
- #initialize hier2
- gr.hier_block2.__init__(
- self,
- "packet mod",
- gr.io_signature(1, 1, self._item_size_in), # Input
signature
- gr.io_signature(1, 1, self._item_size_out) # Output
signature
- )
- #connect
- self.connect(self, msg_sink)
- self.connect(self._modulator, self)
- #start thread
- packet_mod_thread(self._msgq_in, self._payload_length,
self._modulator.send_pkt)
-
-class mod_pkts(gr.hier_block2):
- """
- Hierarchical block for sending packet based data.
- """
-
- def __init__(self, samples_per_symbol, bits_per_symbol, access_code='',
pad_for_usrp=True):
- """!
- mod_pkts constructor.
@param samples_per_symbol number of samples per symbol
@param bits_per_symbol number of bits per symbol
@param access_code AKA sync vector
@param pad_for_usrp If true, packets are padded such that they
end up a multiple of 128 samples
+ @param payload_length number of bytes in a data-stream slice
"""
#setup parameters
+ self._item_size_in = item_size_in
self._samples_per_symbol = samples_per_symbol
self._bits_per_symbol = bits_per_symbol
self._pad_for_usrp = pad_for_usrp
@@ -130,73 +83,106 @@
raise ValueError, "Invalid access_code %r. Must be
string of 1's and 0's" % (access_code,)
self._access_code = access_code
self._pad_for_usrp = pad_for_usrp
+ if payload_length < 0: #get payload length
+ payload_length = DEFAULT_PAYLOAD_LEN
+ if payload_length%self._item_size_in != 0: #verify that
packet length is a multiple of the stream size
+ raise ValueError, 'The packet length: "%d" is not a
mutiple of the stream size: "%d".'%(payload_length, self._item_size_in)
+ self._payload_length = payload_length
#create blocks
msg_source = gr.message_source(gr.sizeof_char,
DEFAULT_MSGQ_LIMIT)
self._msgq_out = msg_source.msgq()
+ self._msgq_in = gr.msg_queue(DEFAULT_MSGQ_LIMIT)
+ msg_sink = gr.message_sink(self._item_size_in, self._msgq_in,
False) #False -> blocking
#initialize hier2
gr.hier_block2.__init__(
self,
- "mod pkts",
- gr.io_signature(0, 0, 0), # Input signature
+ "packet_encoder",
+ gr.io_signature(1, 1, self._item_size_in), # Input
signature
gr.io_signature(1, 1, gr.sizeof_char) # Output signature
)
#connect
+ self.connect(self, msg_sink)
self.connect(msg_source, self)
+ #start thread
+ _packet_encoder_thread(self._msgq_in, self._payload_length,
self.send_pkt)
- def send_pkt(self, payload='', eof=False):
+ def send_pkt(self, payload):
"""!
Wrap the payload in a packet and push onto the message queue.
@param payload string, data to send
- @param eof boolean, end of file
- """
- if eof:
- msg = gr.message(1) # tell self._pkt_input we're not
sending any more packets
- else:
- packet = packet_utils.make_packet(
- payload,
- self._samples_per_symbol,
- self._bits_per_symbol,
- self._access_code,
- self._pad_for_usrp
- )
- msg = gr.message_from_string(packet)
+ """
+ packet = packet_utils.make_packet(
+ payload,
+ self._samples_per_symbol,
+ self._bits_per_symbol,
+ self._access_code,
+ self._pad_for_usrp
+ )
+ msg = gr.message_from_string(packet)
self._msgq_out.insert_tail(msg)
#######################################################################################
-## Packet Demodulation
+## Packet Decoder
#######################################################################################
-class packet_demod(gr.hier_block2):
+class _packet_decoder_thread(_threading.Thread):
+
+ def __init__(self, msgq, callback):
+ _threading.Thread.__init__(self)
+ self.setDaemon(1)
+ self._msgq = msgq
+ self.callback = callback
+ self.keep_running = True
+ self.start()
+
+ def run(self):
+ while self.keep_running:
+ msg = self._msgq.delete_head()
+ ok, payload = packet_utils.unmake_packet(msg.to_string(),
int(msg.arg1()))
+ if self.callback:
+ self.callback(ok, payload)
+
+class packet_decoder(gr.hier_block2):
"""
Hierarchical block for wrapping packet-based demodulators.
"""
- def __init__(self, item_size_in, item_size_out, demodulator):
+ def __init__(self, item_size_out, access_code='', threshold=-1):
"""!
packet_demod constructor.
- @param item_size_in the size of the input data stream in bytes
@param item_size_out the size of the output data stream in bytes
- @param demodulator the packet-based demodulator
+ @param access_code AKA sync vector
+ @param threshold detect access_code with up to threshold bits
wrong (-1 -> use default)
"""
#setup
- self._item_size_in = item_size_in
self._item_size_out = item_size_out
- self._demodulator = demodulator
+ #access code
+ if not access_code: #get access code
+ access_code = packet_utils.default_access_code
+ if not packet_utils.is_1_0_string(access_code):
+ raise ValueError, "Invalid access_code %r. Must be
string of 1's and 0's" % (access_code,)
+ self._access_code = access_code
+ #threshold
+ if threshold < 0: threshold = DEFAULT_THRESHOLD
+ self._threshold = threshold
#blocks
+ self._msgq_in = gr.msg_queue(DEFAULT_MSGQ_LIMIT) #holds packets
from the PHY
+ correlator = gr.correlate_access_code_bb(self._access_code,
self._threshold)
+ framer_sink = gr.framer_sink_1(self._msgq_in)
msg_source = gr.message_source(self._item_size_out,
DEFAULT_MSGQ_LIMIT)
self._msgq_out = msg_source.msgq()
#initialize hier2
gr.hier_block2.__init__(
self,
- "packet demod",
- gr.io_signature(1, 1, self._item_size_in), # Input
signature
+ "packet_decoder",
+ gr.io_signature(1, 1, gr.sizeof_char), # Input signature
gr.io_signature(1, 1, self._item_size_out) # Output
signature
)
#connect
- self.connect(self, gr.kludge_copy(self._item_size_in),
self._demodulator)
+ self.connect(self, correlator, framer_sink)
self.connect(msg_source, self)
- #set callback
- self._demodulator._watcher.callback = self._recv_packet
+ #start thread
+ _packet_decoder_thread(self._msgq_in, self._recv_packet)
def _recv_packet(self, ok, payload):
"""!
@@ -205,59 +191,6 @@
@param payload data received
"""
msg = gr.message_from_string(payload, 0, self._item_size_out,
len(payload)/self._item_size_out)
- if ok: self._msgq_out.insert_tail(msg)
-
-class demod_pkts(gr.hier_block2):
- """
- Hierarchical block for demodulating and deframing packets.
- """
+ if ok: self._msgq_out.insert_tail(msg)
- def __init__(self, access_code='', callback=None, threshold=-1):
- """!
- demod_pkts contructor.
- @param access_code AKA sync vector
- @param callback function of two args: ok, payload
- @param threshold detect access_code with up to threshold bits
wrong (-1 -> use default)
- """
- #access code
- if not access_code: #get access code
- access_code = packet_utils.default_access_code
- if not packet_utils.is_1_0_string(access_code):
- raise ValueError, "Invalid access_code %r. Must be
string of 1's and 0's" % (access_code,)
- self._access_code = access_code
- #threshold
- if threshold < 0: threshold = DEFAULT_THRESHOLD
- self._threshold = threshold
- self._callback = callback
- #initialize hier2
- gr.hier_block2.__init__(
- self,
- "demod pkts",
- gr.io_signature(1, 1, gr.sizeof_char), # Input signature
- gr.io_signature(0, 0, 0), # Output signature
- )
- #blocks
- self._msgq_in = gr.msg_queue(DEFAULT_MSGQ_LIMIT) #
holds packets from the PHY
- correlator = gr.correlate_access_code_bb(self._access_code,
self._threshold)
- framer_sink = gr.framer_sink_1(self._msgq_in)
- #connect
- self.connect(self, correlator, framer_sink)
- #start thread
- self._watcher = _queue_watcher_thread(self._msgq_in,
self._callback)
-
-class _queue_watcher_thread(_threading.Thread):
- def __init__(self, rcvd_pktq, callback):
- _threading.Thread.__init__(self)
- self.setDaemon(1)
- self.rcvd_pktq = rcvd_pktq
- self.callback = callback
- self.keep_running = True
- self.start()
- def run(self):
- while self.keep_running:
- msg = self.rcvd_pktq.delete_head()
- ok, payload = packet_utils.unmake_packet(msg.to_string(),
int(msg.arg1()))
- if self.callback:
- self.callback(ok, payload)
-
Copied:
grc/trunk/src/grc_gnuradio/blocks/error_correction/blks2_packet_decoder.xml
(from rev 8440,
grc/trunk/src/grc_gnuradio/blocks/modulators/blks2_packet_demod.xml)
===================================================================
--- grc/trunk/src/grc_gnuradio/blocks/error_correction/blks2_packet_decoder.xml
(rev 0)
+++ grc/trunk/src/grc_gnuradio/blocks/error_correction/blks2_packet_decoder.xml
2008-05-19 03:01:08 UTC (rev 8442)
@@ -0,0 +1,82 @@
+<?xml version="1.0"?>
+<!DOCTYPE block SYSTEM "../block.dtd">
+<!--
+###################################################
+##Packet Decoder
+###################################################
+ -->
+<block>
+ <name>Packet Decoder</name>
+ <key>blks2_packet_decoder</key>
+ <import>from grc_gnuradio import blks2 as grc_blks2</import>
+ <import>from gnuradio import gr</import>
+ <make>grc_blks2.packet_decoder(
+ item_size_out=$type.size*$vlen,
+ access_code=$access_code,
+ threshold=$threshold,
+)</make>
+ <param>
+ <name>Output Type</name>
+ <key>type</key>
+ <value>float</value>
+ <type>enum</type>
+ <option>
+ <name>Complex</name>
+ <key>complex</key>
+ <opt>size:gr.sizeof_gr_complex</opt>
+ </option>
+ <option>
+ <name>Float</name>
+ <key>float</key>
+ <opt>size:gr.sizeof_float</opt>
+ </option>
+ <option>
+ <name>Int</name>
+ <key>int</key>
+ <opt>size:gr.sizeof_int</opt>
+ </option>
+ <option>
+ <name>Short</name>
+ <key>short</key>
+ <opt>size:gr.sizeof_short</opt>
+ </option>
+ <option>
+ <name>Byte</name>
+ <key>byte</key>
+ <opt>size:gr.sizeof_char</opt>
+ </option>
+ </param>
+ <param>
+ <name>Access Code</name>
+ <key>access_code</key>
+ <value></value>
+ <type>string</type>
+ </param>
+ <param>
+ <name>Threshold</name>
+ <key>threshold</key>
+ <value>-1</value>
+ <type>int</type>
+ </param>
+ <param>
+ <name>Vec Length</name>
+ <key>vlen</key>
+ <value>1</value>
+ <type>int</type>
+ </param>
+ <check>$vlen > 0</check>
+ <sink>
+ <name>in</name>
+ <type>byte</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>$type</type>
+ <vlen>$vlen</vlen>
+ </source>
+ <doc>
+Packet decoder block, for use with the gnuradio demodulator blocks: gmsk, psk,
qam.
+
+Access Code: string of 1's and 0's, leave blank for default.
+ </doc>
+</block>
Copied:
grc/trunk/src/grc_gnuradio/blocks/error_correction/blks2_packet_encoder.xml
(from rev 8440,
grc/trunk/src/grc_gnuradio/blocks/modulators/blks2_packet_mod.xml)
===================================================================
--- grc/trunk/src/grc_gnuradio/blocks/error_correction/blks2_packet_encoder.xml
(rev 0)
+++ grc/trunk/src/grc_gnuradio/blocks/error_correction/blks2_packet_encoder.xml
2008-05-19 03:01:08 UTC (rev 8442)
@@ -0,0 +1,118 @@
+<?xml version="1.0"?>
+<!DOCTYPE block SYSTEM "../block.dtd">
+<!--
+###################################################
+##Packet Encoder
+###################################################
+ -->
+<block>
+ <name>Packet Encoder</name>
+ <key>blks2_packet_encoder</key>
+ <import>from grc_gnuradio import blks2 as grc_blks2</import>
+ <import>from gnuradio import gr</import>
+ <make>grc_blks2.packet_encoder(
+ item_size_in=$type.size*$vlen,
+ samples_per_symbol=$samples_per_symbol,
+ bits_per_symbol=$bits_per_symbol,
+ access_code=$access_code,
+ pad_for_usrp=$pad_for_usrp,
+ payload_length=$payload_length,
+)</make>
+ <param>
+ <name>Input Type</name>
+ <key>type</key>
+ <value>float</value>
+ <type>enum</type>
+ <option>
+ <name>Complex</name>
+ <key>complex</key>
+ <opt>size:gr.sizeof_gr_complex</opt>
+ </option>
+ <option>
+ <name>Float</name>
+ <key>float</key>
+ <opt>size:gr.sizeof_float</opt>
+ </option>
+ <option>
+ <name>Int</name>
+ <key>int</key>
+ <opt>size:gr.sizeof_int</opt>
+ </option>
+ <option>
+ <name>Short</name>
+ <key>short</key>
+ <opt>size:gr.sizeof_short</opt>
+ </option>
+ <option>
+ <name>Byte</name>
+ <key>byte</key>
+ <opt>size:gr.sizeof_char</opt>
+ </option>
+ </param>
+ <param>
+ <name>Samples/Symbol</name>
+ <key>samples_per_symbol</key>
+ <type>int</type>
+ </param>
+ <param>
+ <name>Bits/Symbol</name>
+ <key>bits_per_symbol</key>
+ <type>int</type>
+ </param>
+ <param>
+ <name>Access Code</name>
+ <key>access_code</key>
+ <value></value>
+ <type>string</type>
+ </param>
+ <param>
+ <name>Pad for USRP</name>
+ <key>pad_for_usrp</key>
+ <type>enum</type>
+ <option>
+ <name>Yes</name>
+ <key>True</key>
+ </option>
+ <option>
+ <name>No</name>
+ <key>False</key>
+ </option>
+ </param>
+ <param>
+ <name>Payload Length</name>
+ <key>payload_length</key>
+ <value>-1</value>
+ <type>int</type>
+ </param>
+ <param>
+ <name>Vec Length</name>
+ <key>vlen</key>
+ <value>1</value>
+ <type>int</type>
+ </param>
+ <check>$vlen > 0</check>
+ <sink>
+ <name>in</name>
+ <type>$type</type>
+ <vlen>$vlen</vlen>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>byte</type>
+ </source>
+ <doc>
+Packet encoder block, for use with the gnuradio modulator blocks: gmsk, psk,
qam.
+
+Access Code: string of 1's and 0's, leave blank for default.
+
+Bits/Symbol should be set accordingly:
+ gmsk -> 1
+ dbpsk -> 1
+ dqpsk -> 2
+ d8psk -> 3
+ qam8 -> 3
+ qam16 -> 4
+ qam64 -> 6
+ qam256 -> 8
+ </doc>
+</block>
Deleted: grc/trunk/src/grc_gnuradio/blocks/modulators/blks2_packet_demod.xml
Deleted: grc/trunk/src/grc_gnuradio/blocks/modulators/blks2_packet_mod.xml
Modified: grc/trunk/src/grc_gnuradio/data/block_tree.xml
===================================================================
--- grc/trunk/src/grc_gnuradio/data/block_tree.xml 2008-05-19 02:36:00 UTC
(rev 8441)
+++ grc/trunk/src/grc_gnuradio/data/block_tree.xml 2008-05-19 03:01:08 UTC
(rev 8442)
@@ -199,14 +199,15 @@
<block>blks2_qamx_mod</block>
<block>blks2_qamx_demod</block>
- <block>blks2_packet_mod</block>
- <block>blks2_packet_demod</block>
-
<block>blks2_synthesis_filterbank</block>
<block>blks2_analysis_filterbank</block>
</cat>
<cat>
- <name>Error Correction</name>
+ <name>Error Correction</name>
+
+ <block>blks2_packet_decoder</block>
+ <block>blks2_packet_encoder</block>
+
<block>gr_encode_ccsds_27_bb</block>
<block>gr_decode_ccsds_27_fb</block>
</cat>
Modified: grc/trunk/src/grc_gnuradio/wxgui/callback_controls.py
===================================================================
--- grc/trunk/src/grc_gnuradio/wxgui/callback_controls.py 2008-05-19
02:36:00 UTC (rev 8441)
+++ grc/trunk/src/grc_gnuradio/wxgui/callback_controls.py 2008-05-19
03:01:08 UTC (rev 8442)
@@ -73,7 +73,7 @@
A change is detected. Call the callback.
"""
try: self.call()
- except Exception: print >> sys.stderr, 'Error in exec callback
from handle changed.'
+ except Exception, e: print >> sys.stderr, 'Error in exec
callback from handle changed.\n', e
def get_value(self):
"""!
@@ -219,7 +219,7 @@
self.text_box.SetValue(str(new_value))
self._value = new_value
try: self.call()
- except Exception: print >> sys.stderr, 'Error in exec callback
from handle scroll.'
+ except Exception, e: print >> sys.stderr, 'Error in exec
callback from handle scroll.\n', e
def _handle_enter(self, event=None):
"""!
@@ -229,5 +229,5 @@
self._set_slider_value(new_value)
self._value = new_value
try: self.call()
- except Exception: print >> sys.stderr, 'Error in exec callback
from handle enter.'
+ except Exception, e: print >> sys.stderr, 'Error in exec
callback from handle enter.\n', e
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r8442 - in grc/trunk: notes src/grc/gui/elements src/grc_gnuradio/blks2 src/grc_gnuradio/blocks/error_correction src/grc_gnuradio/blocks/modulators src/grc_gnuradio/data src/grc_gnuradio/wxgui,
jblum <=