Ref T259, Ref T243 remove aircraft parts and situations from interpolator

* no longer using the add parts/situations signals
* will use the remote aircraft provider parts directly

Result: all parts/situations are stored only once in memory and in one single place
This commit is contained in:
Klaus Basan
2018-03-24 17:27:16 +01:00
parent 4248c1b689
commit 9abc57bb3d
27 changed files with 140 additions and 351 deletions

View File

@@ -546,82 +546,6 @@ namespace BlackSimPlugin
return true;
}
void CSimulatorXPlane::onRemoteProviderAddedAircraftSituation(const CAircraftSituation &situation)
{
Q_ASSERT(isConnected());
if (c_driverInterpolation)
{
if (m_xplaneAircraftObjects.contains(situation.getCallsign()))
{
m_xplaneAircraftObjects[situation.getCallsign()].addAircraftSituation(situation);
}
}
else
{
using namespace PhysicalQuantities;
m_trafficProxy->addPlanePosition(situation.getCallsign().asString(),
situation.latitude().value(CAngleUnit::deg()),
situation.longitude().value(CAngleUnit::deg()),
situation.getAltitude().value(CLengthUnit::ft()),
situation.getPitch().value(CAngleUnit::deg()),
situation.getBank().value(CAngleUnit::deg()),
situation.getHeading().value(CAngleUnit::deg()),
situation.getMSecsSinceEpoch() - QDateTime::currentMSecsSinceEpoch(),
situation.getTimeOffsetMs());
if (! isRemoteAircraftSupportingParts(situation.getCallsign()))
{
// if aircraft not supporting parts then guess the basics (onGround, gear, lights)
//! \todo not working for VTOL
CAircraftParts parts;
parts.setMSecsSinceEpoch(situation.getMSecsSinceEpoch());
parts.setTimeOffsetMs(situation.getTimeOffsetMs());
if (situation.getGroundSpeed() < CSpeed(50, CSpeedUnit::kts()))
{
const auto nearestAirport = std::min_element(m_airportsInRange.cbegin(), m_airportsInRange.cend(), [&situation](auto &&a, auto &&b)
{
return calculateEuclideanDistanceSquared(situation, a) < calculateEuclideanDistanceSquared(situation, b);
});
if (nearestAirport != m_airportsInRange.cend() && situation.getAltitude() - nearestAirport->getElevation() < CLength(50, CLengthUnit::ft()))
{
parts.setOnGround(true);
parts.setGearDown(true);
}
}
if (situation.getAltitude() < CAltitude(10000, CLengthUnit::ft()))
{
parts.setLights({ true, true, true, true, true, true, true, true });
}
else
{
parts.setLights({ true, false, false, true, true, true, true, true });
}
onRemoteProviderAddedAircraftParts(situation.getCallsign(), parts);
}
}
}
void CSimulatorXPlane::onRemoteProviderAddedAircraftParts(const CCallsign &callsign, const CAircraftParts &parts)
{
Q_ASSERT(this->isConnected());
if (c_driverInterpolation)
{
if (m_xplaneAircraftObjects.contains(callsign))
{
m_xplaneAircraftObjects[callsign].addAircraftParts(parts);
}
}
else
{
m_trafficProxy->addPlaneSurfaces(callsign.asString(), parts.isGearDown() ? 1 : 0,
parts.getFlapsPercent() / 100.0, parts.isSpoilersOut() ? 1 : 0, parts.isSpoilersOut() ? 1 : 0, parts.getFlapsPercent() / 100.0,
0, parts.isAnyEngineOn() ? 0 : 0.75, 0, 0, 0,
parts.getLights().isLandingOn(), parts.getLights().isBeaconOn(), parts.getLights().isStrobeOn(), parts.getLights().isNavOn(),
0, parts.isOnGround(), parts.getMSecsSinceEpoch() - QDateTime::currentMSecsSinceEpoch(), parts.getTimeOffsetMs());
m_trafficProxy->setPlaneTransponder(callsign.asString(), 2000, true, false);
}
}
bool CSimulatorXPlane::physicallyRemoveRemoteAircraft(const CCallsign &callsign)
{
Q_ASSERT(isConnected());

View File

@@ -108,12 +108,6 @@ namespace BlackSimPlugin
static QDBusConnection connectionFromString(const QString &str);
protected:
//! \name Remote aircraft provider overrides
//! @{
virtual void onRemoteProviderAddedAircraftSituation(const BlackMisc::Aviation::CAircraftSituation &situation) override;
virtual void onRemoteProviderAddedAircraftParts(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftParts &parts) override;
//! @}
//! \copydoc BlackCore::ISimulator::isConnected
virtual bool isConnected() const override;

View File

@@ -26,39 +26,15 @@ namespace BlackSimPlugin
m_interpolator(QSharedPointer<CInterpolatorMulti>::create(aircraft.getCallsign()))
{
m_interpolator->attachLogger(logger);
// if available set situation and parts
if (aircraft.isPartsSynchronized()) { this->addAircraftParts(aircraft.getParts()); }
if (aircraft.getSituation().hasValidTimestamp()) { this->addAircraftSituation(aircraft.getSituation()); }
}
CXPlaneMPAircraft::CXPlaneMPAircraft(const CAircraftSituation &situation) :
m_interpolator(QSharedPointer<CInterpolatorMulti>::create(situation.getCallsign()))
{
if (situation.hasValidTimestamp()) { this->addAircraftSituation(situation); }
}
{ }
CXPlaneMPAircraft::CXPlaneMPAircraft(const CAircraftParts &parts, const CCallsign &callsign) :
m_interpolator(QSharedPointer<CInterpolatorMulti>::create(callsign))
{
if (parts.hasValidTimestamp()) { this->addAircraftParts(parts); }
}
void CXPlaneMPAircraft::addAircraftParts(const CAircraftParts &parts)
{
Q_ASSERT(m_interpolator);
Q_ASSERT(parts.hasValidTimestamp());
m_interpolator->addAircraftParts(parts);
m_aircraft.setParts(parts);
}
void CXPlaneMPAircraft::addAircraftSituation(const CAircraftSituation &situation)
{
Q_ASSERT(m_interpolator);
Q_ASSERT(situation.hasValidTimestamp());
m_interpolator->addAircraftSituation(situation);
m_aircraft.setSituation(situation); // update with last situation
}
{ }
bool CXPlaneMPAircraft::isSameAsSent(const CAircraftSituation &position) const
{

View File

@@ -53,12 +53,6 @@ namespace BlackSimPlugin
//! Set the aircraft
void setAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft) { m_aircraft = aircraft; }
//! Add parts for interpolator
void addAircraftParts(const BlackMisc::Aviation::CAircraftParts &parts);
//! Add situation for interpolator
void addAircraftSituation(const BlackMisc::Aviation::CAircraftSituation &situation);
//! Parts as sent to simulator
const BlackMisc::Aviation::CAircraftParts &getPartsAsSent() const { return m_partsAsSent; }