diff options
author | Josh Morman <jmorman@perspectalabs.com> | 2019-08-30 09:47:42 -0400 |
---|---|---|
committer | devnulling <devnulling@users.noreply.github.com> | 2020-02-10 13:33:07 -0800 |
commit | 3232eeb534b5ac1ab503f7f36254227b1cfba1f9 (patch) | |
tree | c950d0e841644ed584737e905e315d778fe26f3e /grc/core/generator/flow_graph.py.mako | |
parent | 838d081918f8e5ee3f28273237d8b74a8c0b9d9b (diff) |
grc: add python snippets to GRC
This feature adds the ability to insert arbitrary code into the python
flowgraph. It gives a little more low-level flexibility for quickly
modifying flowgraphs and adding custom bits of code rather than having
to go and edit the generated py file
One example is synchronizing multiple USRP objects - sometimes you want
different sync than what is offered in the multi-usrp object, so you can
put a bit of code in the snippet block to do the custom synchronization
Diffstat (limited to 'grc/core/generator/flow_graph.py.mako')
-rw-r--r-- | grc/core/generator/flow_graph.py.mako | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/grc/core/generator/flow_graph.py.mako b/grc/core/generator/flow_graph.py.mako index 7e731d1a9d..3635c550db 100644 --- a/grc/core/generator/flow_graph.py.mako +++ b/grc/core/generator/flow_graph.py.mako @@ -42,6 +42,7 @@ if __name__ == '__main__': ##${imp.replace(" # grc-generated hier_block", "")} ${imp} % endfor + ######################################################## ##Create Class ## Write the class declaration for a top or hier block. @@ -219,6 +220,7 @@ gr.io_signaturev(${len(io_sigs)}, ${len(io_sigs)}, [${', '.join(size_strs)}])\ ${ connection.rstrip() } % endfor % endif + ######################################################## ## QT sink close method reimplementation ######################################################## @@ -266,6 +268,32 @@ gr.io_signaturev(${len(io_sigs)}, ${len(io_sigs)}, [${', '.join(size_strs)}])\ % endfor % endif % endfor +\ +% for snip in flow_graph.get_snippets_dict(): + +${indent(snip['def'])} +% for line in snip['lines']: + ${indent(line)} +% endfor +% endfor +\ +<% +snippet_sections = ['main_after_init', 'main_after_start', 'main_after_stop'] +snippets = {} +for section in snippet_sections: + snippets[section] = flow_graph.get_snippets_dict(section) +%> +\ +%for section in snippet_sections: +%if snippets[section]: + +def snippets_${section}(tb): + % for snip in snippets[section]: + ${indent(snip['call'])} + % endfor +%endif +%endfor + ######################################################## ##Create Main ## For top block code, generate a main routine. @@ -335,9 +363,11 @@ def main(top_block_cls=${class_name}, options=None): qapp = Qt.QApplication(sys.argv) tb = top_block_cls(${ ', '.join(params_eq_list) }) + ${'snippets_main_after_init(tb)' if snippets['main_after_init'] else ''} % if flow_graph.get_option('run'): tb.start(${flow_graph.get_option('max_nouts') or ''}) % endif + ${'snippets_main_after_start(tb)' if snippets['main_after_start'] else ''} % if flow_graph.get_option('qt_qss_theme'): tb.setStyleSheetFromFile("${ flow_graph.get_option('qt_qss_theme') }") % endif @@ -356,6 +386,7 @@ def main(top_block_cls=${class_name}, options=None): def quitting(): tb.stop() tb.wait() + ${'snippets_main_after_stop(tb)' if snippets['main_after_stop'] else ''} qapp.aboutToQuit.connect(quitting) % for m in monitors: % if m.params['en'].get_value() == 'True': @@ -368,6 +399,7 @@ def main(top_block_cls=${class_name}, options=None): def killProc(signum, frame, tb): tb.stop() tb.wait() + ${'snippets_main_after_stop(tb)' if snippets['main_after_stop'] else ''} serverProc.terminate() serverProc.kill() time.sleep(1) @@ -383,20 +415,23 @@ def main(top_block_cls=${class_name}, options=None): url = "http://localhost:" + port + "/bokehgui") # Create Top Block instance tb = top_block_cls(doc) + ${'snippets_main_after_init(tb)' if snippets['main_after_init'] else ''} try: tb.start() + ${'snippets_main_after_start(tb)' if snippets['main_after_start'] else ''} signal.signal(signal.SIGTERM, functools.partial(killProc, tb=tb)) session.loop_until_closed() finally: print("Exiting the simulation. Stopping Bokeh Server") tb.stop() tb.wait() + ${'snippets_main_after_stop(tb)' if snippets['main_after_stop'] else ''} finally: serverProc.terminate() serverProc.kill() % elif generate_options == 'no_gui': tb = top_block_cls(${ ', '.join(params_eq_list) }) - + ${'snippets_main_after_init(tb)' if snippets['main_after_init'] else ''} def sig_handler(sig=None, frame=None): % for m in monitors: % if m.params['en'].get_value() == 'True': @@ -405,6 +440,7 @@ def main(top_block_cls=${class_name}, options=None): % endfor tb.stop() tb.wait() + ${'snippets_main_after_stop(tb)' if snippets['main_after_stop'] else ''} sys.exit(0) signal.signal(signal.SIGINT, sig_handler) @@ -412,6 +448,7 @@ def main(top_block_cls=${class_name}, options=None): % if flow_graph.get_option('run_options') == 'prompt': tb.start(${ flow_graph.get_option('max_nouts') or '' }) + ${'snippets_main_after_start(tb)' if snippets['main_after_start'] else ''} % for m in monitors: % if m.params['en'].get_value() == 'True': tb.${m.name}.start() @@ -422,8 +459,10 @@ def main(top_block_cls=${class_name}, options=None): except EOFError: pass tb.stop() + ## ${'snippets_main_after_stop(tb)' if snippets['main_after_stop'] else ''} % elif flow_graph.get_option('run_options') == 'run': tb.start(${flow_graph.get_option('max_nouts') or ''}) + ${'snippets_main_after_start(tb)' if snippets['main_after_start'] else ''} % for m in monitors: % if m.params['en'].get_value() == 'True': tb.${m.name}.start() @@ -431,6 +470,7 @@ def main(top_block_cls=${class_name}, options=None): % endfor % endif tb.wait() + ${'snippets_main_after_stop(tb)' if snippets['main_after_stop'] else ''} % for m in monitors: % if m.params['en'].get_value() == 'True': tb.${m.name}.stop() @@ -438,7 +478,6 @@ def main(top_block_cls=${class_name}, options=None): % endfor % endif - if __name__ == '__main__': main() % endif |