From 3f5139d717c67d5580def54d246310b3486effff Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Mon, 9 Jan 2017 18:41:50 +0000 Subject: [PATCH] refs #852 IInterpolator::getPartsBeforeTime renamed to getInterpolatedParts and returns a single CAircraftParts object, not a list. --- src/blackmisc/simulation/interpolator.cpp | 11 +++--- src/blackmisc/simulation/interpolator.h | 4 +-- src/plugins/simulator/fsx/simulatorfsx.cpp | 42 ++++++++++------------ src/plugins/simulator/fsx/simulatorfsx.h | 2 +- tests/blackmisc/testinterpolator.cpp | 8 ++--- 5 files changed, 32 insertions(+), 35 deletions(-) diff --git a/src/blackmisc/simulation/interpolator.cpp b/src/blackmisc/simulation/interpolator.cpp index 2efed3e4b..35f3c9227 100644 --- a/src/blackmisc/simulation/interpolator.cpp +++ b/src/blackmisc/simulation/interpolator.cpp @@ -39,23 +39,24 @@ namespace BlackMisc return currentSituation; } - CAircraftPartsList IInterpolator::getPartsBeforeTime(const CAircraftPartsList &parts, qint64 cutoffTime, IInterpolator::PartsStatus &partsStatus) const + CAircraftParts IInterpolator::getInterpolatedParts(const CAircraftPartsList &parts, qint64 currentTimeMsSinceEpoch, IInterpolator::PartsStatus &partsStatus) const { partsStatus.reset(); partsStatus.setSupportsParts(true); - if (cutoffTime < 0) { return parts; } - return parts.findBefore(cutoffTime); + if (parts.isEmpty()) { return {}; } + if (currentTimeMsSinceEpoch < 0) { return parts.front(); } + return parts.findBefore(currentTimeMsSinceEpoch).front(); } - CAircraftPartsList IInterpolator::getPartsBeforeTime(const CCallsign &callsign, qint64 cutoffTime, IInterpolator::PartsStatus &partsStatus) const + CAircraftParts IInterpolator::getInterpolatedParts(const CCallsign &callsign, qint64 currentTimeMsSinceEpoch, IInterpolator::PartsStatus &partsStatus) const { Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "empty callsign"); partsStatus.reset(); partsStatus.setSupportsParts(this->isRemoteAircraftSupportingParts(callsign)); if (!partsStatus.isSupportingParts()) { return {}; } - return this->remoteAircraftParts(callsign, cutoffTime); + return this->getInterpolatedParts(this->remoteAircraftParts(callsign, -1), currentTimeMsSinceEpoch, partsStatus); } void IInterpolator::setInterpolatorSetup(const CInterpolationAndRenderingSetup &setup) diff --git a/src/blackmisc/simulation/interpolator.h b/src/blackmisc/simulation/interpolator.h index a643d96dc..e3008e280 100644 --- a/src/blackmisc/simulation/interpolator.h +++ b/src/blackmisc/simulation/interpolator.h @@ -105,13 +105,13 @@ namespace BlackMisc //! Parts before given offset time (aka pending parts) //! \threadsafe - virtual BlackMisc::Aviation::CAircraftPartsList getPartsBeforeTime( + virtual BlackMisc::Aviation::CAircraftParts getInterpolatedParts( const BlackMisc::Aviation::CAircraftPartsList &parts, qint64 cutoffTime, PartsStatus &partsStatus) const; //! Parts before given offset time (aka pending parts) //! \threadsafe - virtual BlackMisc::Aviation::CAircraftPartsList getPartsBeforeTime( + virtual BlackMisc::Aviation::CAircraftParts getInterpolatedParts( const BlackMisc::Aviation::CCallsign &callsign, qint64 cutoffTime, PartsStatus &partsStatus) const; diff --git a/src/plugins/simulator/fsx/simulatorfsx.cpp b/src/plugins/simulator/fsx/simulatorfsx.cpp index 19b7f551d..764451021 100644 --- a/src/plugins/simulator/fsx/simulatorfsx.cpp +++ b/src/plugins/simulator/fsx/simulatorfsx.cpp @@ -903,8 +903,8 @@ namespace BlackSimPlugin // situation is used to anticipate parts if other client does not send them if (enableAircraftParts) { - CAircraftPartsList parts; - parts = this->m_interpolator->getPartsBeforeTime(callsign, interpolatedSituation.getMSecsSinceEpoch(), partsStatus); + CAircraftParts parts; + parts = this->m_interpolator->getInterpolatedParts(callsign, interpolatedSituation.getMSecsSinceEpoch(), partsStatus); updateRemoteAircraftParts(simObj, parts, partsStatus, interpolatedSituation, isOnGround); // update and retrieve parts in the same step } } @@ -916,7 +916,7 @@ namespace BlackSimPlugin m_statsUpdateAircraftTimeAvgMs = m_statsUpdateAircraftTimeTotalMs / m_statsUpdateAircraftCountMs; } - bool CSimulatorFsx::updateRemoteAircraftParts(const CSimConnectObject &simObj, const CAircraftPartsList &parts, IInterpolator::PartsStatus partsStatus, const CAircraftSituation &interpolatedSituation, bool isOnGround) const + bool CSimulatorFsx::updateRemoteAircraftParts(const CSimConnectObject &simObj, const CAircraftParts &parts, IInterpolator::PartsStatus partsStatus, const CAircraftSituation &interpolatedSituation, bool isOnGround) const { if (!simObj.hasValidRequestAndObjectId()) { return false; } @@ -924,27 +924,23 @@ namespace BlackSimPlugin DataDefinitionRemoteAircraftParts ddRemoteAircraftParts; if (partsStatus.isSupportingParts()) { - // parts is supported, but do we need to update? - if (parts.isEmpty()) { return false; } - // we have parts - CAircraftParts newestParts = parts.front(); - ddRemoteAircraftParts.lightStrobe = newestParts.getLights().isStrobeOn() ? 1 : 0; - ddRemoteAircraftParts.lightLanding = newestParts.getLights().isLandingOn() ? 1 : 0; - // ddRemoteAircraftParts.lightTaxi = newestParts.getLights().isTaxiOn() ? 1 : 0; - ddRemoteAircraftParts.lightBeacon = newestParts.getLights().isBeaconOn() ? 1 : 0; - ddRemoteAircraftParts.lightNav = newestParts.getLights().isNavOn() ? 1 : 0; - ddRemoteAircraftParts.lightLogo = newestParts.getLights().isLogoOn() ? 1 : 0; - ddRemoteAircraftParts.flapsLeadingEdgeLeftPercent = newestParts.getFlapsPercent() / 100.0; - ddRemoteAircraftParts.flapsLeadingEdgeRightPercent = newestParts.getFlapsPercent() / 100.0; - ddRemoteAircraftParts.flapsTrailingEdgeLeftPercent = newestParts.getFlapsPercent() / 100.0; - ddRemoteAircraftParts.flapsTrailingEdgeRightPercent = newestParts.getFlapsPercent() / 100.0; - ddRemoteAircraftParts.spoilersHandlePosition = newestParts.isSpoilersOut() ? 1 : 0; - ddRemoteAircraftParts.gearHandlePosition = isOnGround || newestParts.isGearDown() ? 1 : 0; // on ground we always show gear - ddRemoteAircraftParts.engine1Combustion = newestParts.isEngineOn(1) ? 1 : 0; - ddRemoteAircraftParts.engine2Combustion = newestParts.isEngineOn(2) ? 1 : 0; - ddRemoteAircraftParts.engine3Combustion = newestParts.isEngineOn(3) ? 1 : 0; - ddRemoteAircraftParts.engine4Combustion = newestParts.isEngineOn(4) ? 1 : 0; + ddRemoteAircraftParts.lightStrobe = parts.getLights().isStrobeOn() ? 1 : 0; + ddRemoteAircraftParts.lightLanding = parts.getLights().isLandingOn() ? 1 : 0; + // ddRemoteAircraftParts.lightTaxi = parts.getLights().isTaxiOn() ? 1 : 0; + ddRemoteAircraftParts.lightBeacon = parts.getLights().isBeaconOn() ? 1 : 0; + ddRemoteAircraftParts.lightNav = parts.getLights().isNavOn() ? 1 : 0; + ddRemoteAircraftParts.lightLogo = parts.getLights().isLogoOn() ? 1 : 0; + ddRemoteAircraftParts.flapsLeadingEdgeLeftPercent = parts.getFlapsPercent() / 100.0; + ddRemoteAircraftParts.flapsLeadingEdgeRightPercent = parts.getFlapsPercent() / 100.0; + ddRemoteAircraftParts.flapsTrailingEdgeLeftPercent = parts.getFlapsPercent() / 100.0; + ddRemoteAircraftParts.flapsTrailingEdgeRightPercent = parts.getFlapsPercent() / 100.0; + ddRemoteAircraftParts.spoilersHandlePosition = parts.isSpoilersOut() ? 1 : 0; + ddRemoteAircraftParts.gearHandlePosition = isOnGround || parts.isGearDown() ? 1 : 0; // on ground we always show gear + ddRemoteAircraftParts.engine1Combustion = parts.isEngineOn(1) ? 1 : 0; + ddRemoteAircraftParts.engine2Combustion = parts.isEngineOn(2) ? 1 : 0; + ddRemoteAircraftParts.engine3Combustion = parts.isEngineOn(3) ? 1 : 0; + ddRemoteAircraftParts.engine4Combustion = parts.isEngineOn(4) ? 1 : 0; } else { diff --git a/src/plugins/simulator/fsx/simulatorfsx.h b/src/plugins/simulator/fsx/simulatorfsx.h index 8708935b0..9b3fbfd6c 100644 --- a/src/plugins/simulator/fsx/simulatorfsx.h +++ b/src/plugins/simulator/fsx/simulatorfsx.h @@ -168,7 +168,7 @@ namespace BlackSimPlugin void updateRemoteAircraft(); //! Update remote airacraft parts (send to FSX) - bool updateRemoteAircraftParts(const CSimConnectObject &simObj, const BlackMisc::Aviation::CAircraftPartsList &parts, + bool updateRemoteAircraftParts(const CSimConnectObject &simObj, const BlackMisc::Aviation::CAircraftParts &parts, BlackMisc::Simulation::IInterpolator::PartsStatus partsStatus, const BlackMisc::Aviation::CAircraftSituation &interpolatedSituation, bool isOnGround) const; //! Called when data about our own aircraft are received diff --git a/tests/blackmisc/testinterpolator.cpp b/tests/blackmisc/testinterpolator.cpp index ccb1b34f4..33f471d8f 100644 --- a/tests/blackmisc/testinterpolator.cpp +++ b/tests/blackmisc/testinterpolator.cpp @@ -75,7 +75,8 @@ namespace BlackMiscTest provider->insertNewSituation(s); } - for (int i = 0; i < IRemoteAircraftProvider::MaxPartsPerCallsign; i++) + constexpr int partsCount = 10; + for (int i = 0; i < partsCount; i++) { CAircraftParts p(getTestParts(i, ts, deltaT)); provider->insertNewAircraftParts(cs, p); @@ -86,7 +87,7 @@ namespace BlackMiscTest // check if all situations / parts have been received QVERIFY2(provider->remoteAircraftSituations(cs).size() == IRemoteAircraftProvider::MaxSituationsPerCallsign, "Missing situations"); - QVERIFY2(provider->remoteAircraftParts(cs).size() == IRemoteAircraftProvider::MaxPartsPerCallsign, "Missing parts"); + QVERIFY2(provider->remoteAircraftParts(cs).size() == partsCount, "Missing parts"); // interpolation functional check IInterpolator::InterpolationStatus status; @@ -149,10 +150,9 @@ namespace BlackMiscTest for (qint64 currentTime = ts - 2 * deltaT; currentTime < ts; currentTime += 250) { IInterpolator::PartsStatus partsStatus; - CAircraftPartsList pl(interpolator.getPartsBeforeTime(cs, ts, partsStatus)); + CAircraftParts pl(interpolator.getInterpolatedParts(cs, ts, partsStatus)); fetchedParts++; QVERIFY2(partsStatus.isSupportingParts(), "Parts not supported"); - QVERIFY2(!pl.isEmpty(), "Parts empty"); } timeMs = timer.elapsed(); qDebug() << timeMs << "ms" << "for" << fetchedParts << "fetched parts";