ros2_parsers/diagnostic_msg.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <diagnostic_msgs/msg/diagnostic_array.hpp>
4 #include <boost/spirit/include/qi.hpp>
5 #include "ros2_parser.h"
6 #include "fmt/format.h"
7 #include "header_msg.h"
8 
9 class DiagnosticMsgParser : public BuiltinMessageParser<diagnostic_msgs::msg::DiagnosticArray>
10 {
11 public:
12  DiagnosticMsgParser(const std::string& topic_name, PJ::PlotDataMapRef& plot_data)
13  : BuiltinMessageParser<diagnostic_msgs::msg::DiagnosticArray>(topic_name, plot_data)
14  , _header_parser(topic_name + "/header", plot_data)
15  {
16  }
17 
18  virtual void parseMessageImpl(const diagnostic_msgs::msg::DiagnosticArray& msg, double& timestamp) override
19  {
20  _header_parser.parse(msg.header, timestamp, _config.use_header_stamp);
21 
22  std::string key;
23 
24  for (const auto& status : msg.status)
25  {
26  for (const auto& kv : status.values)
27  {
28  const char* start_ptr = kv.value.data();
29  double val = 0;
30 
31  if (status.hardware_id.empty())
32  {
33  key = fmt::format("{}/{}/{}", _topic_name, status.name, kv.key);
34  }
35  else
36  {
37  key = fmt::format("{}/{}/{}/{}", _topic_name, status.hardware_id, status.name, kv.key);
38  }
39 
40  bool parsed = boost::spirit::qi::parse(start_ptr, start_ptr + kv.value.size(),
41  boost::spirit::qi::double_, val);
42  if (parsed)
43  {
44  auto& series = getSeries(key);
45  series.pushBack({ timestamp, val });
46  }
47  else{
48  auto& series = getStringSeries(key);
49  series.pushBack( { timestamp, kv.value} );
50  }
51  }
52  }
53  }
54 
55  private:
57 };
58 
DiagnosticMsgParser(const std::string &topic_name, PJ::PlotDataMapRef &plot_data)
PJ::StringSeries & getStringSeries(const std::string &key)
PJ::PlotData & getSeries(const std::string &key)
void parse(const std_msgs::Header &msg, double &timestamp, bool use_header_stamp)
FMT_INLINE std::basic_string< Char > format(const S &format_str, Args &&... args)
Definition: core.h:2081
virtual void parseMessageImpl(const diagnostic_msgs::msg::DiagnosticArray &msg, double &timestamp) override
std::string _topic_name
msg


plotjuggler_ros
Author(s): Davide Faconti
autogenerated on Fri Jun 23 2023 02:28:03