200 QString internalError;
203 allKeys << _idJsonKey << _rawNameJsonKey << _friendlyNameJsonKey << _descriptionJsonKey << _standaloneCoordinateJsonKey << _specifiesCoordinateJsonKey
204 <<_friendlyEditJsonKey << _param1JsonKey << _param2JsonKey << _param3JsonKey << _param4JsonKey << _param5JsonKey << _param6JsonKey << _param7JsonKey
205 << _paramRemoveJsonKey << _categoryJsonKey << _specifiesAltitudeOnlyJsonKey << _isLandCommandJsonKey << _isTakeoffCommandJsonKey << _isLoiterCommandJsonKey;
208 for (
const QString& key: jsonObject.keys()) {
209 if (!allKeys.contains(key) && key != _commentJsonKey) {
210 errorString = _loadErrorString(QString(
"Unknown key: %1").arg(key));
216 QStringList requiredKeys;
217 requiredKeys << _idJsonKey;
218 if (requireFullObject) {
219 requiredKeys << _rawNameJsonKey;
227 if (!requireFullObject && (jsonObject.contains(_rawNameJsonKey) || jsonObject.contains(_friendlyNameJsonKey))) {
228 errorString = _loadErrorString(QStringLiteral(
"Only the full object should specify rawName or friendlyName"));
234 QList<QJsonValue::Type> types;
235 types << QJsonValue::Double << QJsonValue::String << QJsonValue::String<< QJsonValue::String << QJsonValue::Bool << QJsonValue::Bool << QJsonValue::Bool
236 << QJsonValue::Object << QJsonValue::Object << QJsonValue::Object << QJsonValue::Object << QJsonValue::Object << QJsonValue::Object << QJsonValue::Object
237 << QJsonValue::String << QJsonValue::String << QJsonValue::Bool << QJsonValue::Bool << QJsonValue::Bool << QJsonValue::Bool;
245 _command = (MAV_CMD)jsonObject.value(_idJsonKey).toInt();
247 if (jsonObject.contains(_categoryJsonKey)) {
248 _infoMap[_categoryJsonKey] = jsonObject.value(_categoryJsonKey).toVariant();
250 if (jsonObject.contains(_rawNameJsonKey)) {
251 _infoMap[_rawNameJsonKey] = jsonObject.value(_rawNameJsonKey).toVariant();
253 if (jsonObject.contains(_friendlyNameJsonKey)) {
254 _infoMap[_friendlyNameJsonKey] = jsonObject.value(_friendlyNameJsonKey).toVariant();
256 if (jsonObject.contains(_descriptionJsonKey)) {
257 _infoMap[_descriptionJsonKey] = jsonObject.value(_descriptionJsonKey).toVariant();
259 if (jsonObject.contains(_standaloneCoordinateJsonKey)) {
260 _infoMap[_standaloneCoordinateJsonKey] = jsonObject.value(_standaloneCoordinateJsonKey).toVariant();
262 if (jsonObject.contains(_specifiesCoordinateJsonKey)) {
263 _infoMap[_specifiesCoordinateJsonKey] = jsonObject.value(_specifiesCoordinateJsonKey).toVariant();
265 if (jsonObject.contains(_specifiesAltitudeOnlyJsonKey)) {
266 _infoMap[_specifiesAltitudeOnlyJsonKey] = jsonObject.value(_specifiesAltitudeOnlyJsonKey).toBool();
268 if (jsonObject.contains(_isLandCommandJsonKey)) {
269 _infoMap[_isLandCommandJsonKey] = jsonObject.value(_isLandCommandJsonKey).toBool();
271 if (jsonObject.contains(_isTakeoffCommandJsonKey)) {
272 _infoMap[_isTakeoffCommandJsonKey] = jsonObject.value(_isTakeoffCommandJsonKey).toBool();
274 if (jsonObject.contains(_isLoiterCommandJsonKey)) {
275 _infoMap[_isLoiterCommandJsonKey] = jsonObject.value(_isLoiterCommandJsonKey).toBool();
277 if (jsonObject.contains(_friendlyEditJsonKey)) {
278 _infoMap[_friendlyEditJsonKey] = jsonObject.value(_friendlyEditJsonKey).toVariant();
280 if (jsonObject.contains(_paramRemoveJsonKey)) {
281 QStringList indexList = jsonObject.value(_paramRemoveJsonKey).toString().split(QStringLiteral(
","));
282 for (
const QString& indexString: indexList) {
283 _paramRemoveList.append(indexString.toInt());
287 if (requireFullObject) {
289 if (!_infoAvailable(_categoryJsonKey)) {
290 _setInfoValue(_categoryJsonKey, _advancedCategory);
292 if (!_infoAvailable(_friendlyNameJsonKey)) {
293 _setInfoValue(_friendlyNameJsonKey, _infoValue(_rawNameJsonKey));
295 if (!_infoAvailable(_descriptionJsonKey)) {
296 _setInfoValue(_descriptionJsonKey, QStringLiteral(
""));
298 if (!_infoAvailable(_standaloneCoordinateJsonKey)) {
299 _setInfoValue(_standaloneCoordinateJsonKey,
false);
301 if (!_infoAvailable(_specifiesCoordinateJsonKey)) {
302 _setInfoValue(_specifiesCoordinateJsonKey,
false);
304 if (!_infoAvailable(_isLandCommandJsonKey)) {
305 _setInfoValue(_isLandCommandJsonKey,
false);
307 if (!_infoAvailable(_isTakeoffCommandJsonKey)) {
308 _setInfoValue(_isTakeoffCommandJsonKey,
false);
310 if (!_infoAvailable(_isLoiterCommandJsonKey)) {
311 _setInfoValue(_isLoiterCommandJsonKey,
false);
313 if (!_infoAvailable(_friendlyEditJsonKey)) {
314 _setInfoValue(_friendlyEditJsonKey,
false);
318 if (requireFullObject) {
319 if (_infoAvailable(_friendlyEditJsonKey) && _infoValue(_friendlyEditJsonKey).toBool()) {
320 if (!_infoAvailable(_descriptionJsonKey)) {
321 errorString = _loadErrorString(QStringLiteral(
"Missing description for friendly edit"));
324 if (_infoValue(_rawNameJsonKey).toString() == _infoValue(_friendlyNameJsonKey).toString()) {
325 errorString = _loadErrorString(QStringLiteral(
"Missing friendlyName for friendly edit"));
332 for (
const QString& infoKey: _infoMap.keys()) {
333 debugOutput.append(QString(
"MavCmdInfo %1: %2 ").arg(infoKey).arg(_infoMap[infoKey].toString()));
335 qCDebug(MissionCommandsLog) << debugOutput;
339 for (
int i=1; i<=7; i++) {
340 QString paramKey = QString(_paramJsonKeyFormat).arg(i);
342 if (jsonObject.contains(paramKey)) {
343 QJsonObject paramObject = jsonObject.value(paramKey).toObject();
345 QStringList allParamKeys;
346 allParamKeys << _defaultJsonKey << _decimalPlacesJsonKey << _enumStringsJsonKey << _enumValuesJsonKey
347 << _labelJsonKey << _unitsJsonKey << _nanUnchangedJsonKey
349 << _minJsonKey << _maxJsonKey << _userMinJsonKey << _userMaxJsonKey;
352 for (
const QString& key: paramObject.keys()) {
353 if (!allParamKeys.contains(key) && key != _commentJsonKey) {
354 errorString = _loadErrorString(QString(
"Unknown param key: %1").arg(key));
360 QList<QJsonValue::Type> paramTypes;
361 paramTypes << QJsonValue::Null << QJsonValue::Double << QJsonValue::String << QJsonValue::String
362 << QJsonValue::String << QJsonValue::String << QJsonValue::Bool
364 << QJsonValue::Double << QJsonValue::Double << QJsonValue::Double << QJsonValue::Double;
370 _setInfoValue(_friendlyEditJsonKey,
true);
372 if (!paramObject.contains(_labelJsonKey)) {
373 internalError = QString(
"param object missing label key: %1").arg(paramKey);
380 paramInfo->_label = paramObject.value(_labelJsonKey).toString();
382 paramInfo->_param = i;
383 paramInfo->_units = paramObject.value(_unitsJsonKey).toString();
384 paramInfo->_nanUnchanged = paramObject.value(_nanUnchangedJsonKey).toBool(
false);
385 paramInfo->_advanced = paramObject.value(_advancedJsonKey).toBool(
false);
389 if (paramObject.value(_minJsonKey).isDouble()) {
390 paramInfo->_min = paramObject.value(_minJsonKey).toDouble();
392 if (paramObject.value(_maxJsonKey).isDouble()) {
393 paramInfo->_max = paramObject.value(_maxJsonKey).toDouble();
395 if (paramObject.value(_userMinJsonKey).isDouble()) {
396 paramInfo->_userMin = paramObject.value(_userMinJsonKey).toDouble();
398 if (paramObject.value(_userMaxJsonKey).isDouble()) {
399 paramInfo->_userMax = paramObject.value(_userMaxJsonKey).toDouble();
402 if (paramObject.contains(_defaultJsonKey)) {
403 if (paramInfo->_nanUnchanged) {
406 if (paramObject[_defaultJsonKey].type() == QJsonValue::Null) {
407 errorString = QString(
"Param %1 default value was null/NaN but NaN is not allowed");
410 paramInfo->_defaultValue = paramObject.value(_defaultJsonKey).toDouble(0.0);
413 paramInfo->_defaultValue = paramInfo->_nanUnchanged ? std::numeric_limits<double>::quiet_NaN() : 0;
417 for (
const QString &enumValue: enumValues) {
419 double value = enumValue.toDouble(&convertOk);
422 internalError = QString(
"Bad enumValue: %1").arg(enumValue);
427 paramInfo->_enumValues << QVariant(value);
429 if (paramInfo->_enumValues.count() != paramInfo->_enumStrings.count()) {
430 internalError = QStringLiteral(
"Enum strings/values count mismatch - label: '%1' strings: '%2'[%3] values: '%4'[%5]")
431 .arg(paramInfo->_label).arg(paramObject.value(_enumStringsJsonKey).toString()).arg(paramInfo->_enumStrings.count())
432 .arg(paramObject.value(_enumValuesJsonKey).toString()).arg(paramInfo->_enumValues.count());
437 qCDebug(MissionCommandsLog) <<
"Param"
439 << paramInfo->_defaultValue
440 << paramInfo->_decimalPlaces
443 << paramInfo->_enumStrings
444 << paramInfo->_enumValues
445 << paramInfo->_nanUnchanged
446 << paramInfo->_advanced
449 << paramInfo->_userMin
450 << paramInfo->_userMax;
452 _paramInfoMap[i] = paramInfo;