refs #865, use same function for removing outdated aircraft parts

* in airspace monitor
* in XP traffic.cpp
This commit is contained in:
Klaus Basan
2017-01-26 17:18:27 +01:00
committed by Mathew Sutcliffe
parent 309d593607
commit e3d81c6c44
4 changed files with 19 additions and 15 deletions

View File

@@ -1240,14 +1240,12 @@ namespace BlackCore
QWriteLocker lock(&m_lockParts); QWriteLocker lock(&m_lockParts);
CAircraftPartsList &partsList = this->m_partsByCallsign[callsign]; CAircraftPartsList &partsList = this->m_partsByCallsign[callsign];
partsList.push_front(parts); partsList.push_front(parts);
// remove outdated parts (but never remove the most recent one)
const auto predicate = [now = parts.getMSecsSinceEpoch()](const auto & p) { return p.getMSecsSinceEpoch() >= now - PartsPerCallsignMaxAgeInSeconds * 1000; };
const auto newEnd = std::find_if(partsList.rbegin(), partsList.rend(), predicate).base();
partsList.erase(newEnd, partsList.end());
partsList.front().setTimeOffsetMs(timeOffsetMs); partsList.front().setTimeOffsetMs(timeOffsetMs);
// remove outdated parts (but never remove the most recent one)
IRemoteAircraftProvider::removeOutdatedParts(partsList);
// aircraft supporting parts
if (!m_aircraftSupportingParts.contains(callsign)) if (!m_aircraftSupportingParts.contains(callsign))
{ {
m_aircraftSupportingParts.push_back(callsign); // mark as callsign which supports parts m_aircraftSupportingParts.push_back(callsign); // mark as callsign which supports parts

View File

@@ -118,5 +118,11 @@ namespace BlackMisc
return this->m_remoteAircraftProvider->updateAircraftEnabled(callsign, enabledForRedering); return this->m_remoteAircraftProvider->updateAircraftEnabled(callsign, enabledForRedering);
} }
void IRemoteAircraftProvider::removeOutdatedParts(CAircraftPartsList &partsList)
{
const auto predicate = [now = partsList.front().getMSecsSinceEpoch()](const auto & p) { return p.getMSecsSinceEpoch() >= now - PartsPerCallsignMaxAgeInSeconds * 1000; };
const auto newEnd = std::find_if(partsList.rbegin(), partsList.rend(), predicate).base();
partsList.erase(newEnd, partsList.end());
}
} // namespace } // namespace
} // namespace } // namespace

View File

@@ -48,7 +48,7 @@ namespace BlackMisc
{ {
public: public:
static constexpr int MaxSituationsPerCallsign = 6; //!< How many situations per callsign static constexpr int MaxSituationsPerCallsign = 6; //!< How many situations per callsign
static constexpr int PartsPerCallsignMaxAgeInSeconds = 20; //!< How many seconds to keep parts for static constexpr int PartsPerCallsignMaxAgeInSeconds = 20; //!< How many seconds to keep parts for interpolation
//! Situations per callsign //! Situations per callsign
using CSituationsPerCallsign = QHash<BlackMisc::Aviation::CCallsign, BlackMisc::Aviation::CAircraftSituationList>; using CSituationsPerCallsign = QHash<BlackMisc::Aviation::CCallsign, BlackMisc::Aviation::CAircraftSituationList>;
@@ -165,6 +165,9 @@ namespace BlackMisc
std::function<void(const BlackMisc::Aviation::CCallsign &)> removedAircraftSlot, std::function<void(const BlackMisc::Aviation::CCallsign &)> removedAircraftSlot,
std::function<void(const BlackMisc::Simulation::CAirspaceAircraftSnapshot &)> aircraftSnapshot std::function<void(const BlackMisc::Simulation::CAirspaceAircraftSnapshot &)> aircraftSnapshot
) = 0; ) = 0;
//! Remove outdated aircraft parts
void static removeOutdatedParts(Aviation::CAircraftPartsList &partsList);
}; };
//! Class which can be directly used to access an \sa IRemoteAircraftProvider object //! Class which can be directly used to access an \sa IRemoteAircraftProvider object

View File

