From 854bed10dfb61e9f9feab5259a75e809941089ab Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Wed, 26 Aug 2009 11:23:23 -0700 Subject: [PATCH] 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/base/Block.py | 7 +++---- grc/base/FlowGraph.py | 12 ++++++------ grc/blocks/Makefile.am | 1 + grc/blocks/block_tree.xml | 1 + grc/blocks/virtual_sink.xml | 15 +++++++++++++++ grc/gui/ActionHandler.py | 2 -- grc/gui/FlowGraph.py | 4 ++++ grc/python/Port.py | 14 ++++++++++++++ 8 files changed, 44 insertions(+), 12 deletions(-) create mode 100644 grc/blocks/virtual_sink.xml diff --git a/grc/base/Block.py b/grc/base/Block.py index 349e71f7..491c594c 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 ea489e94..fe493cce 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 caae6ce7..32866151 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 5b45466f..772320d1 100644 --- a/grc/blocks/block_tree.xml +++ b/grc/blocks/block_tree.xml @@ -35,6 +35,7 @@ gr_wavfile_sink gr_message_sink pad_sink + virtual_sink Graphical Sinks diff --git a/grc/blocks/virtual_sink.xml b/grc/blocks/virtual_sink.xml new file mode 100644 index 00000000..314fb3dc --- /dev/null +++ b/grc/blocks/virtual_sink.xml @@ -0,0 +1,15 @@ + + + + Virtual Sink + virtual_sink + + + in + + + diff --git a/grc/gui/ActionHandler.py b/grc/gui/ActionHandler.py index 9af580e8..0e64aa89 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 f8028f19..007bb622 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 f71c5fa3..bfbac723 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): """ -- 2.30.2