4#include <ulog_cpp/reader.hpp>
18bool isValidHeader(
const char *data, qint64 size)
31 if (!isValidHeader(data, size)) {
34 return static_cast<uint8_t
>(data[4]);
42 if (!isValidHeader(data, size)) {
46 const std::span<const uint8_t> header{
reinterpret_cast<const uint8_t*
>(data),
kHeaderSize};
47 return *LittleEndian::read<uint64_t>(header, 8);
54MessageHandler::MessageHandler(
const std::string &messageName,
57 : _targetMessageName(messageName)
59 , _errorMessage(errorMsg)
65 if (!is_recoverable) {
66 _hadFatalError =
true;
68 if (!_errorMessage.isEmpty()) {
69 _errorMessage.append(QStringLiteral(
", "));
71 _errorMessage.append(QString::fromStdString(msg));
76 if (message_format.name() == _targetMessageName) {
77 _messageFormat = std::make_shared<ulog_cpp::MessageFormat>(message_format);
83 if (add_logged_message.messageName() == _targetMessageName && _messageFormat) {
84 _messageIds.insert(add_logged_message.msgId());
90 _headerComplete =
true;
92 _messageFormat->resolveDefinition({{_targetMessageName, _messageFormat}});
98 if (!_headerComplete || !_messageFormat) {
102 if (!_messageIds.contains(
data.msgId())) {
107 const ulog_cpp::TypedDataView typedData(
data, *_messageFormat);
109 if (!_callback(typedData)) {
113 }
catch (
const ulog_cpp::AccessException &exception) {
114 qCWarning(PX4ULogUtilityLog) <<
"Failed to parse" << QString::fromStdString(_targetMessageName)
115 <<
":" << exception.what();
117 for (
const std::string &name : _messageFormat->fieldNames()) {
118 fields.append(QString::fromStdString(name));
120 qCDebug(PX4ULogUtilityLog) <<
"Available fields:" << fields;
129 const std::string &messageName,
131 QString &errorMessage)
133 errorMessage.clear();
135 auto handler = std::make_shared<MessageHandler>(messageName, callback, errorMessage);
136 ulog_cpp::Reader parser(handler);
137 parser.readChunk(
reinterpret_cast<const uint8_t*
>(data),
static_cast<size_t>(size));
139 if (handler->hadFatalError()) {
140 errorMessage = QStringLiteral(
"Could not parse ULog");
144 if (!handler->isHeaderComplete()) {
145 errorMessage = QStringLiteral(
"Could not parse ULog header");
#define QGC_LOGGING_CATEGORY(name, categoryStr)
void messageFormat(const ulog_cpp::MessageFormat &message_format) override
void addLoggedMessage(const ulog_cpp::AddLoggedMessage &add_logged_message) override
void error(const std::string &msg, bool is_recoverable) override
void headerComplete() override
void data(const ulog_cpp::Data &data) override
uint64_t getHeaderTimestamp(const char *data, qint64 size)
int getVersion(const char *data, qint64 size)
std::function< bool(const ulog_cpp::TypedDataView &sample)> MessageCallback
bool iterateMessages(const char *data, qint64 size, const std::string &messageName, const MessageCallback &callback, QString &errorMessage)
constexpr char kMagicBytes[]
ULog file magic bytes: "ULog" followed by 0x01 (version 1) followed by 0x12 (file compat)
constexpr int kHeaderSize