mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-23 13:55:36 +08:00
refs #667 Interpolator: relaxed thread safety requirements by removing the dependence on shared state.
This commit is contained in:
@@ -24,7 +24,30 @@ namespace BlackMisc
|
|||||||
this->setObjectName(objectName);
|
this->setObjectName(objectName);
|
||||||
}
|
}
|
||||||
|
|
||||||
CAircraftPartsList IInterpolator::getPartsBeforeTime(const CCallsign &callsign, qint64 cutoffTime, BlackMisc::IInterpolator::PartsStatus &partsStatus)
|
BlackMisc::Aviation::CAircraftSituation IInterpolator::getInterpolatedSituation(const BlackMisc::Aviation::CCallsign &callsign, qint64 currentTimeSinceEpoc,
|
||||||
|
bool isVtolAircraft, InterpolationStatus &status) const
|
||||||
|
{
|
||||||
|
// has to be thread safe
|
||||||
|
|
||||||
|
status.reset();
|
||||||
|
Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "empty callsign");
|
||||||
|
|
||||||
|
auto currentSituation = this->getInterpolatedSituation(this->remoteAircraftSituations(callsign), currentTimeSinceEpoc, isVtolAircraft, status);
|
||||||
|
|
||||||
|
Q_ASSERT_X(currentSituation.getCallsign() == callsign, Q_FUNC_INFO, "mismatching callsigns");
|
||||||
|
return currentSituation;
|
||||||
|
}
|
||||||
|
|
||||||
|
CAircraftPartsList IInterpolator::getPartsBeforeTime(const CAircraftPartsList &parts, qint64 cutoffTime, BlackMisc::IInterpolator::PartsStatus &partsStatus) const
|
||||||
|
{
|
||||||
|
partsStatus.reset();
|
||||||
|
partsStatus.supportsParts = true;
|
||||||
|
|
||||||
|
if (cutoffTime < 0) { return parts; }
|
||||||
|
return parts.findBefore(cutoffTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
CAircraftPartsList IInterpolator::getPartsBeforeTime(const CCallsign &callsign, qint64 cutoffTime, BlackMisc::IInterpolator::PartsStatus &partsStatus) const
|
||||||
{
|
{
|
||||||
Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "empty callsign");
|
Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "empty callsign");
|
||||||
partsStatus.reset();
|
partsStatus.reset();
|
||||||
|
|||||||
@@ -68,14 +68,26 @@ namespace BlackMisc
|
|||||||
//! Current interpolated situation
|
//! Current interpolated situation
|
||||||
//! \threadsafe
|
//! \threadsafe
|
||||||
virtual BlackMisc::Aviation::CAircraftSituation getInterpolatedSituation(
|
virtual BlackMisc::Aviation::CAircraftSituation getInterpolatedSituation(
|
||||||
const BlackMisc::Aviation::CCallsign &callsign, qint64 currentTimeSinceEpoc,
|
const BlackMisc::Aviation::CAircraftSituationList &situations, qint64 currentTimeSinceEpoc,
|
||||||
bool isVtolAircraft, InterpolationStatus &status) const = 0;
|
bool isVtolAircraft, InterpolationStatus &status) const = 0;
|
||||||
|
|
||||||
|
//! Current interpolated situation
|
||||||
|
//! \threadsafe
|
||||||
|
virtual BlackMisc::Aviation::CAircraftSituation getInterpolatedSituation(
|
||||||
|
const BlackMisc::Aviation::CCallsign &callsign, qint64 currentTimeSinceEpoc,
|
||||||
|
bool isVtolAircraft, InterpolationStatus &status) const;
|
||||||
|
|
||||||
|
//! Parts before given offset time (aka pending parts)
|
||||||
|
//! \threadsafe
|
||||||
|
virtual BlackMisc::Aviation::CAircraftPartsList getPartsBeforeTime(
|
||||||
|
const BlackMisc::Aviation::CAircraftPartsList &parts, qint64 cutoffTime,
|
||||||
|
PartsStatus &partsStatus) const;
|
||||||
|
|
||||||
//! Parts before given offset time (aka pending parts)
|
//! Parts before given offset time (aka pending parts)
|
||||||
//! \threadsafe
|
//! \threadsafe
|
||||||
virtual BlackMisc::Aviation::CAircraftPartsList getPartsBeforeTime(
|
virtual BlackMisc::Aviation::CAircraftPartsList getPartsBeforeTime(
|
||||||
const BlackMisc::Aviation::CCallsign &callsign, qint64 cutoffTime,
|
const BlackMisc::Aviation::CCallsign &callsign, qint64 cutoffTime,
|
||||||
PartsStatus &partsStatus);
|
PartsStatus &partsStatus) const;
|
||||||
|
|
||||||
//! Enable debug messages
|
//! Enable debug messages
|
||||||
void enableDebugMessages(bool enabled);
|
void enableDebugMessages(bool enabled);
|
||||||
|
|||||||
@@ -36,19 +36,17 @@ using namespace BlackMisc::Aviation;
|
|||||||
|
|
||||||
namespace BlackMisc
|
namespace BlackMisc
|
||||||
{
|
{
|
||||||
CAircraftSituation CInterpolatorLinear::getInterpolatedSituation(const CCallsign &callsign, qint64 currentTimeMsSinceEpoc, bool vtolAiracraft, InterpolationStatus &status) const
|
CAircraftSituation CInterpolatorLinear::getInterpolatedSituation(const BlackMisc::Aviation::CAircraftSituationList &situations, qint64 currentTimeMsSinceEpoc, bool vtolAiracraft, InterpolationStatus &status) const
|
||||||
{
|
{
|
||||||
// has to be thread safe
|
// has to be thread safe
|
||||||
|
|
||||||
status.reset();
|
status.reset();
|
||||||
|
|
||||||
// any data at all?
|
// any data at all?
|
||||||
Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "empty callsign");
|
if (situations.isEmpty()) { return {}; }
|
||||||
if (this->remoteAircraftSituationsCount(callsign) < 1) { return {}; }
|
|
||||||
|
|
||||||
// data, split situations by time
|
// data, split situations by time
|
||||||
if (currentTimeMsSinceEpoc < 0) { currentTimeMsSinceEpoc = QDateTime::currentMSecsSinceEpoch(); }
|
if (currentTimeMsSinceEpoc < 0) { currentTimeMsSinceEpoc = QDateTime::currentMSecsSinceEpoch(); }
|
||||||
const auto situations = remoteAircraftSituations(callsign);
|
|
||||||
|
|
||||||
// find the first situation not in the correct order, keep only the situations before that one
|
// find the first situation not in the correct order, keep only the situations before that one
|
||||||
auto end = std::is_sorted_until(situations.begin(), situations.end(), [](auto &&a, auto &&b) { return b.getAdjustedMSecsSinceEpoch() < a.getAdjustedMSecsSinceEpoch(); });
|
auto end = std::is_sorted_until(situations.begin(), situations.end(), [](auto &&a, auto &&b) { return b.getAdjustedMSecsSinceEpoch() < a.getAdjustedMSecsSinceEpoch(); });
|
||||||
@@ -110,7 +108,7 @@ namespace BlackMisc
|
|||||||
{
|
{
|
||||||
if (this->m_withDebugMsg)
|
if (this->m_withDebugMsg)
|
||||||
{
|
{
|
||||||
CLogMessage(this).warning("Extrapolation, fraction > 1: %1 for callsign: %2") << simulationTimeFraction << callsign;
|
CLogMessage(this).warning("Extrapolation, fraction > 1: %1 for callsign: %2") << simulationTimeFraction << oldSituation.getCallsign();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,7 +180,6 @@ namespace BlackMisc
|
|||||||
* simulationTimeFraction
|
* simulationTimeFraction
|
||||||
+ oldSituation.getGroundSpeed());
|
+ oldSituation.getGroundSpeed());
|
||||||
status.changedPosition = true;
|
status.changedPosition = true;
|
||||||
Q_ASSERT_X(currentSituation.getCallsign() == callsign, Q_FUNC_INFO, "mismatching callsigns");
|
|
||||||
return currentSituation;
|
return currentSituation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,9 @@ namespace BlackMisc
|
|||||||
{}
|
{}
|
||||||
|
|
||||||
//! \copydoc IInterpolator::getInterpolatedSituation
|
//! \copydoc IInterpolator::getInterpolatedSituation
|
||||||
virtual BlackMisc::Aviation::CAircraftSituation getInterpolatedSituation(const BlackMisc::Aviation::CCallsign &callsign, qint64 currentTimeSinceEpoc, bool vtolAiracraft, InterpolationStatus &status) const override;
|
virtual BlackMisc::Aviation::CAircraftSituation getInterpolatedSituation(const BlackMisc::Aviation::CAircraftSituationList &situations, qint64 currentTimeSinceEpoc, bool vtolAiracraft, InterpolationStatus &status) const override;
|
||||||
|
|
||||||
|
using IInterpolator::getInterpolatedSituation;
|
||||||
|
|
||||||
//! Log category
|
//! Log category
|
||||||
static QString getLogCategory() { return "swift.interpolatorlinear"; }
|
static QString getLogCategory() { return "swift.interpolatorlinear"; }
|
||||||
|
|||||||
Reference in New Issue
Block a user