diff --git a/src/blackgui/components/flightplancomponent.ui b/src/blackgui/components/flightplancomponent.ui index d0bfd1ad6..d895f3c76 100644 --- a/src/blackgui/components/flightplancomponent.ui +++ b/src/blackgui/components/flightplancomponent.ui @@ -70,7 +70,7 @@ 2 - + 2 @@ -99,6 +99,22 @@ + + + + Aircraft type + + + 3. Aircraft + + + false + + + true + + + @@ -130,13 +146,6 @@ - - - - 1. Type - - - @@ -147,58 +156,6 @@ - - - - Aircraft type - - - 3. Aircraft - - - false - - - true - - - - - - - 4 - - - ICAO, e.g. EDDF - - - - - - - 2. Callsign - - - false - - - true - - - - - - - 99:99 - - - 00:00 - - - hh:mm e.g. 02:30 - - - @@ -212,6 +169,19 @@ + + + + 99:99 + + + 00:00 + + + hh:mm e.g. 02:30 + + + @@ -237,6 +207,19 @@ + + + + Qt::Horizontal + + + + 40 + 20 + + + + @@ -260,7 +243,7 @@ - + goto generator page @@ -270,14 +253,14 @@ - + 11. Remarks - + @@ -290,7 +273,7 @@ - + Save to disk @@ -304,7 +287,7 @@ - + Load flight plan from network @@ -318,7 +301,7 @@ - + Load from disk @@ -332,28 +315,7 @@ - - - - strict &check - - - - - - - - IFR - - - - - VFR - - - - - + &Validate @@ -364,7 +326,7 @@ - + Send flight plan to network @@ -378,6 +340,44 @@ + + + + strict &check + + + + + + + 12. Fuel on board + + + true + + + + + + + true + + + sent time will go here (read only) + + + + + + + &Prefill + + + + :/diagona/icons/diagona/icons/compass--pencil.png:/diagona/icons/diagona/icons/compass--pencil.png + + + @@ -402,7 +402,7 @@ - + &Reset @@ -413,38 +413,7 @@ - - - - 12. Fuel on board - - - true - - - - - - - true - - - sent time will go here (read only) - - - - - - - &Prefill - - - - :/diagona/icons/diagona/icons/compass--pencil.png:/diagona/icons/diagona/icons/compass--pencil.png - - - - + 9. Destination airport @@ -454,7 +423,7 @@ - + 4 @@ -465,26 +434,13 @@ - - - pilot's name - - - 14. Pilot / homebase - - - true - - - - Sent - + Qt::Vertical @@ -500,7 +456,43 @@ - + + + + pilot's name + + + 14. Pilot / homebase + + + true + + + + + + + 4 + + + ICAO, e.g. EDDF + + + + + + + Estimated time enroute + + + 10. Est.time enroute + + + true + + + + 99:99 @@ -516,30 +508,7 @@ - - - - 4 - - - ICAO, e.g. EDDF - - - - - - - Estimated time enroute - - - 10. Est.time enroute - - - true - - - - + true @@ -549,34 +518,7 @@ - - - - 13. Alternate airport - - - true - - - - - - - - 16777215 - 75 - - - - - - - - ICAO, e.g. A321 - - - - + true @@ -596,7 +538,27 @@ - + + + + 13. Alternate airport + + + true + + + + + + + + 16777215 + 75 + + + + + copy from generator page @@ -616,29 +578,6 @@ - - - - 6. Departure time - - - true - - - - - - - 40 - - - true - - - e.g. DLH1331 - - - @@ -649,7 +588,33 @@ - + + + + 6. Departure time + + + true + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 10 + + + + + @@ -678,21 +643,101 @@ - - - - Qt::Vertical + + + + 4 - - QSizePolicy::Fixed + + ICAO, e.g. EDDF - - - 20 - 10 - + + + + + + + IFR + + + + + VFR + + + + + + + + 2. Callsign - + + false + + + true + + + + + + + 1. Type + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + ICAO, e.g. A321 + + + + + + + Synchronize with simulator + + + Synchronize with simulator + + + + :/diagona/icons/diagona/icons/arrow-circle-225.png:/diagona/icons/diagona/icons/arrow-circle-225.png + + + + + + + + + + 40 + + + true + + + e.g. DLH1331 + + @@ -1178,6 +1223,7 @@ p, li { white-space: pre-wrap; } cb_FlightRule le_Callsign le_AircraftType + tb_SyncWithSimulator le_CruiseTrueAirspeed cb_Heavy cb_Tcas diff --git a/src/blackmisc/aviation/flightplan.cpp b/src/blackmisc/aviation/flightplan.cpp index 309e520fd..766edf301 100644 --- a/src/blackmisc/aviation/flightplan.cpp +++ b/src/blackmisc/aviation/flightplan.cpp @@ -16,6 +16,7 @@ #include "blackmisc/iconlist.h" #include "blackmisc/fileutils.h" #include "blackmisc/stringutils.h" +#include "blackmisc/json.h" #include #include @@ -449,7 +450,52 @@ namespace BlackMisc if (fileName.endsWith(".sfp", Qt::CaseInsensitive)) { return CFlightPlan::fromSB4Format(data); } if (fileName.endsWith(".vfp", Qt::CaseInsensitive)) { return CFlightPlan::fromVPilotFormat(data); } - if (fileName.endsWith(".json", Qt::CaseInsensitive)) { return CFlightPlan::fromJson(data); } + if (fileName.endsWith(".json", Qt::CaseInsensitive)) + { + do + { + CStatusMessage m; + if (!Json::looksLikeSwiftJson(data)) + { + m = CStatusMessage(CFlightPlan::getLogCategories(), CStatusMessage::SeverityWarning, "Reading '%1' yields no data", true) << fileName; + if (msgs) { msgs->push_back(m); } + break; + } + + try + { + const QJsonObject jsonObject = Json::jsonObjectFromString(data); + if (Json::looksLikeSwiftTypeValuePairJson(jsonObject)) + { + // CVariant format + CVariant variant; + variant.convertFromJson(jsonObject); + if (variant.canConvert()) + { + const CFlightPlan fp = variant.value(); + return fp; + } + else + { + m = CStatusMessage(CFlightPlan::getLogCategories(), CStatusMessage::SeverityWarning, "Wrong format for flight plan in '%1'") << fileName; + if (msgs) { msgs->push_back(m); } + } + } + else + { + const CFlightPlan fp = CFlightPlan::fromJson(jsonObject); + return fp; + } + } + catch (const CJsonException &ex) + { + m = ex.toStatusMessage(CFlightPlan::getLogCategories(), "Parse error in " + fileName); + if (msgs) { msgs->push_back(m); } + break; + } + } + while (false); + } return CFlightPlan::fromMultipleFormats(data); } diff --git a/src/blackmisc/network/voicecapabilites.cpp b/src/blackmisc/network/voicecapabilites.cpp index 386910919..88ac6ff76 100644 --- a/src/blackmisc/network/voicecapabilites.cpp +++ b/src/blackmisc/network/voicecapabilites.cpp @@ -29,17 +29,17 @@ namespace BlackMisc const QString &CVoiceCapabilities::toFlightPlanRemarks() const { - static const QString v("/R/"); + static const QString v("/V/"); static const QString t("/T/"); static const QString r("/R/"); static const QString u(""); switch (m_voiceCapabilities) { - case Voice: return v; + case Voice: return v; case TextOnly: return t; + case Unknown: return u; case VoiceReceivingOnly: return r; - case Unknown: return u; default: break; } Q_ASSERT_X(false, Q_FUNC_INFO, "Illegal mode"); @@ -77,7 +77,7 @@ namespace BlackMisc if (r.contains("/T/")) { this->setCapabilities(TextOnly); return; } if (r.contains("/R/")) { this->setCapabilities(VoiceReceivingOnly); return; } if (r.contains("/VOICE/")) { this->setCapabilities(Voice); return; } - if (r.contains("/TEXT/")) { this->setCapabilities(TextOnly); return; } + if (r.contains("/TEXT/")) { this->setCapabilities(TextOnly); return; } this->setCapabilities(Unknown); } @@ -121,11 +121,15 @@ namespace BlackMisc CVoiceCapabilities CVoiceCapabilities::fromText(const QString &text) { - if (text.startsWith("/")) { return CVoiceCapabilities::fromText(text); } - if (text.contains("TEXT", Qt::CaseInsensitive)) { return CVoiceCapabilities(TextOnly); } - if (text.contains("ONLY", Qt::CaseInsensitive)) { return CVoiceCapabilities(TextOnly); } + if (text.startsWith("/")) + { + const CVoiceCapabilities vc(text); + return vc; + } + if (text.contains("TEXT", Qt::CaseInsensitive)) { return CVoiceCapabilities(TextOnly); } + if (text.contains("ONLY", Qt::CaseInsensitive)) { return CVoiceCapabilities(TextOnly); } if (text.contains("RECEIVE", Qt::CaseInsensitive)) { return CVoiceCapabilities(VoiceReceivingOnly); } - if (text.contains("VOICE", Qt::CaseInsensitive)) { return CVoiceCapabilities(Voice); } + if (text.contains("VOICE", Qt::CaseInsensitive)) { return CVoiceCapabilities(Voice); } return CVoiceCapabilities(Unknown); }