QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
LogViewerParamMetaData.cc
Go to the documentation of this file.
2
4#include "FactMetaData.h"
7
8#include <QtCore/QFileInfo>
9
10QGC_LOGGING_CATEGORY(LogViewerParamMetaDataLog, "AnalyzeView.LogViewerParamMetaData")
11
12namespace {
13
14// Map the APM vehicle name as stored in detectedVehicleType to the file-path
15// component used in :/FirmwarePlugin/APM/APMParameterFactMetaData.{X}.major.minor.json
16QString _apmFileVehicleName(const QString &vehicleType)
17{
18 if (vehicleType == QStringLiteral("ArduCopter")) { return QStringLiteral("Copter"); }
19 if (vehicleType == QStringLiteral("ArduPlane")) { return QStringLiteral("Plane"); }
20 if (vehicleType == QStringLiteral("ArduRover")) { return QStringLiteral("Rover"); }
21 if (vehicleType == QStringLiteral("ArduSub")) { return QStringLiteral("Sub"); }
22 return QString();
23}
24
25// Walk down from (major, minor) to find the best available bundled JSON file,
26// mirroring APMFirmwarePlugin::_internalParameterMetaDataFile logic.
27QString _findAPMMetaDataFile(const QString &fileVehicleName, int major, int minor)
28{
29 int currMajor = major;
30 int currMinor = minor;
31
32 while (currMajor >= 4 && currMinor > 0) {
33 const QString file = QStringLiteral(":/FirmwarePlugin/APM/APMParameterFactMetaData.%1.%2.%3.json")
34 .arg(fileVehicleName).arg(currMajor).arg(currMinor);
35 if (QFileInfo::exists(file)) {
36 return file;
37 }
38 currMinor--;
39 if (currMinor == 0) {
40 currMinor = 10;
41 currMajor--;
42 }
43 }
44
45 // Fallback: oldest available in the 4.x series
46 for (int i = 0; i < 10; i++) {
47 const QString file = QStringLiteral(":/FirmwarePlugin/APM/APMParameterFactMetaData.%1.4.%2.json")
48 .arg(fileVehicleName).arg(i);
49 if (QFileInfo::exists(file)) {
50 return file;
51 }
52 }
53
54 return QString();
55}
56
57void _enrichRows(QVariantList &parameters, ParameterMetaData *metaData)
58{
59 for (int i = 0; i < parameters.size(); i++) {
60 QVariantMap row = parameters[i].toMap();
61
62 const QString name = row.value(QStringLiteral("name")).toString();
63 const bool isFloat = row.value(QStringLiteral("isFloat"), false).toBool();
64 const FactMetaData::ValueType_t type = isFloat
67
68 FactMetaData *factMeta = metaData->getMetaDataForFact(name, type);
69 if (!factMeta) {
70 parameters[i] = row;
71 continue;
72 }
73
74 row[QStringLiteral("decimalPlaces")] = factMeta->decimalPlaces();
75 row[QStringLiteral("units")] = factMeta->rawUnits();
76 row[QStringLiteral("shortDescription")] = factMeta->shortDescription();
77 row[QStringLiteral("enumStrings")] = QVariant::fromValue(factMeta->enumStrings());
78 row[QStringLiteral("enumValues")] = QVariant::fromValue(factMeta->enumValues());
79
80 parameters[i] = row;
81 }
82}
83
84} // namespace
85
86void LogViewerParamMetaData::enrichForPX4(QVariantList &parameters)
87{
88 if (parameters.isEmpty()) {
89 return;
90 }
91
92 auto *metaData = new PX4ParameterMetaData(nullptr);
94 QStringLiteral(":/FirmwarePlugin/PX4/PX4ParameterFactMetaData.json"));
95
96 _enrichRows(parameters, metaData);
97
98 delete metaData;
99}
100
101void LogViewerParamMetaData::enrichForAPM(QVariantList &parameters,
102 const QString &vehicleType,
103 int major,
104 int minor)
105{
106 if (parameters.isEmpty()) {
107 return;
108 }
109
110 const QString fileVehicleName = _apmFileVehicleName(vehicleType);
111 if (fileVehicleName.isEmpty()) {
112 qCDebug(LogViewerParamMetaDataLog) << "Unknown APM vehicle type:" << vehicleType;
113 return;
114 }
115
116 // If no version was detected in the log, start from a high version so the
117 // walk-down finds the newest available file.
118 const int startMajor = (major >= 4) ? major : 9;
119 const int startMinor = (minor >= 0) ? minor : 99;
120
121 const QString metaDataFile = _findAPMMetaDataFile(fileVehicleName, startMajor, startMinor);
122 if (metaDataFile.isEmpty()) {
123 qCDebug(LogViewerParamMetaDataLog) << "No APM metadata file found for" << vehicleType
124 << major << "." << minor;
125 return;
126 }
127
128 qCDebug(LogViewerParamMetaDataLog) << "Loading APM metadata:" << metaDataFile;
129
130 auto *metaData = new APMParameterMetaData(nullptr);
131 metaData->loadParameterFactMetaDataFile(metaDataFile);
132
133 _enrichRows(parameters, metaData);
134
135 delete metaData;
136}
#define QGC_LOGGING_CATEGORY(name, categoryStr)
Holds the meta data associated with a Fact.
QStringList enumStrings() const
QVariantList enumValues() const
QString shortDescription() const
int decimalPlaces() const
QString rawUnits() const
static void enrichForAPM(QVariantList &parameters, const QString &vehicleType, int major, int minor)
static void enrichForPX4(QVariantList &parameters)
FactMetaData * getMetaDataForFact(const QString &name, FactMetaData::ValueType_t type)
void loadParameterFactMetaDataFile(const QString &metaDataFile)