summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--grc/base/Block.py7
-rw-r--r--grc/base/FlowGraph.py12
-rw-r--r--grc/blocks/Makefile.am1
-rw-r--r--grc/blocks/block_tree.xml1
-rw-r--r--grc/blocks/virtual_sink.xml15
-rw-r--r--grc/gui/ActionHandler.py2
-rw-r--r--grc/gui/FlowGraph.py4
-rw-r--r--grc/python/Port.py14
8 files changed, 44 insertions, 12 deletions
diff --git a/grc/base/Block.py b/grc/base/Block.py
index 349e71f76..491c594cc 100644
--- a/grc/base/Block.py
+++ b/grc/base/Block.py
@@ -145,13 +145,12 @@ class Block(Element):
Validate the block.
All ports and params must be valid.
All checks must evaluate to true.
+ Validate the params, ports, and the connections to this block.
"""
Element.validate(self)
for c in self.get_params() + self.get_ports() + self.get_connections():
- try:
- c.validate()
- assert c.is_valid()
- except AssertionError:
+ c.validate()
+ if not c.is_valid():
for msg in c.get_error_messages():
self.add_error_message('>>> %s:\n\t%s'%(c, msg))
diff --git a/grc/base/FlowGraph.py b/grc/base/FlowGraph.py
index ea489e948..fe493cce1 100644
--- a/grc/base/FlowGraph.py
+++ b/grc/base/FlowGraph.py
@@ -150,14 +150,14 @@ class FlowGraph(Element):
def validate(self):
"""
Validate the flow graph.
- All connections and blocks must be valid.
+ Validate only the blocks.
+ Connections will be validated within the blocks.
"""
Element.validate(self)
- for c in self.get_elements():
- try:
- c.validate()
- assert c.is_valid()
- except AssertionError: self.add_error_message('Element "%s" is not valid.'%c)
+ for c in self.get_blocks():
+ c.validate()
+ if not c.is_valid():
+ self.add_error_message('Element "%s" is not valid.'%c)
##############################################
## Import/Export Methods
diff --git a/grc/blocks/Makefile.am b/grc/blocks/Makefile.am
index caae6ce75..328661510 100644
--- a/grc/blocks/Makefile.am
+++ b/grc/blocks/Makefile.am
@@ -218,6 +218,7 @@ dist_ourdata_DATA = \
variable_slider.xml \
variable_static_text.xml \
variable_text_box.xml \
+ virtual_sink.xml \
wxgui_constellationsink2.xml \
wxgui_fftsink2.xml \
wxgui_histosink2.xml \
diff --git a/grc/blocks/block_tree.xml b/grc/blocks/block_tree.xml
index 5b45466f5..772320d1b 100644
--- a/grc/blocks/block_tree.xml
+++ b/grc/blocks/block_tree.xml
@@ -35,6 +35,7 @@
<block>gr_wavfile_sink</block>
<block>gr_message_sink</block>
<block>pad_sink</block>
+ <block>virtual_sink</block>
</cat>
<cat>
<name>Graphical Sinks</name>
diff --git a/grc/blocks/virtual_sink.xml b/grc/blocks/virtual_sink.xml
new file mode 100644
index 000000000..314fb3dc9
--- /dev/null
+++ b/grc/blocks/virtual_sink.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+##Virtual Sink
+###################################################
+ -->
+<block>
+ <name>Virtual Sink</name>
+ <key>virtual_sink</key>
+ <make></make>
+ <sink>
+ <name>in</name>
+ <type></type>
+ </sink>
+</block>
diff --git a/grc/gui/ActionHandler.py b/grc/gui/ActionHandler.py
index 9af580e8e..0e64aa89d 100644
--- a/grc/gui/ActionHandler.py
+++ b/grc/gui/ActionHandler.py
@@ -221,13 +221,11 @@ class ActionHandler:
elif state == Actions.PORT_CONTROLLER_INC:
if self.get_flow_graph().port_controller_modify_selected(1):
self.get_flow_graph().update()
- self.get_flow_graph().update() #2 times
self.get_page().get_state_cache().save_new_state(self.get_flow_graph().export_data())
self.get_page().set_saved(False)
elif state == Actions.PORT_CONTROLLER_DEC:
if self.get_flow_graph().port_controller_modify_selected(-1):
self.get_flow_graph().update()
- self.get_flow_graph().update() #2 times
self.get_page().get_state_cache().save_new_state(self.get_flow_graph().export_data())
self.get_page().set_saved(False)
##################################################
diff --git a/grc/gui/FlowGraph.py b/grc/gui/FlowGraph.py
index f8028f199..007bb622c 100644
--- a/grc/gui/FlowGraph.py
+++ b/grc/gui/FlowGraph.py
@@ -292,8 +292,12 @@ class FlowGraph(Element):
def update(self):
"""
Call update on all elements.
+ Validate twice:
+ 1) elements call special rewrite rules that may break validation
+ 2) elements should come up with the same results, validation can pass
"""
self.validate()
+ self.validate()
for element in self.get_elements(): element.update()
##########################################################################
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):
"""