6#include <ulog_cpp/reader.hpp>
17bool isValidHeader(
const char *data, qint64 size)
30 if (!isValidHeader(data, size)) {
33 return static_cast<uint8_t
>(data[4]);
41 if (!isValidHeader(data, size)) {
47 memcpy(×tamp, data + 8,
sizeof(timestamp));
55MessageHandler::MessageHandler(
const std::string &messageName,
58 : _targetMessageName(messageName)
60 , _errorMessage(errorMsg)
66 if (!is_recoverable) {
67 _hadFatalError =
true;
69 if (!_errorMessage.isEmpty()) {
70 _errorMessage.append(QStringLiteral(
", "));
72 _errorMessage.append(QString::fromStdString(msg));
77 if (message_format.name() == _targetMessageName) {
78 _messageFormat = std::make_shared<ulog_cpp::MessageFormat>(message_format);
84 if (add_logged_message.messageName() == _targetMessageName && _messageFormat) {
85 _messageIds.insert(add_logged_message.msgId());
91 _headerComplete =
true;
93 _messageFormat->resolveDefinition({{_targetMessageName, _messageFormat}});
99 if (!_headerComplete || !_messageFormat) {
103 if (!_messageIds.contains(
data.msgId())) {
108 const ulog_cpp::TypedDataView typedData(
data, *_messageFormat);
110 if (!_callback(typedData)) {
114 }
catch (
const ulog_cpp::AccessException &exception) {
115 qCWarning(ULogUtilityLog) <<
"Failed to parse" << QString::fromStdString(_targetMessageName)
116 <<
":" << exception.what();
118 for (
const std::string &name : _messageFormat->fieldNames()) {
119 fields.append(QString::fromStdString(name));
121 qCDebug(ULogUtilityLog) <<
"Available fields:" << fields;
130 const std::string &messageName,
132 QString &errorMessage)
134 errorMessage.clear();
136 auto handler = std::make_shared<MessageHandler>(messageName, callback, errorMessage);
137 ulog_cpp::Reader parser(handler);
138 parser.readChunk(
reinterpret_cast<const uint8_t*
>(data),
static_cast<size_t>(size));
140 if (handler->hadFatalError()) {
141 errorMessage = QStringLiteral(
"Could not parse ULog");
145 if (!handler->isHeaderComplete()) {
146 errorMessage = QStringLiteral(
"Could not parse ULog header");
#define QGC_LOGGING_CATEGORY(name, categoryStr)
void addLoggedMessage(const ulog_cpp::AddLoggedMessage &add_logged_message) override
void messageFormat(const ulog_cpp::MessageFormat &message_format) override
void headerComplete() override
void data(const ulog_cpp::Data &data) override
void error(const std::string &msg, bool is_recoverable) override
std::function< bool(const ulog_cpp::TypedDataView &sample)> MessageCallback
uint64_t getHeaderTimestamp(const char *data, qint64 size)
bool iterateMessages(const char *data, qint64 size, const std::string &messageName, const MessageCallback &callback, QString &errorMessage)
constexpr int kHeaderSize
constexpr char kMagicBytes[]
ULog file magic bytes: "ULog" followed by 0x01 (version 1) followed by 0x12 (file compat)
int getVersion(const char *data, qint64 size)