94 const auto it = _formats.find(add_logged_message.messageName());
95 if (it != _formats.cend()) {
96 _subscriptions[add_logged_message.msgId()] = {
98 add_logged_message.multiId(),
99 add_logged_message.messageName()
114 if (!_headerComplete) {
118 const auto it = _subscriptions.find(
data.msgId());
119 if (it == _subscriptions.cend()) {
123 const SubscriptionInfo &sub = it->second;
129 const ulog_cpp::TypedDataView view(
data, *sub.format);
132 double timestampSecs = -1.0;
133 if (sub.format->fieldMap().count(
"timestamp") > 0) {
134 const uint64_t tsUs = view.at(
"timestamp").as<uint64_t>();
135 timestampSecs =
static_cast<double>(tsUs) / 1e6;
136 _lastTimestampSecs = timestampSecs;
140 const QString prefix = (sub.multiId > 0)
141 ? QStringLiteral(
"%1[%2].").arg(QString::fromStdString(sub.topicName)).arg(sub.multiId)
142 : QString::fromStdString(sub.topicName) + QLatin1Char(
'.');
144 for (
const auto &field : sub.format->fields()) {
146 if (field->name().rfind(
"_padding", 0) == 0) {
149 if (field->name() ==
"timestamp") {
152 if (!field->definitionResolved()) {
156 const QString fieldName = prefix + QString::fromStdString(field->name());
157 _fieldSet.insert(fieldName);
159 if (!_isNumericScalarField(*field) || timestampSecs < 0.0) {
163 const double value = view.at(field).as<
double>();
164 _result.
fieldSamples[fieldName].append(QPointF(timestampSecs, value));
165 _plottableFieldSet.insert(fieldName);
170 if (timestampSecs >= 0.0) {
176 }
catch (
const std::exception &e) {
177 qCWarning(ULogFullHandlerLog) <<
"Failed to decode data message:" << e.what();
251 const auto vehicleTypeIt = _result.
fieldSamples.constFind(QStringLiteral(
"vehicle_status.vehicle_type"));
252 if (vehicleTypeIt != _result.
fieldSamples.cend() && !vehicleTypeIt->isEmpty()) {
253 const int vtype =
static_cast<int>(vehicleTypeIt->first().y());
265 const auto navStateIt = _result.
fieldSamples.constFind(QStringLiteral(
"vehicle_status.nav_state"));
267 const QVector<QPointF> &samples = navStateIt.value();
268 int lastNavState = -1;
269 double segmentStart = -1.0;
272 for (
const QPointF &pt : samples) {
273 const int navState =
static_cast<int>(pt.y());
274 if (navState != lastNavState) {
276 if (lastNavState >= 0 && segmentStart >= 0.0) {
278 seg[QStringLiteral(
"mode")] = segmentMode;
279 seg[QStringLiteral(
"start")] = segmentStart;
280 seg[QStringLiteral(
"end")] = pt.x();
283 lastNavState = navState;
284 segmentStart = pt.x();
285 segmentMode = _px4NavStateName(navState);
290 if (lastNavState >= 0 && segmentStart >= 0.0 && _result.
maxTimestamp >= segmentStart) {
292 seg[QStringLiteral(
"mode")] = segmentMode;
293 seg[QStringLiteral(
"start")] = segmentStart;