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, CSimConnectObject::CSimConnectObject(const CSimulatedAircraft &aircraft,
DWORD requestId, DWORD requestId,
ISimulationEnvironmentProvider *p1, IInterpolationSetupProvider *p2, IRemoteAircraftProvider *p3, ISimulationEnvironmentProvider *simEnvProvider, IInterpolationSetupProvider *setupProvider, IRemoteAircraftProvider *remoteAircraftProvider,
CInterpolationLogger *logger) : CInterpolationLogger *logger) :
m_aircraft(aircraft), m_requestId(requestId), m_validRequestId(true), 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() void CSimConnectObject::invalidatePartsAsSent()
{ {
@@ -146,6 +148,15 @@ namespace BlackSimPlugin
return m_interpolator->getInterpolatedParts(currentTimeSinceEpoc, setup, partsStatus, log); 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 const CAircraftSituation &CSimConnectObject::getLastInterpolatedSituation() const
{ {
if (!m_interpolator) { return CAircraftSituation::null(); } if (!m_interpolator) { return CAircraftSituation::null(); }

View File

@@ -32,7 +32,8 @@ namespace BlackSimPlugin
//! Constructor providing initial situation/parts //! Constructor providing initial situation/parts
CSimConnectObject(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, CSimConnectObject(const BlackMisc::Simulation::CSimulatedAircraft &aircraft,
DWORD requestId, 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); BlackMisc::Simulation::CInterpolationLogger *logger);
//! Destructor //! Destructor
@@ -134,6 +135,9 @@ namespace BlackSimPlugin
//! VTOL? //! VTOL?
bool isVtol() const { return m_aircraft.isVtol(); } bool isVtol() const { return m_aircraft.isVtol(); }
//! Engine count
int getEngineCount() const { return m_aircraft.getEnginesCount(); }
//! Was the object really added to simulator //! Was the object really added to simulator
bool hasValidRequestAndObjectId() const; bool hasValidRequestAndObjectId() const;
@@ -161,6 +165,12 @@ namespace BlackSimPlugin
const BlackMisc::Simulation::CInterpolationAndRenderingSetupPerCallsign &setup, const BlackMisc::Simulation::CInterpolationAndRenderingSetupPerCallsign &setup,
BlackMisc::Simulation::CPartsStatus &partsStatus, bool log) const; 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 //! Last interpolated situation
const BlackMisc::Aviation::CAircraftSituation &getLastInterpolatedSituation() const; const BlackMisc::Aviation::CAircraftSituation &getLastInterpolatedSituation() const;

View File

@@ -686,23 +686,25 @@ namespace BlackSimPlugin
const qint64 currentTimestamp = QDateTime::currentMSecsSinceEpoch(); const qint64 currentTimestamp = QDateTime::currentMSecsSinceEpoch();
// interpolation for all remote aircraft // interpolation for all remote aircraft
const QList<CXPlaneMPAircraft> xplaneAircrafts(m_xplaneAircraftObjects.values()); const QList<CXPlaneMPAircraft> xplaneAircraftList(m_xplaneAircraftObjects.values());
for (const CXPlaneMPAircraft &xplaneAircraft : xplaneAircrafts) for (const CXPlaneMPAircraft &xplaneAircraft : xplaneAircraftList)
{ {
const CCallsign callsign(xplaneAircraft.getCallsign()); const CCallsign callsign(xplaneAircraft.getCallsign());
Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "missing callsign"); 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 CInterpolationAndRenderingSetupPerCallsign setup = this->getInterpolationSetupPerCallsignOrDefault(callsign);
const bool useAircraftParts = aircraftWithParts.contains(callsign) && setup.isAircraftPartsEnabled(); const bool useAircraftParts = aircraftWithParts.contains(callsign) && setup.isAircraftPartsEnabled();
const bool logInterpolationAndParts = setup.logInterpolation(); const bool logInterpolationAndParts = setup.logInterpolation();
CPartsStatus partsStatus(useAircraftParts); CPartsStatus partsStatus(useAircraftParts);
const CAircraftParts parts = useAircraftParts ? xplaneAircraft.getInterpolatedParts(currentTimestamp, setup, partsStatus, logInterpolationAndParts) : CAircraftParts();
// get interpolated situation // interpolated situation
CInterpolationStatus interpolatorStatus; CInterpolationStatus interpolatorStatus;
const CAircraftSituation interpolatedSituation = xplaneAircraft.getInterpolatedSituation(currentTimestamp, setup, 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()) if (interpolatorStatus.hasValidSituation())
{ {
// update situation // update situation
@@ -729,14 +731,6 @@ namespace BlackSimPlugin
{ {
this->updateRemoteAircraftParts(xplaneAircraft, parts, partsStatus); 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 } // all callsigns
const qint64 dt = QDateTime::currentMSecsSinceEpoch() - currentTimestamp; const qint64 dt = QDateTime::currentMSecsSinceEpoch() - currentTimestamp;
@@ -751,14 +745,6 @@ namespace BlackSimPlugin
return this->sendRemoteAircraftPartsToSimulator(xplaneAircraft, parts); 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) bool CSimulatorXPlane::sendRemoteAircraftPartsToSimulator(const CXPlaneMPAircraft &xplaneAircraft, const CAircraftParts &parts)
{ {
// same as in simulator or same as already send to simulator? // same as in simulator or same as already send to simulator?

View File

@@ -181,10 +181,6 @@ namespace BlackSimPlugin
bool updateRemoteAircraftParts(const CXPlaneMPAircraft &xplaneAircraft, bool updateRemoteAircraftParts(const CXPlaneMPAircraft &xplaneAircraft,
const BlackMisc::Aviation::CAircraftParts &parts, const BlackMisc::Simulation::CPartsStatus &partsStatus); 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 //! Send parts to simulator
bool sendRemoteAircraftPartsToSimulator(const CXPlaneMPAircraft &xplaneAircraft, const BlackMisc::Aviation::CAircraftParts &parts); 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(QSharedPointer<CInterpolatorMulti>::create(aircraft.getCallsign(), simulator, simulator, simulator->getRemoteAircraftProvider(), logger))
{ {
m_interpolator->attachLogger(logger); m_interpolator->attachLogger(logger);
m_interpolator->initCorrespondingModel(aircraft.getModel());
} }
bool CXPlaneMPAircraft::isSameAsSent(const CAircraftSituation &position) const bool CXPlaneMPAircraft::isSameAsSent(const CAircraftSituation &position) const

View File

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