Commit 9c9070b1 authored by Sergi Hernandez's avatar Sergi Hernandez
Browse files

Modified the module service to handle generic dynamic reconfigure parameters.

parent 07afbe0a
......@@ -7,7 +7,7 @@ project(iri_ros_tools)
find_package(catkin REQUIRED COMPONENTS roscpp)
## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)
find_package(Boost REQUIRED COMPONENTS system)
## Uncomment this if the package has a setup.py. This macro ensures
## modules and global scripts declared therein get installed
......
......@@ -15,7 +15,8 @@ typedef enum {DYN_RECONF_NO_SUCH_PARAM,
* the specifics of the dynamic reconfigure service. It ptovides functions
* to set integer, boolean, float and string parameters of remote ROS nodes.
*/
class CModuleDynReconf : protected CModuleService<dynamic_reconfigure::Reconfigure>
template<class dyn_reconf_config>
class CModuleDynReconf : protected CModuleService<dynamic_reconfigure::Reconfigure,dyn_reconf_config>
{
private:
/**
......@@ -176,13 +177,16 @@ class CModuleDynReconf : protected CModuleService<dynamic_reconfigure::Reconfigu
~CModuleDynReconf();
};
CModuleDynReconf::CModuleDynReconf(const std::string &name,const std::string &name_space) : CModuleService(name,name_space)
template<class dyn_reconf_config>
CModuleDynReconf<dyn_reconf_config>::CModuleDynReconf(const std::string &name,const std::string &name_space) : CModuleService<dynamic_reconfigure::Reconfigure,dyn_reconf_config>(name,name_space)
{
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));
}
bool CModuleDynReconf::check_dyn_reconf(dynamic_reconfigure::Reconfigure &msg)
template<class dyn_reconf_config>
bool CModuleDynReconf<dyn_reconf_config>::check_dyn_reconf(dynamic_reconfigure::Reconfigure &msg)
{
unsigned int i=0;
......@@ -255,7 +259,8 @@ bool CModuleDynReconf::check_dyn_reconf(dynamic_reconfigure::Reconfigure &msg)
return false;
}
bool CModuleDynReconf::set_parameter(const std::string &name,bool value)
template<class dyn_reconf_config>
bool CModuleDynReconf<dyn_reconf_config>::set_parameter(const std::string &name,bool value)
{
dynamic_reconfigure::Reconfigure set_params_srv;
......@@ -280,7 +285,8 @@ bool CModuleDynReconf::set_parameter(const std::string &name,bool value)
}
}
bool CModuleDynReconf::set_parameter(const std::string &name,int value)
template<class dyn_reconf_config>
bool CModuleDynReconf<dyn_reconf_config>::set_parameter(const std::string &name,int value)
{
dynamic_reconfigure::Reconfigure set_params_srv;
......@@ -305,7 +311,8 @@ bool CModuleDynReconf::set_parameter(const std::string &name,int value)
}
}
bool CModuleDynReconf::set_parameter(const std::string &name,std::string &value)
template<class dyn_reconf_config>
bool CModuleDynReconf<dyn_reconf_config>::set_parameter(const std::string &name,std::string &value)
{
dynamic_reconfigure::Reconfigure set_params_srv;
......@@ -330,7 +337,8 @@ bool CModuleDynReconf::set_parameter(const std::string &name,std::string &value)
}
}
bool CModuleDynReconf::set_parameter(const std::string &name,double value)
template<class dyn_reconf_config>
bool CModuleDynReconf<dyn_reconf_config>::set_parameter(const std::string &name,double value)
{
dynamic_reconfigure::Reconfigure set_params_srv;
......@@ -355,12 +363,14 @@ bool CModuleDynReconf::set_parameter(const std::string &name,double value)
}
}
dyn_reconf_status_t CModuleDynReconf::get_status(void)
template<class dyn_reconf_config>
dyn_reconf_status_t CModuleDynReconf<dyn_reconf_config>::get_status(void)
{
return this->dyn_reconf_status;
}
CModuleDynReconf::~CModuleDynReconf()
template<class dyn_reconf_config>
CModuleDynReconf<dyn_reconf_config>::~CModuleDynReconf()
{
}
......
......@@ -4,6 +4,8 @@
#include <ros/ros.h>
#include <iri_ros_tools/module_common.h>
#include <boost/any.hpp>
#define DEFAULT_SERVICE_MAX_RETRIES 5
/**
......@@ -24,7 +26,7 @@
* <main node namespace>/<class namespace>/<class name>
*/
template<class service_msg>
template<class service_msg,class dyn_reconf_config>
class CModuleService
{
private:
......@@ -110,6 +112,18 @@ class CModuleService
* \param namespace string with the base namespace for the service.
*/
CModuleService(const std::string &name,const std::string &name_space=std::string(""));
/**
* \ brief Handles the dynamic reconfigure parameters of the module service
*
* This functions handles all generic module service parameters for each instance
* and updates the internal attributes accordingly.
*
* \param config data object with all the module parameters.
* \param name prefix given to the module servie variables in order to locate and
* handle them.
*/
void dynamice_reconfigure(dyn_reconf_config &config, std::string &name);
/**
* \brief Sets the maximum number of attempts to start the action
*
......@@ -188,8 +202,8 @@ class CModuleService
~CModuleService();
};
template<class service_msg>
CModuleService<service_msg>::CModuleService(const std::string &name,const std::string &name_space):nh(name_space)
template<class service_msg,class dyn_reconf_config>
CModuleService<service_msg,dyn_reconf_config>::CModuleService(const std::string &name,const std::string &name_space):nh(name_space)
{
this->current_num_retries=0;
this->max_num_retries=DEFAULT_SERVICE_MAX_RETRIES;
......@@ -202,50 +216,79 @@ CModuleService<service_msg>::CModuleService(const std::string &name,const std::s
this->enabled=true;
}
template<class service_msg>
bool CModuleService<service_msg>::default_call_check(service_msg &msg)
template<class service_msg,class dyn_reconf_config>
void CModuleService<service_msg,dyn_reconf_config>::dynamice_reconfigure(dyn_reconf_config &config, std::string &name)
{
std::vector<typename dyn_reconf_config::AbstractParamDescriptionConstPtr> params;
boost::any value;
params=dyn_reconf_config::__getParamDescriptions__();
for(typename std::vector<typename dyn_reconf_config::AbstractParamDescriptionConstPtr>::iterator param=params.begin();param!=params.end();param++)
{
if((*param)->name==(name+"_max_num_retries"))
{
(*param)->getValue(config,value);
if(value.type()==typeid(int))
this->set_max_num_retries(boost::any_cast<int &>(value));
}
if((*param)->name==(name+"_enable"))
{
if(value.type()==typeid(bool))
{
if(boost::any_cast<bool &>(value))
this->enable();
else
this->disable();
}
}
}
}
template<class service_msg,class dyn_reconf_config>
bool CModuleService<service_msg,dyn_reconf_config>::default_call_check(service_msg &msg)
{
return true;
}
template<class service_msg>
void CModuleService<service_msg>::set_max_num_retries(unsigned int max_retries)
template<class service_msg,class dyn_reconf_config>
void CModuleService<service_msg,dyn_reconf_config>::set_max_num_retries(unsigned int max_retries)
{
this->max_num_retries=max_retries;
}
template<class service_msg>
unsigned int CModuleService<service_msg>::get_max_num_retries(void)
template<class service_msg,class dyn_reconf_config>
unsigned int CModuleService<service_msg,dyn_reconf_config>::get_max_num_retries(void)
{
return this->max_num_retries;
}
template<class service_msg>
std::string CModuleService<service_msg>::get_name(void)
template<class service_msg,class dyn_reconf_config>
std::string CModuleService<service_msg,dyn_reconf_config>::get_name(void)
{
return this->name;
}
template<class service_msg>
void CModuleService<service_msg>::enable(void)
template<class service_msg,class dyn_reconf_config>
void CModuleService<service_msg,dyn_reconf_config>::enable(void)
{
this->enabled=true;
}
template<class service_msg>
void CModuleService<service_msg>::disable(void)
template<class service_msg,class dyn_reconf_config>
void CModuleService<service_msg,dyn_reconf_config>::disable(void)
{
this->enabled=false;
}
template<class service_msg>
bool CModuleService<service_msg>::is_enabled(void)
template<class service_msg,class dyn_reconf_config>
bool CModuleService<service_msg,dyn_reconf_config>::is_enabled(void)
{
return this->enabled;
}
template<class service_msg>
act_srv_status CModuleService<service_msg>::call(service_msg &msg)
template<class service_msg,class dyn_reconf_config>
act_srv_status CModuleService<service_msg,dyn_reconf_config>::call(service_msg &msg)
{
ROS_DEBUG_STREAM("CModuleService::call: Sending New Request to service " << this->service_client.getService());
......@@ -295,14 +338,14 @@ act_srv_status CModuleService<service_msg>::call(service_msg &msg)
return ACT_SRV_SUCCESS;
}
template<class service_msg>
void CModuleService<service_msg>::set_call_check_function(const boost::function< bool(service_msg &msg) > &function)
template<class service_msg,class dyn_reconf_config>
void CModuleService<service_msg,dyn_reconf_config>::set_call_check_function(const boost::function< bool(service_msg &msg) > &function)
{
this->call_successfull=function;
}
template<class service_msg>
CModuleService<service_msg>::~CModuleService()
template<class service_msg,class dyn_reconf_config>
CModuleService<service_msg,dyn_reconf_config>::~CModuleService()
{
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment