4 changed files with 138 additions and 87 deletions
@ -0,0 +1,126 @@
@@ -0,0 +1,126 @@
|
||||
#!/usr/bin/env python3 |
||||
""" Script to params from module.yaml config file(s) |
||||
Note: serial params are handled in Tools/serial/generate_config.py |
||||
""" |
||||
|
||||
import argparse |
||||
import os |
||||
import sys |
||||
|
||||
|
||||
try: |
||||
import yaml |
||||
except ImportError as e: |
||||
print("Failed to import yaml: " + str(e)) |
||||
print("") |
||||
print("You may need to install it using:") |
||||
print(" pip3 install --user pyyaml") |
||||
print("") |
||||
sys.exit(1) |
||||
|
||||
parser = argparse.ArgumentParser(description='Generate params from module.yaml file(s)') |
||||
|
||||
parser.add_argument('--config-files', type=str, nargs='*', default=[], |
||||
help='YAML module config file(s)') |
||||
parser.add_argument('--params-file', type=str, action='store', |
||||
help='Parameter output file') |
||||
parser.add_argument('--ethernet', action='store_true', |
||||
help='Ethernet support') |
||||
parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', |
||||
help='Verbose Output') |
||||
|
||||
args = parser.parse_args() |
||||
|
||||
verbose = args.verbose |
||||
params_output_file = args.params_file |
||||
ethernet_supported = args.ethernet |
||||
|
||||
def parse_yaml_parameters_config(yaml_config, ethernet_supported): |
||||
""" parse the parameters section from the yaml config file """ |
||||
if 'parameters' not in yaml_config: |
||||
return '' |
||||
parameters_section_list = yaml_config['parameters'] |
||||
for parameters_section in parameters_section_list: |
||||
if 'definitions' not in parameters_section: |
||||
return '' |
||||
definitions = parameters_section['definitions'] |
||||
ret = '' |
||||
param_group = parameters_section.get('group', None) |
||||
for param_name in definitions: |
||||
param = definitions[param_name] |
||||
if param.get('requires_ethernet', False) and not ethernet_supported: |
||||
continue |
||||
num_instances = param.get('num_instances', 1) |
||||
instance_start = param.get('instance_start', 0) # offset |
||||
|
||||
# get the type and extract all tags |
||||
tags = '@group {:}'.format(param_group) |
||||
if param['type'] == 'enum': |
||||
param_type = 'INT32' |
||||
for key in param['values']: |
||||
tags += '\n * @value {:} {:}'.format(key, param['values'][key]) |
||||
elif param['type'] == 'boolean': |
||||
param_type = 'INT32' |
||||
tags += '\n * @boolean' |
||||
elif param['type'] == 'int32': |
||||
param_type = 'INT32' |
||||
elif param['type'] == 'float': |
||||
param_type = 'FLOAT' |
||||
else: |
||||
raise Exception("unknown param type {:}".format(param['type'])) |
||||
|
||||
for tag in ['decimal', 'increment', 'category', 'volatile', 'bit', |
||||
'min', 'max', 'unit', 'reboot_required']: |
||||
if tag in param: |
||||
tags += '\n * @{:} {:}'.format(tag, param[tag]) |
||||
|
||||
for i in range(num_instances): |
||||
# default value |
||||
default_value = 0 |
||||
if 'default' in param: |
||||
# default can be a list of num_instances or a single value |
||||
if type(param['default']) == list: |
||||
assert len(param['default']) == num_instances |
||||
default_value = param['default'][i] |
||||
else: |
||||
default_value = param['default'] |
||||
|
||||
if type(default_value) == bool: |
||||
default_value = int(default_value) |
||||
|
||||
# output the existing C-style format |
||||
ret += ''' |
||||
/** |
||||
* {short_descr} |
||||
* |
||||
* {long_descr} |
||||
* |
||||
* {tags} |
||||
*/ |
||||
PARAM_DEFINE_{param_type}({name}, {default_value}); |
||||
'''.format(short_descr=param['description']['short'].replace("\n", "\n * "), |
||||
long_descr=param['description']['long'].replace("\n", "\n * "), |
||||
tags=tags, |
||||
param_type=param_type, |
||||
name=param_name, |
||||
default_value=default_value, |
||||
).replace('${i}', str(i+instance_start)) |
||||
return ret |
||||
|
||||
all_params = "" |
||||
|
||||
for yaml_file in args.config_files: |
||||
with open(yaml_file, 'r') as stream: |
||||
try: |
||||
yaml_config = yaml.load(stream, Loader=yaml.Loader) |
||||
|
||||
all_params += parse_yaml_parameters_config(yaml_config, ethernet_supported) |
||||
|
||||
except yaml.YAMLError as exc: |
||||
print(exc) |
||||
raise |
||||
|
||||
if verbose: print("Generating {:}".format(params_output_file)) |
||||
with open(params_output_file, 'w') as fid: |
||||
fid.write(all_params) |
||||
|
Loading…
Reference in new issue