From cd17671053db0eee673168c4393091de69fd0d29 Mon Sep 17 00:00:00 2001 From: Sergi Hernandez Juan <shernand@iri.upc.edu> Date: Fri, 29 Oct 2021 19:09:23 +0200 Subject: [PATCH] Added functions to get the value of the parameters. --- include/iri_ros_tools/module_dyn_reconf.h | 149 ++++++++++++++++++++++ 1 file changed, 149 insertions(+) diff --git a/include/iri_ros_tools/module_dyn_reconf.h b/include/iri_ros_tools/module_dyn_reconf.h index f58982d..331a66a 100644 --- a/include/iri_ros_tools/module_dyn_reconf.h +++ b/include/iri_ros_tools/module_dyn_reconf.h @@ -3,6 +3,7 @@ #include <dynamic_reconfigure/Reconfigure.h> #include <iri_ros_tools/module_service.h> +#include <map> typedef enum {DYN_RECONF_NO_SUCH_PARAM, DYN_RECONF_NO_CHANGE, @@ -35,6 +36,11 @@ class CModuleDynReconf : protected CModuleService<dynamic_reconfigure::Reconfigu * sure the value has been changed correctly. */ bool bool_value; + /** + * \brief + * + */ + std::map<std::string,bool> bool_params; /** * \brief Integer value to change * @@ -43,6 +49,11 @@ class CModuleDynReconf : protected CModuleService<dynamic_reconfigure::Reconfigu * sure the value has been changed correctly. */ int int_value; + /** + * \brief + * + */ + std::map<std::string,int> int_params; /** * \brief String value to change * @@ -51,6 +62,11 @@ class CModuleDynReconf : protected CModuleService<dynamic_reconfigure::Reconfigu * sure the value has been changed correctly. */ std::string string_value; + /** + * \brief + * + */ + std::map<std::string,std::string> string_params; /** * \brief Double value to change * @@ -59,12 +75,22 @@ class CModuleDynReconf : protected CModuleService<dynamic_reconfigure::Reconfigu * sure the value has been changed correctly. */ double double_value; + /** + * \brief + * + */ + std::map<std::string,double> double_params; /** * \brief Status of the last service call * * */ dyn_reconf_status_t dyn_reconf_status; + /** + * \brief + * + */ + bool read_done; protected: /** * \brief Service data check callback @@ -80,6 +106,16 @@ class CModuleDynReconf : protected CModuleService<dynamic_reconfigure::Reconfigu * */ bool check_dyn_reconf(dynamic_reconfigure::Reconfigure &msg); + /** + * \brief + * + */ + bool check_always_true(dynamic_reconfigure::Reconfigure &msg); + /** + * \brief + * + */ + void read_params(void); public: /** * \brief Constructor @@ -104,6 +140,11 @@ class CModuleDynReconf : protected CModuleService<dynamic_reconfigure::Reconfigu * changed (true) or not (false) */ bool set_parameter(const std::string &name,bool value); + /** + * \brief + * + */ + bool get_parameter(const std::string &name,bool &value); /** * \brief Sets a parameter of type integer * @@ -123,6 +164,11 @@ class CModuleDynReconf : protected CModuleService<dynamic_reconfigure::Reconfigu * changed (true) or not (false) */ bool set_parameter(const std::string &name,int value); + /** + * \brief + * + */ + bool get_parameter(const std::string &name,int &value); /** * \brief Sets a parameter of type string * @@ -142,6 +188,11 @@ class CModuleDynReconf : protected CModuleService<dynamic_reconfigure::Reconfigu * changed (true) or not (false) */ bool set_parameter(const std::string &name,std::string &value); + /** + * \brief + * + */ + bool get_parameter(const std::string &name,std::string &value); /** * \brief Sets a parameter of type double * @@ -161,6 +212,11 @@ class CModuleDynReconf : protected CModuleService<dynamic_reconfigure::Reconfigu * changed (true) or not (false) */ bool set_parameter(const std::string &name,double value); + /** + * \brief + * + */ + bool get_parameter(const std::string &name,double &value); /** * \brief returns the las call status * @@ -183,6 +239,8 @@ CModuleDynReconf<dyn_reconf_config>::CModuleDynReconf(const std::string &name,co this->dyn_reconf_status=DYN_RECONF_SUCCESSFULL; this->set_max_num_retries(1); this->set_call_check_function(boost::bind(&CModuleDynReconf::check_dyn_reconf,this,_1)); + this->read_done=false; + this->read_params(); } template<class dyn_reconf_config> @@ -259,6 +317,37 @@ bool CModuleDynReconf<dyn_reconf_config>::check_dyn_reconf(dynamic_reconfigure:: return false; } +template<class dyn_reconf_config> +bool CModuleDynReconf<dyn_reconf_config>::check_always_true(dynamic_reconfigure::Reconfigure &msg) +{ + return true; +} + +template<class dyn_reconf_config> +void CModuleDynReconf<dyn_reconf_config>::read_params(void) +{ + dynamic_reconfigure::Reconfigure set_params_srv; + unsigned int i=0; + + this->set_call_check_function(boost::bind(&CModuleDynReconf::check_always_true,this,_1)); + // make an empty service call to get the current values + if(this->call(set_params_srv)==ACT_SRV_SUCCESS) + { + for(i=0;i<set_params_srv.response.config.bools.size();i++) + this->bool_params[set_params_srv.response.config.bools[i].name]=set_params_srv.response.config.bools[i].value; + for(i=0;i<set_params_srv.response.config.ints.size();i++) + this->bool_params[set_params_srv.response.config.ints[i].name]=set_params_srv.response.config.ints[i].value; + for(i=0;i<set_params_srv.response.config.strs.size();i++) + this->bool_params[set_params_srv.response.config.strs[i].name]=set_params_srv.response.config.strs[i].value; + for(i=0;i<set_params_srv.response.config.doubles.size();i++) + this->bool_params[set_params_srv.response.config.doubles[i].name]=set_params_srv.response.config.doubles[i].value; + this->read_done=true; + } + else + this->read_done=false; + this->set_call_check_function(boost::bind(&CModuleDynReconf::check_dyn_reconf,this,_1)); +} + template<class dyn_reconf_config> bool CModuleDynReconf<dyn_reconf_config>::set_parameter(const std::string &name,bool value) { @@ -267,6 +356,8 @@ bool CModuleDynReconf<dyn_reconf_config>::set_parameter(const std::string &name, ROS_DEBUG_STREAM("CModuleDynReconf::set_parameter: Sending new request on service " << this->get_name()); ROS_DEBUG_STREAM("CModuleDynReconf::set boolean parameter " << name << " to " << value); + if(!this->read_done) + this->read_params(); set_params_srv.request.config.bools.resize(1); set_params_srv.request.config.bools[0].name=name; set_params_srv.request.config.bools[0].value=value; @@ -275,6 +366,7 @@ bool CModuleDynReconf<dyn_reconf_config>::set_parameter(const std::string &name, switch(this->call(set_params_srv)) { case ACT_SRV_SUCCESS: ROS_DEBUG_STREAM("CModule::set_parameters: Request successfull on server: " << this->get_name()); + this->bool_params[name]=set_params_srv.response.config.bools[0].value; return true; break; case ACT_SRV_PENDING: @@ -285,6 +377,18 @@ bool CModuleDynReconf<dyn_reconf_config>::set_parameter(const std::string &name, } } +template<class dyn_reconf_config> +bool CModuleDynReconf<dyn_reconf_config>::get_parameter(const std::string &name,bool &value) +{ + if(this->bool_params.find(name)!=this->bool_params.end()) + { + value=this->bool_params[name]; + return true; + } + else + return false; +} + template<class dyn_reconf_config> bool CModuleDynReconf<dyn_reconf_config>::set_parameter(const std::string &name,int value) { @@ -293,6 +397,8 @@ bool CModuleDynReconf<dyn_reconf_config>::set_parameter(const std::string &name, ROS_DEBUG_STREAM("CModuleDynReconf::set_parameter: Sending new request on service " << this->get_name()); ROS_DEBUG_STREAM("CModule::set integer parameter " << name << " to " << value); + if(!this->read_done) + this->read_params(); set_params_srv.request.config.ints.resize(1); set_params_srv.request.config.ints[0].name=name; set_params_srv.request.config.ints[0].value=value; @@ -301,6 +407,7 @@ bool CModuleDynReconf<dyn_reconf_config>::set_parameter(const std::string &name, switch(this->call(set_params_srv)) { case ACT_SRV_SUCCESS: ROS_DEBUG_STREAM("CModule::set_parameters: Request successfull on server: " << this->get_name()); + this->int_params[name]=set_params_srv.response.config.ints[0].value; return true; break; case ACT_SRV_PENDING: @@ -311,6 +418,18 @@ bool CModuleDynReconf<dyn_reconf_config>::set_parameter(const std::string &name, } } +template<class dyn_reconf_config> +bool CModuleDynReconf<dyn_reconf_config>::get_parameter(const std::string &name,int &value) +{ + if(this->int_params.find(name)!=this->int_params.end()) + { + value=this->int_params[name]; + return true; + } + else + return false; +} + template<class dyn_reconf_config> bool CModuleDynReconf<dyn_reconf_config>::set_parameter(const std::string &name,std::string &value) { @@ -319,6 +438,8 @@ bool CModuleDynReconf<dyn_reconf_config>::set_parameter(const std::string &name, ROS_DEBUG_STREAM("CModuleDynReconf::set_parameter: Sending new request on service " << this->get_name()); ROS_DEBUG_STREAM("CModuleDynReconf::set string parameter " << name << " to " << value); + if(!this->read_done) + this->read_params(); set_params_srv.request.config.strs.resize(1); set_params_srv.request.config.strs[0].name=name; set_params_srv.request.config.strs[0].value=value; @@ -327,6 +448,7 @@ bool CModuleDynReconf<dyn_reconf_config>::set_parameter(const std::string &name, switch(this->call(set_params_srv)) { case ACT_SRV_SUCCESS: ROS_DEBUG_STREAM("CModule::set_parameters: Request successfull on server: " << this->get_name()); + this->string_params[name]=set_params_srv.response.config.strs[0].value; return true; break; case ACT_SRV_PENDING: @@ -337,6 +459,18 @@ bool CModuleDynReconf<dyn_reconf_config>::set_parameter(const std::string &name, } } +template<class dyn_reconf_config> +bool CModuleDynReconf<dyn_reconf_config>::get_parameter(const std::string &name,std::string &value) +{ + if(this->string_params.find(name)!=this->string_params.end()) + { + value=this->string_params[name]; + return true; + } + else + return false; +} + template<class dyn_reconf_config> bool CModuleDynReconf<dyn_reconf_config>::set_parameter(const std::string &name,double value) { @@ -345,6 +479,8 @@ bool CModuleDynReconf<dyn_reconf_config>::set_parameter(const std::string &name, ROS_DEBUG_STREAM("CModule::set_parameter: Sending new request on service " << this->get_name()); ROS_DEBUG_STREAM("CModule::set double parameter " << name << " to " << value); + if(!this->read_done) + this->read_params(); set_params_srv.request.config.doubles.resize(1); set_params_srv.request.config.doubles[0].name=name; set_params_srv.request.config.doubles[0].value=value; @@ -353,6 +489,7 @@ bool CModuleDynReconf<dyn_reconf_config>::set_parameter(const std::string &name, switch(this->call(set_params_srv)) { case ACT_SRV_SUCCESS: ROS_DEBUG_STREAM("CModule::set_parameters: Request successfull on server: " << this->get_name()); + this->double_params[name]=set_params_srv.response.config.doubles[0].value; return true; break; case ACT_SRV_PENDING: @@ -363,6 +500,18 @@ bool CModuleDynReconf<dyn_reconf_config>::set_parameter(const std::string &name, } } +template<class dyn_reconf_config> +bool CModuleDynReconf<dyn_reconf_config>::get_parameter(const std::string &name,double &value) +{ + if(this->double_params.find(name)!=this->double_params.end()) + { + value=this->double_params[name]; + return true; + } + else + return false; +} + template<class dyn_reconf_config> dyn_reconf_status_t CModuleDynReconf<dyn_reconf_config>::get_status(void) { -- GitLab