refs #791, further improve reverse lookup

* utility function if web data are already available
* moved setOwnAircraftModel as reverseLookupAndUpdateOwnAircraftModel to CSimulatorCommon
* reverseLookupAndUpdateOwnAircraftModel also handles async lookup when data are not yet available
* removed context ps_allSwiftWebDataRead reverse lookup, done in CSimulatorCommon now
This commit is contained in:
Klaus Basan
2016-10-30 00:28:16 +02:00
parent 4478af119d
commit 4f447cd408
12 changed files with 81 additions and 37 deletions

View File

@@ -324,11 +324,8 @@ namespace BlackCore
void CContextOwnAircraft::ps_allSwiftWebDataRead() void CContextOwnAircraft::ps_allSwiftWebDataRead()
{ {
const CAircraftModel model = this->getOwnAircraftModel(); // we should already receive a reverse lookup model
if (model.isLoadedFromDb()) { return; } // from the driver
// a reverse lookup of the model could make sense
this->updateOwnModel(model); // force reverse lookup
} }
void CContextOwnAircraft::setAudioVoiceRoomOverrideUrls(const QString &voiceRoom1Url, const QString &voiceRoom2Url) void CContextOwnAircraft::setAudioVoiceRoomOverrideUrls(const QString &voiceRoom1Url, const QString &voiceRoom2Url)

View File

@@ -47,6 +47,7 @@ namespace BlackCore
Q_ASSERT_X(sApp->hasWebDataServices(), Q_FUNC_INFO, "No web services"); Q_ASSERT_X(sApp->hasWebDataServices(), Q_FUNC_INFO, "No web services");
if (modified) { *modified = false; } if (modified) { *modified = false; }
if (!hasDbAircraftData()) { return model; }
if (!model.hasModelString()) { return model; } if (!model.hasModelString()) { return model; }
if (!force && model.hasValidDbKey()) { return model; } if (!force && model.hasValidDbKey()) { return model; }
const int distributorOrder = model.getDistributorOrder(); // later restore that order const int distributorOrder = model.getDistributorOrder(); // later restore that order
@@ -213,5 +214,10 @@ namespace BlackCore
} }
return stashModels; return stashModels;
} }
bool CDatabaseUtils::hasDbAircraftData()
{
return sApp && sApp->hasWebDataServices() && sApp->getWebDataServices()->hasDbAircraftData();
}
} // ns } // ns
} // ns } // ns

View File

@@ -50,6 +50,9 @@ namespace BlackCore
//! Create stash models if the DB models miss that simulator //! Create stash models if the DB models miss that simulator
static BlackMisc::Simulation::CAircraftModelList updateSimulatorForFsFamily(const BlackMisc::Simulation::CAircraftModelList &ownModels, int maxToStash = -1, BlackCore::IProgressIndicator *progressIndicator = nullptr, bool processEvents = true); static BlackMisc::Simulation::CAircraftModelList updateSimulatorForFsFamily(const BlackMisc::Simulation::CAircraftModelList &ownModels, int maxToStash = -1, BlackCore::IProgressIndicator *progressIndicator = nullptr, bool processEvents = true);
//! Convenience function
static bool hasDbAircraftData();
}; };
} // ns } // ns
} // ns } // ns

View File

