scoutos / scout / libscout / generate_behavior_lists.py @ 7b5ea072
History | View | Annotate | Download (4.04 KB)
1 |
#!/usr/bin/python
|
---|---|
2 |
|
3 |
# Usage:
|
4 |
#
|
5 |
# python generate_behavior_lists.py
|
6 |
#
|
7 |
# Parses to use only the final folder and file name for each source file.
|
8 |
|
9 |
import sys |
10 |
import os |
11 |
|
12 |
AUTOGEN_HEADER = '''/**
|
13 |
******************************************************************************
|
14 |
* WARNING: THIS IS AN AUTOGENERATED FILE!
|
15 |
*
|
16 |
* Editing this file is USELESS. It will be overwritten during the build.
|
17 |
* To properly edit this file, edit its corresponding *.template.* file, which
|
18 |
* a script run by CMake uses to generate this file.
|
19 |
*
|
20 |
* This file was generated via rules in src/generate_behavior_lists.py.
|
21 |
*
|
22 |
* Please see that file for a description of syntax and procedure for
|
23 |
* creating auto-generated files.
|
24 |
*
|
25 |
* THIS WARNING IS LONG TO MAKE SURE IT GETS YOUR ATTENTION!
|
26 |
* THANK YOU.
|
27 |
*****************************************************************************
|
28 |
*/
|
29 |
|
30 |
'''
|
31 |
|
32 |
# These are the codes this script will replace in template files.
|
33 |
FULL_PATH_CODE = 'AUTOGEN_BEHAVIOR_FULL_PATH'
|
34 |
LAST_PATH_CODE = 'AUTOGEN_BEHAVIOR_LAST_PATH'
|
35 |
BASE_NAME_CODE = 'AUTOGEN_BEHAVIOR_BASE_NAME'
|
36 |
|
37 |
# Different ways to refer to files in behaviors/ and test_behaviors/.
|
38 |
full_paths = [] |
39 |
last_paths = [] |
40 |
base_names = [] |
41 |
|
42 |
# Mapping of generated files to their templates
|
43 |
R_FILES = {'src/BehaviorList.cpp' : 'src/BehaviorList.template.cpp', |
44 |
'src/BehaviorList.h' : 'src/BehaviorList.template.h'} |
45 |
|
46 |
# Parse the src/behaviors and src/test_behaviors folders
|
47 |
cur_dir = os.getcwd() |
48 |
|
49 |
all_paths = [] |
50 |
all_fnames = [] |
51 |
all_lasts = [] |
52 |
|
53 |
# Extract all the header files for behaviors we want
|
54 |
for path, dirname, fnames in os.walk('src'): |
55 |
if path == 'src/behaviors' or path == 'src/test_behaviors': |
56 |
path_parts = path.split('/')
|
57 |
for f in fnames: |
58 |
if f.endswith('.h'): |
59 |
all_paths.append(path) |
60 |
all_fnames.append(f) |
61 |
all_lasts.append(path_parts[-1])
|
62 |
|
63 |
# Sort these headers into a good order and add them to our lists of paths/names
|
64 |
all_fnames, all_paths, all_lasts = (list(t) for t in zip(*sorted(zip(all_fnames, all_paths, all_lasts), key=lambda x: x[0].lower()))) |
65 |
|
66 |
for f, path, last in zip(all_fnames, all_paths, all_lasts): |
67 |
# Pause goes first
|
68 |
if 'pause_scout' in f: |
69 |
full_paths.insert(0, os.path.join(cur_dir, path, f))
|
70 |
last_paths.insert(0, os.path.join(last, f))
|
71 |
base_names.insert(0, f.split('.')[0]) |
72 |
# Everything else goes in alphabetical order
|
73 |
else:
|
74 |
full_paths.append(os.path.join(cur_dir, path, f)) |
75 |
last_paths.append(os.path.join(last, f)) |
76 |
base_names.append(f.split('.')[0]) |
77 |
|
78 |
# Now, a dictionary of codes to replace -> things to replace them with.
|
79 |
replacements = {FULL_PATH_CODE : full_paths, |
80 |
LAST_PATH_CODE : last_paths, |
81 |
BASE_NAME_CODE : base_names} |
82 |
|
83 |
# also simultaneously write a txt file for the GUI to read from
|
84 |
with open("../scoutsim/behaviorList.txt", "w") as listFile: |
85 |
# Write all the replacements in R_FILES
|
86 |
for outfile_name in sorted(R_FILES.keys()): |
87 |
with open(outfile_name, 'w') as outfile: |
88 |
with open(R_FILES[outfile_name], 'r') as infile: |
89 |
|
90 |
# Write an obvious header so no one will edit our nicely
|
91 |
# generated file
|
92 |
outfile.write(AUTOGEN_HEADER) |
93 |
|
94 |
for line in infile.readlines(): |
95 |
# If the line needs replacing, don't write the orgininal
|
96 |
# to the output file; rather, write many versions of the
|
97 |
# line replaced with each replacement value.
|
98 |
replaced = False
|
99 |
for r_key in replacements: |
100 |
if r_key in line: |
101 |
replaced = True
|
102 |
for b in replacements[r_key]: |
103 |
outfile.write(line.replace(r_key, b)) |
104 |
if (r_key == BASE_NAME_CODE):
|
105 |
listFile.write(b+"\n")
|
106 |
# If it doesn't need replacing, just write the original
|
107 |
if not replaced: |
108 |
outfile.write(line) |
109 |
|
110 |
|