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

@@ -314,23 +314,6 @@ namespace BlackSimPlugin
return CSimulatorCommon::physicallyRemoveAllRemoteAircraft();
}
void CSimulatorEmulated::onRemoteProviderAddedAircraftSituation(const CAircraftSituation &situation)
{
const CCallsign cs = situation.getCallsign();
if (!m_interpolators.contains(cs)) { return; }
CInterpolatorMulti *im = m_interpolators[cs];
Q_ASSERT_X(im, Q_FUNC_INFO, "no interpolator");
im->addAircraftSituation(situation);
}
void BlackSimPlugin::Emulated::CSimulatorEmulated::onRemoteProviderAddedAircraftParts(const CCallsign &callsign, const CAircraftParts &parts)
{
if (!m_interpolators.contains(callsign)) { return; }
CInterpolatorMulti *im = m_interpolators[callsign];
Q_ASSERT_X(im, Q_FUNC_INFO, "no interpolator");
im->addAircraftParts(parts);
}
bool CSimulatorEmulated::parseDetails(const CSimpleCommandParser &parser)
{
if (m_monitorWidget && parser.isKnownCommand())

View File

@@ -124,12 +124,6 @@ namespace BlackSimPlugin
// just logged
virtual int physicallyRemoveAllRemoteAircraft() override;
//! \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::CSimulatorCommon::parseDetails
virtual bool parseDetails(const BlackMisc::CSimpleCommandParser &parser) override;

View File

@@ -205,8 +205,8 @@ namespace BlackSimPlugin
if (!m_simulator) { return; }
ui->le_PhysicallyAddedAircraft->setText(QString::number(m_simulator->getStatisticsPhysicallyAddedAircraft()));
ui->le_PhysicallyRemovedAircraft->setText(QString::number(m_simulator->getStatisticsPhysicallyRemovedAircraft()));
ui->le_SituationAdded->setText(QString::number(m_simulator->getStatisticsSituationAdded()));
ui->le_PartsAdded->setText(QString::number(m_simulator->getStatisticsPartsAdded()));
// ui->le_SituationAdded->setText(QString::number(m_simulator->getStatisticsSituationAdded()));
// ui->le_PartsAdded->setText(QString::number(m_simulator->getStatisticsPartsAdded()));
ui->le_AircraftRendered->setText(QString::number(m_simulator->m_renderedAircraft.size()));
ui->le_PartsEnabledAircraft->setText(QString::number(m_simulator->getRemoteAircraftSupportingPartsCount()));
}

View File

@@ -415,20 +415,6 @@ namespace BlackSimPlugin
m_fsuipc->write(weatherGrid);
}
void CSimulatorFs9::onRemoteProviderAddedAircraftSituation(const CAircraftSituation &situation)
{
const auto it = m_hashFs9Clients.find(situation.getCallsign());
if (it == m_hashFs9Clients.end()) { return; }
QTimer::singleShot(0, it->data(), [client = *it, situation] { client->getInterpolator()->addAircraftSituation(situation); });
}
void CSimulatorFs9::onRemoteProviderAddedAircraftParts(const BlackMisc::Aviation::CCallsign &callsign, const CAircraftParts &parts)
{
const auto it = m_hashFs9Clients.find(callsign);
if (it == m_hashFs9Clients.end()) { return; }
QTimer::singleShot(0, it->data(), [client = *it, parts] { client->getInterpolator()->addAircraftParts(parts); });
}
CSimulatorFs9Listener::CSimulatorFs9Listener(const CSimulatorPluginInfo &info,
const QSharedPointer<CFs9Host> &fs9Host,
const QSharedPointer<CLobbyClient> &lobbyClient) :

View File

@@ -80,12 +80,6 @@ namespace BlackSimPlugin
virtual void injectWeatherGrid(const BlackMisc::Weather::CWeatherGrid &weatherGrid) override;
//! @}
//! \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;
//! @}
private:
//! Dispatch FSUIPC reading
//! \remark very frequently called

View File

