grc: better handling of disabled elements
authorjblum <jblum@221aa14e-8319-0410-a670-987f0aec2ac5>
Fri, 6 Feb 2009 19:01:10 +0000 (19:01 +0000)
committerjblum <jblum@221aa14e-8319-0410-a670-987f0aec2ac5>
Fri, 6 Feb 2009 19:01:10 +0000 (19:01 +0000)
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@10403 221aa14e-8319-0410-a670-987f0aec2ac5

grc/src/gui/Messages.py
grc/src/platforms/base/Block.py
grc/src/platforms/base/Connection.py
grc/src/platforms/base/Element.py
grc/src/platforms/base/Port.py
grc/src/platforms/python/Block.py
grc/src/platforms/python/Port.py

index bd7b4b2b72633ebd6d3f7797a7203103ac3d3351..e8e36f90f81c4edf66d0861f0a808c02f7519d12 100644 (file)
@@ -91,7 +91,7 @@ def send_fail_save(file_path):
 
 ################# functions for connections    ########################################
 def send_fail_connection():
-       send('>>> Warning: A connection can only be created between a source and an unconnected sink.\n')
+       send('>>> Error: Cannot create connection.\n')
 
 ################# functions for preferences    ########################################
 def send_fail_load_preferences(prefs_file_path):
index 89a4c43835e4f131b42e92133fc3c275688f3d8f..8cbcad5a707c8a53b30419eb1f758bc71343cfd4 100644 (file)
@@ -142,8 +142,7 @@ class Block(Element):
                All ports and params must be valid.
                All checks must evaluate to true.
                """
-               if not self.get_enabled(): return
-               for c in self.get_params() + self.get_sinks() + self.get_sources() + self.get_connections():
+               for c in self.get_params() + self.get_ports() + self.get_connections():
                        try: assert(c.is_valid())
                        except AssertionError:
                                for msg in c.get_error_messages():
index 954d4866a54a879d0dd3d198cacb641573673141..b8b75ac133208c4f8a829b6e10dc9d963f5c994b 100644 (file)
@@ -37,10 +37,10 @@ class Connection(Element):
                for port in (porta, portb):
                        if port.is_source(): source = port
                        if port.is_sink(): sink = port
-               #verify the source and sink
                assert(source and sink)
-               assert(not source.is_full())
-               assert(not sink.is_full())
+               #ensure that this connection (source -> sink) is unique
+               for connection in self.get_parent().get_connections():
+                       assert not (connection.get_source() is source and connection.get_sink() is sink)
                self._source = source
                self._sink = sink
 
index b6602a31432b7f76a5bc262d63181177c5706daf..a16be912797b8f4287aaee53dcbc21f8b22d741b 100644 (file)
@@ -41,10 +41,13 @@ class Element(object):
 
        def is_valid(self):
                self._error_messages = []#reset err msgs
-               try: self.validate()
-               except: pass
+               if self.get_enabled():
+                       try: self.validate()
+                       except: pass
                return not self.get_error_messages()
 
+       def get_enabled(self): return True
+
        def _add_error_message(self, msg):
                self._error_messages.append(msg)
 
index 672b2e4db5b9a36a14a9bfce2dd48ddb3619c7e7..26ad1fc4ae795ec3daae4c796ca8dda5959a253b 100644 (file)
@@ -47,8 +47,6 @@ class Port(Element):
                Validate the port.
                The port must be non-empty and type must a possible type.
                """
-               try: assert(not self.is_empty())
-               except AssertionError: self._add_error_message('Port is not connected.')
                try: assert(self.get_type() in self.TYPES)
                except AssertionError: self._add_error_message('Type "%s" is not a possible type.'%self.get_type())
 
@@ -59,17 +57,11 @@ class Port(Element):
                        return 'Sink - %s(%s)'%(self.get_name(), self.get_key())
 
        def is_port(self): return True
-
        def get_color(self): return '#FFFFFF'
-
        def get_name(self): return self._name
-
        def get_key(self): return self._key
-
        def is_sink(self): return self in self.get_parent().get_sinks()
-
        def is_source(self): return self in self.get_parent().get_sources()
-
        def get_type(self): return self.get_parent().resolve_dependencies(self._type)
 
        def get_connections(self):
@@ -81,26 +73,9 @@ class Port(Element):
                connections = filter(lambda c: c.get_source() is self or c.get_sink() is self, connections)
                return connections
 
-       def is_connected(self):
-               """
-               Is this port connected?
-               @return true if at least one connection
+       def get_enabled_connections(self):
                """
-               return bool(self.get_connections())
-
-       def is_full(self):
-               """
-               Is this port full of connections?
-               Generally a sink can handle one connection and a source can handle many.
-               @return true if the port is full
-               """
-               if self.is_source(): return False
-               if self.is_sink(): return bool(self.get_connections())
-
-       def is_empty(self):
-               """
-               Is this port empty?
-               An empty port has no connections.
-               @return true if empty
+               Get all enabled connections that use this port.
+               @return a list of connection objects
                """
-               return not self.get_connections()
+               return filter(lambda c: c.get_enabled(), self.get_connections())
index 655a6ec553a1b617b8023856c7795930f5f0dd93..91b86cc85f2fe3db3ef71e48f43bbe6db41c0d11 100644 (file)
@@ -69,6 +69,7 @@ class Block(_Block):
                                try: assert check_eval
                                except AssertionError: self._add_error_message('Check "%s" failed.'%check)
                        except: self._add_error_message('Check "%s" did not evaluate.'%check)
+               #adjust nports
                for ports, Port in (
                        (self._sources, self.get_parent().get_parent().Source),
                        (self._sinks, self.get_parent().get_parent().Sink),
index e75b47e4b07fdac566e6aee94b1778871c4c6ca8..73ec07242b7f50663bce1df692f889bb5783d1d5 100644 (file)
@@ -46,6 +46,13 @@ class Port(_Port):
                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.
@@ -98,15 +105,6 @@ class Port(_Port):
                        }[self.get_type()]
                except: return _Port.get_color(self)
 
-       def is_empty(self):
-               """
-               Is this port empty?
-               An empty port has no connections.
-               Not empty of optional is set.
-               @return true if empty
-               """
-               return not self.get_optional() and not self.get_connections()
-
 class Source(Port):
 
        def __init__(self, block, n):