@@ -9,6 +9,8 @@
#include "blackcore/simulatorcommon.h" #include "blackcore/simulatorcommon.h"
#include "blackcore/db/databaseutils.h" #include "blackcore/db/databaseutils.h"
#include "blackcore/db/databaseutils.h"
#include "blackcore/webdataservices.h"
#include "blackmisc/aviation/aircraftsituation.h" #include "blackmisc/aviation/aircraftsituation.h"
#include "blackmisc/aviation/callsign.h" #include "blackmisc/aviation/callsign.h"
#include "blackmisc/interpolator.h" #include "blackmisc/interpolator.h"
@@ -31,6 +33,7 @@ using namespace BlackMisc::Simulation;
using namespace BlackMisc::PhysicalQuantities; using namespace BlackMisc::PhysicalQuantities;
using namespace BlackMisc::Simulation; using namespace BlackMisc::Simulation;
using namespace BlackMisc::Weather; using namespace BlackMisc::Weather;
using namespace BlackCore;
using namespace BlackCore::Db; using namespace BlackCore::Db;
namespace BlackCore namespace BlackCore
@@ -63,6 +66,12 @@ namespace BlackCore
connect(&m_oneSecondTimer, &QTimer::timeout, this, &CSimulatorCommon::ps_oneSecondTimer); connect(&m_oneSecondTimer, &QTimer::timeout, this, &CSimulatorCommon::ps_oneSecondTimer);
this->m_oneSecondTimer.start(1000); this->m_oneSecondTimer.start(1000);
// swift data
if (sApp && sApp->getWebDataServices())
{
connect(sApp->getWebDataServices(), &CWebDataServices::allSwiftDbDataRead, this, &CSimulatorCommon::ps_allSwiftDataRead);
}
// info // info
CLogMessage(this).info("Initialized simulator driver %1") << m_simulatorPluginInfo.toQString(); CLogMessage(this).info("Initialized simulator driver %1") << m_simulatorPluginInfo.toQString();
} }
@@ -164,6 +173,41 @@ namespace BlackCore
} }
} }
void CSimulatorCommon::reverseLookupAndUpdateOwnAircraftModel(const QString &modelString)
{
CAircraftModel model = getOwnAircraftModel();
model.setModelString(modelString);
this->reverseLookupAndUpdateOwnAircraftModel(model);
}
void CSimulatorCommon::reverseLookupAndUpdateOwnAircraftModel(const BlackMisc::Simulation::CAircraftModel &model)
{
Q_ASSERT_X(sApp, Q_FUNC_INFO, "Missing sApp");
Q_ASSERT_X(sApp->hasWebDataServices(), Q_FUNC_INFO, "Missing web services");
if (!model.hasModelString()) { return; }
if (this->getOwnAircraftModel() != model)
{
if (CDatabaseUtils::hasDbAircraftData())
{
const CAircraftModel newModel = reverseLookupModel(model);
const bool updated = this->updateOwnModel(newModel); // update in provider (normally the context)
if (updated)
{
emit this->ownAircraftModelChanged(this->getOwnAircraftModel());
}
}
else
{
// we wait for the data
connect(sApp->getWebDataServices(), &CWebDataServices::allSwiftDbDataRead, this, [ = ]
{
this->reverseLookupAndUpdateOwnAircraftModel(model);
});
}
}
}
CAircraftModel CSimulatorCommon::reverseLookupModel(const CAircraftModel &model) CAircraftModel CSimulatorCommon::reverseLookupModel(const CAircraftModel &model)
{ {
bool modified = false; bool modified = false;
@@ -171,6 +215,11 @@ namespace BlackCore
return reverseModel; return reverseModel;
} }
void CSimulatorCommon::ps_allSwiftDataRead()
{
// void
}
CAircraftModel CSimulatorCommon::getDefaultModel() const CAircraftModel CSimulatorCommon::getDefaultModel() const
{ {
return m_defaultModel; return m_defaultModel;

View File

@@ -125,6 +125,12 @@ namespace BlackCore
//! Override situation from current interpolator values, if any! //! Override situation from current interpolator values, if any!
bool setInitialAircraftSituation(BlackMisc::Simulation::CSimulatedAircraft &aircraft) const; bool setInitialAircraftSituation(BlackMisc::Simulation::CSimulatedAircraft &aircraft) const;
//! Set own model
void reverseLookupAndUpdateOwnAircraftModel(const BlackMisc::Simulation::CAircraftModel &model);
//! Set own model
void reverseLookupAndUpdateOwnAircraftModel(const QString &modelString);
protected: protected:
BlackMisc::IInterpolator *m_interpolator = nullptr; //!< interpolator instance BlackMisc::IInterpolator *m_interpolator = nullptr; //!< interpolator instance
bool m_pausedSimFreezesInterpolation = false; //!< paused simulator will also pause interpolation (so AI aircraft will hold) bool m_pausedSimFreezesInterpolation = false; //!< paused simulator will also pause interpolation (so AI aircraft will hold)
@@ -137,6 +143,10 @@ namespace BlackCore
//! Lookup against DB data //! Lookup against DB data
static BlackMisc::Simulation::CAircraftModel reverseLookupModel(const BlackMisc::Simulation::CAircraftModel &model); static BlackMisc::Simulation::CAircraftModel reverseLookupModel(const BlackMisc::Simulation::CAircraftModel &model);
private slots:
//! All swift data read from DB
void ps_allSwiftDataRead();
private: private:
bool m_debugMessages = false; //!< Display debug messages bool m_debugMessages = false; //!< Display debug messages
bool m_blinkCycle = false; //!< use for highlighting bool m_blinkCycle = false; //!< use for highlighting

View File

@@ -170,6 +170,11 @@ namespace BlackCore
return false; return false;
} }
bool CWebDataServices::hasDbAircraftData() const
{
return (this->getModelsCount() > 0) && (this->getLiveriesCount() > 0) && (this->getDistributorsCount() > 0) && (this->getAircraftIcaoCodesCount() > 0);
}
void CWebDataServices::synchronizeDbCaches(CEntityFlags::Entity entities) void CWebDataServices::synchronizeDbCaches(CEntityFlags::Entity entities)
{ {
if (this->m_infoDataReader) { this->m_infoDataReader->synchronizeCaches(entities); } if (this->m_infoDataReader) { this->m_infoDataReader->synchronizeCaches(entities); }

View File

@@ -336,6 +336,9 @@ namespace BlackCore
//! Can connect to swift DB? //! Can connect to swift DB?
bool canConnectSwiftDb() const; bool canConnectSwiftDb() const;
//! All DB data for an aircraft entity available?
bool hasDbAircraftData() const;
//! Synchronize all DB caches //! Synchronize all DB caches
void synchronizeDbCaches(BlackMisc::Network::CEntityFlags::Entity entities); void synchronizeDbCaches(BlackMisc::Network::CEntityFlags::Entity entities);

View File

@@ -320,7 +320,7 @@ namespace BlackSimPlugin
{ {
MPChangePlayerPlane mpChangePlayerPlane; MPChangePlayerPlane mpChangePlayerPlane;
MultiPlayerPacketParser::readMessage(message, mpChangePlayerPlane); MultiPlayerPacketParser::readMessage(message, mpChangePlayerPlane);
setOwnAircraftModel(mpChangePlayerPlane.aircraft_name); reverseLookupAndUpdateOwnAircraftModel(mpChangePlayerPlane.aircraft_name);
break; break;
} }
case CFs9Sdk::MULTIPLAYER_PACKET_ID_POSITION_VELOCITY: case CFs9Sdk::MULTIPLAYER_PACKET_ID_POSITION_VELOCITY:

View File

@@ -67,27 +67,6 @@ namespace BlackSimPlugin
return m_airportsInRange; return m_airportsInRange;
} }
void CSimulatorFsCommon::setOwnAircraftModel(const QString &modelName)
{
CAircraftModel model = getOwnAircraftModel();
model.setModelString(modelName);
this->setOwnAircraftModel(model);
}
void CSimulatorFsCommon::setOwnAircraftModel(const BlackMisc::Simulation::CAircraftModel &model)
{
if (!model.hasModelString()) { return; }
if (this->getOwnAircraftModel() != model)
{
const CAircraftModel newModel = reverseLookupModel(model);
const bool updated = this->updateOwnModel(newModel); // update in provider (normally the context)
if (updated)
{
emit this->ownAircraftModelChanged(this->getOwnAircraftModel());
}
}
}
bool CSimulatorFsCommon::changeRemoteAircraftModel(const CSimulatedAircraft &aircraft) bool CSimulatorFsCommon::changeRemoteAircraftModel(const CSimulatedAircraft &aircraft)
{ {
// remove upfront, and then enable / disable again // remove upfront, and then enable / disable again

View File

@@ -66,12 +66,6 @@ namespace BlackSimPlugin
BlackMisc::Aviation::CComSystem m_simCom1; //!< cockpit COM1 state in simulator BlackMisc::Aviation::CComSystem m_simCom1; //!< cockpit COM1 state in simulator
BlackMisc::Aviation::CComSystem m_simCom2; //!< cockpit COM2 state in simulator BlackMisc::Aviation::CComSystem m_simCom2; //!< cockpit COM2 state in simulator
BlackMisc::Aviation::CTransponder m_simTransponder; //!< cockpit xpdr state in simulator BlackMisc::Aviation::CTransponder m_simTransponder; //!< cockpit xpdr state in simulator
//! Set own model
void setOwnAircraftModel(const BlackMisc::Simulation::CAircraftModel &model);
//! Set own model
void setOwnAircraftModel(const QString &modelName);
}; };
} // namespace } // namespace
} // namespace } // namespace

