parser_configuration.cpp
Go to the documentation of this file.
1 #include "parser_configuration.h"
2 #include <boost/spirit/include/qi.hpp>
3 #include <boost/algorithm/string.hpp>
4 
5 namespace PJ
6 {
7 
8 void RosParserConfig::xmlSaveState(QDomDocument &doc, QDomElement &parent_elem) const
9 {
10  QDomElement stamp_elem = doc.createElement("use_header_stamp");
11  stamp_elem.setAttribute("value", use_header_stamp ? "true" : "false");
12  parent_elem.appendChild(stamp_elem);
13 
14  QDomElement discard_elem = doc.createElement("discard_large_arrays");
15  discard_elem.setAttribute("value", discard_large_arrays ? "true" : "false");
16  parent_elem.appendChild(discard_elem);
17 
18  QDomElement max_elem = doc.createElement("max_array_size");
19  max_elem.setAttribute("value", QString::number(max_array_size));
20  parent_elem.appendChild(max_elem);
21 
22  QDomElement bool_elem = doc.createElement("boolean_strings_to_number");
23  bool_elem.setAttribute("value", boolean_strings_to_number ? "true" : "false");
24  parent_elem.appendChild(bool_elem);
25 
26  QDomElement suffix_elem = doc.createElement("remove_suffix_from_strings");
27  suffix_elem.setAttribute("value", remove_suffix_from_strings ? "true" : "false");
28  parent_elem.appendChild(suffix_elem);
29 }
30 
31 void RosParserConfig::xmlLoadState(const QDomElement &parent_element)
32 {
33  QDomElement stamp_elem = parent_element.firstChildElement("use_header_stamp");
34  use_header_stamp = (stamp_elem.attribute("value") == "true");
35 
36  QDomElement discard_elem = parent_element.firstChildElement("discard_large_arrays");
37  discard_large_arrays = (discard_elem.attribute("value") == "true");
38 
39  QDomElement max_elem = parent_element.firstChildElement("max_array_size");
40  max_array_size = max_elem.attribute("value").toInt();
41 
42  QDomElement bool_elem = parent_element.firstChildElement("boolean_strings_to_number");
43  boolean_strings_to_number = (bool_elem.attribute("value") == "true");
44 
45  QDomElement suffix_elem = parent_element.firstChildElement("remove_suffix_from_strings");
46  remove_suffix_from_strings = (suffix_elem.attribute("value")== "true");
47 }
48 
49 void RosParserConfig::saveToSettings(QSettings &settings, QString prefix) const
50 {
51  settings.setValue(prefix + "/default_topics", topics);
52  settings.setValue(prefix + "/use_header_stamp", use_header_stamp);
53  settings.setValue(prefix + "/max_array_size", (int)max_array_size);
54  settings.setValue(prefix + "/discard_large_arrays", discard_large_arrays);
55  settings.setValue(prefix + "/boolean_strings_to_number", boolean_strings_to_number);
56  settings.setValue(prefix + "/remove_suffix_from_strings", remove_suffix_from_strings);
57 }
58 
59 void RosParserConfig::loadFromSettings(const QSettings &settings, QString prefix)
60 {
61  topics = settings.value(prefix + "/default_topics", false).toStringList();
62  use_header_stamp = settings.value(prefix + "/use_header_stamp", false).toBool();
63  max_array_size = settings.value(prefix + "/max_array_size", 100).toInt();
64  discard_large_arrays = settings.value(prefix + "/discard_large_arrays", true).toBool();
65  boolean_strings_to_number = settings.value(prefix + "/boolean_strings_to_number", true).toBool();
66  remove_suffix_from_strings = settings.value(prefix + "/remove_suffix_from_strings", true).toBool();
67 }
68 
69 CompositeParser::CompositeParser(PlotDataMapRef &plot_data): _plot_data(plot_data)
70 {
71 }
72 
74 {
75  return _config;
76 }
77 
79 {
80  _config = config;
81  // we don't need this information.
82  _config.topics.clear();
83 
84  for(auto& [name, parser]: _parsers)
85  {
86  parser->setConfig(_config);
87  }
88 }
89 
90 bool CompositeParser::parseMessage(const std::string& topic_name, MessageRef serialized_msg, double& timestamp)
91 {
92  auto it = _parsers.find(topic_name);
93  if (it == _parsers.end())
94  {
95  return false;
96  }
97  auto&parser = it->second;
98  parser->parseMessage(serialized_msg, timestamp);
99  return true;
100 }
101 
102 RosMessageParser::RosMessageParser(const std::string &topic_name, PlotDataMapRef &plot_data):
103  MessageParser(topic_name, plot_data)
104 {
105 }
106 
108 {
109  return _config;
110 }
111 
113 {
114  _config = config;
115 }
116 
117 PlotData &RosMessageParser::getSeries(const std::string& key)
118 {
119  return _plot_data.getOrCreateNumeric(key);
120 }
121 
123 {
125 }
126 
127 bool ParseDouble(const std::string &str,
128  double &value,
129  bool remover_suffix,
130  bool parse_boolean)
131 {
132  bool parsed = boost::spirit::qi::parse(str.data(), str.data() + str.size(),
133  boost::spirit::qi::double_, value);
134 
135  if(!parsed && remover_suffix)
136  {
137  int pos = 0;
138  while(pos < str.size())
139  {
140  char c = str[pos];
141  if( !std::isdigit(c) && c!= '-' && c!= '+' && c!='.')
142  {
143  break;
144  }
145  pos++;
146  }
147  if( pos < str.size() )
148  {
149  parsed = boost::spirit::qi::parse(str.data(), str.data() + pos,
150  boost::spirit::qi::double_, value);
151  }
152  }
153 
154  if(!parsed && parse_boolean && str.size() >=4 && str.size() <=5)
155  {
156  std::string temp = str;
157  boost::algorithm::to_lower(temp);
158  if( temp == "true" )
159  {
160  parsed = true;
161  value = 1;
162  }
163  else if( temp == "false" )
164  {
165  parsed = true;
166  value = 0;
167  }
168  }
169 
170  return parsed;
171 }
172 
173 }
void xmlLoadState(const QDomElement &parent_element)
PlotData & getOrCreateNumeric(const std::string &name, PlotGroup::Ptr group={})
void xmlSaveState(QDomDocument &doc, QDomElement &plugin_elem) const
PJ::StringSeries & getStringSeries(const std::string &key)
PlotDataMapRef & _plot_data
PJ::PlotData & getSeries(const std::string &key)
const RosParserConfig & getConfig()
std::map< std::string, std::shared_ptr< RosMessageParser > > _parsers
void setConfig(const RosParserConfig &config)
StringSeries & getOrCreateStringSeries(const std::string &name, PlotGroup::Ptr group={})
iterator it
bool ParseDouble(const std::string &str, double &value, bool remover_suffix, bool parse_boolean)
CompositeParser(PlotDataMapRef &plot_data)
bool parseMessage(const std::string &topic_name, MessageRef serialized_msg, double &timestamp)
void saveToSettings(QSettings &setting, QString prefix) const
RosMessageParser(const std::string &topic_name, PJ::PlotDataMapRef &plot_data)
parser
const RosParserConfig & getConfig() const
void loadFromSettings(const QSettings &settings, QString prefix)
void setConfig(const RosParserConfig &config)


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