208 QString internalError;
210 const QJsonValue idValue = jsonObject.value(_idJsonKey);
211 _command =
static_cast<MAV_CMD
>(idValue.toInt());
212 _commandIdLoaded = idValue.toInt(-1) >= 0;
215 allKeys << _idJsonKey << _rawNameJsonKey << _friendlyNameJsonKey << _descriptionJsonKey << _standaloneCoordinateJsonKey << _specifiesCoordinateJsonKey
216 <<_friendlyEditJsonKey << _param1JsonKey << _param2JsonKey << _param3JsonKey << _param4JsonKey << _param5JsonKey << _param6JsonKey << _param7JsonKey
217 << _paramRemoveJsonKey << _categoryJsonKey << _specifiesAltitudeOnlyJsonKey << _isLandCommandJsonKey << _isTakeoffCommandJsonKey << _isLoiterCommandJsonKey;
220 for (
const QString& key: jsonObject.keys()) {
221 if (!allKeys.contains(key) && key != _commentJsonKey) {
222 errorString = _loadErrorString(QString(
"Unknown key: %1").arg(key));
228 QStringList requiredKeys;
229 requiredKeys << _idJsonKey;
230 if (requireFullObject) {
231 requiredKeys << _rawNameJsonKey;
239 if (!requireFullObject && (jsonObject.contains(_rawNameJsonKey) || jsonObject.contains(_friendlyNameJsonKey))) {
240 errorString = _loadErrorString(QStringLiteral(
"Only the full object should specify rawName or friendlyName"));
246 QList<QJsonValue::Type> types;
247 types << QJsonValue::Double << QJsonValue::String << QJsonValue::String<< QJsonValue::String << QJsonValue::Bool << QJsonValue::Bool << QJsonValue::Bool
248 << QJsonValue::Object << QJsonValue::Object << QJsonValue::Object << QJsonValue::Object << QJsonValue::Object << QJsonValue::Object << QJsonValue::Object
249 << QJsonValue::String << QJsonValue::String << QJsonValue::Bool << QJsonValue::Bool << QJsonValue::Bool << QJsonValue::Bool;
257 if (jsonObject.contains(_categoryJsonKey)) {
258 _infoMap[_categoryJsonKey] = jsonObject.value(_categoryJsonKey).toVariant();
260 if (jsonObject.contains(_rawNameJsonKey)) {
261 _infoMap[_rawNameJsonKey] = jsonObject.value(_rawNameJsonKey).toVariant();
263 if (jsonObject.contains(_friendlyNameJsonKey)) {
264 _infoMap[_friendlyNameJsonKey] = jsonObject.value(_friendlyNameJsonKey).toVariant();
266 if (jsonObject.contains(_descriptionJsonKey)) {
267 _infoMap[_descriptionJsonKey] = jsonObject.value(_descriptionJsonKey).toVariant();
269 if (jsonObject.contains(_standaloneCoordinateJsonKey)) {
270 _infoMap[_standaloneCoordinateJsonKey] = jsonObject.value(_standaloneCoordinateJsonKey).toVariant();
272 if (jsonObject.contains(_specifiesCoordinateJsonKey)) {
273 _infoMap[_specifiesCoordinateJsonKey] = jsonObject.value(_specifiesCoordinateJsonKey).toVariant();
275 if (jsonObject.contains(_specifiesAltitudeOnlyJsonKey)) {
276 _infoMap[_specifiesAltitudeOnlyJsonKey] = jsonObject.value(_specifiesAltitudeOnlyJsonKey).toBool();
278 if (jsonObject.contains(_isLandCommandJsonKey)) {
279 _infoMap[_isLandCommandJsonKey] = jsonObject.value(_isLandCommandJsonKey).toBool();
281 if (jsonObject.contains(_isTakeoffCommandJsonKey)) {
282 _infoMap[_isTakeoffCommandJsonKey] = jsonObject.value(_isTakeoffCommandJsonKey).toBool();
284 if (jsonObject.contains(_isLoiterCommandJsonKey)) {
285 _infoMap[_isLoiterCommandJsonKey] = jsonObject.value(_isLoiterCommandJsonKey).toBool();
287 if (jsonObject.contains(_friendlyEditJsonKey)) {
288 _infoMap[_friendlyEditJsonKey] = jsonObject.value(_friendlyEditJsonKey).toVariant();
290 if (jsonObject.contains(_paramRemoveJsonKey)) {
291 QStringList indexList = jsonObject.value(_paramRemoveJsonKey).toString().split(QStringLiteral(
","));
292 for (
const QString& indexString: indexList) {
293 _paramRemoveList.append(indexString.toInt());
297 if (requireFullObject) {
299 if (!_infoAvailable(_categoryJsonKey)) {
300 _setInfoValue(_categoryJsonKey, _advancedCategory);
302 if (!_infoAvailable(_friendlyNameJsonKey)) {
303 _setInfoValue(_friendlyNameJsonKey, _infoValue(_rawNameJsonKey));
305 if (!_infoAvailable(_descriptionJsonKey)) {
306 _setInfoValue(_descriptionJsonKey, QStringLiteral(
""));
308 if (!_infoAvailable(_standaloneCoordinateJsonKey)) {
309 _setInfoValue(_standaloneCoordinateJsonKey,
false);
311 if (!_infoAvailable(_specifiesCoordinateJsonKey)) {
312 _setInfoValue(_specifiesCoordinateJsonKey,
false);
314 if (!_infoAvailable(_isLandCommandJsonKey)) {
315 _setInfoValue(_isLandCommandJsonKey,
false);
317 if (!_infoAvailable(_isTakeoffCommandJsonKey)) {
318 _setInfoValue(_isTakeoffCommandJsonKey,
false);
320 if (!_infoAvailable(_isLoiterCommandJsonKey)) {
321 _setInfoValue(_isLoiterCommandJsonKey,
false);
323 if (!_infoAvailable(_friendlyEditJsonKey)) {
324 _setInfoValue(_friendlyEditJsonKey,
false);
328 if (requireFullObject) {
329 if (_infoAvailable(_friendlyEditJsonKey) && _infoValue(_friendlyEditJsonKey).toBool()) {
330 if (!_infoAvailable(_descriptionJsonKey)) {
331 errorString = _loadErrorString(QStringLiteral(
"Missing description for friendly edit"));
334 if (_infoValue(_rawNameJsonKey).toString() == _infoValue(_friendlyNameJsonKey).toString()) {
335 errorString = _loadErrorString(QStringLiteral(
"Missing friendlyName for friendly edit"));
342 for (
const QString& infoKey: _infoMap.keys()) {
343 debugOutput.append(QString(
"MavCmdInfo %1: %2 ").arg(infoKey).arg(_infoMap[infoKey].toString()));
345 qCDebug(MissionCommandsLog) << debugOutput;
349 for (
int i=1; i<=7; i++) {
350 QString paramKey = QString(_paramJsonKeyFormat).arg(i);
352 if (jsonObject.contains(paramKey)) {
353 QJsonObject paramObject = jsonObject.value(paramKey).toObject();
355 QStringList allParamKeys;
356 allParamKeys << _defaultJsonKey << _decimalPlacesJsonKey << _enumStringsJsonKey << _enumValuesJsonKey
357 << _labelJsonKey << _unitsJsonKey << _nanUnchangedJsonKey
359 << _minJsonKey << _maxJsonKey << _userMinJsonKey << _userMaxJsonKey;
362 for (
const QString& key: paramObject.keys()) {
363 if (!allParamKeys.contains(key) && key != _commentJsonKey) {
364 errorString = _loadErrorString(QString(
"Unknown param key: %1").arg(key));
370 QList<QJsonValue::Type> paramTypes;
371 paramTypes << QJsonValue::Null << QJsonValue::Double << QJsonValue::String << QJsonValue::String
372 << QJsonValue::String << QJsonValue::String << QJsonValue::Bool
374 << QJsonValue::Double << QJsonValue::Double << QJsonValue::Double << QJsonValue::Double;
380 _setInfoValue(_friendlyEditJsonKey,
true);
382 if (!paramObject.contains(_labelJsonKey)) {
383 internalError = QString(
"param object missing label key: %1").arg(paramKey);
390 paramInfo->_label = paramObject.value(_labelJsonKey).toString();
392 paramInfo->_param = i;
393 paramInfo->_units = paramObject.value(_unitsJsonKey).toString();
394 paramInfo->_nanUnchanged = paramObject.value(_nanUnchangedJsonKey).toBool(
false);
395 paramInfo->_advanced = paramObject.value(_advancedJsonKey).toBool(
false);
399 if (paramObject.value(_minJsonKey).isDouble()) {
400 paramInfo->_min = paramObject.value(_minJsonKey).toDouble();
402 if (paramObject.value(_maxJsonKey).isDouble()) {
403 paramInfo->_max = paramObject.value(_maxJsonKey).toDouble();
405 if (paramObject.value(_userMinJsonKey).isDouble()) {
406 paramInfo->_userMin = paramObject.value(_userMinJsonKey).toDouble();
408 if (paramObject.value(_userMaxJsonKey).isDouble()) {
409 paramInfo->_userMax = paramObject.value(_userMaxJsonKey).toDouble();
412 if (paramObject.contains(_defaultJsonKey)) {
413 if (paramInfo->_nanUnchanged) {
416 if (paramObject[_defaultJsonKey].type() == QJsonValue::Null) {
417 errorString = QString(
"Param %1 default value was null/NaN but NaN is not allowed");
420 paramInfo->_defaultValue = paramObject.value(_defaultJsonKey).toDouble(0.0);
423 paramInfo->_defaultValue = paramInfo->_nanUnchanged ? std::numeric_limits<double>::quiet_NaN() : 0;
427 for (
const QString &enumValue: enumValues) {
429 double value = enumValue.toDouble(&convertOk);
432 internalError = QString(
"Bad enumValue: %1").arg(enumValue);
437 paramInfo->_enumValues << QVariant(value);
439 if (paramInfo->_enumValues.count() != paramInfo->_enumStrings.count()) {
440 internalError = QStringLiteral(
"Enum strings/values count mismatch - label: '%1' strings: '%2'[%3] values: '%4'[%5]")
441 .arg(paramInfo->_label).arg(paramObject.value(_enumStringsJsonKey).toString()).arg(paramInfo->_enumStrings.count())
442 .arg(paramObject.value(_enumValuesJsonKey).toString()).arg(paramInfo->_enumValues.count());
447 qCDebug(MissionCommandsLog) <<
"Param"
449 << paramInfo->_defaultValue
450 << paramInfo->_decimalPlaces
453 << paramInfo->_enumStrings
454 << paramInfo->_enumValues
455 << paramInfo->_nanUnchanged
456 << paramInfo->_advanced
459 << paramInfo->_userMin
460 << paramInfo->_userMax;
462 _paramInfoMap[i] = paramInfo;