15GeoTagData extractGeoTagData(
const QMap<QString, QVariant> &fields)
20 if (fields.contains(QStringLiteral(
"TimeUS"))) {
21 feedback.
timestamp =
static_cast<qint64
>(fields[QStringLiteral(
"TimeUS")].toULongLong() / 1000000);
25 if (fields.contains(QStringLiteral(
"Img"))) {
26 feedback.
imageSequence = fields[QStringLiteral(
"Img")].toUInt();
30 double lat = 0, lon = 0, alt = 0;
31 if (fields.contains(QStringLiteral(
"Lat"))) {
32 lat = fields[QStringLiteral(
"Lat")].toDouble();
34 if (fields.contains(QStringLiteral(
"Lng"))) {
35 lon = fields[QStringLiteral(
"Lng")].toDouble();
37 if (fields.contains(QStringLiteral(
"Alt"))) {
38 alt = fields[QStringLiteral(
"Alt")].toDouble();
39 }
else if (fields.contains(QStringLiteral(
"GPSAlt"))) {
40 alt = fields[QStringLiteral(
"GPSAlt")].toDouble();
43 feedback.
coordinate = QGeoCoordinate(lat, lon, alt);
46 float roll = 0, pitch = 0, yaw = 0;
47 if (fields.contains(QStringLiteral(
"R"))) {
48 roll =
static_cast<float>(fields[QStringLiteral(
"R")].toDouble());
50 if (fields.contains(QStringLiteral(
"P"))) {
51 pitch =
static_cast<float>(fields[QStringLiteral(
"P")].toDouble());
53 if (fields.contains(QStringLiteral(
"Y"))) {
54 yaw =
static_cast<float>(fields[QStringLiteral(
"Y")].toDouble());
58 const float cy = std::cos(yaw * 0.5f *
static_cast<float>(M_PI) / 180.0f);
59 const float sy = std::sin(yaw * 0.5f *
static_cast<float>(M_PI) / 180.0f);
60 const float cp = std::cos(pitch * 0.5f *
static_cast<float>(M_PI) / 180.0f);
61 const float sp = std::sin(pitch * 0.5f *
static_cast<float>(M_PI) / 180.0f);
62 const float cr = std::cos(roll * 0.5f *
static_cast<float>(M_PI) / 180.0f);
63 const float sr = std::sin(roll * 0.5f *
static_cast<float>(M_PI) / 180.0f);
66 cy * cp * cr + sy * sp * sr,
67 cy * cp * sr - sy * sp * cr,
68 sy * cp * sr + cy * sp * cr,
69 sy * cp * cr - cy * sp * sr
80bool getTagsFromLog(
const char *data, qint64 size, QList<GeoTagData> &cameraFeedback, QString &errorMessage)
82 cameraFeedback.clear();
85 errorMessage = QStringLiteral(
"Invalid DataFlash log format");
90 QMap<uint8_t, DataFlashUtility::MessageFormat> formats;
92 errorMessage = QStringLiteral(
"No message formats found in log");
97 uint8_t camMessageType = 0;
98 for (
auto it = formats.constBegin(); it != formats.constEnd(); ++it) {
99 if (it.value().name == QStringLiteral(
"CAM")) {
100 camMessageType = it.key();
101 qCDebug(DataFlashParserLog) <<
"Found CAM format:" << it.value().format
102 <<
"columns:" << it.value().columns;
107 if (camMessageType == 0) {
108 errorMessage = QStringLiteral(
"No CAM (camera) messages found in log");
115 if (msgType == camMessageType) {
117 GeoTagData feedback = extractGeoTagData(fields);
120 cameraFeedback.append(feedback);
126 if (cameraFeedback.isEmpty()) {
127 errorMessage = QStringLiteral(
"No valid camera capture events found in log");
131 qCDebug(DataFlashParserLog) <<
"Parsed" << cameraFeedback.size() <<
"camera capture events";