mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-14 08:45:36 +08:00
Ref T241, misc. logger improvements
* string formatting of logger info * display longer in simulator * better formatting of message
This commit is contained in:
@@ -811,8 +811,15 @@ namespace BlackCore
|
|||||||
|
|
||||||
QString dm;
|
QString dm;
|
||||||
static const QString sep("\n");
|
static const QString sep("\n");
|
||||||
if (s.tsCurrent > 0) { dm = QStringLiteral("Situation: ") % s.toQString(true, true, true, true, true, true, sep); }
|
if (s.tsCurrent > 0)
|
||||||
if (p.tsCurrent > 0) { dm += (dm.isEmpty() ? QStringLiteral("") : "\n\n") % QStringLiteral("Parts: ") % p.toQString(sep); }
|
{
|
||||||
|
dm = QStringLiteral("Hints: ") % s.usedHints.asString(false, true) %
|
||||||
|
QStringLiteral("\n") %
|
||||||
|
QStringLiteral("Setup: ") % s.usedSetup.toQString(true) %
|
||||||
|
QStringLiteral("\n\n") %
|
||||||
|
QStringLiteral("Situation: ") % s.toQString(false, false, true, true, true, true, sep);
|
||||||
|
}
|
||||||
|
if (p.tsCurrent > 0) { dm += (dm.isEmpty() ? QStringLiteral("") : QStringLiteral("\n\n")) % QStringLiteral("Parts: ") % p.toQString(sep); }
|
||||||
if (!dm.isEmpty()) { this->displayStatusMessage(CStatusMessage(this).info(dm)); }
|
if (!dm.isEmpty()) { this->displayStatusMessage(CStatusMessage(this).info(dm)); }
|
||||||
|
|
||||||
const int t = 4500 + (qrand() % 1000); // makes sure not always using the same time difference
|
const int t = 4500 + (qrand() % 1000); // makes sure not always using the same time difference
|
||||||
|
|||||||
@@ -260,7 +260,7 @@ namespace BlackCore
|
|||||||
void callPhysicallyRemoveRemoteAircraft(const BlackMisc::Aviation::CCallsign &remoteCallsign);
|
void callPhysicallyRemoveRemoteAircraft(const BlackMisc::Aviation::CCallsign &remoteCallsign);
|
||||||
|
|
||||||
//! Display a logged situation in simulator
|
//! Display a logged situation in simulator
|
||||||
void displayLoggedSituationInSimulator(const BlackMisc::Aviation::CCallsign &cs, bool stopLogging, int times = 10);
|
void displayLoggedSituationInSimulator(const BlackMisc::Aviation::CCallsign &cs, bool stopLogging, int times = 25);
|
||||||
|
|
||||||
bool m_blinkCycle = false; //!< used for highlighting
|
bool m_blinkCycle = false; //!< used for highlighting
|
||||||
qint64 m_highlightEndTimeMsEpoch = 0; //!< end highlighting
|
qint64 m_highlightEndTimeMsEpoch = 0; //!< end highlighting
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "interpolationhints.h"
|
#include "interpolationhints.h"
|
||||||
|
#include "interpolationlogger.h"
|
||||||
#include "blackmisc/aviation/aircraftsituation.h"
|
#include "blackmisc/aviation/aircraftsituation.h"
|
||||||
|
|
||||||
using namespace BlackMisc::Aviation;
|
using namespace BlackMisc::Aviation;
|
||||||
@@ -29,22 +30,54 @@ namespace BlackMisc
|
|||||||
m_isVtol(isVtolAircraft), m_hasParts(hasParts), m_logInterpolation(log)
|
m_isVtol(isVtolAircraft), m_hasParts(hasParts), m_logInterpolation(log)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
CAltitude CInterpolationHints::getGroundElevation(const CAircraftSituation &situation, bool useProvider, bool forceProvider) const
|
CAltitude CInterpolationHints::getGroundElevation(const CAircraftSituation &situation, bool useProvider, bool forceProvider, SituationLog *log) const
|
||||||
{
|
{
|
||||||
const bool validPlane = m_elevationPlane.isWithinRange(situation);
|
static const CLength null = CLength(0, CLengthUnit::nullUnit());
|
||||||
Q_ASSERT_X(!(forceProvider && !useProvider), Q_FUNC_INFO, "Invalid parameter combination");
|
return this->getGroundElevation(situation, null, useProvider, forceProvider, log);
|
||||||
if (forceProvider && useProvider && m_elevationProvider) { return m_elevationProvider(situation); }
|
|
||||||
if (!validPlane && useProvider && m_elevationProvider) { return m_elevationProvider(situation); }
|
|
||||||
return validPlane ? this->m_elevationPlane.getAltitude() : CAltitude::null();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CAltitude CInterpolationHints::getGroundElevation(const CAircraftSituation &situation, const CLength &validRadius, bool useProvider, bool forceProvider) const
|
CAltitude CInterpolationHints::getGroundElevation(const CAircraftSituation &situation, const CLength &validRadius, bool useProvider, bool forceProvider, SituationLog *log) const
|
||||||
{
|
{
|
||||||
const bool validPlane = m_elevationPlane.isWithinRange(situation, CLength::maxValue(validRadius, m_elevationPlane.getRadius()));
|
|
||||||
Q_ASSERT_X(!(forceProvider && !useProvider), Q_FUNC_INFO, "Invalid parameter combination");
|
Q_ASSERT_X(!(forceProvider && !useProvider), Q_FUNC_INFO, "Invalid parameter combination");
|
||||||
if (forceProvider && useProvider && m_elevationProvider) { return m_elevationProvider(situation); }
|
if (forceProvider && useProvider && m_elevationProvider)
|
||||||
if (!validPlane && useProvider && m_elevationProvider) { return m_elevationProvider(situation); }
|
{
|
||||||
return validPlane ? this->m_elevationPlane.getAltitude() : CAltitude::null();
|
if (log)
|
||||||
|
{
|
||||||
|
static const QString lm("By provider (forced)");
|
||||||
|
log->elevationInfo = lm;
|
||||||
|
}
|
||||||
|
return m_elevationProvider(situation);
|
||||||
|
}
|
||||||
|
|
||||||
|
const CLength radius = CLength::maxValue(validRadius, m_elevationPlane.getRadius());
|
||||||
|
const bool validPlane = m_elevationPlane.isWithinRange(situation, radius);
|
||||||
|
if (!validPlane && useProvider && m_elevationProvider)
|
||||||
|
{
|
||||||
|
if (log)
|
||||||
|
{
|
||||||
|
static const QString lm("By provider (no valid plane)");
|
||||||
|
log->elevationInfo = lm;
|
||||||
|
}
|
||||||
|
return m_elevationProvider(situation);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (validPlane)
|
||||||
|
{
|
||||||
|
if (log)
|
||||||
|
{
|
||||||
|
static const QString lm("Using elevation plane, radius: %1");
|
||||||
|
log->elevationInfo = lm.arg(radius.valueRoundedWithUnit(CLengthUnit::m(), 1));
|
||||||
|
}
|
||||||
|
return m_elevationPlane.getAltitude();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (log)
|
||||||
|
{
|
||||||
|
static const QString lm("Not using provider, no valid plane");
|
||||||
|
log->elevationInfo = lm;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CAltitude::null();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CInterpolationHints::resetElevationPlane()
|
void CInterpolationHints::resetElevationPlane()
|
||||||
@@ -81,8 +114,8 @@ namespace BlackMisc
|
|||||||
const ColumnIndex i = index.frontCasted<ColumnIndex>();
|
const ColumnIndex i = index.frontCasted<ColumnIndex>();
|
||||||
switch (i)
|
switch (i)
|
||||||
{
|
{
|
||||||
case IndexCenterOfGravity: return this->m_cgAboveGround.propertyByIndex(index.copyFrontRemoved());
|
case IndexCenterOfGravity: return m_cgAboveGround.propertyByIndex(index.copyFrontRemoved());
|
||||||
case IndexElevationPlane: return this->m_elevationPlane.propertyByIndex(index.copyFrontRemoved());
|
case IndexElevationPlane: return m_elevationPlane.propertyByIndex(index.copyFrontRemoved());
|
||||||
case IndexIsVtolAircraft: return CVariant::fromValue(m_isVtol);
|
case IndexIsVtolAircraft: return CVariant::fromValue(m_isVtol);
|
||||||
default: return CValueObject::propertyByIndex(index);
|
default: return CValueObject::propertyByIndex(index);
|
||||||
}
|
}
|
||||||
@@ -95,13 +128,13 @@ namespace BlackMisc
|
|||||||
switch (i)
|
switch (i)
|
||||||
{
|
{
|
||||||
case IndexCenterOfGravity:
|
case IndexCenterOfGravity:
|
||||||
this->m_cgAboveGround.setPropertyByIndex(index.copyFrontRemoved(), variant);
|
m_cgAboveGround.setPropertyByIndex(index.copyFrontRemoved(), variant);
|
||||||
break;
|
break;
|
||||||
case IndexElevationPlane:
|
case IndexElevationPlane:
|
||||||
this->m_elevationPlane.setPropertyByIndex(index.copyFrontRemoved(), variant);
|
m_elevationPlane.setPropertyByIndex(index.copyFrontRemoved(), variant);
|
||||||
break;
|
break;
|
||||||
case IndexIsVtolAircraft:
|
case IndexIsVtolAircraft:
|
||||||
this->m_isVtol = variant.toBool();
|
m_isVtol = variant.toBool();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CValueObject::setPropertyByIndex(index, variant);
|
CValueObject::setPropertyByIndex(index, variant);
|
||||||
@@ -121,10 +154,10 @@ namespace BlackMisc
|
|||||||
) %
|
) %
|
||||||
QStringLiteral(" CG: ") % m_cgAboveGround.valueRoundedWithUnit(CLengthUnit::m(), 1) %
|
QStringLiteral(" CG: ") % m_cgAboveGround.valueRoundedWithUnit(CLengthUnit::m(), 1) %
|
||||||
QStringLiteral(" elv.plane: ") % m_elevationPlane.toQString(i18n) %
|
QStringLiteral(" elv.plane: ") % m_elevationPlane.toQString(i18n) %
|
||||||
QStringLiteral(" elv.pr: ") % boolToYesNo(m_elevationProvider ? true : false);
|
QStringLiteral(" elv.pr.: ") % boolToYesNo(m_elevationProvider ? true : false);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString CInterpolationHints::debugInfo(const Geo::CElevationPlane &deltaElevation) const
|
QString CInterpolationHints::debugInfo(const CElevationPlane &deltaElevation) const
|
||||||
{
|
{
|
||||||
static const QString s("Lat: %1 Lng: %2 Elv: %3");
|
static const QString s("Lat: %1 Lng: %2 Elv: %3");
|
||||||
if (m_elevationPlane.isNull() || deltaElevation.isNull()) return "null";
|
if (m_elevationPlane.isNull() || deltaElevation.isNull()) return "null";
|
||||||
|
|||||||
@@ -22,9 +22,10 @@ namespace BlackMisc
|
|||||||
namespace Aviation { class CAircraftSituation; }
|
namespace Aviation { class CAircraftSituation; }
|
||||||
namespace Simulation
|
namespace Simulation
|
||||||
{
|
{
|
||||||
|
struct SituationLog;
|
||||||
|
|
||||||
//! Hints for interpolator such as ground elevation
|
//! Hints for interpolator such as ground elevation
|
||||||
class BLACKMISC_EXPORT CInterpolationHints :
|
class BLACKMISC_EXPORT CInterpolationHints : public CValueObject<CInterpolationHints>
|
||||||
public CValueObject<CInterpolationHints>
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
//! Property indexes
|
//! Property indexes
|
||||||
@@ -56,16 +57,17 @@ namespace BlackMisc
|
|||||||
|
|
||||||
//! Get elevation from CInterpolationHints::getElevationProvider or CInterpolationHints::getElevation
|
//! Get elevation from CInterpolationHints::getElevationProvider or CInterpolationHints::getElevation
|
||||||
//! \remark avoid unnecessary calls on XPlane (calling elevation provider)
|
//! \remark avoid unnecessary calls on XPlane (calling elevation provider)
|
||||||
//! @param situation
|
//! \param situation where to check
|
||||||
//! @param useProvider using the provider if available
|
//! \param useProvider using the provider if available
|
||||||
//! @param forceProvider use the provider and ignore any plane
|
//! \param forceProvider use the provider and ignore any elevation plane
|
||||||
|
//! \param log optional chance to write info about elevation
|
||||||
//! \see setElevationProvider
|
//! \see setElevationProvider
|
||||||
//! \see setElevationPlane
|
//! \see setElevationPlane
|
||||||
Aviation::CAltitude getGroundElevation(const Aviation::CAircraftSituation &situation, bool useProvider, bool forceProvider = false) const;
|
Aviation::CAltitude getGroundElevation(const Aviation::CAircraftSituation &situation, bool useProvider, bool forceProvider = false, SituationLog *log = nullptr) const;
|
||||||
|
|
||||||
//! Get elevation from CInterpolationHints::getElevationProvider or CInterpolationHints::getElevation
|
//! Get elevation from CInterpolationHints::getElevationProvider or CInterpolationHints::getElevation
|
||||||
//! \remark if validRadius is >= Geo::CElevationPlane::radius use validRadius
|
//! \remark if validRadius is >= Geo::CElevationPlane::radius use validRadius
|
||||||
Aviation::CAltitude getGroundElevation(const Aviation::CAircraftSituation &situation, const PhysicalQuantities::CLength &validRadius, bool useProvider, bool forceProvider = false) const;
|
Aviation::CAltitude getGroundElevation(const Aviation::CAircraftSituation &situation, const PhysicalQuantities::CLength &validRadius, bool useProvider, bool forceProvider = false, SituationLog *log = nullptr) const;
|
||||||
|
|
||||||
//! Check if elevation is within radius and can be used
|
//! Check if elevation is within radius and can be used
|
||||||
bool isWithinRange(const Geo::ICoordinateGeodetic &coordinate) const;
|
bool isWithinRange(const Geo::ICoordinateGeodetic &coordinate) const;
|
||||||
@@ -107,7 +109,7 @@ namespace BlackMisc
|
|||||||
//! Function object that can obtain ground elevation
|
//! Function object that can obtain ground elevation
|
||||||
using ElevationProvider = std::function<Aviation::CAltitude(const Aviation::CAircraftSituation &)>;
|
using ElevationProvider = std::function<Aviation::CAltitude(const Aviation::CAircraftSituation &)>;
|
||||||
|
|
||||||
//! Has elevation provider
|
//! Has elevation provider?
|
||||||
bool hasElevationProvider() const;
|
bool hasElevationProvider() const;
|
||||||
|
|
||||||
//! Set function object that can obtain ground elevation
|
//! Set function object that can obtain ground elevation
|
||||||
@@ -131,9 +133,9 @@ namespace BlackMisc
|
|||||||
private:
|
private:
|
||||||
bool m_isVtol = false; //!< VTOL aircraft?
|
bool m_isVtol = false; //!< VTOL aircraft?
|
||||||
bool m_hasParts = false; //!< Has valid aircraft parts?
|
bool m_hasParts = false; //!< Has valid aircraft parts?
|
||||||
bool m_logInterpolation = false; //!< log interpolation
|
bool m_logInterpolation = false; //!< Log.interpolation
|
||||||
Aviation::CAircraftParts m_aircraftParts; //!< Aircraft parts
|
Aviation::CAircraftParts m_aircraftParts; //!< Aircraft parts
|
||||||
Geo::CElevationPlane m_elevationPlane; //!< aircraft's elevation if available
|
Geo::CElevationPlane m_elevationPlane; //!< Aircraft's elevation if available
|
||||||
ElevationProvider m_elevationProvider; //!< Provider of ground elevation (lazy computation)
|
ElevationProvider m_elevationProvider; //!< Provider of ground elevation (lazy computation)
|
||||||
PhysicalQuantities::CLength m_cgAboveGround { 0, nullptr }; //!< center of gravity above ground
|
PhysicalQuantities::CLength m_cgAboveGround { 0, nullptr }; //!< center of gravity above ground
|
||||||
|
|
||||||
|
|||||||
@@ -406,8 +406,9 @@ namespace BlackMisc
|
|||||||
return s3.arg(msSinceEpochToTime(t1), msSinceEpochToTime(t2), msSinceEpochToTime(t3));
|
return s3.arg(msSinceEpochToTime(t1), msSinceEpochToTime(t2), msSinceEpochToTime(t3));
|
||||||
}
|
}
|
||||||
|
|
||||||
QString CInterpolationLogger::SituationLog::toQString(
|
QString SituationLog::toQString(
|
||||||
bool withCurrentSituation, bool withHints, bool withSetup,
|
bool withHints, bool withSetup,
|
||||||
|
bool withCurrentSituation,
|
||||||
bool withElevation, bool withOtherPositions, bool withDeltaTimes, const QString &separator) const
|
bool withElevation, bool withOtherPositions, bool withDeltaTimes, const QString &separator) const
|
||||||
{
|
{
|
||||||
const CAircraftSituation situationOldInterpolation = this->oldestInterpolationSituation();
|
const CAircraftSituation situationOldInterpolation = this->oldestInterpolationSituation();
|
||||||
@@ -431,7 +432,9 @@ namespace BlackMisc
|
|||||||
(
|
(
|
||||||
withElevation ?
|
withElevation ?
|
||||||
separator %
|
separator %
|
||||||
QStringLiteral("transf.elv.: ") % QString::number(noTransferredElevations) :
|
QStringLiteral("Elev.: ") %
|
||||||
|
QStringLiteral("transf.elv.: ") % QString::number(noTransferredElevations) %
|
||||||
|
QStringLiteral(" | elv.info: ") % elevationInfo :
|
||||||
QStringLiteral("")
|
QStringLiteral("")
|
||||||
) %
|
) %
|
||||||
(
|
(
|
||||||
@@ -467,6 +470,7 @@ namespace BlackMisc
|
|||||||
{
|
{
|
||||||
return QStringLiteral("CS: ") % callsign.asString() % separator %
|
return QStringLiteral("CS: ") % callsign.asString() % separator %
|
||||||
QStringLiteral("ts: ") % CInterpolationLogger::msSinceEpochToTimeAndTimestamp(tsCurrent) %
|
QStringLiteral("ts: ") % CInterpolationLogger::msSinceEpochToTimeAndTimestamp(tsCurrent) %
|
||||||
|
QStringLiteral(" | #nw.parts: ") % QString::number(noNetworkParts) %
|
||||||
separator %
|
separator %
|
||||||
QStringLiteral("parts: ") % parts.toQString(true);
|
QStringLiteral("parts: ") % parts.toQString(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,7 +61,9 @@ namespace BlackMisc
|
|||||||
|
|
||||||
// this code is used by linear and spline interpolator
|
// this code is used by linear and spline interpolator
|
||||||
status.reset();
|
status.reset();
|
||||||
CInterpolationLogger::SituationLog log;
|
const bool doLogging = this->hasAttachedLogger() && hints.isLoggingInterpolation();
|
||||||
|
SituationLog log;
|
||||||
|
SituationLog *logP = doLogging ? &log : nullptr;
|
||||||
|
|
||||||
// any data at all?
|
// any data at all?
|
||||||
if (m_aircraftSituations.isEmpty()) { return CAircraftSituation(m_callsign); }
|
if (m_aircraftSituations.isEmpty()) { return CAircraftSituation(m_callsign); }
|
||||||
@@ -77,7 +79,7 @@ namespace BlackMisc
|
|||||||
// * for FSX/P3D provided as hints.getElevation which is set to current position of remote aircraft in simulator
|
// * for FSX/P3D provided as hints.getElevation which is set to current position of remote aircraft in simulator
|
||||||
// * As XP uses lazy init we will call getGroundElevation only when needed
|
// * As XP uses lazy init we will call getGroundElevation only when needed
|
||||||
// * default here via getElevationPlane
|
// * default here via getElevationPlane
|
||||||
CAltitude currentGroundElevation(hints.getGroundElevation(currentSituation, currentSituation.getDistancePerTime(1000), false, false));
|
CAltitude currentGroundElevation(hints.getGroundElevation(currentSituation, currentSituation.getDistancePerTime(1000), true, false, logP));
|
||||||
currentSituation.setGroundElevation(currentGroundElevation); // set as default
|
currentSituation.setGroundElevation(currentGroundElevation); // set as default
|
||||||
|
|
||||||
// data, split situations by time
|
// data, split situations by time
|
||||||
@@ -122,7 +124,7 @@ namespace BlackMisc
|
|||||||
// if not having an ground elevation yet, we fetch from provider (if there is a provider)
|
// if not having an ground elevation yet, we fetch from provider (if there is a provider)
|
||||||
if (!currentGroundElevation.isNull())
|
if (!currentGroundElevation.isNull())
|
||||||
{
|
{
|
||||||
currentGroundElevation = hints.getGroundElevation(currentSituation, true); // "expensive on XPlane" if provider is called
|
currentGroundElevation = hints.getGroundElevation(currentSituation, true, false, logP); // "expensive on XPlane" if provider is called
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!currentGroundElevation.isNull())
|
if (!currentGroundElevation.isNull())
|
||||||
@@ -298,8 +300,9 @@ namespace BlackMisc
|
|||||||
void CInterpolator<Derived>::logParts(qint64 timestamp, const CAircraftParts &parts, bool empty, bool log) const
|
void CInterpolator<Derived>::logParts(qint64 timestamp, const CAircraftParts &parts, bool empty, bool log) const
|
||||||
{
|
{
|
||||||
if (!log || !m_logger) { return; }
|
if (!log || !m_logger) { return; }
|
||||||
CInterpolationLogger::PartsLog logInfo;
|
PartsLog logInfo;
|
||||||
logInfo.callsign = m_callsign;
|
logInfo.callsign = m_callsign;
|
||||||
|
logInfo.noNetworkParts = m_aircraftParts.size();
|
||||||
logInfo.tsCurrent = timestamp;
|
logInfo.tsCurrent = timestamp;
|
||||||
logInfo.parts = parts;
|
logInfo.parts = parts;
|
||||||
logInfo.empty = empty;
|
logInfo.empty = empty;
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ namespace BlackMisc
|
|||||||
return m_remoteAircraftProvider->getRemoteAircraftSupportingPartsCount();
|
return m_remoteAircraftProvider->getRemoteAircraftSupportingPartsCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CRemoteAircraftAware::updateAircraftEnabled(const Aviation::CCallsign &callsign, bool enabledForRedering)
|
bool CRemoteAircraftAware::updateAircraftEnabled(const CCallsign &callsign, bool enabledForRedering)
|
||||||
{
|
{
|
||||||
Q_ASSERT_X(m_remoteAircraftProvider, Q_FUNC_INFO, "No object available");
|
Q_ASSERT_X(m_remoteAircraftProvider, Q_FUNC_INFO, "No object available");
|
||||||
return m_remoteAircraftProvider->updateAircraftEnabled(callsign, enabledForRedering);
|
return m_remoteAircraftProvider->updateAircraftEnabled(callsign, enabledForRedering);
|
||||||
@@ -132,10 +132,10 @@ namespace BlackMisc
|
|||||||
|
|
||||||
void IRemoteAircraftProvider::removeOutdatedParts(CAircraftPartsList &partsList)
|
void IRemoteAircraftProvider::removeOutdatedParts(CAircraftPartsList &partsList)
|
||||||
{
|
{
|
||||||
// remove all outdated parts but one
|
// remove all outdated parts, but keep at least one
|
||||||
const auto predicate = [now = partsList.front().getMSecsSinceEpoch()](const auto & p) { return p.getMSecsSinceEpoch() >= now - PartsPerCallsignMaxAgeInSeconds * 1000; };
|
if (partsList.isEmpty()) { return; }
|
||||||
const auto newEnd = std::find_if(partsList.rbegin(), partsList.rend(), predicate).base();
|
const qint64 ts = partsList.front().getMSecsSinceEpoch() - MaxPartsAgePerCallsignSecs * 1000;
|
||||||
if (newEnd != partsList.end()) { partsList.erase(newEnd + 1, partsList.end()); }
|
partsList.removeBefore(ts);
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|||||||
Reference in New Issue
Block a user