TIOVX User Guide
usecase_code.py
1 #
2 # Copyright (c) 2017 Texas Instruments Incorporated
3 #
4 # All rights reserved not granted herein.
5 #
6 # Limited License.
7 #
8 # Texas Instruments Incorporated grants a world-wide, royalty-free, non-exclusive
9 # license under copyrights and patents it now or hereafter owns or controls to make,
10 # have made, use, import, offer to sell and sell ("Utilize") this software subject to the
11 # terms herein. With respect to the foregoing patent license, such license is granted
12 # solely to the extent that any such patent is necessary to Utilize the software alone.
13 # The patent license shall not apply to any combinations which include this software,
14 # other than combinations with devices manufactured by or for TI ("TI Devices").
15 # No hardware patent is licensed hereunder.
16 #
17 # Redistributions must preserve existing copyright notices and reproduce this license
18 # (including the above copyright notice and the disclaimer and (if applicable) source
19 # code license limitations below) in the documentation and/or other materials provided
20 # with the distribution
21 #
22 # Redistribution and use in binary form, without modification, are permitted provided
23 # that the following conditions are met:
24 #
25 # No reverse engineering, decompilation, or disassembly of this software is
26 # permitted with respect to any software provided in binary form.
27 #
28 # any redistribution and use are licensed by TI for use only with TI Devices.
29 #
30 # Nothing shall obligate TI to provide you with source code for the software
31 # licensed and provided to you in object code.
32 #
33 # If software source code is provided to you, modification and redistribution of the
34 # source code are permitted provided that the following conditions are met:
35 #
36 # any redistribution and use of the source code, including any resulting derivative
37 # works, are licensed by TI for use only with TI Devices.
38 #
39 # any redistribution and use of any object code compiled from the source code
40 # and any resulting derivative works, are licensed by TI for use only with TI Devices.
41 #
42 # Neither the name of Texas Instruments Incorporated nor the names of its suppliers
43 #
44 # may be used to endorse or promote products derived from this software without
45 # specific prior written permission.
46 #
47 # DISCLAIMER.
48 #
49 # THIS SOFTWARE IS PROVIDED BY TI AND TI'S LICENSORS "AS IS" AND ANY EXPRESS
50 # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
51 # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
52 # IN NO EVENT SHALL TI AND TI'S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT,
53 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
54 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
55 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
56 # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
57 # OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
58 # OF THE POSSIBILITY OF SUCH DAMAGE.
59 #
60 #
61 
62 from . import *
63 from glob import glob
64 import os, sys, re
65 
66 class UsecaseCode :
67  def __init__(self, context, env_var) :
68  self.env_var = env_var
69  self.workarea = os.environ.get(self.env_var)
70  if self.workarea == None or self.workarea == "":
71  sys.exit("ERROR: You must define %s environment variable as the root of the kernel workarea." % self.env_var);
72  if self.env_var == "CUSTOM_APPLICATION_PATH" :
73  self.workarea_app = self.workarea + "/" + "app_" + context.name
74  else :
75  self.workarea_app = self.workarea + "/apps/" + context.name + "/app_" + context.name
76  self.create_directory(self.workarea_app)
77  self.h_file = CodeGenerate(self.workarea_app + "/" + context.name + '.h')
78  self.c_file = CodeGenerate(self.workarea_app + "/" + context.name + '.c')
79  self.concerto_file = CodeGenerate(self.workarea_app + "/" + 'concerto.mak', header=False)
80  self.workarea_kernel = self.workarea + "/kernels"
81 
82  # Generating necessary files if they don't exist
83  if self.env_var == "CUSTOM_APPLICATION_PATH" :
84  self.include_custom_kernel_library_tests_filename = self.workarea_kernel + "/custom_app_kernel_library_tests.h"
85  self.create_directory(self.workarea_kernel)
86  if not os.path.exists(self.include_custom_kernel_library_tests_filename):
87  print("Creating " + self.include_custom_kernel_library_tests_filename)
88  self.include_custom_kernel_library_tests_code = CodeGenerate(self.include_custom_kernel_library_tests_filename)
89  self.include_custom_kernel_library_tests_code.close()
90 
91  if self.env_var == "CUSTOM_APPLICATION_PATH" :
92  self.tools_path_filename = self.workarea + "/custom_tools_path.mak"
93  if not os.path.exists(self.tools_path_filename):
94  print("Creating " + self.tools_path_filename)
95  self.tools_path_code = CodeGenerate(self.tools_path_filename, header=False)
96  self.tools_path_code.write_line("# This file can optionally be used to define environment variables which")
97  self.tools_path_code.write_line("# are needed by the kernel libraries defined in this folder, or can be")
98  self.tools_path_code.write_line("# used to overwrite environment variables from the psdk_tools_path.mak")
99  self.tools_path_code.write_line("# and vsdk_tools_path.mak files from the tiovx directory.")
100  self.tools_path_code.write_newline()
101  self.tools_path_code.write_line("# < DEVELOPER_TODO: Add any custom PATH environment variables >")
102  self.tools_path_code.close()
103 
104  if self.env_var == "CUSTOM_APPLICATION_PATH" :
105  self.concerto_inc_filename = self.workarea + "/concerto_inc.mak"
106  else :
107  self.concerto_inc_filename_folder = self.workarea + "/apps/" + context.name
108  self.concerto_inc_filename = self.concerto_inc_filename_folder + "/concerto_inc.mak"
109  if not os.path.exists(self.concerto_inc_filename):
110  print("Creating " + self.concerto_inc_filename)
111  self.concerto_inc_code = CodeGenerate(self.concerto_inc_filename, header=False)
112  self.concerto_inc_code.write_line("# This file contains a list of extension kernel specific static libraries")
113  self.concerto_inc_code.write_line("# to be included in the PC executables. It is put in this separate file")
114  self.concerto_inc_code.write_line("# to make it easier to add/extend kernels without needing to modify")
115  self.concerto_inc_code.write_line("# several concerto.mak files which depend on kernel libraries.")
116  self.concerto_inc_code.write_newline()
117  self.concerto_inc_code.write_line("STATIC_LIBS += vx_conformance_engine")
118  self.concerto_inc_code.write_line("# < DEVELOPER_TODO: Add any additional dependent libraries >")
119  self.concerto_inc_code.close()
120 
121  self.context = context
122  self.context_code = ContextCode(context)
123 
124  def create_directory(self, directory):
125  self.directory = directory
126  if not os.path.exists(self.directory):
127  print("Creating " + self.directory)
128  os.makedirs(self.directory)
129 
130  def generate_h_code(self) :
131  self.h_file.write_ifndef_define(self.context.name.upper())
132  self.h_file.write_include("VX/vx.h")
133  self.h_file.write_include("TI/tivx.h")
134  self.h_file.write_newline()
135  self.h_file.write_line('typedef struct _%s_t *%s;' % (self.context.name, self.context.name))
136  self.h_file.write_newline()
137  self.h_file.write_line('typedef struct _%s_t' % self.context.name)
138  self.h_file.write_open_brace()
139  self.context_code.declare_var(self.h_file)
140  self.h_file.write_close_brace(' %s_t;' % self.context.name)
141  self.h_file.write_newline()
142  self.generate_declare_data_function("create")
143  self.generate_declare_data_function("delete")
144  self.h_file.write_newline()
145  for graph in self.context.graph_list :
146  self.generate_declare_graph_functions(graph)
147  self.generate_declare_usecase_function("create")
148  self.generate_declare_usecase_function("delete")
149  self.generate_declare_usecase_function("verify")
150  self.generate_declare_usecase_function("run")
151  self.h_file.write_newline()
152  self.h_file.write_endif(self.context.name.upper())
153  self.h_file.close()
154 
155  def generate_declare_usecase_function(self, function_name) :
156  self.h_file.write_line("vx_status %s_%s(%s usecase);" % (self.context.name, function_name, self.context.name) )
157 
158  def generate_declare_data_function(self, function_name) :
159  self.h_file.write_line("vx_status %s_data_%s(%s usecase);" % (self.context.name, function_name, self.context.name) )
160 
161  def generate_declare_graph_functions(self, graph) :
162  self.h_file.write_line("vx_status %s_%s_create(%s usecase);" % (self.context.name, graph.name, self.context.name) )
163  self.h_file.write_line("vx_status %s_%s_delete(%s usecase);" % (self.context.name, graph.name, self.context.name) )
164  self.h_file.write_line("vx_status %s_%s_verify(%s usecase);" % (self.context.name, graph.name, self.context.name) )
165  self.h_file.write_line("vx_status %s_%s_run(%s usecase);" % (self.context.name, graph.name, self.context.name) )
166  self.h_file.write_newline()
167 
168  def generate_define_node_code(self) :
169  for node in self.context.node_list :
170  NodeCode(node).define_create(self.c_file)
171 
172  def generate_main_code(self) :
173  self.c_file.write_line("/**")
174  self.c_file.write_line(" * Main function")
175  self.c_file.write_line(" *")
176  self.c_file.write_line(" */")
177  self.c_file.write_line("int main(int argc, char* argv[])")
178  self.c_file.write_open_brace()
179  self.c_file.write_define_status()
180  self.c_file.write_newline()
181  self.c_file.write_line("%s_t uc;" % self.context.name)
182  self.c_file.write_newline()
183  self.c_file.write_line("tivxInit();")
184  self.c_file.write_newline()
185  self.c_file.write_line("status = %s_create(&uc);" % self.context.name)
186  self.c_file.write_newline()
187  self.c_file.write_if_status()
188  self.c_file.write_open_brace()
189  self.c_file.write_line("status = %s_verify(&uc);" % self.context.name)
190  self.c_file.write_close_brace()
191  self.c_file.write_newline()
192  self.c_file.write_if_status()
193  self.c_file.write_open_brace()
194  self.c_file.write_line("status = %s_run(&uc);" % self.context.name)
195  self.c_file.write_close_brace()
196  self.c_file.write_newline()
197  self.c_file.write_if_status()
198  self.c_file.write_open_brace()
199  self.c_file.write_line("status = %s_delete(&uc);" % self.context.name)
200  self.c_file.write_close_brace()
201  self.c_file.write_newline()
202  self.c_file.write_line("tivxDeInit();")
203  self.c_file.write_newline()
204  self.c_file.write_line("return 0;")
205  self.c_file.write_close_brace()
206  self.c_file.write_newline()
207 
208  def generate_create_graph_code(self, graph):
209  self.c_file.write_line("vx_status %s_%s_create(%s usecase)" % (self.context.name, graph.name, self.context.name) )
210  self.c_file.write_open_brace()
211  self.c_file.write_define_status();
212  self.c_file.write_newline()
213  self.c_file.write_line("vx_graph graph = usecase->%s;" % graph.name)
214  self.c_file.write_newline()
215  GraphCode(graph).call_create(self.c_file)
216  self.c_file.write_if_status();
217  self.c_file.write_open_brace();
218  GraphCode(graph).set_ref_name(self.c_file)
219  self.c_file.write_close_brace()
220  self.c_file.write_newline()
221  self.c_file.write_line("return status;")
222  self.c_file.write_close_brace()
223  self.c_file.write_newline()
224 
225  def generate_delete_graph_code(self, graph):
226  self.c_file.write_line("vx_status %s_%s_delete(%s usecase)" % (self.context.name, graph.name, self.context.name) )
227  self.c_file.write_open_brace()
228  self.c_file.write_define_status();
229  self.c_file.write_newline()
230  self.c_file.write_line("vx_graph graph = usecase->%s;" % (graph.name))
231  self.c_file.write_newline()
232  GraphCode(graph).call_delete(self.c_file)
233  self.c_file.write_line("usecase->%s = graph;" % (graph.name))
234  self.c_file.write_newline()
235  self.c_file.write_line("return status;")
236  self.c_file.write_close_brace()
237  self.c_file.write_newline()
238 
239  def generate_verify_graph_code(self, graph):
240  self.c_file.write_line("vx_status %s_%s_verify(%s usecase)" % (self.context.name, graph.name, self.context.name) )
241  self.c_file.write_open_brace()
242  self.c_file.write_define_status();
243  self.c_file.write_newline()
244  self.c_file.write_line("vx_graph graph = usecase->%s;" % (graph.name))
245  self.c_file.write_newline()
246  GraphCode(graph).call_verify(self.c_file)
247  self.c_file.write_line("return status;")
248  self.c_file.write_close_brace()
249  self.c_file.write_newline()
250 
251  def generate_run_graph_code(self, graph):
252  self.c_file.write_line("vx_status %s_%s_run(%s usecase)" % (self.context.name, graph.name, self.context.name) )
253  self.c_file.write_open_brace()
254  self.c_file.write_define_status();
255  self.c_file.write_newline()
256  self.c_file.write_line("vx_graph graph = usecase->%s;" % (graph.name))
257  self.c_file.write_newline()
258  GraphCode(graph).call_run(self.c_file)
259  self.c_file.write_line("return status;")
260  self.c_file.write_close_brace()
261  self.c_file.write_newline()
262 
263  def generate_create_usecase_code(self) :
264  self.c_file.write_line("vx_status %s_create(%s usecase)" % (self.context.name, self.context.name) )
265  self.c_file.write_open_brace()
266  self.c_file.write_define_status();
267  self.c_file.write_newline()
268  self.c_file.write_line("memset(usecase, 0, sizeof(%s_t));" % self.context.name);
269  self.c_file.write_newline();
270  self.c_file.write_if_status();
271  self.c_file.write_open_brace()
272  self.c_file.write_line("usecase->context = vxCreateContext();")
273  self.c_file.write_line("if (usecase->context == NULL)");
274  self.c_file.write_open_brace()
275  self.c_file.write_line("status = VX_ERROR_NO_RESOURCES;");
276  self.c_file.write_close_brace()
277  self.c_file.write_close_brace()
278  self.c_file.write_newline();
279  self.c_file.write_line("/* < DEVELOPER_TODO: (Optional) Load any custom kernel modules needed for this use case > */")
280  self.c_file.write_newline();
281  for graph in self.context.graph_list:
282  # Create graph
283  self.c_file.write_if_status();
284  self.c_file.write_open_brace()
285  self.c_file.write_line("usecase->%s = vxCreateGraph(usecase->context);" % graph.name)
286  self.c_file.write_line("if (usecase->%s == NULL)" % graph.name);
287  self.c_file.write_open_brace()
288  self.c_file.write_line("status = VX_ERROR_NO_RESOURCES;");
289  self.c_file.write_close_brace()
290  self.c_file.write_close_brace()
291  self.c_file.write_if_status();
292  self.c_file.write_open_brace()
293  self.c_file.write_line("status = %s_data_create(usecase);" % (self.context.name) )
294  self.c_file.write_close_brace()
295 
296  for graph in self.context.graph_list :
297  self.c_file.write_if_status();
298  self.c_file.write_open_brace()
299  self.c_file.write_line("status = %s_%s_create(usecase);" % (self.context.name, graph.name) )
300  self.c_file.write_close_brace()
301 
302  self.c_file.write_newline()
303  self.c_file.write_line("return status;")
304  self.c_file.write_close_brace()
305  self.c_file.write_newline()
306 
307  def generate_delete_usecase_code(self):
308  self.c_file.write_line("vx_status %s_delete(%s usecase)" % (self.context.name, self.context.name) )
309  self.c_file.write_open_brace()
310  self.c_file.write_define_status();
311  self.c_file.write_newline()
312 
313  for graph in self.context.graph_list :
314  self.c_file.write_if_status();
315  self.c_file.write_open_brace()
316  self.c_file.write_line("status = %s_%s_delete(usecase);" % (self.context.name, graph.name) )
317  self.c_file.write_close_brace()
318 
319  self.c_file.write_if_status();
320  self.c_file.write_open_brace()
321  self.c_file.write_line("status = %s_data_delete(usecase);" % (self.context.name) )
322  self.c_file.write_close_brace()
323 
324  self.c_file.write_newline();
325  self.c_file.write_line("/* < DEVELOPER_TODO: (Optional) Unload any custom kernel modules needed for this use case >*/")
326  self.c_file.write_newline();
327 
328  self.c_file.write_if_status();
329  self.c_file.write_open_brace()
330  self.c_file.write_line("status = vxReleaseContext(&usecase->context);" )
331  self.c_file.write_close_brace()
332 
333  self.c_file.write_newline()
334  self.c_file.write_line("return status;")
335  self.c_file.write_close_brace()
336  self.c_file.write_newline()
337 
338  def generate_usecase_function_code(self, function_name):
339  self.c_file.write_line("vx_status %s_%s(%s usecase)" % (self.context.name, function_name, self.context.name) )
340  self.c_file.write_open_brace()
341  self.c_file.write_define_status();
342  self.c_file.write_newline()
343 
344  for graph in self.context.graph_list :
345  self.c_file.write_if_status();
346  self.c_file.write_open_brace()
347  self.c_file.write_line("status = %s_%s_%s(usecase);" % (self.context.name, graph.name, function_name) )
348  self.c_file.write_close_brace()
349 
350  if (function_name=="delete") :
351  self.c_file.write_if_status();
352  self.c_file.write_open_brace()
353  self.c_file.write_line("status = %s_data_%s(usecase);" % (self.context.name, function_name) )
354  self.c_file.write_close_brace()
355 
356  self.c_file.write_newline()
357  self.c_file.write_line("return status;")
358  self.c_file.write_close_brace()
359  self.c_file.write_newline()
360 
361  def generate_create_data_code(self) :
362  self.c_file.write_line("vx_status %s_data_create(%s usecase)" % (self.context.name, self.context.name) )
363  self.c_file.write_open_brace()
364  self.c_file.write_define_status();
365  self.c_file.write_newline()
366  self.c_file.write_line("vx_context context = usecase->context;")
367  self.c_file.write_newline()
368  for data in self.context.data_list :
369  ContextCode.get_data_code_obj(data).call_create(self.c_file)
370  self.c_file.write_newline()
371  self.c_file.write_line("return status;")
372  self.c_file.write_close_brace()
373  self.c_file.write_newline()
374 
375  def generate_delete_data_code(self) :
376  self.c_file.write_line("vx_status %s_data_delete(%s usecase)" % (self.context.name, self.context.name) )
377  self.c_file.write_open_brace()
378  self.c_file.write_define_status();
379  self.c_file.write_newline()
380  for data in self.context.data_list :
381  self.c_file.write_if_status();
382  self.c_file.write_open_brace()
383  if data.type != Type.NULL :
384  self.c_file.write_line("status = vxReleaseReference((vx_reference*)&usecase->%s);" % (data.name) )
385  self.c_file.write_close_brace()
386  self.c_file.write_newline()
387  self.c_file.write_line("return status;")
388  self.c_file.write_close_brace()
389  self.c_file.write_newline()
390 
391  def generate_c_code(self) :
392  self.c_file.write_include(self.context.name + '.h')
393  self.c_file.write_line("/* < DEVELOPER_TODO: (Optional) Include any custom kernel module header files needed for this use case >*/")
394  self.c_file.write_newline();
395  self.c_file.write_newline()
396  self.generate_create_usecase_code()
397  self.generate_usecase_function_code("verify")
398  self.generate_usecase_function_code("run")
399  self.generate_delete_usecase_code()
400  self.generate_create_data_code()
401  self.generate_delete_data_code()
402  self.generate_define_node_code()
403  for graph in self.context.graph_list :
404  self.generate_create_graph_code(graph)
405  self.generate_delete_graph_code(graph)
406  self.generate_verify_graph_code(graph)
407  self.generate_run_graph_code(graph)
408  self.generate_main_code()
409  self.c_file.close()
410 
411  def generate_concerto(self) :
412  if self.env_var == "VISION_APPS_PATH" :
413  self.concerto_file.write_line("ifeq ($(TARGET_PLATFORM),PC)")
414  self.concerto_file.write_newline()
415  self.concerto_file.write_line("include $(PRELUDE)")
416  self.concerto_file.write_line("TARGET := vx_app_%s" % self.context.name)
417  self.concerto_file.write_line("TARGETTYPE := exe")
418  self.concerto_file.write_line("CSOURCES := $(call all-c-files)")
419  self.concerto_file.write_newline()
420  self.concerto_file.write_line("include $(VISION_APPS_PATH)/apps/concerto_inc.mak")
421  self.concerto_file.write_line("include $(VISION_APPS_PATH)/apps/%s/concerto_inc.mak" % self.context.name)
422  self.concerto_file.write_newline()
423  self.concerto_file.write_line("include $(FINALE)")
424  self.concerto_file.write_newline()
425  self.concerto_file.write_line("endif")
426  self.concerto_file.close()
427  else :
428  self.concerto_file.write_line("include $(PRELUDE)")
429  self.concerto_file.write_line("TARGET := vx_app_%s" % self.context.name)
430  self.concerto_file.write_line("TARGETTYPE := exe")
431  self.concerto_file.write_line("CSOURCES := $(call all-c-files)")
432  self.concerto_file.write_newline()
433  self.concerto_file.write_line("IDIRS += $(TIOVX_PATH)/utils/include")
434  self.concerto_file.write_line("# < DEVELOPER_TODO: Add any custom IDIRS paths, similar to below: >")
435  self.concerto_file.write_line("# IDIRS += $(CUSTOM_APPLICATION_PATH)/kernels/<module>/include")
436  self.concerto_file.write_newline()
437  self.concerto_file.write_newline()
438  self.concerto_file.write_line("include $(HOST_ROOT)/kernels/concerto_inc.mak")
439  self.concerto_file.write_newline()
440  self.concerto_file.write_line("STATIC_LIBS += vx_vxu vx_framework")
441  self.concerto_file.write_line("STATIC_LIBS += vx_platform_pc vx_framework")
442  self.concerto_file.write_line("STATIC_LIBS += vx_kernels_openvx_core vx_target_kernels_openvx_core")
443  self.concerto_file.write_newline()
444  self.concerto_file.write_line("ifeq ($(BUILD_TUTORIAL),yes)")
445  self.concerto_file.write_line("STATIC_LIBS += vx_target_kernels_tutorial")
446  self.concerto_file.write_line("endif")
447  self.concerto_file.write_newline()
448  self.concerto_file.write_line("ifeq ($(BUILD_BAM),yes)")
449  self.concerto_file.write_line("STATIC_LIBS += vx_target_kernels_openvx_core_bam vx_target_kernels_openvx_core")
450  self.concerto_file.write_line("endif")
451  self.concerto_file.write_newline()
452  self.concerto_file.write_line("STATIC_LIBS += vx_kernels_host_utils")
453  self.concerto_file.write_line("STATIC_LIBS += vx_kernels_target_utils")
454  self.concerto_file.write_line("STATIC_LIBS += vx_framework")
455  self.concerto_file.write_line("ifeq ($(BUILD_BAM),yes)")
456  self.concerto_file.write_line("STATIC_LIBS += vxlib_bamplugin_$(TARGET_CPU)")
457  self.concerto_file.write_line("endif")
458  self.concerto_file.write_line("STATIC_LIBS += vxlib_$(TARGET_CPU) c6xsim_$(TARGET_CPU)_C66")
459  self.concerto_file.write_line("SYS_SHARED_LIBS += rt")
460  self.concerto_file.write_line("ifeq ($(BUILD_BAM),yes)")
461  self.concerto_file.write_line("STATIC_LIBS += algframework_$(TARGET_CPU) dmautils_$(TARGET_CPU)")
462  self.concerto_file.write_line("endif")
463  self.concerto_file.write_newline()
464  self.concerto_file.write_line("include $(FINALE)")
465  self.concerto_file.close()
466 
467  def todo(self) :
468  if self.env_var == "CUSTOM_APPLICATION_PATH" :
469  self.todo_filename = self.workarea + "/DEVELOPER_TODO.txt"
470  else :
471  self.todo_filename = self.concerto_inc_filename_folder + "/DEVELOPER_TODO.txt"
472  print("Creating " + self.todo_filename)
473  self.todo_code = CodeGenerate(self.todo_filename, header=False)
474 
475  self.lineNum = -1
476  self.fileName = None
477  self.state = False
478 
479  self.todo_code.write_line("# This file lists the places in the generated code where the developer is expected")
480  self.todo_code.write_line("# to add custom code beyond what the script can generate. This is generated as ")
481  self.todo_code.write_line("# part of the KernelExportCode.export() function, but may also be called independently ")
482  self.todo_code.write_line("# by calling the KernelExportCode.todo() function with the requirement that the ")
483  self.todo_code.write_line("# "+self.env_var+" environment variable is defined. This function simply searches")
484  self.todo_code.write_line("# for the \"< DEVELOPER_TODO ...>\" string in all the files from this path, and lists them.")
485  self.todo_code.write_line("# Removing the \"< DEVELOPER_TODO ...>\" comment block from the files will effectively remove those")
486  self.todo_code.write_line("# lines from showing up in this file the next time KernelExportCode.todo() is run.")
487  if self.env_var == "CUSTOM_APPLICATION_PATH" :
488  self.all_files = [y for x in os.walk(self.workarea) for y in glob(os.path.join(x[0], '*.*'))]
489  else :
490  self.all_files = [y for x in os.walk(self.concerto_inc_filename_folder) for y in glob(os.path.join(x[0], '*.*'))]
491  for file in self.all_files :
492  with open(file, 'rb') as f:
493  for num, line in enumerate(f, 1):
494  if 'DEVELOPER_TODO'.encode() in line:
495  if '>'.encode() in line:
496  self.state = False
497  else:
498  self.state = True
499  self.modLine = re.sub("^.*?DEVELOPER_TODO:".encode(),"".encode(), line)
500  self.modLine = re.sub("^\s+".encode(),"".encode(), self.modLine)
501  self.modLine = re.sub("\*\/".encode(),"".encode(), self.modLine)
502  self.modLine = re.sub(">".encode(),"".encode(), self.modLine)
503  if self.fileName != file :
504  self.todo_code.write_line("\n" + file, new_line=False)
505  self.todo_code.write_line("\n " + str(num) + ": " + self.modLine.decode('utf-8'), new_line=False)
506  self.lineNum = num
507  self.fileName = file
508  elif self.state :
509  if '>'.encode() in line :
510  self.state = False
511  self.modLine = re.sub("^.*?DEVELOPER_TODO:".encode(),"".encode(), line)
512  self.modLine = re.sub("#".encode(),"".encode(), self.modLine)
513  self.modLine = re.sub("\/\/".encode(),"".encode(), self.modLine)
514  self.modLine = re.sub("\/\*".encode(),"".encode(), self.modLine)
515  self.modLine = re.sub("\*\/".encode(),"".encode(), self.modLine)
516  self.modLine = re.sub("^\s+".encode(),"".encode(), self.modLine)
517  self.modLine = re.sub(">".encode(),"".encode(), self.modLine)
518  self.todo_code.write_line(" " + str(num) + ": " + self.modLine.decode('utf-8'), new_line=False)
519  self.lineNum = num
520  self.todo_code.close()
521 
522  def generate_code(self) :
523  self.generate_h_code()
524  self.generate_c_code()
525  self.generate_concerto()
526  self.todo()
527 
528 
def __init__(self, thr_type, data_type, name="default")
Constructor used to create this object.
Definition: threshold.py:84