From 7e004e911050bf98f96d29046b5cb8ac6975179e Mon Sep 17 00:00:00 2001 From: Sai Kishor Kothakota Date: Sun, 4 May 2025 19:58:08 +0200 Subject: [PATCH 1/3] Improve method --- .../jinja_templates/cpp/parameter_library_header | 6 +++--- 1 file 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 179d506..909b9bf 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 @@ -125,12 +125,12 @@ struct StackParams { } bool try_get_params(Params & params_in) const { - if (mutex_.try_lock()) { + std::unique_lock lock(mutex_, std::try_to_lock); + if (lock.owns_lock()) { if (const bool is_old = params_in.__stamp != params_.__stamp; is_old) { params_in = params_; + return true; } - mutex_.unlock(); - return true; } return false; } From f5f0bf620434a9c79ae251877d161370fcb98b35 Mon Sep 17 00:00:00 2001 From: Sai Kishor Kothakota Date: Sun, 4 May 2025 22:33:32 +0200 Subject: [PATCH 2/3] fix tests --- example/test/example_test_gtest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/test/example_test_gtest.cpp b/example/test/example_test_gtest.cpp index 40e06e1..8d1155d 100644 --- a/example/test/example_test_gtest.cpp +++ b/example/test/example_test_gtest.cpp @@ -65,7 +65,7 @@ TEST_F(ExampleTest, check_parameters) { } TEST_F(ExampleTest, try_get_params) { - ASSERT_TRUE(param_listener_->try_get_params(params_)); + ASSERT_FALSE(param_listener_->try_get_params(params_)); const rclcpp ::Parameter new_param("interpolation_mode", "linear"); example_test_node_->set_parameter(new_param); From b2139d09bc5f7762f81a2f8727e58a94ba563b6c Mon Sep 17 00:00:00 2001 From: Sai Kishor Kothakota Date: Sat, 7 Jun 2025 17:20:19 +0200 Subject: [PATCH 3/3] add try_update_params method --- example/test/example_test_gtest.cpp | 11 +++++++- .../cpp/parameter_library_header | 26 ++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/example/test/example_test_gtest.cpp b/example/test/example_test_gtest.cpp index 8d1155d..fcae688 100644 --- a/example/test/example_test_gtest.cpp +++ b/example/test/example_test_gtest.cpp @@ -64,8 +64,17 @@ TEST_F(ExampleTest, check_parameters) { ASSERT_EQ(params_.ft_sensor.filter_coefficient, 0.1); } +TEST_F(ExampleTest, try_update_params) { + ASSERT_FALSE(param_listener_->try_update_params(params_)); + + const rclcpp ::Parameter new_param("interpolation_mode", "linear"); + example_test_node_->set_parameter(new_param); + ASSERT_TRUE(param_listener_->try_update_params(params_)); + ASSERT_EQ(params_.interpolation_mode, "linear"); +} + TEST_F(ExampleTest, try_get_params) { - ASSERT_FALSE(param_listener_->try_get_params(params_)); + ASSERT_TRUE(param_listener_->try_get_params(params_)); const rclcpp ::Parameter new_param("interpolation_mode", "linear"); example_test_node_->set_parameter(new_param); 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 909b9bf..29562e6 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,7 +124,13 @@ struct StackParams { return params_; } - bool try_get_params(Params & params_in) const { + /** + * @brief Tries to update the parsed Params object + * @param params_in The Params object to update + * @return true if the Params object was updated, false if it was already up to date or the mutex could not be locked + * @note This function tries to lock the mutex without blocking, so it can be used in a RT loop + */ + bool try_update_params(Params & params_in) const { std::unique_lock lock(mutex_, std::try_to_lock); if (lock.owns_lock()) { if (const bool is_old = params_in.__stamp != params_.__stamp; is_old) { @@ -135,6 +141,24 @@ struct StackParams { return false; } + /** + * @brief Tries to get the current Params object + * @param params_in The Params object to fill with the current parameters + * @return true if mutex can be locked, false if mutex could not be locked + * @note The parameters are only filled, when the mutex can be locked and the params timestamp is different + * @note This function tries to lock the mutex without blocking, so it can be used in a RT loop + */ + bool try_get_params(Params & params_in) const { + if (mutex_.try_lock()) { + if (const bool is_old = params_in.__stamp != params_.__stamp; is_old) { + params_in = params_; + } + mutex_.unlock(); + return true; + } + return false; + } + bool is_old(Params const& other) const { std::lock_guard lock(mutex_); return params_.__stamp != other.__stamp;