#!/usr/bin/env python ######################################################## ##Cheetah template - gnuradio_python ## ##@param imports the import statements ##@param flow_graph the flow_graph ##@param variables the variable blocks ##@param parameters the paramater blocks ##@param blocks the signal blocks ##@param connections the connections ##@param messages the msg type connections ##@param generate_options the type of flow graph ##@param var_id2cbs variable id map to callback strings ######################################################## #def indent($code) #set $code = '\n\t\t'.join(str($code).splitlines()) $code#slurp #end def #import time #set $DIVIDER = '#'*50 $DIVIDER # Gnuradio Python Flow Graph # Title: $title #if $flow_graph.get_option('author') # Author: $flow_graph.get_option('author') #end if #if $flow_graph.get_option('description') # Description: $flow_graph.get_option('description') #end if # Generated: $time.ctime() $DIVIDER ######################################################## ##Create Imports ######################################################## #for $imp in $imports $imp #end for ######################################################## ##Create Class ## Write the class declaration for a top or hier block. ## The parameter names are the arguments to __init__. ## Determine the absolute icon path (wx gui only). ## Setup the IO signature (hier block only). ######################################################## #set $class_name = $flow_graph.get_option('id') #set $param_str = ', '.join(['self'] + ['%s=%s'%(param.get_id(), param.get_make()) for param in $parameters]) #if $generate_options == 'wx_gui' #import gtk #set $icon = gtk.IconTheme().lookup_icon('gnuradio-grc', 32, 0) class $(class_name)(grc_wxgui.top_block_gui): def __init__($param_str): grc_wxgui.top_block_gui.__init__(self, title="$title") #if $icon _icon_path = "$icon.get_filename()" self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) #end if #elif $generate_options == 'qt_gui' class $(class_name)(gr.top_block, Qt.QWidget): def __init__($param_str): gr.top_block.__init__(self, "$title") Qt.QWidget.__init__(self) self.setWindowTitle("$title") self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc')) self.top_scroll_layout = Qt.QVBoxLayout() self.setLayout(self.top_scroll_layout) self.top_scroll = Qt.QScrollArea() self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame) self.top_scroll_layout.addWidget(self.top_scroll) self.top_scroll.setWidgetResizable(True) self.top_widget = Qt.QWidget() self.top_scroll.setWidget(self.top_widget) self.top_layout = Qt.QVBoxLayout(self.top_widget) self.top_grid_layout = Qt.QGridLayout() self.top_layout.addLayout(self.top_grid_layout) #elif $generate_options == 'no_gui' class $(class_name)(gr.top_block): def __init__($param_str): gr.top_block.__init__(self, "$title") #elif $generate_options == 'hb' #set $in_sigs = $flow_graph.get_io_signaturev('in') #set $out_sigs = $flow_graph.get_io_signaturev('out') class $(class_name)(gr.hier_block2): #def make_io_sig($io_sigs) #set $size_strs = ['%s*%s'%(io_sig['size'], io_sig['vlen']) for io_sig in $io_sigs] #if len($io_sigs) == 0 gr.io_signature(0, 0, 0)#slurp #elif len($io_sigs) == 1 gr.io_signature(1, 1, $size_strs[0])#slurp #else gr.io_signaturev($(len($io_sigs)), $(len($io_sigs)), [$(', '.join($size_strs))])#slurp #end if #end def def __init__($param_str): gr.hier_block2.__init__( self, "$title", $make_io_sig($in_sigs), $make_io_sig($out_sigs), ) #end if ######################################################## ##Create Parameters ## Set the parameter to a property of self. ######################################################## #if $parameters $DIVIDER # Parameters $DIVIDER #end if #for $param in $parameters $indent($param.get_var_make()) #end for ######################################################## ##Create Variables ######################################################## #if $variables $DIVIDER # Variables $DIVIDER #end if #for $var in $variables $indent($var.get_var_make()) #end for ######################################################## ##Create Message Queues ######################################################## #if $messages $DIVIDER # Message Queues $DIVIDER #end if #for $msg in $messages $(msg.get_source().get_parent().get_id())_msgq_out = $(msg.get_sink().get_parent().get_id())_msgq_in = gr.msg_queue(2) #end for ######################################################## ##Create Blocks ######################################################## #if $blocks $DIVIDER # Blocks $DIVIDER #end if #for $blk in filter(lambda b: b.get_make(), $blocks) #if $blk in $variables $indent($blk.get_make()) #else self.$blk.get_id() = $indent($blk.get_make()) #end if #end for ######################################################## ##Create Connections ## The port name should be the id of the parent block. ## However, port names for IO pads should be self. ######################################################## #def make_port_sig($port) #if $port.get_parent().get_key() == 'pad_source' (self, $flow_graph.get_pad_sources().index($port.get_parent()))#slurp #elif $port.get_parent().get_key() == 'pad_sink' (self, $flow_graph.get_pad_sinks().index($port.get_parent()))#slurp #else (self.$port.get_parent().get_id(), $port.get_key())#slurp #end if #end def #if $connections $DIVIDER # Connections $DIVIDER #end if #for $con in $connections #set $source = $con.get_source() #set $sink = $con.get_sink() ##resolve virtual sources to the actual sources #if $source.get_parent().is_virtual_source() #set $source = $source.resolve_virtual_source() #end if ##do not generate connections with virtual sinks #if not $sink.get_parent().is_virtual_sink() self.connect($make_port_sig($source), $make_port_sig($sink)) #end if #end for ######################################################## ##Create Asynch Message Connections ######################################################## #if $messages2 $DIVIDER # Asynch Message Connections $DIVIDER #end if #for $msg in $messages2 #set $sr = $msg.get_source() #set $source = "self.%s"%($sr.get_parent().get_id()) #set $source_port = $sr.get_name(); #if $sr.get_parent().get_key() == "pad_source" #set $source = "self" #set $source_port = $sr.get_parent().get_param("label").get_value(); #end if #set $sk = $msg.get_sink() #set $sink = "self.%s"%($sk.get_parent().get_id()) #set $sink_port = $sk.get_name(); #if $sk.get_parent().get_key() == "pad_sink" #set $sink = "self" #set $sink_port = $sk.get_parent().get_param("label").get_value(); #end if self.msg_connect($source, "$source_port", $sink, "$sink_port") #end for ######################################################## ##Create Callbacks ## Write a set method for this variable that calls the callbacks ######################################################## #for $var in $parameters + $variables #set $id = $var.get_id() def get_$(id)(self): return self.$id def set_$(id)(self, $id): self.$id = $id #for $callback in $var_id2cbs[$id] $indent($callback) #end for #end for ######################################################## ##Create Main ## For top block code, generate a main routine. ## Instantiate the top block and run as gui or cli. ######################################################## #def make_default($type, $param) #if $type == 'eng_float' eng_notation.num_to_str($param.get_make())#slurp #else $param.get_make()#slurp #end if #end def #def make_short_id($param) #set $short_id = $param.get_param('short_id').get_evaluated() #if $short_id #set $short_id = '-' + $short_id #end if $short_id#slurp #end def #if $generate_options != 'hb' if __name__ == '__main__': parser = OptionParser(option_class=eng_option, usage="%prog: [options]") #set $params_eq_list = list() #for $param in $parameters #set $type = $param.get_param('type').get_value() #if $type #silent $params_eq_list.append('%s=options.%s'%($param.get_id(), $param.get_id())) parser.add_option("$make_short_id($param)", "--$param.get_id().replace('_', '-')", dest="$param.get_id()", type="$type", default=$make_default($type, $param), help="Set $($param.get_param('label').get_evaluated() or $param.get_id()) [default=%default]") #end if #end for (options, args) = parser.parse_args() #if $flow_graph.get_option('realtime_scheduling') if gr.enable_realtime_scheduling() != gr.RT_OK: print "Error: failed to enable realtime scheduling." #end if #if $generate_options == 'wx_gui' tb = $(class_name)($(', '.join($params_eq_list))) #if $flow_graph.get_option('max_nouts') tb.Run($flow_graph.get_option('run'), $flow_graph.get_option('max_nouts')) #else tb.Run($flow_graph.get_option('run')) #end if #elif $generate_options == 'qt_gui' qapp = Qt.QApplication(sys.argv) tb = $(class_name)($(', '.join($params_eq_list))) #if $flow_graph.get_option('run') #if $flow_graph.get_option('max_nouts') tb.start($flow_graph.get_option('max_nouts')) #else tb.start() #end if #end if tb.show() qapp.exec_() tb.stop() #elif $generate_options == 'no_gui' tb = $(class_name)($(', '.join($params_eq_list))) #set $run_options = $flow_graph.get_option('run_options') #if $run_options == 'prompt' #if $flow_graph.get_option('max_nouts') tb.start($flow_graph.get_option('max_nouts')) #else tb.start() #end if raw_input('Press Enter to quit: ') tb.stop() #elif $run_options == 'run' #if $flow_graph.get_option('max_nouts') tb.run($flow_graph.get_option('max_nouts')) #else tb.run() #end if #end if #end if #end if