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