@@ -28,38 +28,6 @@ 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()); }
}
CSimConnectObject::CSimConnectObject(const CAircraftSituation &situation) :
m_interpolator(QSharedPointer<CInterpolatorMulti>::create(situation.getCallsign()))
{
if (situation.hasValidTimestamp()) { this->addAircraftSituation(situation); }
}
CSimConnectObject::CSimConnectObject(const CAircraftParts &parts, const CCallsign &callsign) :
m_interpolator(QSharedPointer<CInterpolatorMulti>::create(callsign))
{
if (parts.hasValidTimestamp()) { this->addAircraftParts(parts); }
}
void CSimConnectObject::addAircraftParts(const CAircraftParts &parts)
{
Q_ASSERT(m_interpolator);
Q_ASSERT(parts.hasValidTimestamp());
m_interpolator->addAircraftParts(parts);
m_aircraft.setParts(parts);
}
void CSimConnectObject::addAircraftSituation(const CAircraftSituation &situation)
{
Q_ASSERT(m_interpolator);
Q_ASSERT(situation.hasValidTimestamp());
m_interpolator->addAircraftSituation(situation);
m_aircraft.setSituation(situation); // update with last situation
}
void CSimConnectObject::invalidatePartsAsSent()

View File

@@ -34,12 +34,6 @@ namespace BlackSimPlugin
DWORD requestId,
BlackMisc::Simulation::CInterpolationLogger *logger);
//! Constructor providing initial situation
CSimConnectObject(const BlackMisc::Aviation::CAircraftSituation &situation);
//! Constructor providing initial parts
CSimConnectObject(const BlackMisc::Aviation::CAircraftParts &parts, const BlackMisc::Aviation::CCallsign &callsign);
//! Destructor
~CSimConnectObject() {}
@@ -55,12 +49,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);
//! Get current lights (requested from simulator)
const BlackMisc::Aviation::CAircraftLights &getCurrentLightsInSimulator() const { return m_currentLightsInSim; }

View File

@@ -1465,46 +1465,6 @@ namespace BlackSimPlugin
CSimulatorFsCommon::clearAllRemoteAircraftData();
}
void CSimulatorFsxCommon::onRemoteProviderAddedAircraftSituation(const CAircraftSituation &situation)
{
if (m_simConnectObjects.contains(situation.getCallsign()))
{
m_simConnectObjects[situation.getCallsign()].addAircraftSituation(situation);
}
else
{
// trace for future usage
if (m_simConnectObjectsPositionAndPartsTraces.contains(situation.getCallsign()))
{
m_simConnectObjectsPositionAndPartsTraces[situation.getCallsign()].addAircraftSituation(situation);
}
else
{
m_simConnectObjectsPositionAndPartsTraces.insert(situation.getCallsign(), CSimConnectObject(situation));
}
}
}
void CSimulatorFsxCommon::onRemoteProviderAddedAircraftParts(const CCallsign &callsign, const CAircraftParts &parts)
{
if (m_simConnectObjects.contains(callsign))
{
m_simConnectObjects[callsign].addAircraftParts(parts);
}
else
{
// trace for future usage
if (m_simConnectObjectsPositionAndPartsTraces.contains(callsign))
{
m_simConnectObjectsPositionAndPartsTraces[callsign].addAircraftParts(parts);
}
else
{
m_simConnectObjectsPositionAndPartsTraces.insert(callsign, CSimConnectObject(parts, callsign));
}
}
}
QString CSimulatorFsxCommon::fsxPositionToString(const SIMCONNECT_DATA_INITPOSITION &position)
{
static const QString positionStr("Lat: %1deg lng: %2deg alt: %3ft pitch: %4deg bank: %5deg hdg: %6deg airspeed: %7kts onGround: %8");

View File

@@ -148,12 +148,6 @@ namespace BlackSimPlugin
virtual void injectWeatherGrid(const BlackMisc::Weather::CWeatherGrid &weatherGrid) override;
//! @}
//! \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;
//! @}
//! Timer event (our SimConnect event loop), runs dispatch
//! \sa m_timerId
//! \sa CSimulatorFsxCommon::dispatch

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; }