diff --git a/Tools/px_generate_params.py b/Tools/px_generate_params.py index 08808bc559..a12c72f5e0 100755 --- a/Tools/px_generate_params.py +++ b/Tools/px_generate_params.py @@ -2,52 +2,86 @@ import xml.etree.ElementTree as ET import os -if len(os.sys.argv) != 3: +if len(os.sys.argv) != 2: print "Error in %s" % os.sys.argv[0] - print "Usage: %s " + print "Usage: %s " raise SystemExit -fp = open(os.sys.argv[2], "w") +fp_header = open("px4_parameters.h", "w") +fp_src = open("px4_parameters.c", "w") tree = ET.parse(os.sys.argv[1]) root = tree.getroot() -body = """ + +# Generate the header file content +header = """ #include #include // DO NOT EDIT // This file is autogenerated from paramaters.xml +struct px4_parameters_t { """ - start_name = "" end_name = "" for group in root: if group.tag == "group": - body += "// %s\n" % group.attrib["name"] + header += """ + /***************************************************************** + * %s + ****************************************************************/""" % group.attrib["name"] for param in group: if not start_name: start_name = param.attrib["name"] end_name = param.attrib["name"] - body += """ -static const -__attribute__((used, section("__param"))) -struct param_info_s __param__%s = { - "%s", - PARAM_TYPE_%s, - .val.f = %s + header += """ + const struct param_info_s __param__%s;""" % param.attrib["name"] +header += """ + const unsigned int param_count; }; -""" % (param.attrib["name"], param.attrib["name"], param.attrib["type"], param.attrib["default"]) -body += """ -extern const -__attribute__((alias("__param__%s"))) -struct param_info_s __param_start; -extern const -__attribute__((alias("__param__%s"))) -struct param_info_s __param_end; -""" % (start_name, end_name) +extern const struct px4_parameters_t px4_parameters; +""" -fp.write(body) +# Generate the C file content +src = """ +#include + +// DO NOT EDIT +// This file is autogenerated from paramaters.xml + +static const +__attribute__((used, section("__param"))) +struct px4_parameters_t px4_parameters_impl = { +""" +i=0 +for group in root: + if group.tag == "group": + src += """ + /***************************************************************** + * %s + ****************************************************************/""" % group.attrib["name"] + for param in group: + if not start_name: + start_name = param.attrib["name"] + end_name = param.attrib["name"] + i+=1 + src += """ + { + "%s", + PARAM_TYPE_%s, + .val.f = %s + }, +""" % (param.attrib["name"], param.attrib["type"], param.attrib["default"]) +src += """ + %d +}; + +extern const struct px4_parameters_t px4_parameters __attribute__((alias("px4_parameters_impl"))); +""" % i + +fp_header.write(header) +fp_src.write(src) diff --git a/cmake/common/px4_base.cmake b/cmake/common/px4_base.cmake index c836223258..b1cf5aa33e 100644 --- a/cmake/common/px4_base.cmake +++ b/cmake/common/px4_base.cmake @@ -681,7 +681,7 @@ function(px4_generate_parameters) ) execute_process( - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/Tools/px_generate_params.py ${CMAKE_BINARY_DIR}/parameters.xml ${CMAKE_BINARY_DIR}/parameters.c + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/Tools/px_generate_params.py ${CMAKE_BINARY_DIR}/parameters.xml ) endfunction() diff --git a/src/firmware/posix/CMakeLists.txt b/src/firmware/posix/CMakeLists.txt index 657d8d45ad..bc557ce6f7 100644 --- a/src/firmware/posix/CMakeLists.txt +++ b/src/firmware/posix/CMakeLists.txt @@ -9,7 +9,7 @@ px4_generate_parameters() add_executable(mainapp ${CMAKE_SOURCE_DIR}/src/platforms/posix/main.cpp - ${CMAKE_BINARY_DIR}/parameters.c + ${CMAKE_BINARY_DIR}/px4_parameters.c apps.h ) diff --git a/src/modules/systemlib/param/param.c b/src/modules/systemlib/param/param.c index 7af26cd30b..4efe7bea0d 100644 --- a/src/modules/systemlib/param/param.c +++ b/src/modules/systemlib/param/param.c @@ -63,6 +63,7 @@ #include "uORB/uORB.h" #include "uORB/topics/parameter_update.h" +#include "px4_parameters.h" #if 0 # define debug(fmt, args...) do { warnx(fmt, ##args); } while(0) @@ -86,14 +87,11 @@ extern struct param_info_s param_array[]; extern struct param_info_s *param_info_base; extern struct param_info_s *param_info_limit; #else -extern const struct param_info_s __param_start, __param_end; - // FIXME - start and end are reversed -static const struct param_info_s *param_info_base = &__param_end; -static const struct param_info_s *param_info_limit = &__param_start; +static const struct param_info_s *param_info_base = (const struct param_info_s *)&px4_parameters; #endif -#define param_info_count ((unsigned)(param_info_limit - param_info_base)) +#define param_info_count px4_parameters.param_count /** * Storage for modified parameters.