6#include <QtCore/QJsonDocument>
7#include <QtCore/QJsonObject>
8#include <QtCore/QRegularExpression>
9#include <QtCore/QThread>
18 qCDebug(ParameterMetaDataLog) <<
this;
23 qCDebug(ParameterMetaDataLog) <<
this;
28 Q_ASSERT(QThread::currentThread() == thread());
29 if (Q_UNLIKELY(QThread::currentThread() != thread())) {
30 qCCritical(ParameterMetaDataLog) <<
"loadParameterFactMetaDataFile called from wrong thread";
38 qCDebug(ParameterMetaDataLog) <<
"Loading parameter meta data:" << metaDataFile;
43 qCWarning(ParameterMetaDataLog) <<
"Unable to open parameter meta data file:" << metaDataFile <<
errorString;
46 if (!doc.isObject()) {
47 qCWarning(ParameterMetaDataLog) <<
"JSON root is not an object:" << metaDataFile;
57 Q_ASSERT(QThread::currentThread() == thread());
58 if (Q_UNLIKELY(QThread::currentThread() != thread())) {
59 qCCritical(ParameterMetaDataLog) <<
"getMetaDataForFact called from wrong thread";
93 qCDebug(ParameterMetaDataLog) <<
"JSON parse error extracting version:" <<
errorString;
97 const QJsonObject root = doc.object();
103 const int major = root.value(u
"parameter_version_major").toInt(-1);
104 const int minor = root.value(u
"parameter_version_minor").toInt(0);
106 return QVersionNumber(major, minor);
116 if (data.isEmpty()) {
117 qCWarning(ParameterMetaDataLog) <<
"Failed to read parameter meta data file:" << metaDataFile <<
errorString;
126 static const QRegularExpression regex(QStringLiteral(
"\\.(\\d+)\\.(\\d+)\\.json$"));
127 const QRegularExpressionMatch match = regex.match(fileName);
128 if (match.hasMatch()) {
129 return QVersionNumber(match.captured(1).toInt(), match.captured(2).toInt());
158 (metaData->*setter)(converted);
161 qCDebug(ParameterMetaDataLog) <<
"Invalid value for" << metaData->
name() <<
"raw:" << rawText <<
"error:" <<
errorString;
167 QStringList enumStrings;
168 QVariantList enumValues;
170 for (
const auto &[code, description] : pairs) {
174 enumValues << enumValue;
175 enumStrings << description;
177 qCWarning(ParameterMetaDataLog) <<
"Skipping invalid enum value for" << metaData->
name() <<
"code:" << code <<
"error:" <<
errorString;
181 if (!enumStrings.isEmpty()) {
188 QStringList bitmaskStrings;
189 QVariantList bitmaskValues;
191 for (
const auto &[bitIndexStr, description] : pairs) {
193 const uint bitIndex = bitIndexStr.toUInt(&ok);
195 qCWarning(ParameterMetaDataLog) <<
"Skipping invalid bitmask index for" << metaData->
name() <<
"value:" << bitIndexStr;
198 if (bitIndex >= 64) {
199 qCWarning(ParameterMetaDataLog) <<
"Skipping out-of-range bitmask index for" << metaData->
name() <<
"bit:" << bitIndex;
203 const QVariant rawValue = QVariant::fromValue(
static_cast<quint64
>(1ull << bitIndex));
204 QVariant bitmaskValue;
207 bitmaskValues << bitmaskValue;
208 bitmaskStrings << description;
210 qCWarning(ParameterMetaDataLog) <<
"Skipping invalid bitmask value for" << metaData->
name() <<
"bit:" << bitIndex <<
"error:" <<
errorString;
214 if (!bitmaskStrings.isEmpty()) {
#define QGC_LOGGING_CATEGORY(name, categoryStr)
bool isJsonFile(const QByteArray &bytes, QJsonDocument &jsonDoc, QString &errorString)
Determines whether an in-memory byte buffer contains parseable JSON content.
QByteArray readFile(const QString &filePath, QString *errorString, qint64 maxBytes)