32139636af8fcdec8aa319ec1e7a714a219052df
[debian/gnuradio] / grc / python / flow_graph.tmpl
1 #!/usr/bin/env python
2 ########################################################
3 ##Cheetah template - gnuradio_python
4 ##
5 ##@param imports the import statements
6 ##@param flow_graph the flow_graph
7 ##@param variables the variable blocks
8 ##@param notebooks a list of notebook blocks
9 ##@param controls the variables with gui controls
10 ##@param parameters the paramater blocks
11 ##@param blocks the signal blocks
12 ##@param connections the connections
13 ##@param messages the msg type connections
14 ##@param generate_options the type of flow graph
15 ##@param var_id2cbs variable id map to callback strings
16 ########################################################
17 #def indent($code)
18 #set $code = '\n\t\t'.join(str($code).splitlines())
19 $code#slurp
20 #end def
21 #import time
22 #set $DIVIDER = '#'*50
23 $DIVIDER
24 # Gnuradio Python Flow Graph
25 # Title: $title
26 #if $flow_graph.get_option('author')
27 # Author: $flow_graph.get_option('author')
28 #end if
29 #if $flow_graph.get_option('description')
30 # Description: $flow_graph.get_option('description')
31 #end if
32 # Generated: $time.ctime()
33 $DIVIDER
34
35 ########################################################
36 ##Create Imports
37 ########################################################
38 #for $imp in $imports
39 $imp
40 #end for
41
42 ########################################################
43 ##Create Class
44 ##      Write the class declaration for a top or hier block.
45 ##      The parameter names are the arguments to __init__.
46 ##      Determine the absolute icon path (wx gui only).
47 ##      Setup the IO signature (hier block only).
48 ########################################################
49 #set $class_name = $flow_graph.get_option('id')
50 #set $param_str = ', '.join(['self'] + ['%s=%s'%(param.get_id(), param.get_make()) for param in $parameters])
51 #if $generate_options == 'wx_gui'
52         #import gtk
53         #set $icon = gtk.IconTheme().lookup_icon('gnuradio-grc', 32, 0)
54 class $(class_name)(grc_wxgui.top_block_gui):
55
56         def __init__($param_str):
57                 grc_wxgui.top_block_gui.__init__(self, title="$title")
58         #if $icon
59                 _icon_path = "$icon.get_filename()"
60                 self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY))
61         #end if
62 #elif $generate_options == 'no_gui'
63 class $(class_name)(gr.top_block):
64
65         def __init__($param_str):
66                 gr.top_block.__init__(self, "$title")
67 #elif $generate_options == 'hb'
68         #set $in_sig = $flow_graph.get_input_signature()
69         #set $out_sig = $flow_graph.get_output_signature()
70 class $(class_name)(gr.hier_block2):
71
72         def __init__($param_str):
73                 gr.hier_block2.__init__(
74                         self, "$title",
75                         gr.io_signature($in_sig.nports, $in_sig.nports, $in_sig.size*$in_sig.vlen),
76                         gr.io_signature($out_sig.nports, $out_sig.nports, $out_sig.size*$out_sig.vlen),
77                 )
78 #end if
79 ########################################################
80 ##Create Parameters
81 ##      Set the parameter to a property of self.
82 ########################################################
83 #if $parameters
84
85                 $DIVIDER
86                 # Parameters
87                 $DIVIDER
88 #end if
89 #for $param in $parameters
90                 $indent($param.get_var_make())
91 #end for
92 ########################################################
93 ##Create Variables
94 ########################################################
95 #if $variables
96
97                 $DIVIDER
98                 # Variables
99                 $DIVIDER
100 #end if
101 #for $var in $variables
102                 $indent($var.get_var_make())
103 #end for
104 ########################################################
105 ##Create Notebooks
106 ########################################################
107 #if $notebooks
108
109                 $DIVIDER
110                 # Notebooks
111                 $DIVIDER
112 #end if
113 #for $notebook in $notebooks
114                 $indent($notebook.get_make())
115 #end for
116 ########################################################
117 ##Create Controls
118 ########################################################
119 #if $controls
120
121                 $DIVIDER
122                 # Controls
123                 $DIVIDER
124 #end if
125 #for $ctrl in $controls
126                 $indent($ctrl.get_make())
127 #end for
128 ########################################################
129 ##Create Message Queues
130 ########################################################
131 #if $messages
132
133                 $DIVIDER
134                 # Message Queues
135                 $DIVIDER
136 #end if
137 #for $msg in $messages
138                 $(msg.get_source().get_parent().get_id())_msgq = $(msg.get_sink().get_parent().get_id())_msgq = gr.msg_queue(2)
139 #end for
140 ########################################################
141 ##Create Blocks
142 ########################################################
143 #if $blocks
144
145                 $DIVIDER
146                 # Blocks
147                 $DIVIDER
148 #end if
149 #for $blk in filter(lambda b: b.get_make(), $blocks)
150                 self.$blk.get_id() = $indent($blk.get_make())
151 #end for
152 ########################################################
153 ##Create Connections
154 ##      The port name should be the id of the parent block.
155 ##      However, port names for IO pads should be self.
156 ########################################################
157 #if $connections
158
159                 $DIVIDER
160                 # Connections
161                 $DIVIDER
162 #end if
163 #for $con in $connections
164         ####################################################################
165         ## Logic to extract source and sink
166         ##   Special resolution logic for pad source in continuation mode
167         ####################################################################
168         #set $source = $con.get_source()
169         #set $sink = $con.get_sink()
170         #if $source.get_parent().get_key() == 'pad_source' and $source.get_parent().get_param('mode').get_value() == 'cont'
171                 #set $pad_sink_id = $source.get_parent().get_param('pad_sink_id').get_evaluated()
172                 #set $pad_sink = filter(lambda b: b.get_id() == pad_sink_id, $blocks)[0]
173                 #set $source = $pad_sink.get_sink($source.get_key()).get_connections()[0].get_source()
174         #end if
175         ####################################################################
176         ## Logic to extract source and sink names
177         ####################################################################
178         #if $source.get_parent().get_key() == 'pad_source'
179                 #set $source_name = 'self'
180         #else
181                 #set $source_name = 'self.' + $source.get_parent().get_id()
182         #end if
183         #if $sink.get_parent().get_key() == 'pad_sink'
184                 #set $sink_name = 'self'
185         #else
186                 #set $sink_name = 'self.' + $sink.get_parent().get_id()
187         #end if
188         ####################################################################
189         ## Dont make a connection for continuation pad sinks!!!
190         ####################################################################
191         #if not ($sink.get_parent().get_key() == 'pad_sink' and $sink.get_parent().get_param('mode').get_value() == 'cont')
192                 self.connect(($source_name, $source.get_key()), ($sink_name, $sink.get_key()))
193         #end if
194 #end for
195
196 ########################################################
197 ##Create Callbacks
198 ##      Write a set method for this variable that calls the callbacks
199 ########################################################
200 #for $var in $parameters + $variables
201         #set $id = $var.get_id()
202         def set_$(id)(self, $id):
203                 self.$id = $id
204         #for $callback in $var_id2cbs[$id]
205                 $indent($callback)
206         #end for
207
208 #end for
209 ########################################################
210 ##Create Main
211 ##      For top block code, generate a main routine.
212 ##      Instantiate the top block and run as gui or cli.
213 ########################################################
214 #if $generate_options != 'hb'
215 if __name__ == '__main__':
216         parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
217         #set $params_eq_list = list()
218         #for $param in $parameters
219                 #set $type = $param.get_param('type').get_value()
220                 #if $type
221                         #silent $params_eq_list.append('%s=options.%s'%($param.get_id(), $param.get_id()))
222                         #set $short_id = $param.get_param('short_id').get_evaluated()
223                         #if $short_id
224                                 #set $short_id = '-' + $short_id
225                         #end if
226         parser.add_option("$short_id", "--$param.get_id()", dest="$param.get_id()", type="$type", default=$param.get_make(),
227                 help="Set $($param.get_param('label').evaluate() or $param.get_id()) [default=%default]")
228                 #end if
229         #end for
230         (options, args) = parser.parse_args()
231         #if $flow_graph.get_option('realtime_scheduling')
232         if gr.enable_realtime_scheduling() != gr.RT_OK:
233                 print "Error: failed to enable realtime scheduling."
234         #end if
235         tb = $(class_name)($(', '.join($params_eq_list)))
236         #if $generate_options == 'wx_gui'
237         tb.Run($flow_graph.get_option('run'))
238         #elif $generate_options == 'no_gui'
239         tb.start()
240         raw_input('Press Enter to quit: ')
241         tb.stop()
242         #end if
243 #end if
244