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);
}