gpio_analog.cpp
Go to the documentation of this file.
1 
32 
33 #define PARAM_ANALOG_STRING "/analog"
34 
35 GPIOAnalogConfigurator::GPIOAnalogConfigurator(const ros::NodeHandle &nh, roboteq::serial_controller *serial, std::vector<roboteq::Motor *> motor, string name, unsigned int number)
36  : nh_(nh)
37  , mSerial(serial)
38  ,_motor(motor)
39 {
40  // Find path param
41  mName = nh_.getNamespace() + name + PARAM_ANALOG_STRING + "/" + std::to_string(number);
42  // Roboteq motor number
43  mNumber = number;
44  // Set false on first run
45  setup_param = false;
46 }
47 
48 void GPIOAnalogConfigurator::initConfigurator(bool load_from_board)
49 {
50  // Check if is required load paramers
51  if(load_from_board)
52  {
53  // Load parameters from roboteq
55  }
56  // Initialize parameter dynamic reconfigure
57  ds_param = new dynamic_reconfigure::Server<roboteq_control::RoboteqAnalogInputConfig>(ros::NodeHandle(mName));
58  dynamic_reconfigure::Server<roboteq_control::RoboteqAnalogInputConfig>::CallbackType cb_param = boost::bind(&GPIOAnalogConfigurator::reconfigureCBParam, this, _1, _2);
59  ds_param->setCallback(cb_param);
60 }
61 
63 {
64  try
65  {
66  // conversion AMOD [pag. 292]
67  string str_conversion = mSerial->getParam("AMOD", std::to_string(mNumber));
68  int conversion = boost::lexical_cast<int>(str_conversion);
69  // Set params
70  nh_.setParam(mName + "/conversion", conversion);
71 
72  // input AINA [pag. 287]
73  string str_pina = mSerial->getParam("AINA", std::to_string(mNumber));
74  // Get AINA from roboteq board
75  int emod = boost::lexical_cast<unsigned int>(str_pina);
76  // 3 modes:
77  // 0 - Unsed
78  // 1 - Command
79  // 2 - Feedback
80  int command = (emod & 0b11);
81  int motors = (emod - command) >> 4;
82  int tmp1 = ((motors & 0b1) > 0);
83  int tmp2 = ((motors & 0b10) > 0);
84  if(tmp1)
85  {
86  for (vector<roboteq::Motor*>::iterator it = _motor.begin() ; it != _motor.end(); ++it)
87  {
88  roboteq::Motor* motor = ((roboteq::Motor*)(*it));
89  if(motor->getNumber() == 1)
90  {
91  motor->registerSensor(this);
92  ROS_INFO_STREAM("Register analog [" << mNumber << "] to: " << motor->getName());
93  break;
94  }
95  }
96  }
97  if(tmp2)
98  {
99  for (vector<roboteq::Motor*>::iterator it = _motor.begin() ; it != _motor.end(); ++it)
100  {
101  roboteq::Motor* motor = ((roboteq::Motor*)(*it));
102  if(motor->getNumber() == 2)
103  {
104  motor->registerSensor(this);
105  ROS_INFO_STREAM("Register analog [" << mNumber << "] to: " << motor->getName());
106  break;
107  }
108  }
109  }
110 
111  // Set parameter
112  nh_.setParam(mName + "/input_use", command);
113  nh_.setParam(mName + "/input_motor_one", tmp1);
114  nh_.setParam(mName + "/input_motor_two", tmp2);
115 
116  // polarity APOL [pag. 293]
117  string str_polarity = mSerial->getParam("APOL", std::to_string(mNumber));
118  int polarity = boost::lexical_cast<int>(str_polarity);
119  // Set params
120  nh_.setParam(mName + "/conversion_polarity", polarity);
121 
122  // Input deadband ADB [pag. 286]
123  string str_deadband = mSerial->getParam("ADB", std::to_string(mNumber));
124  int deadband = boost::lexical_cast<int>(str_deadband);
125  // Set params
126  nh_.setParam(mName + "/input_deadband", deadband);
127 
128  // Input AMIN [pag. 290]
129  string str_min = mSerial->getParam("AMIN", std::to_string(mNumber));
130  double min = boost::lexical_cast<double>(str_min) / 1000;
131  // Set params
132  nh_.setParam(mName + "/range_input_min", min);
133 
134  // Input AMAX [pag. 289]
135  string str_max = mSerial->getParam("AMAX", std::to_string(mNumber));
136  double max = boost::lexical_cast<double>(str_max) / 1000;
137  // Set params
138  nh_.setParam(mName + "/range_input_max", max);
139 
140  // Input ATCR [pag. 285]
141  string str_ctr = mSerial->getParam("ACTR", std::to_string(mNumber));
142  double ctr = boost::lexical_cast<double>(str_ctr) / 1000;
143  // Set params
144  nh_.setParam(mName + "/range_input_center", ctr);
145 
146  } catch (std::bad_cast& e)
147  {
148  ROS_WARN_STREAM("Failure parsing feedback data. Dropping message." << e.what());
149  }
150 }
151 
152 void GPIOAnalogConfigurator::reconfigureCBParam(roboteq_control::RoboteqAnalogInputConfig &config, uint32_t level)
153 {
154  //The first time we're called, we just want to make sure we have the
155  //original configuration
156  if(!setup_param)
157  {
158  _last_param_config = config;
160  setup_param = true;
161  return;
162  }
163 
164  if(config.restore_defaults)
165  {
166  //if someone sets restore defaults on the parameter server, prevent looping
167  config.restore_defaults = false;
168  // Overload config with default
169  config = default_param_config;
170  }
171 
172  if(config.load_roboteq)
173  {
174  //if someone sets again the request on the parameter server, prevent looping
175  config.load_roboteq = false;
176  // Launch param load
178  // Skip other read
179  return;
180  }
181 
182  // Set conversion AMOD [pag. 292]
183  if(_last_param_config.conversion != config.conversion)
184  {
185  // Update operative mode
186  mSerial->setParam("AMOD", std::to_string(mNumber) + " " + std::to_string(config.conversion));
187  }
188  // Set input AINA [pag. 287]
189  if((_last_param_config.input_use != config.input_use) ||
190  (_last_param_config.input_motor_one != config.input_motor_one) ||
191  (_last_param_config.input_motor_two != config.input_motor_two))
192  {
193  int input = config.input_use + 16*config.input_motor_one + 32*config.input_motor_two;
194  mSerial->setParam("AINA", std::to_string(mNumber) + " " + std::to_string(input));
195 
196  if(config.input_motor_one)
197  {
198  roboteq::Motor* motor = _motor.at(0);
199  motor->registerSensor(this);
200  ROS_INFO_STREAM("Register analog [" << mNumber << "] to: " << motor->getName());
201  }
202  if(config.input_motor_two)
203  {
204  roboteq::Motor* motor = _motor.at(1);
205  motor->registerSensor(this);
206  ROS_INFO_STREAM("Register analog [" << mNumber << "] to: " << motor->getName());
207  }
208  }
209  // Set polarity APOL [pag. 293]
210  if(_last_param_config.conversion_polarity != config.conversion_polarity)
211  {
212  // Update operative mode
213  mSerial->setParam("APOL", std::to_string(mNumber) + " " + std::to_string(config.conversion_polarity));
214  }
215  // Set deadband ADB [pag. 286]
216  if(_last_param_config.input_deadband != config.input_deadband)
217  {
218  // Update operative mode
219  mSerial->setParam("ADB", std::to_string(mNumber) + " " + std::to_string(config.input_deadband));
220  }
221  // Set input AMIN [pag. 290]
222  if(_last_param_config.range_input_min != config.range_input_min)
223  {
224  int range_input_min = config.range_input_min * 1000;
225  // Update operative mode
226  mSerial->setParam("AMIN", std::to_string(mNumber) + " " + std::to_string(range_input_min));
227  }
228  // Set input AMAX [pag. 289]
229  if(_last_param_config.range_input_max != config.range_input_max)
230  {
231  int range_input_max = config.range_input_max * 1000;
232  // Update operative mode
233  mSerial->setParam("AMAX", std::to_string(mNumber) + " " + std::to_string(range_input_max));
234  }
235  // Set input ATCR [pag. 285]
236  if(_last_param_config.range_input_center != config.range_input_center)
237  {
238  int range_input_center = config.range_input_center * 1000;
239  // Update operative mode
240  mSerial->setParam("AMAX", std::to_string(mNumber) + " " + std::to_string(range_input_center));
241  }
242 }
bool setup_param
Setup variable.
Definition: gpio_analog.h:69
bool setParam(string msg, string params="")
#define PARAM_ANALOG_STRING
Definition: gpio_analog.cpp:33
void initConfigurator(bool load_from_board)
initConfigurator Initialize all parameter and syncronize parameters between ros and roboteq board ...
Definition: gpio_analog.cpp:48
dynamic_reconfigure::Server< roboteq_control::RoboteqAnalogInputConfig > * ds_param
Dynamic reconfigure parameters.
Definition: gpio_analog.h:83
string getName()
getName the name of the motor
Definition: motor.h:122
ROSLIB_DECL std::string command(const std::string &cmd)
void reconfigureCBParam(roboteq_control::RoboteqAnalogInputConfig &config, uint32_t level)
reconfigureCBParam when the dynamic reconfigurator change some values start this method ...
roboteq::serial_controller * mSerial
Serial port.
Definition: gpio_analog.h:78
const std::string & getNamespace() const
#define ROS_WARN_STREAM(args)
unsigned int mNumber
Number motor.
Definition: gpio_analog.h:74
int getNumber()
getNumber The roboteq number
Definition: motor.h:114
string getParam(string msg, string params="")
void registerSensor(GPIOSensor *sensor)
registerSensor register the sensor
Definition: motor.h:129
#define ROS_INFO_STREAM(args)
int min(int a, int b)
std::vector< roboteq::Motor * > _motor
Definition: gpio_analog.h:80
string mName
Associate name space.
Definition: gpio_analog.h:72
roboteq_control::RoboteqAnalogInputConfig default_param_config
Definition: gpio_analog.h:92
roboteq_control::RoboteqAnalogInputConfig _last_param_config
Definition: gpio_analog.h:92
ros::NodeHandle nh_
Private namespace.
Definition: gpio_analog.h:76
void setParam(const std::string &key, const XmlRpc::XmlRpcValue &v) const
GPIOAnalogConfigurator(const ros::NodeHandle &nh, roboteq::serial_controller *serial, std::vector< roboteq::Motor * > motor, string name, unsigned int number)
GPIOAnalogConfigurator.
Definition: gpio_analog.cpp:35
void getParamFromRoboteq()
getParamFromRoboteq Load parameters from Roboteq board
Definition: gpio_analog.cpp:62


roboteq_control
Author(s): Raffaello Bonghi
autogenerated on Wed Jan 3 2018 03:48:23