Commit 4a36f9d5 authored by Don Gagne's avatar Don Gagne

New V3 format for mission items

Moves all params into param array instead of using GeoCoordinate for
param 5/6/7
parent 6dae1e7e
...@@ -162,12 +162,8 @@ void MissionItem::save(QJsonObject& json) const ...@@ -162,12 +162,8 @@ void MissionItem::save(QJsonObject& json) const
json[_jsonAutoContinueKey] = autoContinue(); json[_jsonAutoContinueKey] = autoContinue();
json[_jsonDoJumpIdKey] = _sequenceNumber; json[_jsonDoJumpIdKey] = _sequenceNumber;
QJsonArray rgParams = { param1(), param2(), param3(), param4() }; QJsonArray rgParams = { param1(), param2(), param3(), param4(), param5(), param6(), param7() };
json[_jsonParamsKey] = rgParams; json[_jsonParamsKey] = rgParams;
QJsonValue coordinateValue;
JsonHelper::saveGeoCoordinate(QGeoCoordinate(param5(), param6(), param7()), true /* writeAltitude */, coordinateValue);
json[_jsonCoordinateKey] = coordinateValue;
} }
bool MissionItem::load(QTextStream &loadStream) bool MissionItem::load(QTextStream &loadStream)
...@@ -229,10 +225,46 @@ bool MissionItem::_convertJsonV1ToV2(const QJsonObject& json, QJsonObject& v2Jso ...@@ -229,10 +225,46 @@ bool MissionItem::_convertJsonV1ToV2(const QJsonObject& json, QJsonObject& v2Jso
return true; return true;
} }
bool MissionItem::_convertJsonV2ToV3(QJsonObject& json, QString& errorString)
{
// V2 format: param 5/6/7 stored in GeoCoordinate
// V3 format: param 5/6/7 stored in params array
if (!json.contains(_jsonCoordinateKey)) {
// Already V3 format
return true;
}
QList<JsonHelper::KeyValidateInfo> keyInfoList = {
{ _jsonCoordinateKey, QJsonValue::Array, true },
};
if (!JsonHelper::validateKeys(json, keyInfoList, errorString)) {
return false;
}
QGeoCoordinate coordinate;
if (!JsonHelper::loadGeoCoordinate(json[_jsonCoordinateKey], true /* altitudeRequired */, coordinate, errorString)) {
return false;
}
QJsonArray rgParam = json[_jsonParamsKey].toArray();
rgParam.append(coordinate.latitude());
rgParam.append(coordinate.longitude());
rgParam.append(coordinate.altitude());
json[_jsonParamsKey] = rgParam;
json.remove(_jsonCoordinateKey);
return true;
}
bool MissionItem::load(const QJsonObject& json, int sequenceNumber, QString& errorString) bool MissionItem::load(const QJsonObject& json, int sequenceNumber, QString& errorString)
{ {
QJsonObject v2Json; QJsonObject convertedJson;
if (!_convertJsonV1ToV2(json, v2Json, errorString)) { if (!_convertJsonV1ToV2(json, convertedJson, errorString)) {
return false;
}
if (!_convertJsonV2ToV3(convertedJson, errorString)) {
return false; return false;
} }
...@@ -242,21 +274,20 @@ bool MissionItem::load(const QJsonObject& json, int sequenceNumber, QString& err ...@@ -242,21 +274,20 @@ bool MissionItem::load(const QJsonObject& json, int sequenceNumber, QString& err
{ _jsonCommandKey, QJsonValue::Double, true }, { _jsonCommandKey, QJsonValue::Double, true },
{ _jsonParamsKey, QJsonValue::Array, true }, { _jsonParamsKey, QJsonValue::Array, true },
{ _jsonAutoContinueKey, QJsonValue::Bool, true }, { _jsonAutoContinueKey, QJsonValue::Bool, true },
{ _jsonCoordinateKey, QJsonValue::Array, true },
{ _jsonDoJumpIdKey, QJsonValue::Double, false }, { _jsonDoJumpIdKey, QJsonValue::Double, false },
}; };
if (!JsonHelper::validateKeys(v2Json, keyInfoList, errorString)) { if (!JsonHelper::validateKeys(convertedJson, keyInfoList, errorString)) {
return false; return false;
} }
if (v2Json[VisualMissionItem::jsonTypeKey] != VisualMissionItem::jsonTypeSimpleItemValue) { if (convertedJson[VisualMissionItem::jsonTypeKey] != VisualMissionItem::jsonTypeSimpleItemValue) {
errorString = tr("Type found: %1 must be: %2").arg(v2Json[VisualMissionItem::jsonTypeKey].toString()).arg(VisualMissionItem::jsonTypeSimpleItemValue); errorString = tr("Type found: %1 must be: %2").arg(convertedJson[VisualMissionItem::jsonTypeKey].toString()).arg(VisualMissionItem::jsonTypeSimpleItemValue);
return false; return false;
} }
QJsonArray rgParams = v2Json[_jsonParamsKey].toArray(); QJsonArray rgParams = convertedJson[_jsonParamsKey].toArray();
if (rgParams.count() != 4) { if (rgParams.count() != 7) {
errorString = tr("%1 key must contains 4 values").arg(_jsonParamsKey); errorString = tr("%1 key must contains 7 values").arg(_jsonParamsKey);
return false; return false;
} }
...@@ -268,29 +299,24 @@ bool MissionItem::load(const QJsonObject& json, int sequenceNumber, QString& err ...@@ -268,29 +299,24 @@ bool MissionItem::load(const QJsonObject& json, int sequenceNumber, QString& err
} }
// Make sure to set these first since they can signal other changes // Make sure to set these first since they can signal other changes
setFrame((MAV_FRAME)v2Json[_jsonFrameKey].toInt()); setFrame((MAV_FRAME)convertedJson[_jsonFrameKey].toInt());
setCommand((MAV_CMD)v2Json[_jsonCommandKey].toInt()); setCommand((MAV_CMD)convertedJson[_jsonCommandKey].toInt());
QGeoCoordinate coordinate;
if (!JsonHelper::loadGeoCoordinate(v2Json[_jsonCoordinateKey], true /* altitudeRequired */, coordinate, errorString)) {
return false;
}
setParam5(coordinate.latitude());
setParam6(coordinate.longitude());
setParam7(coordinate.altitude());
_doJumpId = -1; _doJumpId = -1;
if (v2Json.contains(_jsonDoJumpIdKey)) { if (convertedJson.contains(_jsonDoJumpIdKey)) {
_doJumpId = v2Json[_jsonDoJumpIdKey].toInt(); _doJumpId = convertedJson[_jsonDoJumpIdKey].toInt();
} }
setIsCurrentItem(false); setIsCurrentItem(false);
setSequenceNumber(sequenceNumber); setSequenceNumber(sequenceNumber);
setAutoContinue(v2Json[_jsonAutoContinueKey].toBool()); setAutoContinue(convertedJson[_jsonAutoContinueKey].toBool());
setParam1(JsonHelper::possibleNaNJsonValue(rgParams[0])); setParam1(JsonHelper::possibleNaNJsonValue(rgParams[0]));
setParam2(JsonHelper::possibleNaNJsonValue(rgParams[1])); setParam2(JsonHelper::possibleNaNJsonValue(rgParams[1]));
setParam3(JsonHelper::possibleNaNJsonValue(rgParams[2])); setParam3(JsonHelper::possibleNaNJsonValue(rgParams[2]));
setParam4(JsonHelper::possibleNaNJsonValue(rgParams[3])); setParam4(JsonHelper::possibleNaNJsonValue(rgParams[3]));
setParam5(JsonHelper::possibleNaNJsonValue(rgParams[4]));
setParam6(JsonHelper::possibleNaNJsonValue(rgParams[5]));
setParam7(JsonHelper::possibleNaNJsonValue(rgParams[6]));
return true; return true;
} }
......
...@@ -114,6 +114,7 @@ private slots: ...@@ -114,6 +114,7 @@ private slots:
private: private:
bool _convertJsonV1ToV2(const QJsonObject& json, QJsonObject& v2Json, QString& errorString); bool _convertJsonV1ToV2(const QJsonObject& json, QJsonObject& v2Json, QString& errorString);
bool _convertJsonV2ToV3(QJsonObject& json, QString& errorString);
int _sequenceNumber; int _sequenceNumber;
int _doJumpId; int _doJumpId;
...@@ -134,10 +135,12 @@ private: ...@@ -134,10 +135,12 @@ private:
static const char* _jsonFrameKey; static const char* _jsonFrameKey;
static const char* _jsonCommandKey; static const char* _jsonCommandKey;
static const char* _jsonAutoContinueKey; static const char* _jsonAutoContinueKey;
static const char* _jsonCoordinateKey;
static const char* _jsonParamsKey; static const char* _jsonParamsKey;
static const char* _jsonDoJumpIdKey; static const char* _jsonDoJumpIdKey;
// Deprecated V2 format keys
static const char* _jsonCoordinateKey;
// Deprecated V1 format keys // Deprecated V1 format keys
static const char* _jsonParam1Key; static const char* _jsonParam1Key;
static const char* _jsonParam2Key; static const char* _jsonParam2Key;
......
This diff is collapsed.
...@@ -35,11 +35,16 @@ private slots: ...@@ -35,11 +35,16 @@ private slots:
void _testSimpleLoadFromStream(void); void _testSimpleLoadFromStream(void);
void _testLoadFromJsonV1(void); void _testLoadFromJsonV1(void);
void _testLoadFromJsonV2(void); void _testLoadFromJsonV2(void);
void _testLoadFromJsonV3(void);
void _testLoadFromJsonV3NaN(void);
void _testSimpleLoadFromJson(void); void _testSimpleLoadFromJson(void);
void _testSaveToJson(void); void _testSaveToJson(void);
private: private:
void _checkExpectedMissionItem(const MissionItem& missionItem); void _checkExpectedMissionItem(const MissionItem& missionItem, bool allNaNs = false);
QJsonObject _createV1Json(void);
QJsonObject _createV2Json(void);
QJsonObject _createV3Json(bool allNaNs = false);
int _seq = 10; int _seq = 10;
Vehicle* _offlineVehicle; Vehicle* _offlineVehicle;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment