Ref T259, Ref T243 added functions to use guessed parts in

* sim object
* XPlane aircraft
* forward aircraft model to interpolator for guessing
This commit is contained in:
Klaus Basan
2018-04-06 00:34:14 +02:00
committed by Roland Winklmeier
parent e3d17859a0
commit f1faeef84a
6 changed files with 36 additions and 29 deletions

View File

@@ -24,11 +24,13 @@ namespace BlackSimPlugin
CSimConnectObject::CSimConnectObject(const CSimulatedAircraft &aircraft,
DWORD requestId,
ISimulationEnvironmentProvider *p1, IInterpolationSetupProvider *p2, IRemoteAircraftProvider *p3,
ISimulationEnvironmentProvider *simEnvProvider, IInterpolationSetupProvider *setupProvider, IRemoteAircraftProvider *remoteAircraftProvider,
CInterpolationLogger *logger) :
m_aircraft(aircraft), m_requestId(requestId), m_validRequestId(true),
m_interpolator(QSharedPointer<CInterpolatorMulti>::create(aircraft.getCallsign(), p1, p2, p3, logger))
{ }
m_interpolator(QSharedPointer<CInterpolatorMulti>::create(aircraft.getCallsign(), simEnvProvider, setupProvider, remoteAircraftProvider, logger))
{
m_interpolator->initCorrespondingModel(aircraft.getModel());
}
void CSimConnectObject::invalidatePartsAsSent()
{
@@ -146,6 +148,15 @@ namespace BlackSimPlugin
return m_interpolator->getInterpolatedParts(currentTimeSinceEpoc, setup, partsStatus, log);
}
CAircraftParts CSimConnectObject::getInterpolatedOrGuessedParts(
qint64 currentTimeSinceEpoc,
const CInterpolationAndRenderingSetupPerCallsign &setup,
CPartsStatus &partsStatus, bool log) const
{
Q_ASSERT(m_interpolator);
return m_interpolator->getInterpolatedOrGuessedParts(currentTimeSinceEpoc, setup, partsStatus, log);
}
const CAircraftSituation &CSimConnectObject::getLastInterpolatedSituation() const
{
if (!m_interpolator) { return CAircraftSituation::null(); }

View File

@@ -32,7 +32,8 @@ namespace BlackSimPlugin
//! Constructor providing initial situation/parts
CSimConnectObject(const BlackMisc::Simulation::CSimulatedAircraft &aircraft,
DWORD requestId,
BlackMisc::Simulation::ISimulationEnvironmentProvider *p1, BlackMisc::Simulation::IInterpolationSetupProvider *p2, BlackMisc::Simulation::IRemoteAircraftProvider *p3,
BlackMisc::Simulation::ISimulationEnvironmentProvider *simEnvProvider, BlackMisc::Simulation::IInterpolationSetupProvider *setupProvider,
BlackMisc::Simulation::IRemoteAircraftProvider *remoteAircraftProvider,
BlackMisc::Simulation::CInterpolationLogger *logger);
//! Destructor
@@ -134,6 +135,9 @@ namespace BlackSimPlugin
//! VTOL?
bool isVtol() const { return m_aircraft.isVtol(); }
//! Engine count
int getEngineCount() const { return m_aircraft.getEnginesCount(); }
//! Was the object really added to simulator
bool hasValidRequestAndObjectId() const;
@@ -161,6 +165,12 @@ namespace BlackSimPlugin
const BlackMisc::Simulation::CInterpolationAndRenderingSetupPerCallsign &setup,
BlackMisc::Simulation::CPartsStatus &partsStatus, bool log) const;
//! \copydoc BlackMisc::Simulation::CInterpolator::getInterpolatedOrGuessedParts
BlackMisc::Aviation::CAircraftParts getInterpolatedOrGuessedParts(
qint64 currentTimeSinceEpoc,
const BlackMisc::Simulation::CInterpolationAndRenderingSetupPerCallsign &setup,
BlackMisc::Simulation::CPartsStatus &partsStatus, bool log) const;
//! Last interpolated situation
const BlackMisc::Aviation::CAircraftSituation &getLastInterpolatedSituation() const;

View File

@@ -686,23 +686,25 @@ namespace BlackSimPlugin
const qint64 currentTimestamp = QDateTime::currentMSecsSinceEpoch();
// interpolation for all remote aircraft
const QList<CXPlaneMPAircraft> xplaneAircrafts(m_xplaneAircraftObjects.values());
for (const CXPlaneMPAircraft &xplaneAircraft : xplaneAircrafts)
const QList<CXPlaneMPAircraft> xplaneAircraftList(m_xplaneAircraftObjects.values());
for (const CXPlaneMPAircraft &xplaneAircraft : xplaneAircraftList)
{
const CCallsign callsign(xplaneAircraft.getCallsign());
Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "missing callsign");
// fetch parts, as they are needed for ground interpolation
// setup
const CInterpolationAndRenderingSetupPerCallsign setup = this->getInterpolationSetupPerCallsignOrDefault(callsign);
const bool useAircraftParts = aircraftWithParts.contains(callsign) && setup.isAircraftPartsEnabled();
const bool logInterpolationAndParts = setup.logInterpolation();
CPartsStatus partsStatus(useAircraftParts);
const CAircraftParts parts = useAircraftParts ? xplaneAircraft.getInterpolatedParts(currentTimestamp, setup, partsStatus, logInterpolationAndParts) : CAircraftParts();
// get interpolated situation
// interpolated situation
CInterpolationStatus interpolatorStatus;
const CAircraftSituation interpolatedSituation = xplaneAircraft.getInterpolatedSituation(currentTimestamp, setup, interpolatorStatus);
// perts
const CAircraftParts parts = useAircraftParts ? xplaneAircraft.getInterpolatedParts(currentTimestamp, setup, partsStatus, logInterpolationAndParts) : CAircraftParts::guessedParts(interpolatedSituation, xplaneAircraft.isVtol(), xplaneAircraft.getEngineCount());
if (interpolatorStatus.hasValidSituation())
{
// update situation
@@ -729,14 +731,6 @@ namespace BlackSimPlugin
{
this->updateRemoteAircraftParts(xplaneAircraft, parts, partsStatus);
}
else
{
// guess on position, but not every frame
if (m_interpolationRequest % GuessRemoteAircraftPartsCycle == 0)
{
this->guessAndUpdateRemoteAircraftParts(xplaneAircraft, interpolatedSituation, interpolatorStatus);
}
}
} // all callsigns
const qint64 dt = QDateTime::currentMSecsSinceEpoch() - currentTimestamp;
@@ -751,14 +745,6 @@ namespace BlackSimPlugin
return this->sendRemoteAircraftPartsToSimulator(xplaneAircraft, parts);
}
bool CSimulatorXPlane::guessAndUpdateRemoteAircraftParts(const CXPlaneMPAircraft &xplaneAircraft, const CAircraftSituation &interpolatedSituation, const CInterpolationStatus &interpolationStatus)
{
if (!interpolationStatus.isInterpolated()) { return false; }
const CAircraftParts parts = CAircraftParts::guessedParts(interpolatedSituation, xplaneAircraft.isVtol());
return this->sendRemoteAircraftPartsToSimulator(xplaneAircraft, parts);
}
bool CSimulatorXPlane::sendRemoteAircraftPartsToSimulator(const CXPlaneMPAircraft &xplaneAircraft, const CAircraftParts &parts)
{
// same as in simulator or same as already send to simulator?

View File

@@ -181,10 +181,6 @@ namespace BlackSimPlugin
bool updateRemoteAircraftParts(const CXPlaneMPAircraft &xplaneAircraft,
const BlackMisc::Aviation::CAircraftParts &parts, const BlackMisc::Simulation::CPartsStatus &partsStatus);
//! Update remote aircraft parts by guessing (send to XSwiftBus)
bool guessAndUpdateRemoteAircraftParts(const CXPlaneMPAircraft &xplaneAircraft,
const BlackMisc::Aviation::CAircraftSituation &interpolatedSituation, const BlackMisc::Simulation::CInterpolationStatus &interpolationStatus);
//! Send parts to simulator
bool sendRemoteAircraftPartsToSimulator(const CXPlaneMPAircraft &xplaneAircraft, const BlackMisc::Aviation::CAircraftParts &parts);

View File

@@ -28,6 +28,7 @@ namespace BlackSimPlugin
m_interpolator(QSharedPointer<CInterpolatorMulti>::create(aircraft.getCallsign(), simulator, simulator, simulator->getRemoteAircraftProvider(), logger))
{
m_interpolator->attachLogger(logger);
m_interpolator->initCorrespondingModel(aircraft.getModel());
}
bool CXPlaneMPAircraft::isSameAsSent(const CAircraftSituation &position) const

View File

@@ -67,6 +67,9 @@ namespace BlackSimPlugin
//! VTOL?
bool isVtol() const { return m_aircraft.isVtol(); }
//! Engine count
int getEngineCount() const { return m_aircraft.getEnginesCount(); }
//! \copydoc BlackMisc::Simulation::CInterpolatorMulti::toggleMode
void toggleInterpolatorMode();