@@ -32,7 +32,7 @@ namespace XBus
CTraffic::Plane::Plane(void *id_, QString callsign_, QString aircraftIcao_, QString airlineIcao_, QString livery_) CTraffic::Plane::Plane(void *id_, QString callsign_, QString aircraftIcao_, QString airlineIcao_, QString livery_)
: id(id_), callsign(callsign_), aircraftIcao(aircraftIcao_), airlineIcao(airlineIcao_), livery(livery_) : id(id_), callsign(callsign_), aircraftIcao(aircraftIcao_), airlineIcao(airlineIcao_), livery(livery_)
{ {
std::memset(static_cast<void*>(&surfaces), 0, sizeof(surfaces)); std::memset(static_cast<void *>(&surfaces), 0, sizeof(surfaces));
surfaces.lights.bcnLights = surfaces.lights.landLights = surfaces.lights.navLights = surfaces.lights.strbLights = 1; surfaces.lights.bcnLights = surfaces.lights.landLights = surfaces.lights.navLights = surfaces.lights.strbLights = 1;
surfaces.size = sizeof(surfaces); surfaces.size = sizeof(surfaces);
@@ -51,7 +51,7 @@ namespace XBus
BlackMisc::Simulation::CInterpolationHints hints; BlackMisc::Simulation::CInterpolationHints hints;
BlackMisc::Simulation::IInterpolator::PartsStatus status; BlackMisc::Simulation::IInterpolator::PartsStatus status;
hints.setAircraftParts(interpolator->getInterpolatedParts(callsign, parts, -1, status)); hints.setAircraftParts(interpolator->getInterpolatedParts(callsign, parts, -1, status));
hints.setElevationProvider([this](const auto &situation) hints.setElevationProvider([this](const auto & situation)
{ {
using namespace BlackMisc::PhysicalQuantities; using namespace BlackMisc::PhysicalQuantities;
using namespace BlackMisc::Aviation; using namespace BlackMisc::Aviation;
@@ -85,7 +85,7 @@ namespace XBus
auto dir = g_xplanePath + "Resources" + g_sep + "plugins" + g_sep + "xbus" + g_sep + "LegacyData" + g_sep; auto dir = g_xplanePath + "Resources" + g_sep + "plugins" + g_sep + "xbus" + g_sep + "LegacyData" + g_sep;
auto err = XPMPMultiplayerInitLegacyData(qPrintable(dir + "CSL"), qPrintable(dir + "related.txt"), auto err = XPMPMultiplayerInitLegacyData(qPrintable(dir + "CSL"), qPrintable(dir + "related.txt"),
qPrintable(dir + "lights.png"), qPrintable(dir + "Doc8643.txt"), "C172", preferences, preferences); qPrintable(dir + "lights.png"), qPrintable(dir + "Doc8643.txt"), "C172", preferences, preferences);
if (*err) { s_legacyDataOK = false; } if (*err) { s_legacyDataOK = false; }
} }
@@ -274,7 +274,7 @@ namespace XBus
} }
void CTraffic::addPlaneSurfaces(const QString &callsign, double gear, double flap, double spoiler, double speedBrake, double slat, double wingSweep, double thrust, void CTraffic::addPlaneSurfaces(const QString &callsign, double gear, double flap, double spoiler, double speedBrake, double slat, double wingSweep, double thrust,
double elevator, double rudder, double aileron, bool landLight, bool beaconLight, bool strobeLight, bool navLight, int lightPattern, bool onGround, qint64 relativeTime) double elevator, double rudder, double aileron, bool landLight, bool beaconLight, bool strobeLight, bool navLight, int lightPattern, bool onGround, qint64 relativeTime)
{ {
const auto plane = m_planesByCallsign.value(callsign, nullptr); const auto plane = m_planesByCallsign.value(callsign, nullptr);
if (plane) if (plane)
@@ -301,10 +301,7 @@ namespace XBus
plane->parts.front().setMSecsSinceEpoch(relativeTime + QDateTime::currentMSecsSinceEpoch()); plane->parts.front().setMSecsSinceEpoch(relativeTime + QDateTime::currentMSecsSinceEpoch());
// remove outdated parts (but never remove the most recent one) // remove outdated parts (but never remove the most recent one)
enum { maxAgeMs = BlackMisc::Simulation::IRemoteAircraftProvider::PartsPerCallsignMaxAgeInSeconds * 1000 }; // enum because MSVC constexpr bug BlackMisc::Simulation::IRemoteAircraftProvider::removeOutdatedParts(plane->parts);
const auto predicate = [now = plane->parts.front().getMSecsSinceEpoch()](auto && p) { return p.getMSecsSinceEpoch() >= now - maxAgeMs; };
const auto newEnd = std::find_if(plane->parts.rbegin(), plane->parts.rend(), predicate).base();
plane->parts.erase(newEnd, plane->parts.end());
} }
} }