diff options
-rw-r--r-- | grc/base/Block.py | 7 | ||||
-rw-r--r-- | grc/base/FlowGraph.py | 12 | ||||
-rw-r--r-- | grc/blocks/Makefile.am | 1 | ||||
-rw-r--r-- | grc/blocks/block_tree.xml | 1 | ||||
-rw-r--r-- | grc/blocks/virtual_sink.xml | 15 | ||||
-rw-r--r-- | grc/gui/ActionHandler.py | 2 | ||||
-rw-r--r-- | grc/gui/FlowGraph.py | 4 | ||||
-rw-r--r-- | grc/python/Port.py | 14 |
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): """ |