7 #include <QProgressDialog> 9 #include <QInputDialog> 10 #include <QPushButton> 11 #include "QSyntaxStyle" 17 #include <QStandardItemModel> 31 static std::vector<const char*> ext = {
"mcap",
"MCAP"};
40 throw std::runtime_error(
"No parsing available");
43 std::ifstream input(info->
filename.toStdString(), std::ios::binary);
49 std::unordered_map<int, mcap::SchemaPtr> schemas;
50 std::unordered_map<int, mcap::ChannelPtr> channels;
51 std::unordered_map<int, MessageParserPtr> parsers_by_channel;
56 schemas.insert( {recordPtr->id, recordPtr} );
62 if(channels.count(recordPtr->id) != 0)
66 channels.insert( {recordPtr->id, recordPtr} );
68 auto schema = schemas.at(recordPtr->schemaId);
69 const auto& topic_name = recordPtr->topic;
70 std::string
definition(reinterpret_cast<const char*>(schema->data.data()),
73 QString encoding = QString::fromStdString(recordPtr->messageEncoding);
79 encoding = QString::fromStdString(schema->encoding);
85 throw std::runtime_error(
86 fmt::format(
"No parsing available for encoding [{}] nor [{}]",
87 schema->encoding, recordPtr->messageEncoding) );
90 auto& parser_factory = it->second;
91 auto parser = parser_factory->createParser(topic_name,
95 parsers_by_channel.insert( {recordPtr->id,
parser} );
101 running = type_reader.
next();
104 QMessageBox::warning(
nullptr, tr(
"MCAP parsing"),
105 QString(
"Error reading the MCAP file:\n%1.\n%2")
108 QMessageBox::Cancel);
114 auto ret = dialog.exec();
115 if (
ret != QDialog::Accepted)
122 std::unordered_set<int> enabled_channels;
124 for (
const auto& [channel_id,
parser] : parsers_by_channel)
126 parser->setLargeArraysPolicy(dialog_params.clamp_large_arrays,
127 dialog_params.max_array_size);
129 QString topic_name = QString::fromStdString(channels[channel_id]->
topic);
130 if( dialog_params.selected_topics.contains(topic_name) )
132 enabled_channels.insert(channel_id);
139 auto status = msg_reader.
open(data_source);
142 auto msg = QString::fromStdString(status.message);
143 QMessageBox::warning(
nullptr,
"MCAP parsing",
144 QString(
"Error reading the MCAP file: %1").
arg(
msg),
145 QMessageBox::Cancel);
150 qDebug() << QString::fromStdString(problem.message);
155 QProgressDialog progress_dialog(
"Loading... please wait",
158 progress_dialog.setModal(
true);
159 progress_dialog.setAutoClose(
true);
160 progress_dialog.setAutoReset(
true);
161 progress_dialog.setMinimumDuration(0);
162 progress_dialog.show();
163 progress_dialog.setValue(0);
165 size_t msg_count = 0;
167 for (
const auto& msg_view : messages)
169 if( enabled_channels.count(msg_view.channel->id) == 0 )
175 double timestamp_sec = double(msg_view.message.publishTime) * 1e-9;
177 auto parser_it = parsers_by_channel.find(msg_view.channel->id);
178 if( parser_it == parsers_by_channel.end() )
180 qDebug() <<
"Skipping channeld id: " << msg_view.channel->id;
184 auto parser = parser_it->second;
185 MessageRef msg(msg_view.message.data, msg_view.message.dataSize);
186 parser->parseMessage(msg, timestamp_sec);
188 if (msg_count++ % 1000 == 0)
190 QApplication::processEvents();
191 if (progress_dialog.wasCanceled())
Wraps a status code and string message carrying additional context.
std::function< void(const SchemaPtr, ByteOffset, std::optional< ByteOffset >)> onSchema
IReadable implementation wrapping a std::ifstream input file stream.
Status open(IReadable &reader)
Opens an MCAP file for reading from an already constructed IReadable implementation.
auto arg(const Char *name, const T &arg) -> detail::named_arg< Char, T >
QString filename
name of the file to open
const ParserFactories * parserFactories() const
const Status & status() const
std::shared_ptr< Schema > SchemaPtr
virtual const std::vector< const char * > & compatibleFileExtensions() const override
Provide a list of file extensions that this plugin can open.
std::shared_ptr< Channel > ChannelPtr
virtual ~DataLoadMCAP() override
LinearMessageView readMessages(Timestamp startTime=0, Timestamp endTime=MaxTime)
Returns an iterable view with begin() and end() methods for iterating Messages in the MCAP file...
virtual bool readDataFromFile(PJ::FileLoadInfo *fileload_info, PlotDataMapRef &destination) override
void close()
Closes the MCAP file, clearing any internal data structures and state and dropping the data source re...
const char * definition()
std::function< void(const ChannelPtr, ByteOffset, std::optional< ByteOffset >)> onChannel
A mid-level interface for parsing and validating MCAP records from a data source. ...
std::basic_string< Char > format(const text_style &ts, const S &format_str, const Args &... args)
Provides a read interface to an MCAP file.