From e8a11b4e89741bb0c339292603a4e43154746276 Mon Sep 17 00:00:00 2001 From: Sai Kishor Kothakota Date: Mon, 30 Oct 2023 17:44:45 +0100 Subject: [PATCH 01/19] add retrieve_params method to get params from the declare_params --- .../jinja_templates/cpp/parameter_library_header | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header index 9422c66..b6852ad 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header @@ -179,6 +179,10 @@ struct StackParams { {%- filter indent(width=6) %} {{declare_params}} {%- endfilter %} + } + + void retrieve_params(){ + auto updated_params = get_params(); // get parameters and fill struct fields rclcpp::Parameter param; @@ -194,7 +198,7 @@ struct StackParams { updated_params.__stamp = clock_.now(); update_interal_params(updated_params); - } + } private: void update_interal_params(Params updated_params) { @@ -202,6 +206,7 @@ struct StackParams { params_ = updated_params; } + std::string prefix_; Params params_; rclcpp::Clock clock_; From 4007b53148d0e005b44f753840924e93ccc7d312 Mon Sep 17 00:00:00 2001 From: Sai Kishor Kothakota Date: Mon, 30 Oct 2023 18:42:21 +0100 Subject: [PATCH 02/19] added initialize_params parameter ad some helper methods to check the parameter initialization --- .../cpp/parameter_library_header | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header index b6852ad..9a0738e 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header @@ -91,28 +91,31 @@ struct StackParams { class ParamListener{ public: // throws rclcpp::exceptions::InvalidParameterValueException on initialization if invalid parameter are loaded - ParamListener(rclcpp::Node::SharedPtr node, std::string const& prefix = "") - : ParamListener(node->get_node_parameters_interface(), node->get_logger(), prefix) {} + ParamListener(rclcpp::Node::SharedPtr node, std::string const& prefix = "", bool initialize_params = true) + : ParamListener(node->get_node_parameters_interface(), node->get_logger(), prefix, initialize_params) {} - ParamListener(rclcpp_lifecycle::LifecycleNode::SharedPtr node, std::string const& prefix = "") - : ParamListener(node->get_node_parameters_interface(), node->get_logger(), prefix) {} + ParamListener(rclcpp_lifecycle::LifecycleNode::SharedPtr node, std::string const& prefix = "", bool initialize_params = true) + : ParamListener(node->get_node_parameters_interface(), node->get_logger(), prefix, initialize_params) {} ParamListener(const std::shared_ptr& parameters_interface, - std::string const& prefix = "") - : ParamListener(parameters_interface, rclcpp::get_logger("{{namespace}}"), prefix) { + std::string const& prefix = "", bool initialize_params = true) + : ParamListener(parameters_interface, rclcpp::get_logger("{{namespace}}"), prefix, initialize_params) { RCLCPP_DEBUG(logger_, "ParameterListener: Not using node logger, recommend using other constructors to use a node logger"); } ParamListener(const std::shared_ptr& parameters_interface, - rclcpp::Logger logger, std::string const& prefix = "") { + rclcpp::Logger logger, std::string const& prefix = "", bool initialize_params = true) { logger_ = logger; prefix_ = prefix; + are_parameters_initialized_ = false; if (!prefix_.empty() && prefix_.back() != '.') { prefix_ += "."; } parameters_interface_ = parameters_interface; declare_params(); + if(initialize_params) + initialize_parameters(); auto update_param_cb = [this](const std::vector ¶meters){return this->update(parameters);}; handle_ = parameters_interface_->add_on_set_parameters_callback(update_param_cb); clock_ = rclcpp::Clock(); @@ -120,9 +123,18 @@ struct StackParams { Params get_params() const{ std::lock_guard lock(mutex_); + if(!are_parameters_initialized_) + { + throw std::runtime_error("Please initialize the parameters using initialize_parameters method, before getting them!"); + } return params_; } + bool are_params_initialized() const + { + return are_parameters_initialized_; + } + bool is_old(Params const& other) const { std::lock_guard lock(mutex_); return params_.__stamp != other.__stamp; @@ -181,7 +193,7 @@ struct StackParams { {%- endfilter %} } - void retrieve_params(){ + void initialize_parameters(){ auto updated_params = get_params(); // get parameters and fill struct fields rclcpp::Parameter param; @@ -198,6 +210,7 @@ struct StackParams { updated_params.__stamp = clock_.now(); update_interal_params(updated_params); + are_parameters_initialized_ = true; } private: @@ -210,6 +223,7 @@ struct StackParams { std::string prefix_; Params params_; rclcpp::Clock clock_; + bool are_parameters_initialized_; std::shared_ptr handle_; std::shared_ptr parameters_interface_; From 54e2205aa07d2fe5644fcc03f6bcd660f2c725fd Mon Sep 17 00:00:00 2001 From: Sai Kishor Kothakota Date: Mon, 30 Oct 2023 18:42:43 +0100 Subject: [PATCH 03/19] Added method to get the internal params copy --- .../jinja_templates/cpp/parameter_library_header | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header index 9a0738e..3dcbe1a 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header @@ -141,7 +141,7 @@ struct StackParams { } StackParams get_stack_params() { - Params params = get_params(); + Params params = get_internal_params_copy(); StackParams output; {%- filter indent(width=6) %} @@ -152,7 +152,7 @@ struct StackParams { } void refresh_dynamic_parameters() { - auto updated_params = get_params(); + auto updated_params = get_internal_params_copy(); // TODO remove any destroyed dynamic parameters {%- filter indent(width=6) %} {{remove_dynamic_parameters}} @@ -165,7 +165,7 @@ struct StackParams { } rcl_interfaces::msg::SetParametersResult update(const std::vector ¶meters) { - auto updated_params = get_params(); + auto updated_params = get_internal_params_copy(); for (const auto ¶m: parameters) { {%- filter indent(width=8) %} @@ -186,7 +186,7 @@ struct StackParams { } void declare_params(){ - auto updated_params = get_params(); + auto updated_params = get_internal_params_copy(); // declare all parameters and give default values to non-required ones {%- filter indent(width=6) %} {{declare_params}} @@ -194,7 +194,7 @@ struct StackParams { } void initialize_parameters(){ - auto updated_params = get_params(); + auto updated_params = get_internal_params_copy(); // get parameters and fill struct fields rclcpp::Parameter param; @@ -219,6 +219,11 @@ struct StackParams { params_ = updated_params; } + Params get_internal_params_copy() const{ + std::lock_guard lock(mutex_); + return params_; + } + std::string prefix_; Params params_; From 52a14cc500a6090adec5355ad446e13557d70fe9 Mon Sep 17 00:00:00 2001 From: Sai Kishor Kothakota Date: Tue, 31 Oct 2023 14:12:04 +0100 Subject: [PATCH 04/19] apply formatting suggestions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Christoph Fröhlich --- .../jinja_templates/cpp/parameter_library_header | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header index 3dcbe1a..d5867a4 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header @@ -114,8 +114,9 @@ struct StackParams { parameters_interface_ = parameters_interface; declare_params(); - if(initialize_params) + if(initialize_params) { initialize_parameters(); + } auto update_param_cb = [this](const std::vector ¶meters){return this->update(parameters);}; handle_ = parameters_interface_->add_on_set_parameters_callback(update_param_cb); clock_ = rclcpp::Clock(); From 2281dd245a6a5251d01469466bc80e0d9ed9f102 Mon Sep 17 00:00:00 2001 From: Sai Kishor Kothakota Date: Wed, 1 Nov 2023 13:17:26 +0100 Subject: [PATCH 05/19] revert the changes --- .../cpp/parameter_library_header | 49 +++++-------------- 1 file changed, 12 insertions(+), 37 deletions(-) diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header index d5867a4..9422c66 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header @@ -91,32 +91,28 @@ struct StackParams { class ParamListener{ public: // throws rclcpp::exceptions::InvalidParameterValueException on initialization if invalid parameter are loaded - ParamListener(rclcpp::Node::SharedPtr node, std::string const& prefix = "", bool initialize_params = true) - : ParamListener(node->get_node_parameters_interface(), node->get_logger(), prefix, initialize_params) {} + ParamListener(rclcpp::Node::SharedPtr node, std::string const& prefix = "") + : ParamListener(node->get_node_parameters_interface(), node->get_logger(), prefix) {} - ParamListener(rclcpp_lifecycle::LifecycleNode::SharedPtr node, std::string const& prefix = "", bool initialize_params = true) - : ParamListener(node->get_node_parameters_interface(), node->get_logger(), prefix, initialize_params) {} + ParamListener(rclcpp_lifecycle::LifecycleNode::SharedPtr node, std::string const& prefix = "") + : ParamListener(node->get_node_parameters_interface(), node->get_logger(), prefix) {} ParamListener(const std::shared_ptr& parameters_interface, - std::string const& prefix = "", bool initialize_params = true) - : ParamListener(parameters_interface, rclcpp::get_logger("{{namespace}}"), prefix, initialize_params) { + std::string const& prefix = "") + : ParamListener(parameters_interface, rclcpp::get_logger("{{namespace}}"), prefix) { RCLCPP_DEBUG(logger_, "ParameterListener: Not using node logger, recommend using other constructors to use a node logger"); } ParamListener(const std::shared_ptr& parameters_interface, - rclcpp::Logger logger, std::string const& prefix = "", bool initialize_params = true) { + rclcpp::Logger logger, std::string const& prefix = "") { logger_ = logger; prefix_ = prefix; - are_parameters_initialized_ = false; if (!prefix_.empty() && prefix_.back() != '.') { prefix_ += "."; } parameters_interface_ = parameters_interface; declare_params(); - if(initialize_params) { - initialize_parameters(); - } auto update_param_cb = [this](const std::vector ¶meters){return this->update(parameters);}; handle_ = parameters_interface_->add_on_set_parameters_callback(update_param_cb); clock_ = rclcpp::Clock(); @@ -124,25 +120,16 @@ struct StackParams { Params get_params() const{ std::lock_guard lock(mutex_); - if(!are_parameters_initialized_) - { - throw std::runtime_error("Please initialize the parameters using initialize_parameters method, before getting them!"); - } return params_; } - bool are_params_initialized() const - { - return are_parameters_initialized_; - } - bool is_old(Params const& other) const { std::lock_guard lock(mutex_); return params_.__stamp != other.__stamp; } StackParams get_stack_params() { - Params params = get_internal_params_copy(); + Params params = get_params(); StackParams output; {%- filter indent(width=6) %} @@ -153,7 +140,7 @@ struct StackParams { } void refresh_dynamic_parameters() { - auto updated_params = get_internal_params_copy(); + auto updated_params = get_params(); // TODO remove any destroyed dynamic parameters {%- filter indent(width=6) %} {{remove_dynamic_parameters}} @@ -166,7 +153,7 @@ struct StackParams { } rcl_interfaces::msg::SetParametersResult update(const std::vector ¶meters) { - auto updated_params = get_internal_params_copy(); + auto updated_params = get_params(); for (const auto ¶m: parameters) { {%- filter indent(width=8) %} @@ -187,15 +174,11 @@ struct StackParams { } void declare_params(){ - auto updated_params = get_internal_params_copy(); + auto updated_params = get_params(); // declare all parameters and give default values to non-required ones {%- filter indent(width=6) %} {{declare_params}} {%- endfilter %} - } - - void initialize_parameters(){ - auto updated_params = get_internal_params_copy(); // get parameters and fill struct fields rclcpp::Parameter param; @@ -211,8 +194,7 @@ struct StackParams { updated_params.__stamp = clock_.now(); update_interal_params(updated_params); - are_parameters_initialized_ = true; - } + } private: void update_interal_params(Params updated_params) { @@ -220,16 +202,9 @@ struct StackParams { params_ = updated_params; } - Params get_internal_params_copy() const{ - std::lock_guard lock(mutex_); - return params_; - } - - std::string prefix_; Params params_; rclcpp::Clock clock_; - bool are_parameters_initialized_; std::shared_ptr handle_; std::shared_ptr parameters_interface_; From 46c027024150b7e40ae6b5fcf79d8804bf07983f Mon Sep 17 00:00:00 2001 From: Sai Kishor Kothakota Date: Wed, 1 Nov 2023 13:20:43 +0100 Subject: [PATCH 06/19] add latest_stamp variable to track the changes of the parameters --- .../jinja_templates/cpp/parameter_library_header | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header index 9422c66..2a056e2 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header @@ -124,8 +124,7 @@ struct StackParams { } bool is_old(Params const& other) const { - std::lock_guard lock(mutex_); - return params_.__stamp != other.__stamp; + return latest_stamp_ != other.__stamp; } StackParams get_stack_params() { @@ -168,7 +167,7 @@ struct StackParams { {%- endfilter %} } {%- endif %} - updated_params.__stamp = clock_.now(); + latest_stamp_ = clock_.now(); update_interal_params(updated_params); return rsl::to_parameter_result_msg({}); } @@ -192,7 +191,7 @@ struct StackParams { {%- endfilter %} {%- endif %} - updated_params.__stamp = clock_.now(); + latest_stamp_ = clock_.now(); update_interal_params(updated_params); } @@ -204,6 +203,8 @@ struct StackParams { std::string prefix_; Params params_; + // for detecting if the parameter struct has been updated by update + rclcpp::Time latest_stamp_; rclcpp::Clock clock_; std::shared_ptr handle_; std::shared_ptr parameters_interface_; From 3ee6864a33d2a5956e502212013ea4af99c4c297 Mon Sep 17 00:00:00 2001 From: Sai Kishor Kothakota Date: Wed, 1 Nov 2023 13:35:05 +0100 Subject: [PATCH 07/19] update get_params method to get the declared params locally --- .../jinja_templates/cpp/parameter_library_header | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header index 2a056e2..e0d7133 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header @@ -119,8 +119,15 @@ struct StackParams { } Params get_params() const{ + Params updated_params; std::lock_guard lock(mutex_); - return params_; + // get parameters and fill struct fields + rclcpp::Parameter param; + +{%- filter indent(width=6) %} +{{declare_params_set}} +{%- endfilter %} + return updated_params; } bool is_old(Params const& other) const { @@ -173,7 +180,7 @@ struct StackParams { } void declare_params(){ - auto updated_params = get_params(); + Params updated_params; // declare all parameters and give default values to non-required ones {%- filter indent(width=6) %} {{declare_params}} @@ -181,9 +188,6 @@ struct StackParams { // get parameters and fill struct fields rclcpp::Parameter param; -{%- filter indent(width=6) %} -{{declare_params_set}} -{%- endfilter %} {% if declare_set_dynamic_params|length %} {% filter indent(width=6) %} // declare and set all dynamic parameters From 5bf0775447343d0a544734ce45ed3c15dcef4ad4 Mon Sep 17 00:00:00 2001 From: Sai Kishor Kothakota Date: Wed, 1 Nov 2023 17:39:38 +0100 Subject: [PATCH 08/19] separate dynamic parameters declaration and parameter value retrieval --- .../jinja_templates/cpp/declare_runtime_parameter | 1 - .../jinja_templates/cpp/parameter_library_header | 11 ++++++++--- .../jinja_templates/cpp/set_runtime_parameter | 6 ++++++ .../generate_parameter_library_py/parse_yaml.py | 14 ++++++++++++++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/declare_runtime_parameter b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/declare_runtime_parameter index 9d9395d..0abd434 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/declare_runtime_parameter +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/declare_runtime_parameter @@ -47,6 +47,5 @@ auto parameter = rclcpp::ParameterValue(entry.{{parameter_field}}); parameters_interface_->declare_parameter(param_name, parameter, descriptor); {% endfilter -%} } -{{set_runtime_parameter-}} {% endfilter -%} } diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header index e0d7133..0040978 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header @@ -127,6 +127,13 @@ struct StackParams { {%- filter indent(width=6) %} {{declare_params_set}} {%- endfilter %} +{% if declare_set_dynamic_params|length %} +{% filter indent(width=6) %} +// set all dynamic parameters +{{set_dynamic_params-}} +{%- endfilter %} +{%- endif %} + updated_params.__stamp = latest_stamp_; return updated_params; } @@ -185,12 +192,10 @@ struct StackParams { {%- filter indent(width=6) %} {{declare_params}} {%- endfilter %} - // get parameters and fill struct fields - rclcpp::Parameter param; {% if declare_set_dynamic_params|length %} {% filter indent(width=6) %} -// declare and set all dynamic parameters +// declare all dynamic parameters {{declare_set_dynamic_params}} {%- endfilter %} {%- endif %} diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_runtime_parameter b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_runtime_parameter index 015be80..a30c880 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_runtime_parameter +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_runtime_parameter @@ -1,6 +1,12 @@ +for (const auto & value : {{param_struct_instance}}.{{mapped_param}}){ +{%- filter indent(width=4) %} +auto& entry = {{param_struct_instance}}.{{parameter_map}}[value]; +auto param_name = fmt::format("{}{}.{}.{}", prefix_, "{{struct_name}}", value, "{{parameter_field}}"); param = parameters_interface_->get_parameter(param_name); RCLCPP_DEBUG_STREAM(logger_, param.get_name() << ": " << param.get_type_name() << " = " << param.value_to_string()); {% if parameter_validations|length -%} {{parameter_validations-}} {% endif -%} entry.{{parameter_field}} = param.{{parameter_as_function}}; +{% endfilter -%} +} diff --git a/generate_parameter_library_py/generate_parameter_library_py/parse_yaml.py b/generate_parameter_library_py/generate_parameter_library_py/parse_yaml.py index 4ee7f75..d38d661 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/parse_yaml.py +++ b/generate_parameter_library_py/generate_parameter_library_py/parse_yaml.py @@ -463,10 +463,19 @@ class SetRuntimeParameter(SetParameterBase): def __str__(self): parameter_validations_str = "".join(str(x) for x in self.parameter_validations) parameter_field = get_dynamic_parameter_field(self.parameter_name) + mapped_param = get_dynamic_mapped_parameter(self.parameter_name) + parameter_map = get_dynamic_parameter_map(self.parameter_name) + struct_name = get_dynamic_struct_name(self.parameter_name) + param_struct_instance = "updated_params" data = { + "struct_name": struct_name, "parameter_field": parameter_field, "parameter_validations": str(parameter_validations_str), "parameter_as_function": self.parameter_as_function, + "param_struct_instance": param_struct_instance, + "parameter_field": parameter_field, + "parameter_map": parameter_map, + "mapped_param": mapped_param, } j2_template = Template(GenerateCode.templates["set_runtime_parameter"]) @@ -701,6 +710,7 @@ def __init__(self, language: str): self.update_declare_dynamic_parameter = [] self.remove_dynamic_parameter = [] self.declare_parameter_sets = [] + self.declare_dynamic_parameters_sets = [] self.set_stack_params = [] if language == "cpp": self.comments = "// auto-generated DO NOT EDIT" @@ -803,6 +813,7 @@ def parse_params(self, name, value, nested_name_list): self.set_stack_params.append(SetStackParams(code_gen_variable.param_name)) if is_runtime_parameter: self.declare_dynamic_parameters.append(declare_parameter) + self.declare_dynamic_parameters_sets.append(declare_parameter_set) self.update_dynamic_parameters.append(update_parameter) self.update_declare_dynamic_parameter.append(declare_parameter) dynamic_update_parameter = RemoveRuntimeParameter(declare_parameter) @@ -860,6 +871,9 @@ def __str__(self): "declare_set_dynamic_params": "\n".join( [str(x) for x in self.declare_dynamic_parameters] ), + "set_dynamic_params": "\n".join( + [str(x) for x in self.declare_dynamic_parameters_sets] + ), "update_declare_dynamic_parameters": "\n".join( [str(x) for x in self.update_declare_dynamic_parameter] ), From dc4d5a0e330c260429c54744210be7f27c4335a4 Mon Sep 17 00:00:00 2001 From: Sai Kishor Kothakota Date: Wed, 1 Nov 2023 23:13:08 +0100 Subject: [PATCH 09/19] update parameters in update cb only when there is a validation present --- .../jinja_templates/cpp/parameter_library_header | 3 ++- .../jinja_templates/cpp/update_parameter | 5 ++--- .../jinja_templates/cpp/update_runtime_parameter | 4 ++-- .../generate_parameter_library_py/parse_yaml.py | 6 ++++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header index 0040978..39e053a 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header @@ -168,11 +168,13 @@ struct StackParams { rcl_interfaces::msg::SetParametersResult update(const std::vector ¶meters) { auto updated_params = get_params(); +{% if update_params_set|length %} for (const auto ¶m: parameters) { {%- filter indent(width=8) %} {{update_params_set}} {%- endfilter %} } +{%- endif %} {% if update_dynamic_parameters|length %} // update dynamic parameters for (const auto ¶m: parameters) { @@ -182,7 +184,6 @@ struct StackParams { } {%- endif %} latest_stamp_ = clock_.now(); - update_interal_params(updated_params); return rsl::to_parameter_result_msg({}); } diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/update_parameter b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/update_parameter index 4a9a560..3ff45fa 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/update_parameter +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/update_parameter @@ -1,9 +1,8 @@ +{% if parameter_validations|length -%} if (param.get_name() == (prefix_ + "{{parameter_name}}")) { {%- filter indent(width=4) %} -{% if parameter_validations|length -%} {{parameter_validations-}} -{% endif -%} updated_params.{{parameter_name}} = param.{{parameter_as_function}}; RCLCPP_DEBUG_STREAM(logger_, param.get_name() << ": " << param.get_type_name() << " = " << param.value_to_string()); {% endfilter -%} -} +}{% endif -%} \ No newline at end of file diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/update_runtime_parameter b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/update_runtime_parameter index 5140ab7..e759c7d 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/update_runtime_parameter +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/update_runtime_parameter @@ -1,14 +1,14 @@ +{% if parameter_validations|length -%} for (const auto & value : updated_params.{{mapped_param}}){ {%- filter indent(width=4) %} auto param_name = fmt::format("{}{}.{}.{}", prefix_, "{{struct_name}}", value, "{{parameter_field}}"); if (param.get_name() == param_name) { {%- filter indent(width=4) %} -{% if parameter_validations|length -%} {{parameter_validations-}} -{% endif -%} updated_params.{{parameter_map}}[value].{{parameter_field}} = param.{{parameter_as_function}}; RCLCPP_DEBUG_STREAM(logger_, param.get_name() << ": " << param.get_type_name() << " = " << param.value_to_string()); {% endfilter -%} } {% endfilter -%} } +{% endif -%} diff --git a/generate_parameter_library_py/generate_parameter_library_py/parse_yaml.py b/generate_parameter_library_py/generate_parameter_library_py/parse_yaml.py index d38d661..0d47238 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/parse_yaml.py +++ b/generate_parameter_library_py/generate_parameter_library_py/parse_yaml.py @@ -814,13 +814,15 @@ def parse_params(self, name, value, nested_name_list): if is_runtime_parameter: self.declare_dynamic_parameters.append(declare_parameter) self.declare_dynamic_parameters_sets.append(declare_parameter_set) - self.update_dynamic_parameters.append(update_parameter) + if str(update_parameter): + self.update_dynamic_parameters.append(update_parameter) self.update_declare_dynamic_parameter.append(declare_parameter) dynamic_update_parameter = RemoveRuntimeParameter(declare_parameter) self.remove_dynamic_parameter.append(dynamic_update_parameter) else: self.declare_parameters.append(declare_parameter) - self.update_parameters.append(update_parameter) + if str(update_parameter): + self.update_parameters.append(update_parameter) self.declare_parameter_sets.append(declare_parameter_set) def parse_dict(self, name, root_map, nested_name): From 2a7a2eca68d6a0bd2594a8e5cc673136f6c5bc67 Mon Sep 17 00:00:00 2001 From: Sai Kishor Kothakota Date: Thu, 2 Nov 2023 10:04:19 +0100 Subject: [PATCH 10/19] always have normal parameter as they might be useful for map of dynamic parameters --- .../jinja_templates/cpp/parameter_library_header | 1 - .../jinja_templates/cpp/update_parameter | 5 +++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header index 39e053a..4acf2ef 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header @@ -167,7 +167,6 @@ struct StackParams { rcl_interfaces::msg::SetParametersResult update(const std::vector ¶meters) { auto updated_params = get_params(); - {% if update_params_set|length %} for (const auto ¶m: parameters) { {%- filter indent(width=8) %} diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/update_parameter b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/update_parameter index 3ff45fa..a3285cd 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/update_parameter +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/update_parameter @@ -1,8 +1,9 @@ -{% if parameter_validations|length -%} if (param.get_name() == (prefix_ + "{{parameter_name}}")) { {%- filter indent(width=4) %} +{% if parameter_validations|length -%} {{parameter_validations-}} +{% endif -%} updated_params.{{parameter_name}} = param.{{parameter_as_function}}; RCLCPP_DEBUG_STREAM(logger_, param.get_name() << ": " << param.get_type_name() << " = " << param.value_to_string()); {% endfilter -%} -}{% endif -%} \ No newline at end of file +} \ No newline at end of file From 1648e53919d9a7eecb7f484371baf273ce89bf06 Mon Sep 17 00:00:00 2001 From: Sai Kishor Kothakota Date: Thu, 2 Nov 2023 14:48:52 +0100 Subject: [PATCH 11/19] remove the unused update_interal_params method and internal params variable --- .../jinja_templates/cpp/parameter_library_header | 7 ------- 1 file changed, 7 deletions(-) diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header index 4acf2ef..d40f0ea 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header @@ -201,17 +201,10 @@ struct StackParams { {%- endif %} latest_stamp_ = clock_.now(); - update_interal_params(updated_params); } private: - void update_interal_params(Params updated_params) { - std::lock_guard lock(mutex_); - params_ = updated_params; - } - std::string prefix_; - Params params_; // for detecting if the parameter struct has been updated by update rclcpp::Time latest_stamp_; rclcpp::Clock clock_; From 4e557b3742210cb331b6030fb6b6258fc7f9ac93 Mon Sep 17 00:00:00 2001 From: Sai Kishor Kothakota Date: Thu, 2 Nov 2023 19:50:19 +0100 Subject: [PATCH 12/19] deprecate the refresh_dynamic_parameters method --- .../jinja_templates/cpp/parameter_library_header | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header index d40f0ea..3f8e181 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header @@ -152,17 +152,8 @@ struct StackParams { return output; } + [[deprecated("Calling the method is no longer needed, will be removed in the future")]] void refresh_dynamic_parameters() { - auto updated_params = get_params(); - // TODO remove any destroyed dynamic parameters -{%- filter indent(width=6) %} -{{remove_dynamic_parameters}} -{%- endfilter %} - // declare any new dynamic parameters - rclcpp::Parameter param; -{%- filter indent(width=6) %} -{{update_declare_dynamic_parameters}} -{%- endfilter %} } rcl_interfaces::msg::SetParametersResult update(const std::vector ¶meters) { From dc8500da501ff9e6f1e223c26e52035b117d38d1 Mon Sep 17 00:00:00 2001 From: Sai Kishor Kothakota Date: Thu, 2 Nov 2023 19:50:41 +0100 Subject: [PATCH 13/19] remove timestamp update from the declare_params method --- .../jinja_templates/cpp/parameter_library_header | 2 -- 1 file changed, 2 deletions(-) diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header index 3f8e181..d4f5abc 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header @@ -190,8 +190,6 @@ struct StackParams { {{declare_set_dynamic_params}} {%- endfilter %} {%- endif %} - - latest_stamp_ = clock_.now(); } private: From 7651f1c019dea7c331114257f6e8be7a88caf151 Mon Sep 17 00:00:00 2001 From: Sai Kishor Kothakota Date: Thu, 2 Nov 2023 19:51:12 +0100 Subject: [PATCH 14/19] throw exception if the params are not loaded yet and get_params is invoked --- .../jinja_templates/cpp/parameter_library_header | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header index d4f5abc..9bff47c 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header @@ -119,6 +119,9 @@ struct StackParams { } Params get_params() const{ + if(latest_stamp_.seconds() == 0){ + throw rclcpp::exceptions::InvalidParameterValueException("No parameters are loaded yet!"); + } Params updated_params; std::lock_guard lock(mutex_); // get parameters and fill struct fields @@ -127,7 +130,7 @@ struct StackParams { {%- filter indent(width=6) %} {{declare_params_set}} {%- endfilter %} -{% if declare_set_dynamic_params|length %} +{% if set_dynamic_params|length %} {% filter indent(width=6) %} // set all dynamic parameters {{set_dynamic_params-}} From a89d00f6ed43b0b3ac2835ea4a00b55bb81ceebe Mon Sep 17 00:00:00 2001 From: Sai Kishor Kothakota Date: Thu, 2 Nov 2023 19:51:47 +0100 Subject: [PATCH 15/19] don't perform validation in the get_params method --- .../jinja_templates/cpp/set_parameter | 3 --- .../jinja_templates/cpp/set_runtime_parameter | 3 --- 2 files changed, 6 deletions(-) diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_parameter b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_parameter index fdd223f..47a3116 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_parameter +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_parameter @@ -1,6 +1,3 @@ param = parameters_interface_->get_parameter(prefix_ + "{{parameter_name}}"); RCLCPP_DEBUG_STREAM(logger_, param.get_name() << ": " << param.get_type_name() << " = " << param.value_to_string()); -{% if parameter_validations|length -%} -{{parameter_validations-}} -{% endif -%} updated_params.{{parameter_name}} = param.{{parameter_as_function}}; diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_runtime_parameter b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_runtime_parameter index a30c880..0ca47f1 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_runtime_parameter +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_runtime_parameter @@ -4,9 +4,6 @@ auto& entry = {{param_struct_instance}}.{{parameter_map}}[value]; auto param_name = fmt::format("{}{}.{}.{}", prefix_, "{{struct_name}}", value, "{{parameter_field}}"); param = parameters_interface_->get_parameter(param_name); RCLCPP_DEBUG_STREAM(logger_, param.get_name() << ": " << param.get_type_name() << " = " << param.value_to_string()); -{% if parameter_validations|length -%} -{{parameter_validations-}} -{% endif -%} entry.{{parameter_field}} = param.{{parameter_as_function}}; {% endfilter -%} } From acfbd73f592ba190fdd6fe5a4ba269acfc9172ed Mon Sep 17 00:00:00 2001 From: Sai Kishor Kothakota Date: Thu, 2 Nov 2023 19:52:49 +0100 Subject: [PATCH 16/19] use Params object instead of get_params method in the update callback --- .../jinja_templates/cpp/parameter_library_header | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header index 9bff47c..c62c123 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header @@ -160,7 +160,7 @@ struct StackParams { } rcl_interfaces::msg::SetParametersResult update(const std::vector ¶meters) { - auto updated_params = get_params(); + Params updated_params; {% if update_params_set|length %} for (const auto ¶m: parameters) { {%- filter indent(width=8) %} From aa207d6f2457daef1462ec6cf314e95e8caaf135 Mon Sep 17 00:00:00 2001 From: Sai Kishor Kothakota Date: Thu, 2 Nov 2023 22:54:17 +0100 Subject: [PATCH 17/19] use internal methods to update the param state for update callback --- .../jinja_templates/cpp/parameter_library_header | 15 ++++++++++++++- .../jinja_templates/cpp/update_runtime_parameter | 4 ++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header index c62c123..46e8646 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header @@ -160,7 +160,7 @@ struct StackParams { } rcl_interfaces::msg::SetParametersResult update(const std::vector ¶meters) { - Params updated_params; + auto updated_params = get_internal_params(); {% if update_params_set|length %} for (const auto ¶m: parameters) { {%- filter indent(width=8) %} @@ -177,6 +177,8 @@ struct StackParams { } {%- endif %} latest_stamp_ = clock_.now(); + updated_params.__stamp = clock_.now(); + update_interal_params(updated_params); return rsl::to_parameter_result_msg({}); } @@ -196,7 +198,18 @@ struct StackParams { } private: + void update_interal_params(Params updated_params) { + std::lock_guard lock(mutex_); + params_ = updated_params; + } + + Params get_internal_params() const{ + std::lock_guard lock(mutex_); + return params_; + } + std::string prefix_; + Params params_; // for detecting if the parameter struct has been updated by update rclcpp::Time latest_stamp_; rclcpp::Clock clock_; diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/update_runtime_parameter b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/update_runtime_parameter index e759c7d..5140ab7 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/update_runtime_parameter +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/update_runtime_parameter @@ -1,14 +1,14 @@ -{% if parameter_validations|length -%} for (const auto & value : updated_params.{{mapped_param}}){ {%- filter indent(width=4) %} auto param_name = fmt::format("{}{}.{}.{}", prefix_, "{{struct_name}}", value, "{{parameter_field}}"); if (param.get_name() == param_name) { {%- filter indent(width=4) %} +{% if parameter_validations|length -%} {{parameter_validations-}} +{% endif -%} updated_params.{{parameter_map}}[value].{{parameter_field}} = param.{{parameter_as_function}}; RCLCPP_DEBUG_STREAM(logger_, param.get_name() << ": " << param.get_type_name() << " = " << param.value_to_string()); {% endfilter -%} } {% endfilter -%} } -{% endif -%} From 9ecb96fdaa05948d09c776edd1f1936ce9b4f8c7 Mon Sep 17 00:00:00 2001 From: Sai Kishor Kothakota Date: Thu, 2 Nov 2023 23:18:05 +0100 Subject: [PATCH 18/19] optimize get_params to use internal variable with some logic --- .../cpp/parameter_library_header | 26 +++++++++---------- .../jinja_templates/cpp/set_parameter | 3 +++ .../jinja_templates/cpp/set_runtime_parameter | 3 +++ 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header index 46e8646..b68b61a 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header @@ -119,29 +119,30 @@ struct StackParams { } Params get_params() const{ - if(latest_stamp_.seconds() == 0){ - throw rclcpp::exceptions::InvalidParameterValueException("No parameters are loaded yet!"); - } - Params updated_params; - std::lock_guard lock(mutex_); - // get parameters and fill struct fields - rclcpp::Parameter param; + auto params = get_internal_params(); + if(params.__stamp.seconds() == 0){ + Params updated_params; + // get parameters and fill struct fields + rclcpp::Parameter param; -{%- filter indent(width=6) %} +{%- filter indent(width=8) %} {{declare_params_set}} {%- endfilter %} {% if set_dynamic_params|length %} -{% filter indent(width=6) %} +{% filter indent(width=8) %} // set all dynamic parameters {{set_dynamic_params-}} {%- endfilter %} {%- endif %} - updated_params.__stamp = latest_stamp_; - return updated_params; + updated_params.__stamp = clock_.now(); + return updated_params; + } + return params; } bool is_old(Params const& other) const { - return latest_stamp_ != other.__stamp; + std::lock_guard lock(mutex_); + return params_.__stamp != other.__stamp; } StackParams get_stack_params() { @@ -176,7 +177,6 @@ struct StackParams { {%- endfilter %} } {%- endif %} - latest_stamp_ = clock_.now(); updated_params.__stamp = clock_.now(); update_interal_params(updated_params); return rsl::to_parameter_result_msg({}); diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_parameter b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_parameter index 47a3116..fdd223f 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_parameter +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_parameter @@ -1,3 +1,6 @@ param = parameters_interface_->get_parameter(prefix_ + "{{parameter_name}}"); RCLCPP_DEBUG_STREAM(logger_, param.get_name() << ": " << param.get_type_name() << " = " << param.value_to_string()); +{% if parameter_validations|length -%} +{{parameter_validations-}} +{% endif -%} updated_params.{{parameter_name}} = param.{{parameter_as_function}}; diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_runtime_parameter b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_runtime_parameter index 0ca47f1..a30c880 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_runtime_parameter +++ b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_runtime_parameter @@ -4,6 +4,9 @@ auto& entry = {{param_struct_instance}}.{{parameter_map}}[value]; auto param_name = fmt::format("{}{}.{}.{}", prefix_, "{{struct_name}}", value, "{{parameter_field}}"); param = parameters_interface_->get_parameter(param_name); RCLCPP_DEBUG_STREAM(logger_, param.get_name() << ": " << param.get_type_name() << " = " << param.value_to_string()); +{% if parameter_validations|length -%} +{{parameter_validations-}} +{% endif -%} entry.{{parameter_field}} = param.{{parameter_as_function}}; {% endfilter -%} } From 62383cba2d4253bde699a16dcbd0ce79be615c5d Mon Sep 17 00:00:00 2001 From: Sai Kishor Kothakota Date: Sun, 12 Nov 2023 22:45:41 +0100 Subject: [PATCH 19/19] retrieve the main dynamic map parameter parent params and pass to set_parameter --- .../parse_yaml.py | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/generate_parameter_library_py/generate_parameter_library_py/parse_yaml.py b/generate_parameter_library_py/generate_parameter_library_py/parse_yaml.py index 0d47238..9bf7bcb 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/parse_yaml.py +++ b/generate_parameter_library_py/generate_parameter_library_py/parse_yaml.py @@ -139,6 +139,14 @@ def get_fixed_type(yaml_type: str): return get_fixed_base_type(yaml_type) + "_fixed" +@typechecked +def get_all_keys(param_map: dict): + for key, value in param_map.items(): + yield key + if isinstance(value, dict): + yield from get_all_keys(value) + + class CodeGenVariableBase: @typechecked def __init__( @@ -434,8 +442,14 @@ def __str__(self): class SetParameterBase: @typechecked - def __init__(self, parameter_name: str, code_gen_variable: CodeGenVariableBase): + def __init__( + self, + parameter_name: str, + params_map_parents: list, + code_gen_variable: CodeGenVariableBase, + ): self.parameter_name = parameter_name + self.params_map_parents = params_map_parents self.parameter_as_function = code_gen_variable.parameter_as_function_str() self.parameter_validations = [] @@ -452,6 +466,7 @@ def __str__(self): "parameter_name": self.parameter_name, "parameter_validations": str(parameter_validations_str), "parameter_as_function": self.parameter_as_function, + "mapped_params": self.params_map_parents, } j2_template = Template(GenerateCode.templates["set_parameter"]) @@ -738,6 +753,10 @@ def parse(self, yaml_file, validate_header): raise compile_error( "The yaml definition must only have one root element" ) + self.params_map_parents = list() + for key in list(get_all_keys(doc)): + if is_mapped_parameter(key): + self.params_map_parents.append((key.replace("__map_", ""))) self.namespace = list(doc.keys())[0] self.user_validation_file = validate_header self.parse_dict(self.namespace, doc[self.namespace], []) @@ -774,7 +793,9 @@ def parse_params(self, name, value, nested_name_list): is_runtime_parameter = is_mapped_parameter(self.struct_tree.struct_name) if is_runtime_parameter: - declare_parameter_set = SetRuntimeParameter(param_name, code_gen_variable) + declare_parameter_set = SetRuntimeParameter( + param_name, self.params_map_parents, code_gen_variable + ) declare_parameter = DeclareRuntimeParameter( code_gen_variable, description, read_only, validations ) @@ -784,7 +805,9 @@ def parse_params(self, name, value, nested_name_list): declare_parameter = DeclareParameter( code_gen_variable, description, read_only, validations ) - declare_parameter_set = SetParameter(param_name, code_gen_variable) + declare_parameter_set = SetParameter( + param_name, self.params_map_parents, code_gen_variable + ) update_parameter = UpdateParameter(param_name, code_gen_variable) # set parameter