ts_driver_node.cpp
Go to the documentation of this file.
1 #include <signal.h>
2 
3 #include <ros/ros.h>
4 #include <ros/xmlrpc_manager.h>
5 
7 
8 // Signal-safe flag for whether shutdown is requested
9 volatile sig_atomic_t g_shutdown = 0;
10 
11 // Replacement SIGINT handler. Called on Ctrl-C
12 void onSigint(int sig) { g_shutdown = 1; }
13 
14 // Replacement "shutdown" XMLRPC callback. Called on rosnode kill.
16 {
17  int num_params = 0;
18  if (params.getType() == XmlRpc::XmlRpcValue::TypeArray) num_params = params.size();
19  if (num_params > 1)
20  {
21  std::string reason = params[1];
22  ROS_WARN("Shutdown request received. Reason: [%s]", reason.c_str());
23  g_shutdown = 1; // Set flag
24  }
25  result = ros::xmlrpc::responseInt(1, "", 0);
26 }
27 
28 int main(int argc, char **argv)
29 {
30  ros::init(argc, argv, "ts_driver_node", ros::init_options::NoSigintHandler);
31  signal(SIGINT, onSigint); // Override SIGINT handler
32 
33  // Override XMLRPC shutdown
34  ros::XMLRPCManager::instance()->unbind("shutdown");
35  ros::XMLRPCManager::instance()->bind("shutdown", onShutdown);
36 
37  ros::NodeHandle nh;
38  ros::NodeHandle private_nh("~");
39  ros::Rate loop_rate(50); // 50 Hz
40 
41  // @todo: Exception should raise better message
42  try
43  {
44  toposens_driver::Sensor d(nh, private_nh);
45 
46  while (!g_shutdown)
47  {
48  d.poll(); // @todo give message that scan is empty
49  ros::spinOnce();
50  loop_rate.sleep();
51  }
52 
53  d.shutdown();
54  }
55  catch (const char *msg)
56  {
57  ROS_ERROR("%s", msg);
58  }
59 
60  ros::shutdown();
61  return 0;
62 }
XmlRpc::XmlRpcValue::size
int size() const
ros::init
ROSCPP_DECL void init(const M_string &remappings, const std::string &name, uint32_t options=0)
ros::xmlrpc::responseInt
ROSCPP_DECL XmlRpc::XmlRpcValue responseInt(int code, const std::string &msg, int response)
ros.h
ros::spinOnce
ROSCPP_DECL void spinOnce()
ros::shutdown
ROSCPP_DECL void shutdown()
sensor.h
xmlrpc_manager.h
onShutdown
void onShutdown(XmlRpc::XmlRpcValue &params, XmlRpc::XmlRpcValue &result)
Definition: ts_driver_node.cpp:15
onSigint
void onSigint(int sig)
Definition: ts_driver_node.cpp:12
main
int main(int argc, char **argv)
Definition: ts_driver_node.cpp:28
d
d
ROS_WARN
#define ROS_WARN(...)
ros::XMLRPCManager::instance
static const XMLRPCManagerPtr & instance()
ros::Rate::sleep
bool sleep()
XmlRpc::XmlRpcValue::getType
const Type & getType() const
XmlRpc::XmlRpcValue::TypeArray
TypeArray
ROS_ERROR
#define ROS_ERROR(...)
g_shutdown
volatile sig_atomic_t g_shutdown
Definition: ts_driver_node.cpp:9
toposens_driver::Sensor
Converts raw sensor data to ROS friendly message structures.
Definition: sensor.h:31
ros::Rate
ros::init_options::NoSigintHandler
NoSigintHandler
XmlRpc::XmlRpcValue
ros::NodeHandle


toposens_driver
Author(s): Adi Singh, Sebastian Dengler, Christopher Lang, Roua Mokchah, Nancy Seckel, Georgiana Barbut
autogenerated on Wed Mar 2 2022 01:12:30