client.h
Go to the documentation of this file.
1 #include "sick_scan/sick_scan_base.h" /* Base definitions included in all header files, added by add_sick_scan_base_header.py. Do not edit this line. */
2 /*********************************************************************
3 * Software License Agreement (BSD License)
4 *
5 * Copyright (c) 2015-2016, Myrmex, Inc.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 *
12 * * Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * * Redistributions in binary form must reproduce the above
15 * copyright notice, this list of conditions and the following
16 * disclaimer in the documentation and/or other materials provided
17 * with the distribution.
18 * * Neither the name of the Myrmex, Inc nor the names of its
19 * contributors may be used to endorse or promote products derived
20 * from this software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 * POSSIBILITY OF SUCH DAMAGE.
34 *********************************************************************/
35 
45 #ifndef __CLIENT_H__
46 #define __CLIENT_H__
47 
48 //#include <boost/chrono.hpp>
49 //#include <boost/function.hpp>
50 #include <thread>
51 #include <ros/node_handle.h>
54 
55 namespace dynamic_reconfigure {
56 
57 template <class ConfigType>
58 class Client {
59  public:
70  const std::string& name,
71  const std::function<void(const ConfigType&)> config_callback = 0,
72  const std::function<void(const dynamic_reconfigure::ConfigDescription&)>
73  description_callback = 0)
74  : name_(name),
75  nh_(name),
77  received_description_(false),
78  config_callback_(config_callback),
79  description_callback_(description_callback) {
80  set_service_ =
82 
83  config_sub_ =
84  nh_.subscribe("parameter_updates", 1,
86 
87  descr_sub_ = nh_.subscribe("parameter_descriptions", 1,
89  }
101  const std::string& name, const ros::NodeHandle& nh,
102  const std::function<void(const ConfigType&)> config_callback = 0,
103  const std::function<void(const dynamic_reconfigure::ConfigDescription&)>
104  description_callback = 0)
105  : name_(name),
106  nh_(nh),
108  received_description_(false),
109  config_callback_(config_callback),
110  description_callback_(description_callback) {
111  set_service_ =
113 
114  config_sub_ =
115  nh_.subscribe("parameter_updates", 1,
117 
118  descr_sub_ = nh_.subscribe("parameter_descriptions", 1,
120  }
127  const std::function<void(const ConfigType&)>& config_callback) {
128  config_callback_ = config_callback;
129  }
135  void setDescriptionCallback(const std::function<void(
136  const dynamic_reconfigure::ConfigDescription&)>& description_callback) {
137  description_callback_ = description_callback;
138  }
144  bool setConfiguration(const ConfigType& configuration) {
145  ConfigType temp = configuration;
146  return setConfiguration(temp);
147  }
154  bool setConfiguration(ConfigType& configuration) {
156  received_configuration_ = false;
157  configuration.__toMessage__(srv.request.config);
158  if (set_service_.call(srv)) {
159  configuration.__fromMessage__(srv.response.config);
160  return true;
161  } else {
162  ROS_WARN("Could not set configuration");
163  return false;
164  }
165  }
175  ConfigType& configuration,
176  const ros::Duration& timeout = ros::Duration(0)) {
177  if (timeout == ros::Duration(0)) {
178  ROS_INFO_ONCE("Waiting for configuration...");
179  std::lock_guard<std::mutex> lock(mutex_);
180  while (!received_configuration_) {
181  if (!ros::ok()) return false;
182  cv_.wait(lock);
183  }
184  } else {
185  ros::Time start_time = ros::Time::now();
186  std::lock_guard<std::mutex> lock(mutex_);
187  while (!received_configuration_) {
188  if (!ros::ok()) return false;
189  ros::Duration time_left = timeout - (ros::Time::now() - start_time);
190  if (time_left.toSec() <= 0.0) return false;
191  cv_.wait_for(lock, boost::chrono::nanoseconds(time_left.toNSec()));
192  }
193  }
194  configuration = latest_configuration_;
195  return true;
196  }
206  ConfigType& configuration,
207  const ros::Duration& timeout = ros::Duration(0)) {
208  ConfigDescription answer;
209  if (getDescription(answer, timeout)) {
210  configuration.__fromMessage__(answer.dflt);
211  return true;
212  } else {
213  return false;
214  }
215  }
224  bool getMinConfiguration(ConfigType& configuration,
225  const ros::Duration& timeout = ros::Duration(0)) {
226  ConfigDescription answer;
227  if (getDescription(answer, timeout)) {
228  configuration.__fromMessage__(answer.min);
229  return true;
230  } else {
231  return false;
232  }
233  }
242  bool getMaxConfiguration(ConfigType& configuration,
243  const ros::Duration& timeout = ros::Duration(0)) {
244  ConfigDescription answer;
245  if (getDescription(answer, timeout)) {
246  configuration.__fromMessage__(answer.max);
247  return true;
248  } else {
249  return false;
250  }
251  }
256  std::string getName() const { return name_; }
257 
258  private:
260  std::lock_guard<std::mutex> lock(mutex_);
261  dynamic_reconfigure::Config temp_config = configuration;
263  latest_configuration_.__fromMessage__(temp_config);
264  cv_.notify_all();
265 
266  if (config_callback_) {
267  try {
269  } catch (std::exception& e) {
270  ROS_WARN("Configuration callback failed with exception %s", e.what());
271  } catch (...) {
272  ROS_WARN("Configuration callback failed with unprintable exception");
273  }
274  } else {
275  ROS_DEBUG(
276  "Unable to call Configuration callback because none was set.\n" \
277  "See setConfigurationCallback");
278  }
279  }
280 
282  const dynamic_reconfigure::ConfigDescription& description) {
283  std::lock_guard<std::mutex> lock(mutex_);
284  received_description_ = true;
286  cv_.notify_all();
287 
288  if (description_callback_) {
289  try {
291  } catch (std::exception& e) {
292  ROS_WARN("Description callback failed with exception %s", e.what());
293  } catch (...) {
294  ROS_WARN("Description callback failed with unprintable exception");
295  }
296  } else {
297  ROS_DEBUG(
298  "Unable to call Description callback because none was set.\n" \
299  "See setDescriptionCallback");
300  }
301  }
302 
303  bool getDescription(ConfigDescription& configuration,
304  const ros::Duration& timeout) {
305  if (timeout == ros::Duration(0)) {
306  ROS_INFO_ONCE("Waiting for configuration...");
307  std::lock_guard<std::mutex> lock(mutex_);
308  while (!received_description_) {
309  if (!ros::ok()) return false;
310  cv_.wait(lock);
311  }
312  } else {
313  ros::Time start_time = ros::Time::now();
314  std::lock_guard<std::mutex> lock(mutex_);
315  while (!received_description_) {
316  if (!ros::ok()) return false;
317  ros::Duration time_left = timeout - (ros::Time::now() - start_time);
318  if (time_left.toSec() <= 0.0) return false;
319  cv_.wait_for(lock, boost::chrono::nanoseconds(time_left.toNSec()));
320  }
321  }
322  configuration = latest_description_;
323  return true;
324  }
325 
326  std::string name_;
331  std::condition_variable cv_;
332  std::mutex mutex_;
337 
338  std::function<void(const ConfigType&)> config_callback_;
339  std::function<void(const dynamic_reconfigure::ConfigDescription&)>
341 };
342 }
343 
344 #endif // __CLIENT_H__
dynamic_reconfigure::Client::getMinConfiguration
bool getMinConfiguration(ConfigType &configuration, const ros::Duration &timeout=ros::Duration(0))
getMinConfiguration Gets the latest minimum configuration from the dynamic_reconfigure::Server
Definition: client.h:224
dynamic_reconfigure::Client::mutex_
std::mutex mutex_
Definition: client.h:332
dynamic_reconfigure::Client::name_
std::string name_
Definition: client.h:326
dynamic_reconfigure::Config_< std::allocator< void > >
Reconfigure.h
description
description
dynamic_reconfigure::ReconfigureRequest_::config
_config_type config
Definition: ReconfigureRequest.h:39
ros::NodeHandle::serviceClient
ServiceClient serviceClient(const std::string &service_name, bool persistent=false, const M_string &header_values=M_string())
ROS_WARN
#define ROS_WARN(...)
Definition: sick_scan_logging.h:122
dynamic_reconfigure::Client::getCurrentConfiguration
bool getCurrentConfiguration(ConfigType &configuration, const ros::Duration &timeout=ros::Duration(0))
getCurrentConfiguration Gets the latest configuration from the dynamic_reconfigure::Server
Definition: client.h:174
dynamic_reconfigure::Client::getDefaultConfiguration
bool getDefaultConfiguration(ConfigType &configuration, const ros::Duration &timeout=ros::Duration(0))
getDefaultConfiguration Gets the latest default configuration from the dynamic_reconfigure::Server
Definition: client.h:205
ros::ok
ROSCPP_DECL bool ok()
Check whether it's time to exit.
Definition: rossimu.cpp:273
dynamic_reconfigure::ConfigDescription_< std::allocator< void > >
dynamic_reconfigure::Reconfigure::response
Response response
Definition: Reconfigure.h:25
dynamic_reconfigure::Client
Definition: client.h:58
dynamic_reconfigure::Client::latest_description_
dynamic_reconfigure::ConfigDescription latest_description_
Definition: client.h:330
dynamic_reconfigure::Client::description_callback_
std::function< void(const dynamic_reconfigure::ConfigDescription &)> description_callback_
Definition: client.h:340
api.setup.name
name
Definition: python/api/setup.py:12
dynamic_reconfigure::Client::getName
std::string getName() const
getName Gets the name of the Dynamic Reconfigure Client
Definition: client.h:256
ROS_INFO_ONCE
#define ROS_INFO_ONCE(...)
Definition: macros_generated.h:119
dynamic_reconfigure::Client::config_callback_
std::function< void(const ConfigType &)> config_callback_
Definition: client.h:338
dynamic_reconfigure::Client::descriptionCallback
void descriptionCallback(const dynamic_reconfigure::ConfigDescription &description)
Definition: client.h:281
ros::ServiceClient
dynamic_reconfigure::Client::Client
Client(const std::string &name, const std::function< void(const ConfigType &)> config_callback=0, const std::function< void(const dynamic_reconfigure::ConfigDescription &)> description_callback=0)
Client Constructs a statefull dynamic_reconfigure client.
Definition: client.h:69
dynamic_reconfigure::Reconfigure::request
Request request
Definition: Reconfigure.h:24
dynamic_reconfigure::Client::latest_configuration_
ConfigType latest_configuration_
Definition: client.h:328
dynamic_reconfigure::Client::descr_sub_
ros::Subscriber descr_sub_
Definition: client.h:335
ros::NodeHandle::subscribe
Subscriber subscribe(const std::string &topic, uint32_t queue_size, const boost::function< void(C)> &callback, const VoidConstPtr &tracked_object=VoidConstPtr(), const TransportHints &transport_hints=TransportHints())
dynamic_reconfigure::ReconfigureResponse_::config
_config_type config
Definition: ReconfigureResponse.h:39
dynamic_reconfigure::Client::setConfigurationCallback
void setConfigurationCallback(const std::function< void(const ConfigType &)> &config_callback)
setConfigurationCallback Sets the user defined configuration callback function
Definition: client.h:126
dynamic_reconfigure::Client::setDescriptionCallback
void setDescriptionCallback(const std::function< void(const dynamic_reconfigure::ConfigDescription &)> &description_callback)
setDescriptionCallback Sets the user defined description callback function
Definition: client.h:135
dynamic_reconfigure::ConfigDescription_::dflt
_dflt_type dflt
Definition: ConfigDescription.h:53
dynamic_reconfigure::Client::received_configuration_
bool received_configuration_
Definition: client.h:327
dynamic_reconfigure::Client::getDescription
bool getDescription(ConfigDescription &configuration, const ros::Duration &timeout)
Definition: client.h:303
dynamic_reconfigure
Definition: BoolParameter.h:20
dynamic_reconfigure::Client::setConfiguration
bool setConfiguration(ConfigType &configuration)
setConfiguration Attempts to set the configuration to the server
Definition: client.h:154
dynamic_reconfigure::Client::configurationCallback
void configurationCallback(const dynamic_reconfigure::Config &configuration)
Definition: client.h:259
dynamic_reconfigure::ConfigDescription_::max
_max_type max
Definition: ConfigDescription.h:47
ros::Time
DurationBase< Duration >::toNSec
int64_t toNSec() const
dynamic_reconfigure::Client::cv_
std::condition_variable cv_
Definition: client.h:331
dynamic_reconfigure::Client::received_description_
bool received_description_
Definition: client.h:329
dynamic_reconfigure::Client::nh_
ros::NodeHandle nh_
Definition: client.h:333
ros::ServiceClient::call
bool call(const MReq &req, MRes &resp, const std::string &service_md5sum)
dynamic_reconfigure::Client::set_service_
ros::ServiceClient set_service_
Definition: client.h:334
sick_scan_base.h
sick_generic_device_finder.timeout
timeout
Definition: sick_generic_device_finder.py:113
ROS_DEBUG
#define ROS_DEBUG(...)
Definition: sick_scan_logging.h:112
DurationBase< Duration >::toSec
double toSec() const
dynamic_reconfigure::Reconfigure
Definition: Reconfigure.h:19
dynamic_reconfigure::Client::config_sub_
ros::Subscriber config_sub_
Definition: client.h:336
dynamic_reconfigure::ConfigDescription_::min
_min_type min
Definition: ConfigDescription.h:50
ros::Duration
ConfigDescription.h
dynamic_reconfigure::Client::getMaxConfiguration
bool getMaxConfiguration(ConfigType &configuration, const ros::Duration &timeout=ros::Duration(0))
getMaxConfiguration Gets the latest maximum configuration from the dynamic_reconfigure::Server
Definition: client.h:242
ros::NodeHandle
ros::Subscriber
dynamic_reconfigure::Client::setConfiguration
bool setConfiguration(const ConfigType &configuration)
setConfiguration Attempts to set the configuration to the server
Definition: client.h:144
dynamic_reconfigure::Client::Client
Client(const std::string &name, const ros::NodeHandle &nh, const std::function< void(const ConfigType &)> config_callback=0, const std::function< void(const dynamic_reconfigure::ConfigDescription &)> description_callback=0)
Client Constructs a statefull dynamic_reconfigure client.
Definition: client.h:100
ros::Time::now
static Time now()


sick_scan_xd
Author(s): Michael Lehning , Jochen Sprickerhof , Martin Günther
autogenerated on Fri Oct 25 2024 02:47:07