From 9988664127b367fa8fee4409f8460673d6f265e1 Mon Sep 17 00:00:00 2001 From: jblum Date: Tue, 23 Jun 2009 20:38:18 +0000 Subject: Merging r11186:11273 from grc branch. Fixes, features, and reorganization for grc. Minor fixes and features for wxgui forms. git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@11274 221aa14e-8319-0410-a670-987f0aec2ac5 --- grc/python/Port.py | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 grc/python/Port.py (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py new file mode 100644 index 000000000..5a2b047f0 --- /dev/null +++ b/grc/python/Port.py @@ -0,0 +1,129 @@ +""" +Copyright 2008, 2009 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 +""" + +from .. base.Port import Port as _Port +import Constants + +class Port(_Port): + + ##possible port types + TYPES = ['complex', 'float', 'int', 'short', 'byte'] + + def __init__(self, block, n): + """ + Make a new port from nested data. + @param block the parent element + @param n the nested odict + @return a new port + """ + vlen = n.find('vlen') or '1' + nports = n.find('nports') or '' + optional = n.find('optional') or '' + #build the port + _Port.__init__( + self, + block=block, + n=n, + ) + self._nports = nports + self._vlen = vlen + self._optional = bool(optional) + + def validate(self): + _Port.validate(self) + try: assert self.get_enabled_connections() or self.get_optional() + except AssertionError: self.add_error_message('Port is not connected.') + try: assert self.is_source() or len(self.get_enabled_connections()) <= 1 + except AssertionError: self.add_error_message('Port has too many connections.') + + def get_vlen(self): + """ + Get the vector length. + If the evaluation of vlen cannot be cast to an integer, return 1. + @return the vector length or 1 + """ + vlen = self.get_parent().resolve_dependencies(self._vlen) + try: return int(self.get_parent().get_parent().evaluate(vlen)) + except: return 1 + + def get_nports(self): + """ + Get the number of ports. + If already blank, return a blank + If the evaluation of nports cannot be cast to an integer, return 1. + @return the number of ports or 1 + """ + nports = self.get_parent().resolve_dependencies(self._nports) + #return blank if nports is blank + if not nports: return '' + try: + nports = int(self.get_parent().get_parent().evaluate(nports)) + assert 0 < nports + return nports + except: return 1 + + def get_optional(self): return bool(self._optional) + + def get_color(self): + """ + Get the color that represents this port's type. + Codes differ for ports where the vec length is 1 or greater than 1. + @return a hex color code. + """ + try: + if self.get_vlen() == 1: + return {#vlen is 1 + 'complex': Constants.COMPLEX_COLOR_SPEC, + 'float': Constants.FLOAT_COLOR_SPEC, + 'int': Constants.INT_COLOR_SPEC, + 'short': Constants.SHORT_COLOR_SPEC, + 'byte': Constants.BYTE_COLOR_SPEC, + }[self.get_type()] + return {#vlen is non 1 + 'complex': Constants.COMPLEX_VECTOR_COLOR_SPEC, + 'float': Constants.FLOAT_VECTOR_COLOR_SPEC, + 'int': Constants.INT_VECTOR_COLOR_SPEC, + 'short': Constants.SHORT_VECTOR_COLOR_SPEC, + 'byte': Constants.BYTE_VECTOR_COLOR_SPEC, + }[self.get_type()] + except: return _Port.get_color(self) + +class Source(Port): + + def __init__(self, block, n): + self._n = n #save n + #key is port index + n['key'] = str(block._source_count) + block._source_count = block._source_count + 1 + Port.__init__(self, block, n) + + def __del__(self): + self.get_parent()._source_count = self.get_parent()._source_count - 1 + +class Sink(Port): + + def __init__(self, block, n): + self._n = n #save n + #key is port index + n['key'] = str(block._sink_count) + block._sink_count = block._sink_count + 1 + Port.__init__(self, block, n) + + def __del__(self): + self.get_parent()._sink_count = self.get_parent()._sink_count - 1 -- cgit From 9cdea550a868695d3b75dc79ccde4a4cc3b78851 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Mon, 10 Aug 2009 22:29:55 -0700 Subject: apply diff from previous commits --- grc/python/Port.py | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index 5a2b047f0..c01884cc3 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -23,27 +23,23 @@ import Constants class Port(_Port): ##possible port types - TYPES = ['complex', 'float', 'int', 'short', 'byte'] + TYPES = ['complex', 'float', 'int', 'short', 'byte', 'msg'] def __init__(self, block, n): """ Make a new port from nested data. @param block the parent element @param n the nested odict - @return a new port """ - vlen = n.find('vlen') or '1' - nports = n.find('nports') or '' - optional = n.find('optional') or '' #build the port _Port.__init__( self, block=block, n=n, ) - self._nports = nports - self._vlen = vlen - self._optional = bool(optional) + self._nports = n.find('nports') or '' + self._vlen = n.find('vlen') or '1' + self._optional = bool(n.find('optional')) def validate(self): _Port.validate(self) @@ -94,6 +90,7 @@ class Port(_Port): 'int': Constants.INT_COLOR_SPEC, 'short': Constants.SHORT_COLOR_SPEC, 'byte': Constants.BYTE_COLOR_SPEC, + 'msg': Constants.MSG_COLOR_SPEC, }[self.get_type()] return {#vlen is non 1 'complex': Constants.COMPLEX_VECTOR_COLOR_SPEC, @@ -108,10 +105,10 @@ class Source(Port): def __init__(self, block, n): self._n = n #save n - #key is port index - n['key'] = str(block._source_count) - block._source_count = block._source_count + 1 - Port.__init__(self, block, n) + if n['type'] != 'msg': #key is port index + n['key'] = str(block._source_count) + block._source_count = block._source_count + 1 + Port.__init__(self, block, n) def __del__(self): self.get_parent()._source_count = self.get_parent()._source_count - 1 @@ -120,10 +117,14 @@ class Sink(Port): def __init__(self, block, n): self._n = n #save n - #key is port index - n['key'] = str(block._sink_count) - block._sink_count = block._sink_count + 1 - Port.__init__(self, block, n) + if n['type'] != 'msg': #key is port index + n['key'] = str(block._sink_count) + block._sink_count = block._sink_count + 1 + Port.__init__(self, block, n) def __del__(self): self.get_parent()._sink_count = self.get_parent()._sink_count - 1 + +#TODO merge source and sink classes into port class +#TODO check that key is only defined if and only if type is message +#TODO check that nports is undefined when type is message -- cgit From 0a73facce3ce4eba23676df5f22f222df319ed87 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Thu, 13 Aug 2009 23:59:06 -0700 Subject: this time commit the file changes --- grc/python/Port.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index c01884cc3..14adc0618 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -105,10 +105,11 @@ class Source(Port): def __init__(self, block, n): self._n = n #save n - if n['type'] != 'msg': #key is port index + if n['type'] == 'msg': n['key'] = 'msg' + else: n['key'] = str(block._source_count) block._source_count = block._source_count + 1 - Port.__init__(self, block, n) + Port.__init__(self, block, n) def __del__(self): self.get_parent()._source_count = self.get_parent()._source_count - 1 @@ -117,14 +118,14 @@ class Sink(Port): def __init__(self, block, n): self._n = n #save n - if n['type'] != 'msg': #key is port index + if n['type'] == 'msg': n['key'] = 'msg' + else: n['key'] = str(block._sink_count) block._sink_count = block._sink_count + 1 - Port.__init__(self, block, n) + Port.__init__(self, block, n) def __del__(self): self.get_parent()._sink_count = self.get_parent()._sink_count - 1 -#TODO merge source and sink classes into port class -#TODO check that key is only defined if and only if type is message -#TODO check that nports is undefined when type is message +#TODO check that nports and vlen is undefined when type is message +#TODO only allow up to one port of type msg -- cgit From de213686dfa9608bcf59e2c14a4e326049e9779e Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Fri, 14 Aug 2009 23:23:53 -0700 Subject: params, sources, and sinks now stored internally as lists. The keys for said objects are now only stored in one place (in the object). --- grc/python/Port.py | 6 ------ 1 file changed, 6 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index 14adc0618..0b6d20bbe 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -111,9 +111,6 @@ class Source(Port): block._source_count = block._source_count + 1 Port.__init__(self, block, n) - def __del__(self): - self.get_parent()._source_count = self.get_parent()._source_count - 1 - class Sink(Port): def __init__(self, block, n): @@ -124,8 +121,5 @@ class Sink(Port): block._sink_count = block._sink_count + 1 Port.__init__(self, block, n) - def __del__(self): - self.get_parent()._sink_count = self.get_parent()._sink_count - 1 - #TODO check that nports and vlen is undefined when type is message #TODO only allow up to one port of type msg -- cgit From 8e1a2c4ac1a43fd989c06856dae27b0c2559c6b3 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Sat, 15 Aug 2009 00:29:11 -0700 Subject: added validation check for msg type ports, added copy method for ports to cleanup nports code --- grc/python/Port.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index 0b6d20bbe..daf8f9ca3 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -38,7 +38,7 @@ class Port(_Port): n=n, ) self._nports = n.find('nports') or '' - self._vlen = n.find('vlen') or '1' + self._vlen = n.find('vlen') or '' self._optional = bool(n.find('optional')) def validate(self): @@ -47,6 +47,11 @@ class Port(_Port): except AssertionError: self.add_error_message('Port is not connected.') try: assert self.is_source() or len(self.get_enabled_connections()) <= 1 except AssertionError: self.add_error_message('Port has too many connections.') + if self.get_type() == 'msg': + try: assert not self.get_nports() + except AssertionError: self.add_error_message('A port of type "msg" cannot have "nports" set.') + try: assert self.get_vlen() == 1 + except AssertionError: self.add_error_message('A port of type "msg" must have a "vlen" of 1.') def get_vlen(self): """ @@ -101,12 +106,17 @@ class Port(_Port): }[self.get_type()] except: return _Port.get_color(self) + def copy(self, new_key=None): + n = self._n.copy() + if new_key: n['key'] = new_key + return self.__class__(self.get_parent(), n) + class Source(Port): def __init__(self, block, n): self._n = n #save n if n['type'] == 'msg': n['key'] = 'msg' - else: + if not n.find('key'): n['key'] = str(block._source_count) block._source_count = block._source_count + 1 Port.__init__(self, block, n) @@ -116,10 +126,7 @@ class Sink(Port): def __init__(self, block, n): self._n = n #save n if n['type'] == 'msg': n['key'] = 'msg' - else: + if not n.find('key'): n['key'] = str(block._sink_count) block._sink_count = block._sink_count + 1 Port.__init__(self, block, n) - -#TODO check that nports and vlen is undefined when type is message -#TODO only allow up to one port of type msg -- cgit From 63c928575c10741ac6a6c3c3c8be9c238e7b8432 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Mon, 17 Aug 2009 00:54:11 -0700 Subject: Removed Source and Sink classes as Port subclasses. A port can be a source or a sink based on the dir parameter. --- grc/python/Port.py | 34 ++++++++++++---------------------- 1 file changed, 12 insertions(+), 22 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index daf8f9ca3..f71c5fa35 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -25,17 +25,27 @@ class Port(_Port): ##possible port types TYPES = ['complex', 'float', 'int', 'short', 'byte', 'msg'] - def __init__(self, block, n): + def __init__(self, block, n, dir): """ Make a new port from nested data. @param block the parent element @param n the nested odict + @param dir the direction """ + self._n = n + if n['type'] == 'msg': n['key'] = 'msg' + if dir == 'source' and not n.find('key'): + n['key'] = str(block._source_count) + block._source_count += 1 + if dir == 'sink' and not n.find('key'): + n['key'] = str(block._sink_count) + block._sink_count += 1 #build the port _Port.__init__( self, block=block, n=n, + dir=dir, ) self._nports = n.find('nports') or '' self._vlen = n.find('vlen') or '' @@ -109,24 +119,4 @@ class Port(_Port): def copy(self, new_key=None): n = self._n.copy() if new_key: n['key'] = new_key - return self.__class__(self.get_parent(), n) - -class Source(Port): - - def __init__(self, block, n): - self._n = n #save n - if n['type'] == 'msg': n['key'] = 'msg' - if not n.find('key'): - n['key'] = str(block._source_count) - block._source_count = block._source_count + 1 - Port.__init__(self, block, n) - -class Sink(Port): - - def __init__(self, block, n): - self._n = n #save n - if n['type'] == 'msg': n['key'] = 'msg' - if not n.find('key'): - n['key'] = str(block._sink_count) - block._sink_count = block._sink_count + 1 - Port.__init__(self, block, n) + return self.__class__(self.get_parent(), n, self._dir) -- cgit From 854bed10dfb61e9f9feab5259a75e809941089ab Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Wed, 26 Aug 2009 11:23:23 -0700 Subject: Added virtual sink and logic to clone port. Tweaks to the base validation routines. Validate twice in the update until rewrite functions are implemented. --- grc/python/Port.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index f71c5fa35..bfbac7237 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -57,11 +57,25 @@ class Port(_Port): except AssertionError: self.add_error_message('Port is not connected.') try: assert self.is_source() or len(self.get_enabled_connections()) <= 1 except AssertionError: self.add_error_message('Port has too many connections.') + ################################################################ + # message port logic + ################################################################ if self.get_type() == 'msg': try: assert not self.get_nports() except AssertionError: self.add_error_message('A port of type "msg" cannot have "nports" set.') try: assert self.get_vlen() == 1 except AssertionError: self.add_error_message('A port of type "msg" must have a "vlen" of 1.') + ################################################################ + # virtual sink logic + ################################################################ + if self.get_parent().get_key() == 'virtual_sink': + if self.get_enabled_connections(): #clone type and vlen + source = self.get_enabled_connections()[0].get_source() + self._type = str(source.get_type()) + self._vlen = str(source.get_vlen()) + else: #reset type and vlen + self._type = '' + self._vlen = '' def get_vlen(self): """ -- cgit From dc9e9db16047ec589a7b0488fac04c5bb682903c Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Wed, 26 Aug 2009 13:29:28 -0700 Subject: added rewrite methods to element to separate from validation logic --- grc/python/Port.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index bfbac7237..dde736dba 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -57,17 +57,19 @@ class Port(_Port): except AssertionError: self.add_error_message('Port is not connected.') try: assert self.is_source() or len(self.get_enabled_connections()) <= 1 except AssertionError: self.add_error_message('Port has too many connections.') - ################################################################ - # message port logic - ################################################################ + #message port logic if self.get_type() == 'msg': try: assert not self.get_nports() except AssertionError: self.add_error_message('A port of type "msg" cannot have "nports" set.') try: assert self.get_vlen() == 1 except AssertionError: self.add_error_message('A port of type "msg" must have a "vlen" of 1.') - ################################################################ - # virtual sink logic - ################################################################ + + def rewrite(self): + """ + Handle the port cloning for virtual blocks. + """ + _Port.rewrite(self) + #virtual sink logic if self.get_parent().get_key() == 'virtual_sink': if self.get_enabled_connections(): #clone type and vlen source = self.get_enabled_connections()[0].get_source() -- cgit From 36d1520f0ac73b64bd0541b422552a6d419c7ffd Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Fri, 28 Aug 2009 01:09:08 -0700 Subject: added virtual source and added stream ids, logic to clone in port --- grc/python/Port.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index dde736dba..b386e3f89 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -69,13 +69,23 @@ class Port(_Port): Handle the port cloning for virtual blocks. """ _Port.rewrite(self) - #virtual sink logic - if self.get_parent().get_key() == 'virtual_sink': - if self.get_enabled_connections(): #clone type and vlen - source = self.get_enabled_connections()[0].get_source() + if self.get_parent().get_key() in ('virtual_sink', 'virtual_source'): + try: + if self.get_parent().get_key() == 'virtual_sink': + source = self.get_enabled_connections()[0].get_source() + if self.get_parent().get_key() == 'virtual_source': + source = filter( + lambda vs: vs.get_param('stream_id').get_value() == self.get_parent().get_param('stream_id').get_value(), + filter( + lambda b: b.get_key() == 'virtual_sink', + self.get_parent().get_parent().get_enabled_blocks(), + ), + )[0].get_sink('0').get_enabled_connections()[0].get_source() + #clone type and vlen self._type = str(source.get_type()) self._vlen = str(source.get_vlen()) - else: #reset type and vlen + except: + #reset type and vlen self._type = '' self._vlen = '' -- cgit From cadc9548afb7b4a385cea51f48745f0a1c702607 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Fri, 28 Aug 2009 18:15:49 -0700 Subject: Recursive resolution of virtual sources. Flow graph generation code working. Also, mod to fft window to use clean/nice Db/div. --- grc/python/Port.py | 45 ++++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 15 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index b386e3f89..2f7af855c 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -20,6 +20,26 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA from .. base.Port import Port as _Port import Constants +def _get_source_from_virtual_sink_port(vsp): + try: return _get_source_from_virtual_source_port( + vsp.get_enabled_connections()[0].get_source()) + except: raise Exception, 'Could not resolve source for virtual sink port', vsp + +def _get_source_from_virtual_source_port(vsp): + if not vsp.is_virtual_source(): return vsp + try: return _get_source_from_virtual_source_port( + _get_source_from_virtual_sink_port( + filter( + lambda vs: vs.get_param('stream_id').get_value() == vsp.get_parent().get_param('stream_id').get_value(), + filter( + lambda b: b.get_key() == 'virtual_sink', + vsp.get_parent().get_parent().get_enabled_blocks(), + ), + )[0].get_sink(vsp.get_key()) + ) + ) + except: raise Exception, 'Could not resolve source for virtual source port', vsp + class Port(_Port): ##possible port types @@ -69,26 +89,21 @@ class Port(_Port): Handle the port cloning for virtual blocks. """ _Port.rewrite(self) - if self.get_parent().get_key() in ('virtual_sink', 'virtual_source'): - try: - if self.get_parent().get_key() == 'virtual_sink': - source = self.get_enabled_connections()[0].get_source() - if self.get_parent().get_key() == 'virtual_source': - source = filter( - lambda vs: vs.get_param('stream_id').get_value() == self.get_parent().get_param('stream_id').get_value(), - filter( - lambda b: b.get_key() == 'virtual_sink', - self.get_parent().get_parent().get_enabled_blocks(), - ), - )[0].get_sink('0').get_enabled_connections()[0].get_source() - #clone type and vlen + if self.is_virtual_sink() or self.is_virtual_source(): + try: #clone type and vlen + source = self.resolve_virtual_source() self._type = str(source.get_type()) self._vlen = str(source.get_vlen()) - except: - #reset type and vlen + except: #reset type and vlen self._type = '' self._vlen = '' + def is_virtual_sink(self): return self.get_parent().get_key() == 'virtual_sink' + def is_virtual_source(self): return self.get_parent().get_key() == 'virtual_source' + def resolve_virtual_source(self): + if self.is_virtual_sink(): return _get_source_from_virtual_sink_port(self) + if self.is_virtual_source(): return _get_source_from_virtual_source_port(self) + def get_vlen(self): """ Get the vector length. -- cgit From 5f7bd3f80387ea699649f76bd22d0be5ba08732d Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Fri, 28 Aug 2009 20:39:35 -0700 Subject: avoid loops --- grc/python/Port.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index 2f7af855c..80d9fcaae 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -21,12 +21,21 @@ from .. base.Port import Port as _Port import Constants def _get_source_from_virtual_sink_port(vsp): + """ + Resolve the source port that is connected to the given virtual sink port. + Use the get source from virtual source to recursively resolve subsequent ports. + """ try: return _get_source_from_virtual_source_port( vsp.get_enabled_connections()[0].get_source()) - except: raise Exception, 'Could not resolve source for virtual sink port', vsp + except: raise Exception, 'Could not resolve source for virtual sink port %s'%vsp -def _get_source_from_virtual_source_port(vsp): +def _get_source_from_virtual_source_port(vsp, traversed=[]): + """ + Recursively resolve source ports over the virtual connections. + Keep track of traversed sources to avoid recursive loops. + """ if not vsp.is_virtual_source(): return vsp + if vsp in traversed: raise Exception, 'Loop found when resolving virtual source %s'%vsp try: return _get_source_from_virtual_source_port( _get_source_from_virtual_sink_port( filter( @@ -36,9 +45,9 @@ def _get_source_from_virtual_source_port(vsp): vsp.get_parent().get_parent().get_enabled_blocks(), ), )[0].get_sink(vsp.get_key()) - ) + ), traversed + [vsp], ) - except: raise Exception, 'Could not resolve source for virtual source port', vsp + except: raise Exception, 'Could not resolve source for virtual source port %s'%vsp class Port(_Port): -- cgit From cb794a7c8703ea06a9bce110fc1041140f25e8e6 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Fri, 28 Aug 2009 21:06:19 -0700 Subject: made is_virtual_xxx a block level function, used by port and param classes --- grc/python/Port.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index 80d9fcaae..d6c622c46 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -34,14 +34,14 @@ def _get_source_from_virtual_source_port(vsp, traversed=[]): Recursively resolve source ports over the virtual connections. Keep track of traversed sources to avoid recursive loops. """ - if not vsp.is_virtual_source(): return vsp + if not vsp.get_parent().is_virtual_source(): return vsp if vsp in traversed: raise Exception, 'Loop found when resolving virtual source %s'%vsp try: return _get_source_from_virtual_source_port( _get_source_from_virtual_sink_port( - filter( + filter(#get all virtual sinks with a matching stream id lambda vs: vs.get_param('stream_id').get_value() == vsp.get_parent().get_param('stream_id').get_value(), - filter( - lambda b: b.get_key() == 'virtual_sink', + filter(#get all enabled blocks that are also virtual sinks + lambda b: b.is_virtual_sink(), vsp.get_parent().get_parent().get_enabled_blocks(), ), )[0].get_sink(vsp.get_key()) @@ -98,7 +98,7 @@ class Port(_Port): Handle the port cloning for virtual blocks. """ _Port.rewrite(self) - if self.is_virtual_sink() or self.is_virtual_source(): + if self.get_parent().is_virtual_sink() or self.get_parent().is_virtual_source(): try: #clone type and vlen source = self.resolve_virtual_source() self._type = str(source.get_type()) @@ -107,11 +107,9 @@ class Port(_Port): self._type = '' self._vlen = '' - def is_virtual_sink(self): return self.get_parent().get_key() == 'virtual_sink' - def is_virtual_source(self): return self.get_parent().get_key() == 'virtual_source' def resolve_virtual_source(self): - if self.is_virtual_sink(): return _get_source_from_virtual_sink_port(self) - if self.is_virtual_source(): return _get_source_from_virtual_source_port(self) + if self.get_parent().is_virtual_sink(): return _get_source_from_virtual_sink_port(self) + if self.get_parent().is_virtual_source(): return _get_source_from_virtual_source_port(self) def get_vlen(self): """ -- cgit From 576d3978c7fafe5d6727c77281e3aad6d92074d2 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Sat, 29 Aug 2009 01:04:58 -0700 Subject: Replaced TYPES in Port and Param with types parameter. Replaced odict in options for storing options with a list. Fix virtual port check in flow graph template. --- grc/python/Port.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index d6c622c46..3214d937a 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -49,12 +49,12 @@ def _get_source_from_virtual_source_port(vsp, traversed=[]): ) except: raise Exception, 'Could not resolve source for virtual source port %s'%vsp -class Port(_Port): +##possible port types +TYPES = ['complex', 'float', 'int', 'short', 'byte', 'msg', ''] - ##possible port types - TYPES = ['complex', 'float', 'int', 'short', 'byte', 'msg'] +class Port(_Port): - def __init__(self, block, n, dir): + def __init__(self, block, n, dir, **kwargs): """ Make a new port from nested data. @param block the parent element @@ -75,6 +75,7 @@ class Port(_Port): block=block, n=n, dir=dir, + types=TYPES, ) self._nports = n.find('nports') or '' self._vlen = n.find('vlen') or '' -- cgit From cc13a27310e4ab91ebf90ee2d9cd6e3c659e1bc0 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Sun, 30 Aug 2009 09:35:55 -0700 Subject: port and param types from an overloaded method --- grc/python/Port.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index 3214d937a..a714844ef 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -49,12 +49,9 @@ def _get_source_from_virtual_source_port(vsp, traversed=[]): ) except: raise Exception, 'Could not resolve source for virtual source port %s'%vsp -##possible port types -TYPES = ['complex', 'float', 'int', 'short', 'byte', 'msg', ''] - class Port(_Port): - def __init__(self, block, n, dir, **kwargs): + def __init__(self, block, n, dir): """ Make a new port from nested data. @param block the parent element @@ -75,12 +72,13 @@ class Port(_Port): block=block, n=n, dir=dir, - types=TYPES, ) self._nports = n.find('nports') or '' self._vlen = n.find('vlen') or '' self._optional = bool(n.find('optional')) + def get_types(self): return ('complex', 'float', 'int', 'short', 'byte', 'msg', '') + def validate(self): _Port.validate(self) try: assert self.get_enabled_connections() or self.get_optional() -- cgit From 152fcbc219cd2e4f6df7b38843844bc85fdf2bc2 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Sun, 30 Aug 2009 10:34:10 -0700 Subject: Switched the python classes to inherit from the base and gui classes. Use only **kwargs so all contructor parameters must be passed with keys. Moved gui input forms classes from base to gui param module. --- grc/python/Port.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index a714844ef..33426d905 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -18,6 +18,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA """ from .. base.Port import Port as _Port +from .. gui.Port import Port as _GUIPort import Constants def _get_source_from_virtual_sink_port(vsp): @@ -49,7 +50,7 @@ def _get_source_from_virtual_source_port(vsp, traversed=[]): ) except: raise Exception, 'Could not resolve source for virtual source port %s'%vsp -class Port(_Port): +class Port(_Port, _GUIPort): def __init__(self, block, n, dir): """ @@ -73,6 +74,7 @@ class Port(_Port): n=n, dir=dir, ) + _GUIPort.__init__(self) self._nports = n.find('nports') or '' self._vlen = n.find('vlen') or '' self._optional = bool(n.find('optional')) -- cgit From b8f69ad7ba49aa85239f6de611ddfd040344f66b Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Tue, 8 Sep 2009 23:04:38 -0700 Subject: use show signal to perform initial gui update --- grc/python/Port.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index 33426d905..6965371df 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -45,7 +45,7 @@ def _get_source_from_virtual_source_port(vsp, traversed=[]): lambda b: b.is_virtual_sink(), vsp.get_parent().get_parent().get_enabled_blocks(), ), - )[0].get_sink(vsp.get_key()) + )[0].get_sinks()[0] ), traversed + [vsp], ) except: raise Exception, 'Could not resolve source for virtual source port %s'%vsp -- cgit From 8d6a4a06cde05c4b8d97b91bc39521e577d28a22 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Wed, 23 Jun 2010 18:46:05 -0700 Subject: grc: expanded nports ability to have multiple port duplicators per side --- grc/python/Port.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index 6965371df..6e5a5c59f 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -167,5 +167,7 @@ class Port(_Port, _GUIPort): def copy(self, new_key=None): n = self._n.copy() + #remove nports from the key so the copy cannot be a duplicator + if n.has_key('nports'): n.pop('nports') if new_key: n['key'] = new_key return self.__class__(self.get_parent(), n, self._dir) -- cgit From 4cdd41c1046cef12601602bd38dc8ebf42d1550d Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Thu, 14 Apr 2011 10:05:33 -0700 Subject: grc: replaced asserts in python subdirectory --- grc/python/Port.py | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index 6e5a5c59f..3846b0f4e 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -1,5 +1,5 @@ """ -Copyright 2008, 2009 Free Software Foundation, Inc. +Copyright 2008-2011 Free Software Foundation, Inc. This file is part of GNU Radio GNU Radio Companion is free software; you can redistribute it and/or @@ -83,16 +83,16 @@ class Port(_Port, _GUIPort): def validate(self): _Port.validate(self) - try: assert self.get_enabled_connections() or self.get_optional() - except AssertionError: self.add_error_message('Port is not connected.') - try: assert self.is_source() or len(self.get_enabled_connections()) <= 1 - except AssertionError: self.add_error_message('Port has too many connections.') + if not self.get_enabled_connections() and not self.get_optional(): + self.add_error_message('Port is not connected.') + if not self.is_source() and len(self.get_enabled_connections()) > 1: + self.add_error_message('Port has too many connections.') #message port logic if self.get_type() == 'msg': - try: assert not self.get_nports() - except AssertionError: self.add_error_message('A port of type "msg" cannot have "nports" set.') - try: assert self.get_vlen() == 1 - except AssertionError: self.add_error_message('A port of type "msg" must have a "vlen" of 1.') + if self.get_nports(): + self.add_error_message('A port of type "msg" cannot have "nports" set.') + if self.get_vlen() != 1: + self.add_error_message('A port of type "msg" must have a "vlen" of 1.') def rewrite(self): """ @@ -134,8 +134,7 @@ class Port(_Port, _GUIPort): if not nports: return '' try: nports = int(self.get_parent().get_parent().evaluate(nports)) - assert 0 < nports - return nports + if 0 < nports: return nports except: return 1 def get_optional(self): return bool(self._optional) -- cgit From 413964379c19fce5c2c0ad25d1de968a68744f4d Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Sat, 8 Oct 2011 10:23:00 -0700 Subject: grc: added new IO types Added all complex/real float/integer types. Used volk naming convention: fc32, etc... The port type checking now relies on IO size, therefore a short vector of length 2 can connect to a complex short, a float can connect to an int. Basically, the same size checking done in gnuradio runtime. --- grc/python/Port.py | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index 3846b0f4e..9baa81110 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -79,7 +79,7 @@ class Port(_Port, _GUIPort): self._vlen = n.find('vlen') or '' self._optional = bool(n.find('optional')) - def get_types(self): return ('complex', 'float', 'int', 'short', 'byte', 'msg', '') + def get_types(self): return Constants.TYPE_TO_SIZEOF.keys() def validate(self): _Port.validate(self) @@ -146,22 +146,16 @@ class Port(_Port, _GUIPort): @return a hex color code. """ try: - if self.get_vlen() == 1: - return {#vlen is 1 - 'complex': Constants.COMPLEX_COLOR_SPEC, - 'float': Constants.FLOAT_COLOR_SPEC, - 'int': Constants.INT_COLOR_SPEC, - 'short': Constants.SHORT_COLOR_SPEC, - 'byte': Constants.BYTE_COLOR_SPEC, - 'msg': Constants.MSG_COLOR_SPEC, - }[self.get_type()] - return {#vlen is non 1 - 'complex': Constants.COMPLEX_VECTOR_COLOR_SPEC, - 'float': Constants.FLOAT_VECTOR_COLOR_SPEC, - 'int': Constants.INT_VECTOR_COLOR_SPEC, - 'short': Constants.SHORT_VECTOR_COLOR_SPEC, - 'byte': Constants.BYTE_VECTOR_COLOR_SPEC, - }[self.get_type()] + color = Constants.TYPE_TO_COLOR[self.get_type()] + if self.get_vlen() == 1: return color + color_val = int(color[1:], 16) + r = (color_val >> 16) & 0xff + g = (color_val >> 8) & 0xff + b = (color_val >> 0) & 0xff + r = max(r-50, 0) + g = max(g-50, 0) + b = max(b-50, 0) + return '#%.2x%.2x%.2x'%(r, g, b) except: return _Port.get_color(self) def copy(self, new_key=None): -- cgit From 8be1f3f82e0f17583cecab9c8a4763dda4ebc1e7 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Tue, 18 Oct 2011 17:31:48 -0700 Subject: grc: tweaks for colors, added 64 int, vector darken --- grc/python/Port.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index 9baa81110..c2bfd9ccc 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -147,14 +147,16 @@ class Port(_Port, _GUIPort): """ try: color = Constants.TYPE_TO_COLOR[self.get_type()] - if self.get_vlen() == 1: return color + vlen = self.get_vlen() + if vlen == 1: return color color_val = int(color[1:], 16) r = (color_val >> 16) & 0xff g = (color_val >> 8) & 0xff b = (color_val >> 0) & 0xff - r = max(r-50, 0) - g = max(g-50, 0) - b = max(b-50, 0) + dark = (0, 0, 30, 50, 70)[min(4, vlen)] + r = max(r-dark, 0) + g = max(g-dark, 0) + b = max(b-dark, 0) return '#%.2x%.2x%.2x'%(r, g, b) except: return _Port.get_color(self) -- cgit From 25b29495b71e8d3276a9a2f27044524c833772cb Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Sun, 25 Mar 2012 17:52:42 -0700 Subject: grc: resolve down and up stream for empty types --- grc/python/Port.py | 57 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 7 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index c2bfd9ccc..d0ef51b48 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -1,5 +1,5 @@ """ -Copyright 2008-2011 Free Software Foundation, Inc. +Copyright 2008-2012 Free Software Foundation, Inc. This file is part of GNU Radio GNU Radio Companion is free software; you can redistribute it and/or @@ -24,7 +24,7 @@ import Constants def _get_source_from_virtual_sink_port(vsp): """ Resolve the source port that is connected to the given virtual sink port. - Use the get source from virtual source to recursively resolve subsequent ports. + Use the get source from virtual source to recursively resolve subsequent ports. """ try: return _get_source_from_virtual_source_port( vsp.get_enabled_connections()[0].get_source()) @@ -50,6 +50,35 @@ def _get_source_from_virtual_source_port(vsp, traversed=[]): ) except: raise Exception, 'Could not resolve source for virtual source port %s'%vsp +def _get_sink_from_virtual_source_port(vsp): + """ + Resolve the sink port that is connected to the given virtual source port. + Use the get sink from virtual sink to recursively resolve subsequent ports. + """ + try: return _get_sink_from_virtual_sink_port( + vsp.get_enabled_connections()[0].get_sink()) # Could have many connections, but use first + except: raise Exception, 'Could not resolve source for virtual source port %s'%vsp + +def _get_sink_from_virtual_sink_port(vsp, traversed=[]): + """ + Recursively resolve sink ports over the virtual connections. + Keep track of traversed sinks to avoid recursive loops. + """ + if not vsp.get_parent().is_virtual_sink(): return vsp + if vsp in traversed: raise Exception, 'Loop found when resolving virtual sink %s'%vsp + try: return _get_sink_from_virtual_sink_port( + _get_sink_from_virtual_source_port( + filter(#get all virtual source with a matching stream id + lambda vs: vs.get_param('stream_id').get_value() == vsp.get_parent().get_param('stream_id').get_value(), + filter(#get all enabled blocks that are also virtual sinks + lambda b: b.is_virtual_source(), + vsp.get_parent().get_parent().get_enabled_blocks(), + ), + )[0].get_sources()[0] + ), traversed + [vsp], + ) + except: raise Exception, 'Could not resolve source for virtual sink port %s'%vsp + class Port(_Port, _GUIPort): def __init__(self, block, n, dir): @@ -81,6 +110,8 @@ class Port(_Port, _GUIPort): def get_types(self): return Constants.TYPE_TO_SIZEOF.keys() + def is_type_empty(self): return not self._n['type'] + def validate(self): _Port.validate(self) if not self.get_enabled_connections() and not self.get_optional(): @@ -99,18 +130,30 @@ class Port(_Port, _GUIPort): Handle the port cloning for virtual blocks. """ _Port.rewrite(self) - if self.get_parent().is_virtual_sink() or self.get_parent().is_virtual_source(): + if self.is_type_empty(): try: #clone type and vlen - source = self.resolve_virtual_source() + source = self.resolve_empty_type() self._type = str(source.get_type()) self._vlen = str(source.get_vlen()) except: #reset type and vlen self._type = '' self._vlen = '' - def resolve_virtual_source(self): - if self.get_parent().is_virtual_sink(): return _get_source_from_virtual_sink_port(self) - if self.get_parent().is_virtual_source(): return _get_source_from_virtual_source_port(self) + def resolve_empty_type(self): + if self.is_sink(): + try: + src = _get_source_from_virtual_sink_port(self) + if not src.is_type_empty(): return src + except: pass + sink = _get_sink_from_virtual_sink_port(self) + if not sink.is_type_empty(): return sink + if self.is_source(): + try: + src = _get_source_from_virtual_source_port(self) + if not src.is_type_empty(): return src + except: pass + sink = _get_sink_from_virtual_source_port(self) + if not sink.is_type_empty(): return sink def get_vlen(self): """ -- cgit From 53dabcddefa202facfd0825fd2171f840a1a47c3 Mon Sep 17 00:00:00 2001 From: Justin R. Cutler Date: Thu, 31 May 2012 17:02:05 -0700 Subject: grc: restore virtual ports in grc --- grc/python/Port.py | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index d0ef51b48..9f8b50d05 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -139,6 +139,10 @@ class Port(_Port, _GUIPort): self._type = '' self._vlen = '' + def resolve_virtual_source(self): + if self.get_parent().is_virtual_sink(): return _get_source_from_virtual_sink_port(self) + if self.get_parent().is_virtual_source(): return _get_source_from_virtual_source_port(self) + def resolve_empty_type(self): if self.is_sink(): try: -- cgit From 6cc818260128df57c51a41e4e6aa459de5faf4fe Mon Sep 17 00:00:00 2001 From: Tim O'Shea Date: Fri, 30 Nov 2012 22:31:43 -0800 Subject: core: gr_blocks can now have only message ports with no general_work() * msg only blocks now get thread context * added blocking msg queue delete call * added gr_message_strobe block * added grc definitions for message_debug, message_strobe, pdu_to_tagged_stream, tagged_stream_to_pdu. * allow message fan-in connections in GRC --- grc/python/Port.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index 9f8b50d05..738a33ba7 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -116,7 +116,7 @@ class Port(_Port, _GUIPort): _Port.validate(self) if not self.get_enabled_connections() and not self.get_optional(): self.add_error_message('Port is not connected.') - if not self.is_source() and len(self.get_enabled_connections()) > 1: + if not self.is_source() and (not self.get_type() == "message") and len(self.get_enabled_connections()) > 1: self.add_error_message('Port has too many connections.') #message port logic if self.get_type() == 'msg': -- cgit From e826097e09fdfb04d14bf87861646b88229db881 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Sun, 13 Jan 2013 13:51:46 -0800 Subject: gras: support changeset for 3.6.4 used volk from next branch cf5c930d89ac89ba5a0da4a616c88d3c37e018ae for grextras support (it uses the dispatcher) empty stubs for the gr_basic_block msg passing. This is going to be difficult to figure out. The alias stuff may or may not be related most qa pass, there seems to be some additional issues, will be working through them on futher commits Conflicts: gnuradio-core/CMakeLists.txt gnuradio-core/src/lib/runtime/CMakeLists.txt gnuradio-core/src/lib/runtime/gr_block.cc gnuradio-core/src/lib/runtime/gr_block.h gnuradio-core/src/lib/runtime/gr_hier_block2.h gnuradio-core/src/lib/runtime/gr_top_block.h gnuradio-core/src/python/gnuradio/gr/__init__.py gr-audio/examples/c++/CMakeLists.txt gr-fcd/examples/c++/CMakeLists.txt grc/python/Port.py --- grc/python/Port.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index 738a33ba7..4c0175f90 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -116,7 +116,8 @@ class Port(_Port, _GUIPort): _Port.validate(self) if not self.get_enabled_connections() and not self.get_optional(): self.add_error_message('Port is not connected.') - if not self.is_source() and (not self.get_type() == "message") and len(self.get_enabled_connections()) > 1: + is_msg = (not self.get_type()) or (self.get_type() == "message") + if not self.is_source() and (not is_msg) and len(self.get_enabled_connections()) > 1: self.add_error_message('Port has too many connections.') #message port logic if self.get_type() == 'msg': -- cgit From ce52bd370c0b13ed4de11df08168768dec327497 Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Tue, 26 Mar 2013 13:27:29 -0400 Subject: grc: fixes problem with order of defining message ports vs. data ports. --- grc/python/Port.py | 1 + 1 file changed, 1 insertion(+) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index 738a33ba7..9e9f5676e 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -90,6 +90,7 @@ class Port(_Port, _GUIPort): """ self._n = n if n['type'] == 'msg': n['key'] = 'msg' + if n['type'] == 'message': n['key'] = n['name'] if dir == 'source' and not n.find('key'): n['key'] = str(block._source_count) block._source_count += 1 -- cgit