From 3d19de1331f0ac429db87ec8991ff31b42ad25cd Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Wed, 1 Aug 2018 02:56:23 +0200 Subject: [PATCH] Ref T298, matching setup (settings), making the matching configurable --- src/blackcore/aircraftmatcher.cpp | 123 +++++++++++++++++++++-------- src/blackcore/aircraftmatcher.h | 110 +++++++++++++++++++------- src/blackcore/registermetadata.cpp | 8 +- src/blackmisc/propertyindex.h | 5 +- 4 files changed, 181 insertions(+), 65 deletions(-) diff --git a/src/blackcore/aircraftmatcher.cpp b/src/blackcore/aircraftmatcher.cpp index c082d1f1e..fcc985d48 100644 --- a/src/blackcore/aircraftmatcher.cpp +++ b/src/blackcore/aircraftmatcher.cpp @@ -30,6 +30,7 @@ using namespace BlackMisc; using namespace BlackMisc::Aviation; using namespace BlackMisc::Network; using namespace BlackMisc::Simulation; +using namespace BlackCore::Settings; namespace BlackCore { @@ -39,9 +40,12 @@ namespace BlackCore return cats; } - CAircraftMatcher::CAircraftMatcher(MatchingMode matchingMode, QObject *parent) : + CAircraftMatcher::CAircraftMatcher(const CAircraftMatcherSetup &setup, QObject *parent) : QObject(parent), - m_matchingMode(matchingMode) + m_setup(setup) + { } + + CAircraftMatcher::CAircraftMatcher(QObject *parent) : CAircraftMatcher(CAircraftMatcherSetup(), parent) { } CAircraftMatcher::~CAircraftMatcher() @@ -89,7 +93,7 @@ namespace BlackCore CAircraftModel CAircraftMatcher::getClosestMatch(const CSimulatedAircraft &remoteAircraft, CStatusMessageList *log) const { const CAircraftModelList modelSet(m_modelSet); // Models for this matching - const MatchingMode mode = m_matchingMode; + const CAircraftMatcherSetup::MatchingMode mode = m_setup.getMatchingMode(); static const QString format("hh:mm:ss.zzz"); const QDateTime startTime = QDateTime::currentDateTimeUtc(); @@ -122,7 +126,7 @@ namespace BlackCore else if (remoteAircraft.hasModelString()) { // try to find in installed models by model string - if (mode.testFlag(ByModelString)) + if (mode.testFlag(CAircraftMatcherSetup::ByModelString)) { matchedModel = matchByExactModelString(remoteAircraft, modelSet, log); if (matchedModel.hasModelString()) @@ -168,8 +172,7 @@ namespace BlackCore CAircraftModel CAircraftMatcher::reverseLookupModel(const CAircraftModel &modelToLookup, const QString &networkLiveryInfo, CStatusMessageList *log) { - Q_ASSERT_X(sApp, Q_FUNC_INFO, "Missing sApp"); - Q_ASSERT_X(sApp->getWebDataServices(), Q_FUNC_INFO, "No web services"); + if (!sApp || sApp->isShuttingDown() || !sApp->hasWebDataServices()) { return CAircraftModel(); } // already DB model? CAircraftModel model(modelToLookup); // copy @@ -279,8 +282,8 @@ namespace BlackCore if (log) { - CMatchingUtils::addLogDetailsToList(log, callsign, QString("Using model: ICAO '%1', livery '%2', model '%3', type '%4'"). - arg(model.getAircraftIcaoCode().getCombinedIcaoStringWithKey(), + CMatchingUtils::addLogDetailsToList(log, callsign, QString("Using model: ICAO '%1', livery '%2', model '%3', type '%4'").arg( + model.getAircraftIcaoCode().getCombinedIcaoStringWithKey(), model.getLivery().getCombinedCodePlusInfo(), model.getModelString(), model.getModelTypeAsString())); } @@ -289,8 +292,7 @@ namespace BlackCore CAircraftIcaoCode CAircraftMatcher::reverseLookupAircraftIcao(const CAircraftIcaoCode &icaoCandidate, const CCallsign &logCallsign, CStatusMessageList *log) { - Q_ASSERT_X(sApp, Q_FUNC_INFO, "Missing sApp"); - Q_ASSERT_X(sApp->hasWebDataServices(), Q_FUNC_INFO, "No web services"); + if (!sApp || sApp->isShuttingDown() || !sApp->hasWebDataServices()) { return CAircraftIcaoCode(); } const QString designator(icaoCandidate.getDesignator()); CAircraftIcaoCodeList foundIcaos = sApp->getWebDataServices()->getAircraftIcaoCodesForDesignator(designator); @@ -359,9 +361,7 @@ namespace BlackCore CAirlineIcaoCode CAircraftMatcher::reverseLookupAirlineIcao(const CAirlineIcaoCode &icaoPattern, const CCallsign &callsign, CStatusMessageList *log) { - Q_ASSERT_X(sApp, Q_FUNC_INFO, "Missing sApp"); - Q_ASSERT_X(sApp->getWebDataServices(), Q_FUNC_INFO, "No web services"); - + if (!sApp || sApp->isShuttingDown() || !sApp->hasWebDataServices()) { return CAirlineIcaoCode(); } const CAirlineIcaoCode icao = sApp->getWebDataServices()->smartAirlineIcaoSelector(icaoPattern, callsign); if (log) { @@ -373,9 +373,7 @@ namespace BlackCore CLivery CAircraftMatcher::reverseLookupStandardLivery(const CAirlineIcaoCode &airline, const CCallsign &callsign, CStatusMessageList *log) { - Q_ASSERT_X(sApp, Q_FUNC_INFO, "Missing sApp"); - Q_ASSERT_X(sApp->getWebDataServices(), Q_FUNC_INFO, "No web services"); - + if (!sApp || sApp->isShuttingDown() || !sApp->hasWebDataServices()) { return CLivery(); } if (!airline.hasValidDesignator()) { if (log) { CMatchingUtils::addLogDetailsToList(log, callsign, "Reverse lookup of standard livery skipped, no airline designator", CAircraftMatcher::getLogCategories(), CStatusMessage::SeverityWarning); } @@ -393,8 +391,7 @@ namespace BlackCore QString CAircraftMatcher::reverseLookupAirlineName(const QString &candidate, const CCallsign &callsign, CStatusMessageList *log) { - Q_ASSERT_X(sApp, Q_FUNC_INFO, "Missing sApp"); - Q_ASSERT_X(sApp->getWebDataServices(), Q_FUNC_INFO, "No web services"); + if (!sApp || sApp->isShuttingDown() || !sApp->hasWebDataServices()) { return ""; } if (candidate.isEmpty()) { return ""; } const QStringList names = sApp->getWebDataServices()->getAirlineNames(); if (names.contains(candidate, Qt::CaseInsensitive)) @@ -409,9 +406,7 @@ namespace BlackCore QString CAircraftMatcher::reverseLookupTelephonyDesignator(const QString &candidate, const CCallsign &callsign, CStatusMessageList *log) { - Q_ASSERT_X(sApp, Q_FUNC_INFO, "Missing sApp"); - Q_ASSERT_X(sApp->getWebDataServices(), Q_FUNC_INFO, "No web services"); - + if (!sApp || sApp->isShuttingDown() || !sApp->hasWebDataServices()) { return ""; } if (candidate.isEmpty()) { return ""; } const QStringList designators = sApp->getWebDataServices()->getTelephonyDesignators(); if (designators.contains(candidate, Qt::CaseInsensitive)) @@ -426,15 +421,13 @@ namespace BlackCore bool CAircraftMatcher::isKnowAircraftDesignator(const QString &candidate, const CCallsign &callsign, CStatusMessageList *log) { + if (!sApp || sApp->isShuttingDown() || !sApp->hasWebDataServices()) { return false; } if (!CAircraftIcaoCode::isValidDesignator(candidate)) { CMatchingUtils::addLogDetailsToList(log, callsign, QString("No valid ICAO designator '%1'").arg(candidate)); return false; } - Q_ASSERT_X(sApp, Q_FUNC_INFO, "Missing sApp"); - Q_ASSERT_X(sApp->getWebDataServices(), Q_FUNC_INFO, "No web services"); - const bool known = sApp->getWebDataServices()->containsAircraftIcaoDesignator(candidate); static const QString sKnown("Known ICAO '%1'"); static const QString sUnknown("Unknown ICAO '%1'"); @@ -444,13 +437,13 @@ namespace BlackCore CAircraftIcaoCode CAircraftMatcher::searchAmongAirlineAircraft(const QString &candidateString, const CAirlineIcaoCode &airline, const CCallsign &callsign, CStatusMessageList *log) { + if (!sApp || sApp->isShuttingDown() || !sApp->hasWebDataServices()) { return CAircraftIcaoCode(); } if (!airline.isLoadedFromDb()) { CMatchingUtils::addLogDetailsToList(log, callsign, QString("No valid airline from DB '%1'").arg(airline.getDesignator())); return CAircraftIcaoCode(); } - Q_ASSERT_X(sApp, Q_FUNC_INFO, "Missing sApp"); Q_ASSERT_X(sApp->getWebDataServices(), Q_FUNC_INFO, "No web services"); const CAircraftIcaoCodeList aircraft = sApp->getWebDataServices()->getAircraftIcaoCodesForAirline(airline); @@ -563,7 +556,7 @@ namespace BlackCore m_statistics.addAircraftAirlineCombination(type, sessionId, m_modelSetInfo, description, aircraftIcao, airlineIcao); } - CAircraftModel CAircraftMatcher::getClosestMatchSearchImplementation(MatchingMode mode, const CAircraftModelList &modelSet, const CSimulatedAircraft &remoteAircraft, CStatusMessageList *log) const + CAircraftModel CAircraftMatcher::getClosestMatchSearchImplementation(CAircraftMatcherSetup::MatchingMode mode, const CAircraftModelList &modelSet, const CSimulatedAircraft &remoteAircraft, CStatusMessageList *log) const { CAircraftModelList matchedModels(modelSet); CAircraftModel matchedModel(remoteAircraft.getModel()); @@ -572,7 +565,7 @@ namespace BlackCore do { // by livery, then by ICAO - if (mode.testFlag(ByLivery)) + if (mode.testFlag(CAircraftMatcherSetup::ByLivery)) { matchedModels = ifPossibleReduceByLiveryAndIcaoCode(remoteAircraft, matchedModels, reduced, log); if (reduced) { break; } @@ -583,7 +576,7 @@ namespace BlackCore } // by ICAO data from set - if (mode.testFlag(ByIcaoData)) + if (mode.testFlag(CAircraftMatcherSetup::ByIcaoData)) { // if already matched by livery skip matchedModels = ifPossibleReduceByIcaoData(remoteAircraft, matchedModels, false, reduced, log); @@ -595,7 +588,7 @@ namespace BlackCore } // family - if (mode.testFlag(ByFamily)) + if (mode.testFlag(CAircraftMatcherSetup::ByFamily)) { QString family = remoteAircraft.getAircraftIcaoCode().getFamily(); matchedModels = ifPossibleReduceByFamily(remoteAircraft, family, matchedModels, "real family", reduced, log); @@ -612,7 +605,7 @@ namespace BlackCore } // combined code - if (mode.testFlag(ByCombinedType)) + if (mode.testFlag(CAircraftMatcherSetup::ByCombinedType)) { matchedModels = ifPossibleReduceByCombinedCode(remoteAircraft, matchedModels, reduced, log); if (reduced) { break; } @@ -625,7 +618,7 @@ namespace BlackCore while (false); // the last resort is to use the combined type - if (mode.testFlag(ByCombinedType) && matchedModels.isEmpty() && remoteAircraft.getModel().getAircraftIcaoCode().hasValidCombinedType()) + if (mode.testFlag(CAircraftMatcherSetup::ByCombinedType) && matchedModels.isEmpty() && remoteAircraft.getModel().getAircraftIcaoCode().hasValidCombinedType()) { const CAircraftModel defaultModel = getCombinedTypeDefaultModel(modelSet, remoteAircraft, log); matchedModels.push_back(defaultModel); @@ -654,7 +647,7 @@ namespace BlackCore return matchedModel; } - CAircraftModel CAircraftMatcher::getClosestMatchScoreImplementation(MatchingMode mode, const CAircraftModelList &modelSet, const CSimulatedAircraft &remoteAircraft, CStatusMessageList *log) const + CAircraftModel CAircraftMatcher::getClosestMatchScoreImplementation(CAircraftMatcherSetup::MatchingMode mode, const CAircraftModelList &modelSet, const CSimulatedAircraft &remoteAircraft, CStatusMessageList *log) const { Q_UNUSED(mode); CAircraftModelList usedModelSet; @@ -1082,4 +1075,70 @@ namespace BlackCore if (!sApp || sApp->isShuttingDown() || !sApp->hasWebDataServices()) { return true; } return (sApp->getWebDataServices()->containsAirlineIcaoDesignator(designator)); } + + const QString &CAircraftMatcherSetup::modeFlagToString(MatchingModeFlag modeFlag) + { + static const QString ms("by model string"); + static const QString icao("by ICAO"); + static const QString family("by family"); + static const QString livery("by livery"); + static const QString combined("by combined combined"); + + switch (modeFlag) + { + case ByModelString: return ms; + case ByIcaoData: return icao; + case ByFamily: return family; + case ByLivery: return livery; + case ByCombinedType: return combined; + default: break; + } + + static const QString unknown("unknown"); + return unknown; + } + + QString CAircraftMatcherSetup::modeToString(MatchingMode mode) + { + if (mode == ModeAll) { return "all"; } + + QStringList modes; + if (mode.testFlag(ByModelString)) { modes << modeFlagToString(ByModelString); } + if (mode.testFlag(ByIcaoData)) { modes << modeFlagToString(ByIcaoData); } + if (mode.testFlag(ByFamily)) { modes << modeFlagToString(ByFamily); } + if (mode.testFlag(ByLivery)) { modes << modeFlagToString(ByLivery); } + if (mode.testFlag(ByCombinedType)) { modes << modeFlagToString(ByCombinedType); } + return modes.join(", "); + } + + QString CAircraftMatcherSetup::convertToQString(bool i18n) const + { + Q_UNUSED(i18n); + return modeToString(this->getMatchingMode()); + } + + CVariant CAircraftMatcherSetup::propertyByIndex(const CPropertyIndex &index) const + { + if (index.isMyself()) { return CVariant::from(*this); } + const ColumnIndex i = index.frontCasted(); + switch (i) + { + case IndexMatchingMode: return CVariant::fromValue(m_mode); + default: break; + } + return CValueObject::propertyByIndex(index); + } + + void CAircraftMatcherSetup::setPropertyByIndex(const CPropertyIndex &index, const CVariant &variant) + { + if (index.isMyself()) { (*this) = variant.to(); return; } + const ColumnIndex i = index.frontCasted(); + switch (i) + { + case IndexMatchingMode: m_mode = variant.toInt(); break; + default: break; + } + CValueObject::setPropertyByIndex(index, variant); + } + } // namespace diff --git a/src/blackcore/aircraftmatcher.h b/src/blackcore/aircraftmatcher.h index d8d3951b4..f44d5dfe8 100644 --- a/src/blackcore/aircraftmatcher.h +++ b/src/blackcore/aircraftmatcher.h @@ -16,6 +16,8 @@ #include "blackmisc/simulation/aircraftmodellist.h" #include "blackmisc/simulation/matchingstatistics.h" #include "blackmisc/statusmessage.h" +#include "blackmisc/valueobject.h" +#include "blackmisc/variant.h" #include #include @@ -31,39 +33,86 @@ namespace BlackMisc namespace BlackCore { - /*! - * Matcher for all models. - * \details Reads the model set (ie the models the user wants to use). - * Also Allows to reverse lookup a model (from network to DB data). - */ + namespace Settings + { + //! Matcher settings + class BLACKCORE_EXPORT CAircraftMatcherSetup : public BlackMisc::CValueObject + { + public: + //! Enabled matching mode flags + enum MatchingModeFlag + { + ByModelString = 1 << 0, + ByIcaoData = 1 << 1, + ByFamily = 1 << 2, + ByLivery = 1 << 3, + ByCombinedType = 1 << 4, + ModeAll = ByModelString | ByIcaoData | ByFamily | ByLivery | ByCombinedType + }; + Q_DECLARE_FLAGS(MatchingMode, MatchingModeFlag) + + //! Enumeration as string + static const QString &modeFlagToString(MatchingModeFlag modeFlag); + + //! Enumeration as string + static QString modeToString(MatchingMode mode); + + //! Properties by index + enum ColumnIndex + { + IndexMatchingMode = BlackMisc::CPropertyIndex::GlobalIndexCAircraftMatcherSetup + }; + + //! Constructor + CAircraftMatcherSetup() {} + + //! Matching mode + MatchingMode getMatchingMode() const { return static_cast(m_mode); } + + //! Dynamic offset values? + void setMatchingMode(MatchingMode mode) { m_mode = static_cast(mode); } + + //! \copydoc BlackMisc::Mixin::String::toQString + QString convertToQString(bool i18n = false) const; + + //! \copydoc BlackMisc::Mixin::Index::propertyByIndex + BlackMisc::CVariant propertyByIndex(const BlackMisc::CPropertyIndex &index) const; + + //! \copydoc BlackMisc::Mixin::Index::setPropertyByIndex + void setPropertyByIndex(const BlackMisc::CPropertyIndex &index, const BlackMisc::CVariant &variant); + + private: + int m_mode = static_cast(ModeAll); + + BLACK_METACLASS( + CAircraftMatcherSetup, + BLACK_METAMEMBER(mode) + ); + }; + } // ns + + //! Matcher for all models. + //! \details Reads the model set (ie the models the user wants to use). + //! Also Allows to reverse lookup a model (from network to DB data). class BLACKCORE_EXPORT CAircraftMatcher : public QObject { Q_OBJECT public: - //! Enabled matching mode flags - enum MatchingModeFlag - { - ByModelString = 1 << 0, - ByIcaoData = 1 << 1, - ByFamily = 1 << 2, - ByLivery = 1 << 3, - ByCombinedType = 1 << 4, - All = ByModelString | ByIcaoData | ByFamily | ByLivery | ByCombinedType - }; - Q_DECLARE_FLAGS(MatchingMode, MatchingModeFlag) - //! Log categories static const BlackMisc::CLogCategoryList &getLogCategories(); //! Constructor - CAircraftMatcher(MatchingMode matchingMode = All, QObject *parent = nullptr); + CAircraftMatcher(const Settings::CAircraftMatcherSetup &setup, QObject *parent = nullptr); + + //! Constructor + CAircraftMatcher(QObject *parent = nullptr); //! Destructor virtual ~CAircraftMatcher(); //! Set the enabled matching modes - void setMatchingModes(MatchingMode matchingModes); + void setSetup(const Settings::CAircraftMatcherSetup matchingModes); //! Get the closest matching aircraft model from set. //! Result depends on enabled modes. @@ -179,11 +228,11 @@ namespace BlackCore private: //! The search based implementation //! \threadsafe - BlackMisc::Simulation::CAircraftModel getClosestMatchSearchImplementation(MatchingMode mode, const BlackMisc::Simulation::CAircraftModelList &modelSet, const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft, BlackMisc::CStatusMessageList *log = nullptr) const; + BlackMisc::Simulation::CAircraftModel getClosestMatchSearchImplementation(Settings::CAircraftMatcherSetup::MatchingMode mode, const BlackMisc::Simulation::CAircraftModelList &modelSet, const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft, BlackMisc::CStatusMessageList *log = nullptr) const; //! The score based implementation //! \threadsafe - BlackMisc::Simulation::CAircraftModel getClosestMatchScoreImplementation(MatchingMode mode, const BlackMisc::Simulation::CAircraftModelList &modelSet, const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft, BlackMisc::CStatusMessageList *log = nullptr) const; + BlackMisc::Simulation::CAircraftModel getClosestMatchScoreImplementation(Settings::CAircraftMatcherSetup::MatchingMode mode, const BlackMisc::Simulation::CAircraftModelList &modelSet, const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft, BlackMisc::CStatusMessageList *log = nullptr) const; //! Get combined type default model, i.e. get a default model under consideration of the combined code such as "L2J" //! \see BlackMisc::Simulation::CSimulatedAircraft::getAircraftIcaoCombinedType @@ -239,17 +288,18 @@ namespace BlackCore //! \threadsafe static bool isValidAirlineIcaoDesignator(const QString &designator, bool checkAgainstSwiftDb); - MatchingMode m_matchingMode = All; - BlackMisc::Simulation::CAircraftModel m_defaultModel; //!< model to be used as default model - BlackMisc::Simulation::CAircraftModelList m_modelSet; //!< models used for model matching - BlackMisc::Simulation::CSimulatorInfo m_simulator; //!< simulator (optional) - BlackMisc::Simulation::CMatchingStatistics m_statistics; //!< matching statistics - QString m_modelSetInfo; + Settings::CAircraftMatcherSetup m_setup; //!< setup + BlackMisc::Simulation::CAircraftModel m_defaultModel; //!< model to be used as default model + BlackMisc::Simulation::CAircraftModelList m_modelSet; //!< models used for model matching + BlackMisc::Simulation::CSimulatorInfo m_simulator; //!< simulator (optional) + BlackMisc::Simulation::CMatchingStatistics m_statistics; //!< matching statistics + QString m_modelSetInfo; //!< info string }; } // namespace -Q_DECLARE_METATYPE(BlackCore::CAircraftMatcher::MatchingMode) -Q_DECLARE_METATYPE(BlackCore::CAircraftMatcher::MatchingModeFlag) -Q_DECLARE_OPERATORS_FOR_FLAGS(BlackCore::CAircraftMatcher::MatchingMode) +Q_DECLARE_METATYPE(BlackCore::Settings::CAircraftMatcherSetup) +Q_DECLARE_METATYPE(BlackCore::Settings::CAircraftMatcherSetup::MatchingMode) +Q_DECLARE_METATYPE(BlackCore::Settings::CAircraftMatcherSetup::MatchingModeFlag) +Q_DECLARE_OPERATORS_FOR_FLAGS(BlackCore::Settings::CAircraftMatcherSetup::MatchingMode) #endif // guard diff --git a/src/blackcore/registermetadata.cpp b/src/blackcore/registermetadata.cpp index 4a3cc389a..a1b684489 100644 --- a/src/blackcore/registermetadata.cpp +++ b/src/blackcore/registermetadata.cpp @@ -7,7 +7,7 @@ * contained in the LICENSE file. */ -#include "blackcore/registermetadata.h" +#include "registermetadata.h" #include "blackcore/context/contextapplication.h" #include "blackcore/data/launchersetup.h" #include "blackcore/data/globalsetup.h" @@ -17,6 +17,7 @@ #include "blackcore/network.h" #include "blackcore/voicechannel.h" #include "blackcore/webreaderflags.h" +#include "blackcore/aircraftmatcher.h" #include "blackmisc/dbus.h" #include "blackmisc/network/network.h" #include "blackmisc/valueobject.h" @@ -35,6 +36,8 @@ namespace BlackCore qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType(); @@ -42,12 +45,15 @@ namespace BlackCore qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType(); + // qDBusRegisterMetaType(); + qDBusRegisterMetaType(); Db::CDatabaseReaderConfig::registerMetadata(); Db::CDatabaseReaderConfigList::registerMetadata(); Data::CGlobalSetup::registerMetadata(); Data::CVatsimSetup::registerMetadata(); Data::CLauncherSetup::registerMetadata(); + Settings::CAircraftMatcherSetup::registerMetadata(); Vatsim::CReaderSettings::registerMetadata(); Vatsim::CRawFsdMessageSettings::registerMetadata(); } diff --git a/src/blackmisc/propertyindex.h b/src/blackmisc/propertyindex.h index f6ebc9021..0b2e6ddf9 100644 --- a/src/blackmisc/propertyindex.h +++ b/src/blackmisc/propertyindex.h @@ -138,8 +138,7 @@ namespace BlackMisc GlobalIndexCModelSettings = 8700, GlobalIndexCAircraftCfgEntries = 8800, GlobalIndexCDistributor = 8900, - GlobalIndexCMatchingStatisticsEntry = 9000, - GlobalIndexCVPilotModelRule = 9100, + GlobalIndexCVPilotModelRule = 9000, GlobalIndexCVoiceRoom = 10000, GlobalIndexCSettingKeyboardHotkey = 11000, GlobalIndexIDatastoreInteger = 12000, @@ -162,6 +161,8 @@ namespace BlackMisc GlobalIndexCAtcStationsSettings = 14800, GlobalIndexRawFsdMessageSettings = 14900, GlobalIndexCInterpolatioRenderingSetup = 16000, + GlobalIndexCMatchingStatisticsEntry = 16100, + GlobalIndexCAircraftMatcherSetup = 16200, GlobalIndexSwiftPilotClient = 17000, GlobalIndexSwiftCore = 17100, GlobalIndexSwiftLauncher = 17200,