diff --git a/Tools/px4params/srcparser.py b/Tools/px4params/srcparser.py index 438bc9eb2d..c4f1b54e43 100644 --- a/Tools/px4params/srcparser.py +++ b/Tools/px4params/srcparser.py @@ -144,7 +144,7 @@ class SourceParser(object): def __init__(self): self.param_groups = {} - def Parse(self, contents): + def Parse(self, scope, contents): """ Incrementally parse program contents and append all found parameters to the list. @@ -241,6 +241,7 @@ class SourceParser(object): if defval != "" and self.re_is_a_number.match(defval): defval = self.re_cut_type_specifier.sub('', defval) param = Parameter(name, tp, defval) + param.SetField("scope", scope) param.SetField("short_desc", name) # If comment was found before the parameter declaration, # inject its data into the newly created parameter. diff --git a/Tools/px4params/srcscanner.py b/Tools/px4params/srcscanner.py index 4db5698992..739a067c9a 100644 --- a/Tools/px4params/srcscanner.py +++ b/Tools/px4params/srcscanner.py @@ -33,6 +33,8 @@ class SourceScanner(object): Scans provided file and passes its contents to the parser using parser.Parse method. """ + prefix = ".." + os.path.sep + "src" + os.path.sep + scope = re.sub(prefix, '', os.path.dirname(os.path.relpath(path))) with codecs.open(path, 'r', 'utf-8') as f: try: contents = f.read() @@ -40,4 +42,4 @@ class SourceScanner(object): contents = '' print('Failed reading file: %s, skipping content.' % path) pass - return parser.Parse(contents) + return parser.Parse(scope, contents) diff --git a/Tools/px_generate_params.py b/Tools/px_generate_params.py index f1877987ad..5752bac1df 100755 --- a/Tools/px_generate_params.py +++ b/Tools/px_generate_params.py @@ -1,12 +1,89 @@ #!/usr/bin/env python import xml.etree.ElementTree as ET import os +import re +import codecs -if len(os.sys.argv) != 2: +class Scope(object): + """ + Single parameter group + """ + def __init__(self, ): + self.scope = set() + + + def __str__(self): + return self.scope.__str__() + + def Add(self, scope): + """ + Add Scope to set + """ + self.scope.add(scope) + + def Has(self, scope): + """ + Check for existance + """ + if len(self.scope) == 0: + return True + return scope in self.scope + + +class CMakeParser(object): + """ + Parses provided data and stores all found paths in scope. + """ + re_split_lines = re.compile(r'[\r\n]+') + re_comment = re.compile(r'^\#') + re_start = re.compile(r'set\s*\(\s*config_module_list') + re_end = re.compile(r'\)\s*') + + def Parse(self, scope, contents): + """ + Incrementally parse cmake file contents and append all found path scope + to scope. + """ + # This code is essentially a comment-parsing grammar. "state" + # represents parser state. It contains human-readable state + # names. + state = None + for line in self.re_split_lines.split(contents): + line = line.strip() + # Ignore empty lines + if line == "": + continue + if self.re_comment.match(line): + continue + elif self.re_start.match(line): + state = "gather" + continue + elif state is not None and state == "gather": + if self.re_end.match(line): + return True + scope.Add(line) + return False + + +if len(os.sys.argv) < 2: print("Error in %s" % os.sys.argv[0]) - print("Usage: %s " % os.sys.argv[0]) + print("Usage: %s [cmake-file-scoping] " % os.sys.argv[0]) raise SystemExit + +scope = Scope() +if len(os.sys.argv) == 3: + with codecs.open(os.sys.argv[2], 'r', 'utf-8') as f: + try: + contents = f.read() + f.close() + parser = CMakeParser() + parser.Parse(scope, contents) + except: + contents = '' + print('Failed reading file: %s, skipping scoping.' % os.sys.argv[2]) + pass + fp_header = open("px4_parameters.h", "w") fp_src = open("px4_parameters.c", "w") @@ -30,14 +107,19 @@ end_name = "" for group in root: if group.tag == "group" and "no_code_generation" not in group.attrib: - header += """ + section = """ /***************************************************************** * %s ****************************************************************/""" % group.attrib["name"] for param in group: + scope_ = param.find('scope').text + if not scope.Has(scope_): + continue if not start_name: start_name = param.attrib["name"] end_name = param.attrib["name"] + header += section + section ="" header += """ const struct param_info_s __param__%s;""" % param.attrib["name"] header += """ @@ -63,12 +145,14 @@ struct px4_parameters_t px4_parameters = { i=0 for group in root: if group.tag == "group" and "no_code_generation" not in group.attrib: - - src += """ + section = """ /***************************************************************** * %s ****************************************************************/""" % group.attrib["name"] for param in group: + scope_ = param.find('scope').text + if not scope.Has(scope_): + continue if not start_name: start_name = param.attrib["name"] end_name = param.attrib["name"] @@ -78,6 +162,8 @@ for group in root: elif (param.attrib["type"] == "INT32"): val_str = ".val.i = " i+=1 + src += section + section ="" src += """ { "%s", @@ -97,4 +183,5 @@ __END_DECLS fp_header.write(header) fp_src.write(src) - +fp_header.close() +fp_src.close() diff --git a/cmake/common/px4_base.cmake b/cmake/common/px4_base.cmake index 22bcde71f2..00a55f0106 100644 --- a/cmake/common/px4_base.cmake +++ b/cmake/common/px4_base.cmake @@ -820,22 +820,23 @@ endfunction() # Generates a source file with all parameters. # # Usage: -# px4_generate_parameters_source(OUT XML ) +# px4_generate_parameters_source(OUT XML [SCOPE ]) # # Input: -# XML : the parameters.xml file -# DEPS : target dependencies +# XML : the parameters.xml file +# SCOPE : the cmake file used to limit scope of the paramaters +# DEPS : target dependencies # # Output: # OUT : the generated source files # # Example: -# px4_generate_parameters_source(OUT param_files XML parameters.xml) +# px4_generate_parameters_source(OUT param_files XML parameters.xml SCOPE ${OS}_${BOARD}_${LABEL}.cmake ) # function(px4_generate_parameters_source) px4_parse_function_args( NAME px4_generate_parameters_source - ONE_VALUE OUT XML DEPS + ONE_VALUE OUT XML SCOPE DEPS REQUIRED OUT XML ARGN ${ARGN}) set(generated_files @@ -844,7 +845,7 @@ function(px4_generate_parameters_source) set_source_files_properties(${generated_files} PROPERTIES GENERATED TRUE) add_custom_command(OUTPUT ${generated_files} - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/Tools/px_generate_params.py ${XML} + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/Tools/px_generate_params.py ${XML} ${SCOPE} DEPENDS ${XML} ${DEPS} ) set(${OUT} ${generated_files} PARENT_SCOPE) diff --git a/src/modules/param/CMakeLists.txt b/src/modules/param/CMakeLists.txt index 64bff2a0e1..b3148baab1 100644 --- a/src/modules/param/CMakeLists.txt +++ b/src/modules/param/CMakeLists.txt @@ -35,6 +35,7 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR}) px4_generate_parameters_source(OUT param_files XML ${CMAKE_BINARY_DIR}/parameters.xml + SCOPE ${CMAKE_SOURCE_DIR}/cmake/configs/${OS}_${BOARD}_${LABEL}.cmake DEPS xml_gen )