View File

@@ -172,7 +172,7 @@ namespace BlackSimPlugin
CAircraftModel model; CAircraftModel model;
model.setModelString(dataDefinitionModel->title); model.setModelString(dataDefinitionModel->title);
model.setModelType(CAircraftModel::TypeOwnSimulatorModel); model.setModelType(CAircraftModel::TypeOwnSimulatorModel);
simulatorFsx->setOwnAircraftModel(model); simulatorFsx->reverseLookupAndUpdateOwnAircraftModel(model);
break; break;
} }
case CSimConnectDefinitions::RequestSimEnvironment: case CSimConnectDefinitions::RequestSimEnvironment:

View File

@@ -310,9 +310,7 @@ namespace BlackSimPlugin
model.setFileName(path + "/" + filename); model.setFileName(path + "/" + filename);
model.setLivery(CLivery("XPLANE." + livery, airlineIcaoCode, "XP livery", "", "", false)); model.setLivery(CLivery("XPLANE." + livery, airlineIcaoCode, "XP livery", "", "", false));
// updated model. this->reverseLookupAndUpdateOwnAircraftModel(model);
// Hint: will update in own model context by using reverse lookup
emit ownAircraftModelChanged(model);
} }
void CSimulatorXPlane::displayStatusMessage(const BlackMisc::CStatusMessage &message) const void CSimulatorXPlane::displayStatusMessage(const BlackMisc::CStatusMessage &message) const