debug_value.cpp
Go to the documentation of this file.
1 
9 /*
10  * Copyright 2017 Nuno Marques.
11  *
12  * This file is part of the mavros package and subject to the license terms
13  * in the top-level LICENSE file of the mavros repository.
14  * https://github.com/mavlink/mavros/tree/master/LICENSE.md
15  */
16 
17 #include <mavros/mavros_plugin.h>
18 
19 #include <mavros_msgs/DebugValue.h>
20 #include <algorithm>
21 
22 namespace mavros {
23 namespace extra_plugins {
26 public:
28  debug_nh("~debug_value")
29  { }
30 
31  void initialize(UAS &uas_) override
32  {
34 
35  // subscribers
37 
38  // publishers
39  debug_pub = debug_nh.advertise<mavros_msgs::DebugValue>("debug", 10);
40  debug_vector_pub = debug_nh.advertise<mavros_msgs::DebugValue>("debug_vector", 10);
41  debug_float_array_pub = debug_nh.advertise<mavros_msgs::DebugValue>("debug_float_array", 10);
42  named_value_float_pub = debug_nh.advertise<mavros_msgs::DebugValue>("named_value_float", 10);
43  named_value_int_pub = debug_nh.advertise<mavros_msgs::DebugValue>("named_value_int", 10);
44  }
45 
47  return {
53  };
54  }
55 
56 private:
58 
60 
66 
67  /* -*- helpers -*- */
68 
74  void debug_logger(const std::string &type, const mavros_msgs::DebugValue &dv)
75  {
76  using DV = mavros_msgs::DebugValue;
77 
78  std::string name = (dv.name == "") ? "UNK" : dv.name;
79 
80  std::ostringstream ss;
81  if (dv.type == DV::TYPE_NAMED_VALUE_INT) {
82  ss << dv.value_int;
83  }
84  else if (dv.type == DV::TYPE_DEBUG_VECT) {
85  ss << "[";
86  bool is_first = true;
87  for (auto v : dv.data) {
88  if (!is_first) {
89  ss << ", ";
90  }
91 
92  ss << v;
93  is_first = false;
94  }
95 
96  ss << "]";
97  }
98  else {
99  ss << dv.value_float;
100  }
101 
102 
103  ROS_DEBUG_STREAM_NAMED("debug_value", type << "\t"
104  << dv.header.stamp << "\t"
105  << name << "\t["
106  << dv.index << "]\tvalue:"
107  << ss.str());
108  }
109 
110  /* -*- message handlers -*- */
111 
118  void handle_debug(const mavlink::mavlink_message_t *msg, mavlink::common::msg::DEBUG &debug)
119  {
120  // [[[cog:
121  // p = "dv_msg"
122  // val = "debug"
123  //
124  // def common_filler(type_, time_f, index, name, disable_array_id = True):
125  // if isinstance(index, str):
126  // index = val + "." + index
127  //
128  // _args = globals()
129  // _args.update(locals())
130  //
131  // cog.outl("""auto {p} = boost::make_shared<mavros_msgs::DebugValue>();""".format(**_args))
132  // cog.outl("""{p}->header.stamp = m_uas->synchronise_stamp({val}.{time_f});""".format(**_args))
133  // cog.outl("""{p}->type = mavros_msgs::DebugValue::{type_};""".format(**_args))
134  // cog.outl("""{p}->index = {index};""".format(**_args))
135  // if disable_array_id:
136  // cog.outl("""{p}->array_id = -1;""".format(**_args))
137  // if name:
138  // cog.outl("""{p}->name = mavlink::to_string({val}.{name});""".format(**_args))
139  //
140  // common_filler("TYPE_DEBUG", "time_boot_ms", "ind", None)
141  // cog.outl("""{p}->value_float = {val}.value;""".format(**locals()))
142  // ]]]
143  auto dv_msg = boost::make_shared<mavros_msgs::DebugValue>();
144  dv_msg->header.stamp = m_uas->synchronise_stamp(debug.time_boot_ms);
145  dv_msg->type = mavros_msgs::DebugValue::TYPE_DEBUG;
146  dv_msg->index = debug.ind;
147  dv_msg->array_id = -1;
148  dv_msg->value_float = debug.value;
149  // [[[end]]] (checksum: 5ef05a58b0a7925a57b4602198097e30)
150 
151  debug_logger(debug.get_name(), *dv_msg);
152  debug_pub.publish(dv_msg);
153  }
154 
161  void handle_debug_vector(const mavlink::mavlink_message_t *msg, mavlink::common::msg::DEBUG_VECT &debug)
162  {
163  // [[[cog:
164  // common_filler("TYPE_DEBUG_VECT", "time_usec", -1, "name")
165  //
166  // fields = "xyz"
167  // pd = p + "->data"
168  // cog.outl("""{pd}.resize({l});""".format(l=len(fields), **locals()))
169  // for i, f in enumerate(fields):
170  // cog.outl("""{pd}[{i}] = {val}.{f};""".format(**locals()))
171  // ]]]
172  auto dv_msg = boost::make_shared<mavros_msgs::DebugValue>();
173  dv_msg->header.stamp = m_uas->synchronise_stamp(debug.time_usec);
174  dv_msg->type = mavros_msgs::DebugValue::TYPE_DEBUG_VECT;
175  dv_msg->index = -1;
176  dv_msg->array_id = -1;
177  dv_msg->name = mavlink::to_string(debug.name);
178  dv_msg->data.resize(3);
179  dv_msg->data[0] = debug.x;
180  dv_msg->data[1] = debug.y;
181  dv_msg->data[2] = debug.z;
182  // [[[end]]] (checksum: 6537917118cc4121b7477a46788c5c4d)
183 
184  debug_logger(debug.get_name(), *dv_msg);
185  debug_vector_pub.publish(dv_msg);
186  }
187 
194  void handle_debug_float_array(const mavlink::mavlink_message_t *msg, mavlink::common::msg::DEBUG_FLOAT_ARRAY &debug)
195  {
196  // [[[cog:
197  // common_filler("TYPE_DEBUG_FLOAT_ARRAY", "time_usec", -1, "name", False)
198  //
199  // cog.outl("{p}->array_id = {val}.array_id;".format(**locals()))
200  // cog.outl("{p}->data.assign({val}.data.begin(), {val}.data.end());".format(**locals()))
201  // ]]]
202  auto dv_msg = boost::make_shared<mavros_msgs::DebugValue>();
203  dv_msg->header.stamp = m_uas->synchronise_stamp(debug.time_usec);
204  dv_msg->type = mavros_msgs::DebugValue::TYPE_DEBUG_FLOAT_ARRAY;
205  dv_msg->index = -1;
206  dv_msg->name = mavlink::to_string(debug.name);
207  dv_msg->array_id = debug.array_id;
208  dv_msg->data.assign(debug.data.begin(), debug.data.end());
209  // [[[end]]] (checksum: a27f0f0d80be19127fe9838a867e85b4)
210 
211  debug_logger(debug.get_name(), *dv_msg);
212  debug_float_array_pub.publish(dv_msg);
213  }
214 
221  void handle_named_value_float(const mavlink::mavlink_message_t *msg, mavlink::common::msg::NAMED_VALUE_FLOAT &value)
222  {
223  // [[[cog:
224  // val="value"
225  // common_filler("TYPE_NAMED_VALUE_FLOAT", "time_boot_ms", -1, "name")
226  // cog.outl("""{p}->value_float = {val}.value;""".format(**locals()))
227  // ]]]
228  auto dv_msg = boost::make_shared<mavros_msgs::DebugValue>();
229  dv_msg->header.stamp = m_uas->synchronise_stamp(value.time_boot_ms);
230  dv_msg->type = mavros_msgs::DebugValue::TYPE_NAMED_VALUE_FLOAT;
231  dv_msg->index = -1;
232  dv_msg->array_id = -1;
233  dv_msg->name = mavlink::to_string(value.name);
234  dv_msg->value_float = value.value;
235  // [[[end]]] (checksum: a4661d49c58aa52f3d870859ab5aefa6)
236 
237  debug_logger(value.get_name(), *dv_msg);
238  named_value_float_pub.publish(dv_msg);
239  }
240 
247  void handle_named_value_int(const mavlink::mavlink_message_t *msg, mavlink::common::msg::NAMED_VALUE_INT &value)
248  {
249  // [[[cog:
250  // common_filler("TYPE_NAMED_VALUE_INT", "time_boot_ms", -1, "name")
251  // cog.outl("""{p}->value_int = {val}.value;""".format(**locals()))
252  // ]]]
253  auto dv_msg = boost::make_shared<mavros_msgs::DebugValue>();
254  dv_msg->header.stamp = m_uas->synchronise_stamp(value.time_boot_ms);
255  dv_msg->type = mavros_msgs::DebugValue::TYPE_NAMED_VALUE_INT;
256  dv_msg->index = -1;
257  dv_msg->array_id = -1;
258  dv_msg->name = mavlink::to_string(value.name);
259  dv_msg->value_int = value.value;
260  // [[[end]]] (checksum: 875d1469f398e89e17c5e988b3cfda56)
261 
262  debug_logger(value.get_name(), *dv_msg);
263  named_value_int_pub.publish(dv_msg);
264  }
265 
266  /* -*- callbacks -*- */
267 
273  {
274  switch (req->type) {
275  case mavros_msgs::DebugValue::TYPE_DEBUG: {
276  mavlink::common::msg::DEBUG debug {};
277 
278  debug.time_boot_ms = req->header.stamp.toNSec() / 1000000;
279  debug.ind = req->index;
280  debug.value = req->value_float;
281 
282  UAS_FCU(m_uas)->send_message_ignore_drop(debug);
283  break;
284  }
285  case mavros_msgs::DebugValue::TYPE_DEBUG_VECT: {
286  mavlink::common::msg::DEBUG_VECT debug {};
287 
288  debug.time_usec = req->header.stamp.toNSec() / 1000;
289  mavlink::set_string(debug.name, req->name);
290  // [[[cog:
291  // for i, f in enumerate("xyz"):
292  // cog.outl("debug.{f} = req->data[{i}];".format(**locals()))
293  // ]]]
294  debug.x = req->data[0];
295  debug.y = req->data[1];
296  debug.z = req->data[2];
297  // [[[end]]] (checksum: f4918ce98ca3183f93f6aff20d4ab7ec)
298 
299  UAS_FCU(m_uas)->send_message_ignore_drop(debug);
300  break;
301  }
302  case mavros_msgs::DebugValue::TYPE_DEBUG_FLOAT_ARRAY: {
303  mavlink::common::msg::DEBUG_FLOAT_ARRAY debug {};
304 
305  debug.time_usec = req->header.stamp.toNSec() / 1000;
306  mavlink::set_string(debug.name, req->name);
307  std::copy_n(req->data.begin(), std::min(req->data.size(), debug.data.size()), std::begin(debug.data));
308 
309  UAS_FCU(m_uas)->send_message_ignore_drop(debug);
310  break;
311  }
312  case mavros_msgs::DebugValue::TYPE_NAMED_VALUE_FLOAT: {
313  mavlink::common::msg::NAMED_VALUE_FLOAT value {};
314 
315  value.time_boot_ms = req->header.stamp.toNSec() / 1000000;
316  mavlink::set_string(value.name, req->name);
317  value.value = req->value_float;
318 
319  UAS_FCU(m_uas)->send_message_ignore_drop(value);
320  break;
321  }
322  case mavros_msgs::DebugValue::TYPE_NAMED_VALUE_INT: {
323  mavlink::common::msg::NAMED_VALUE_INT value {};
324 
325  value.time_boot_ms = req->header.stamp.toNSec() / 1000000;
326  mavlink::set_string(value.name, req->name);
327  value.value = req->value_int;
328 
329  UAS_FCU(m_uas)->send_message_ignore_drop(value);
330  break;
331  }
332  default:
333  ROS_ERROR_NAMED("debug", "Wrong debug type (%d). Droping!...", req->type);
334  return;
335  }
336  }
337 };
338 } // namespace extra_plugins
339 } // namespace mavros
340 
std::shared_ptr< MAVConnInterface const > ConstPtr
Subscriptions get_subscriptions() override
Definition: debug_value.cpp:46
#define ROS_DEBUG_STREAM_NAMED(name, args)
void debug_cb(const mavros_msgs::DebugValue::ConstPtr &req)
Debug callbacks.
void handle_debug_float_array(const mavlink::mavlink_message_t *msg, mavlink::common::msg::DEBUG_FLOAT_ARRAY &debug)
Handle DEBUG_FLOAT_ARRAY message. Message specification: https://mavlink.io/en/messages/common.html#DEBUG_FLOAT_ARRAY.
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
HandlerInfo make_handler(const mavlink::msgid_t id, void(_C::*fn)(const mavlink::mavlink_message_t *msg, const mavconn::Framing framing))
void publish(const boost::shared_ptr< M > &message) const
void debug_logger(const std::string &type, const mavros_msgs::DebugValue &dv)
Helper function to log debug messages.
Definition: debug_value.cpp:74
std::atomic< uint8_t > type
#define UAS_FCU(uasobjptr)
ros::Time synchronise_stamp(uint32_t time_boot_ms)
Plugin for Debug msgs from MAVLink API.
Definition: debug_value.cpp:25
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
void handle_named_value_float(const mavlink::mavlink_message_t *msg, mavlink::common::msg::NAMED_VALUE_FLOAT &value)
Handle NAMED_VALUE_FLOAT message. Message specification: https://mavlink.io/en/messages/common.html#NAMED_VALUE_FLOAT.
void initialize(UAS &uas_) override
Definition: debug_value.cpp:31
void handle_debug_vector(const mavlink::mavlink_message_t *msg, mavlink::common::msg::DEBUG_VECT &debug)
Handle DEBUG_VECT message. Message specification: https://mavlink.io/en/messages/common.html#DEBUG_VECT.
std::vector< HandlerInfo > Subscriptions
#define ROS_ERROR_NAMED(name,...)
void initialize(UAS &uas_) override
void handle_debug(const mavlink::mavlink_message_t *msg, mavlink::common::msg::DEBUG &debug)
Handle DEBUG message. Message specification: https://mavlink.io/en/messages/common.html#DEBUG.
#define PLUGINLIB_EXPORT_CLASS(class_type, base_class_type)
void handle_named_value_int(const mavlink::mavlink_message_t *msg, mavlink::common::msg::NAMED_VALUE_INT &value)
Handle NAMED_VALUE_INT message. Message specification: https://mavlink.io/en/messages/common.html#NAMED_VALUE_INT.


mavros_extras
Author(s): Vladimir Ermakov , Amilcar Lucas
autogenerated on Tue Jun 13 2023 02:17:59