11 #include <QMessageBox>
14 #include <QProgressDialog>
16 #include <QInputDialog>
17 #include <QPushButton>
18 #include <QElapsedTimer>
19 #include <QStandardItemModel>
37 QDomElement elem = doc.createElement(
"parameters");
39 elem.setAttribute(
"use_timestamp",
int(params.use_timestamp));
40 elem.setAttribute(
"use_mcap_log_time",
int(params.use_mcap_log_time));
41 elem.setAttribute(
"clamp_large_arrays",
int(params.clamp_large_arrays));
42 elem.setAttribute(
"max_array_size", params.max_array_size);
43 elem.setAttribute(
"selected_topics", params.selected_topics.join(
';'));
45 parent_element.appendChild(elem);
51 QDomElement elem = parent_element.firstChildElement(
"parameters");
58 params.
use_timestamp = bool(elem.attribute(
"use_timestamp").toInt());
69 static std::vector<const char*> ext = {
"mcap",
"MCAP" };
77 throw std::runtime_error(
"No parsing available");
85 QMessageBox::warning(
nullptr,
"Can't open file",
86 tr(
"Code: %0\n Message: %1")
87 .
arg(
int(status.code))
88 .arg(QString::fromStdString(status.message)));
95 QMessageBox::warning(
nullptr,
"Can't open summary of the file",
96 tr(
"Code: %0\n Message: %1")
97 .
arg(
int(status.code))
98 .arg(QString::fromStdString(status.message)));
101 auto statistics =
reader.statistics();
103 std::unordered_map<int, mcap::SchemaPtr> mcap_schemas;
104 std::unordered_map<int, mcap::ChannelPtr> channels;
105 std::unordered_map<int, MessageParserPtr> parsers_by_channel;
107 std::unordered_map<int, DataTamerParser::Schema> dt_schames;
108 int total_dt_schemas = 0;
110 std::unordered_set<mcap::ChannelId> channels_containing_datatamer_schema;
111 std::unordered_set<mcap::ChannelId> channels_containing_datatamer_data;
113 for (
const auto& [schema_id, schema_ptr] :
reader.schemas())
115 mcap_schemas.insert({ schema_id, schema_ptr });
118 std::set<QString> notified_encoding_problem;
123 for (
const auto& [channel_id, channel_ptr] :
reader.channels())
125 channels.insert({ channel_id, channel_ptr });
126 const auto& schema = mcap_schemas.at(channel_ptr->schemaId);
127 const auto& topic_name = channel_ptr->topic;
128 std::string
definition(
reinterpret_cast<const char*
>(schema->data.data()),
129 schema->data.size());
131 if (schema->name ==
"data_tamer_msgs/msg/Schemas")
133 channels_containing_datatamer_schema.insert(channel_id);
134 total_dt_schemas += statistics->channelMessageCounts.at(channel_id);
136 if (schema->name ==
"data_tamer_msgs/msg/Snapshot")
138 channels_containing_datatamer_data.insert(channel_id);
141 QString channel_encoding = QString::fromStdString(channel_ptr->messageEncoding);
142 QString schema_encoding = QString::fromStdString(schema->encoding);
154 if (notified_encoding_problem.count(schema_encoding) == 0)
156 notified_encoding_problem.insert(schema_encoding);
157 auto msg = QString(
"No parser available for encoding [%0] nor [%1]")
158 .arg(channel_encoding)
159 .arg(schema_encoding);
160 QMessageBox::warning(
nullptr,
"Encoding problem",
msg);
165 auto& parser_factory = it->second;
167 parser_factory->createParser(topic_name, schema->name,
definition, plot_data);
168 parsers_by_channel.insert({ channel_ptr->id,
parser });
180 auto ret = dialog.exec();
181 if (
ret != QDialog::Accepted)
188 std::unordered_set<int> enabled_channels;
190 for (
const auto& [channel_id,
parser] : parsers_by_channel)
196 QString topic_name = QString::fromStdString(channels[channel_id]->
topic);
199 enabled_channels.insert(channel_id);
207 qDebug() << QString::fromStdString(problem.message);
210 auto messages =
reader.readMessages(onProblem);
212 QProgressDialog progress_dialog(
"Loading... please wait",
"Cancel", 0, 0,
nullptr);
213 progress_dialog.setWindowTitle(
"Loading the MCAP file");
214 progress_dialog.setModal(
true);
215 progress_dialog.setAutoClose(
true);
216 progress_dialog.setAutoReset(
true);
217 progress_dialog.setMinimumDuration(0);
218 progress_dialog.show();
219 progress_dialog.setValue(0);
221 size_t msg_count = 0;
223 for (
const auto& msg_view : messages)
225 if (enabled_channels.count(msg_view.channel->id) == 0)
231 double timestamp_sec = double(msg_view.message.publishTime) * 1e-9;
234 timestamp_sec = double(msg_view.message.logTime) * 1e-9;
236 auto parser_it = parsers_by_channel.find(msg_view.channel->id);
237 if (parser_it == parsers_by_channel.end())
239 qDebug() <<
"Skipping channeld id: " << msg_view.channel->id;
243 auto parser = parser_it->second;
244 MessageRef msg(msg_view.message.data, msg_view.message.dataSize);
245 parser->parseMessage(
msg, timestamp_sec);
247 if (msg_count++ % 1000 == 0)
249 QApplication::processEvents();
250 if (progress_dialog.wasCanceled())
258 qDebug() <<
"Loaded file in " << timer.elapsed() <<
"milliseconds";