refs #393, allow to highlight a certain aircraft by blinking

* signatures in contexts
* some specialized functions in aircraft list
* context menus in aircraft view
* default "blinking" implementation in driver common base class
This commit is contained in:
Klaus Basan
2015-03-23 19:50:15 +01:00
parent 66da4d7353
commit 70670b74c6
38 changed files with 557 additions and 78 deletions

View File

@@ -919,12 +919,8 @@ namespace BlackCore
this->m_aircraftParts.removeOlderThanNowMinusOffset(AircraftPartsRemoveOffsetMs);
emit this->addedRemoteAircraftParts(parts);
CPropertyIndexVariantMap vm;
vm.addValue(CAircraft::IndexParts, parts);
vm.addValue(CSimulatedAircraft::IndexPartsSynchronized, true);
// here I expect always a changed value
this->m_aircraftInRange.applyIfCallsign(callsign, vm);
this->m_aircraftInRange.setAircraftParts(callsign, parts);
this->m_aircraftWatchdog.resetCallsign(callsign);
}

View File

@@ -96,10 +96,14 @@ namespace BlackCore
void changedAircraftInRangeDigest();
//! Aircraft model was changed
void changedRenderedAircraftModel(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator);
//! \details All remote aircraft are stored in the network context. The model can be updated here
//! via \sa updateAircraftModel and then this signal is fired
void changedRemoteAircraftModel(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator);
//! Aircraft enabled / disabled
void changedAircraftEnabled(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator);
//! \details All remote aircraft are stored in the network context. The aircraft can be enabled (for rendering) here
//! via \sa updateAircraftEnabled and then this signal is fired
void changedRemoteAircraftEnabled(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator);
//! Aircraft enabled / disabled
void changedFastPositionUpdates(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator);

View File

@@ -522,7 +522,7 @@ namespace BlackCore
if (c)
{
CSimulatedAircraft aircraft(this->remoteAircraft().findFirstByCallsign(callsign));
emit this->changedAircraftEnabled(aircraft, originator);
emit this->changedRemoteAircraftEnabled(aircraft, originator);
}
return c;
}
@@ -534,7 +534,7 @@ namespace BlackCore
if (c)
{
CSimulatedAircraft aircraft(this->remoteAircraft().findFirstByCallsign(callsign));
emit this->changedRenderedAircraftModel(aircraft, originator);
emit this->changedRemoteAircraftModel(aircraft, originator);
}
return c;
}

View File

@@ -76,10 +76,10 @@ namespace BlackCore
"vatsimBookingsRead", this, SIGNAL(vatsimBookingsRead()));
Q_ASSERT(s);
s = connection.connect(serviceName, IContextNetwork::ObjectPath(), IContextNetwork::InterfaceName(),
"changedRenderedAircraftModel", this, SIGNAL(changedRenderedAircraftModel(BlackMisc::Simulation::CSimulatedAircraft, QString)));
"changedRemoteAircraftModel", this, SIGNAL(changedRemoteAircraftModel(BlackMisc::Simulation::CSimulatedAircraft, QString)));
Q_ASSERT(s);
s = connection.connect(serviceName, IContextNetwork::ObjectPath(), IContextNetwork::InterfaceName(),
"changedAircraftEnabled", this, SIGNAL(changedAircraftEnabled(BlackMisc::Simulation::CSimulatedAircraft, QString)));
"changedRemoteAircraftEnabled", this, SIGNAL(changedRemoteAircraftEnabled(BlackMisc::Simulation::CSimulatedAircraft, QString)));
Q_ASSERT(s);
s = connection.connect(serviceName, IContextNetwork::ObjectPath(), IContextNetwork::InterfaceName(),
"changedFastPositionUpdates", this, SIGNAL(changedFastPositionUpdates(BlackMisc::Simulation::CSimulatedAircraft,QString)));

View File

@@ -88,9 +88,9 @@ namespace BlackCore
Q_ASSERT(this->getIContextAudio());
Q_ASSERT(this->getIContextNetwork());
Q_ASSERT(this->getIContextApplication());
if (!this->getIContextNetwork() || !this->getIContextAudio() || !this->getIContextAudio()) { return; } // no chance to resolve rooms
if (!this->getIContextNetwork() || !this->getIContextAudio() || !this->getIContextApplication()) { return; } // no chance to resolve rooms
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO;
if (m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; }
if (this->m_voiceRoom1UrlOverride.isEmpty() && this->m_voiceRoom2UrlOverride.isEmpty() && !this->m_automaticVoiceRoomResolution) { return; }
if (!this->m_automaticVoiceRoomResolution) { return; } // not responsible

View File

@@ -11,9 +11,29 @@
#include "context_simulator_impl.h"
#include "context_simulator_proxy.h"
using namespace BlackMisc::PhysicalQuantities;
namespace BlackCore
{
const QString &IContextSimulator::InterfaceName()
{
static const QString s(BLACKCORE_CONTEXTSIMULATOR_INTERFACENAME);
return s;
}
const QString &IContextSimulator::ObjectPath()
{
static const QString s(BLACKCORE_CONTEXTSIMULATOR_OBJECTPATH);
return s;
}
const BlackMisc::PhysicalQuantities::CTime &IContextSimulator::HighlightTime()
{
static const CTime t(10.0, CTimeUnit::s());
return t;
}
IContextSimulator *IContextSimulator::create(CRuntime *parent, CRuntimeConfig::ContextMode mode, CDBusServer *server, QDBusConnection &conn)
{
switch (mode)

View File

@@ -34,6 +34,7 @@
#include "blackmisc/avairportlist.h"
#include "blackmisc/project.h"
#include "blackmisc/pixmap.h"
#include "blackmisc/pqtime.h"
#include <QObject>
namespace BlackCore
@@ -46,18 +47,13 @@ namespace BlackCore
public:
//! Service name
static const QString &InterfaceName()
{
static QString s(BLACKCORE_CONTEXTSIMULATOR_INTERFACENAME);
return s;
}
static const QString &InterfaceName();
//! Service path
static const QString &ObjectPath()
{
static QString s(BLACKCORE_CONTEXTSIMULATOR_OBJECTPATH);
return s;
}
static const QString &ObjectPath();
//! Highlight time
static const BlackMisc::PhysicalQuantities::CTime &HighlightTime();
//! \copydoc CContext::getPathAndContextId()
virtual QString getPathAndContextId() const { return this->buildPathAndContextId(ObjectPath()); }
@@ -172,6 +168,9 @@ namespace BlackCore
//! Enable debugging
virtual void enableDebugMessages(bool driver, bool interpolator) = 0;
//! Highlight aircraft in simulator
virtual void highlightAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraftToHighlight, bool enableHighlight, const BlackMisc::PhysicalQuantities::CTime &displayTime) = 0;
protected:
//! Constructor
IContextSimulator(CRuntimeConfig::ContextMode mode, CRuntime *runtime) : CContext(mode, runtime) {}

View File

@@ -248,13 +248,14 @@ namespace BlackCore
Q_ASSERT(networkContext->isLocalObject());
// use readyForModelMatching instead of CAirspaceMonitor::addedAircraft, as it contains client information
// ready for model matching is sent delayed when all information are available
bool c = connect(networkContext, &IContextNetwork::readyForModelMatching, this, &CContextSimulator::ps_addRemoteAircraft);
Q_ASSERT(c);
c = connect(networkContext, &IContextNetwork::removedAircraft, this, &CContextSimulator::ps_removedRemoteAircraft);
Q_ASSERT(c);
c = connect(networkContext, &IContextNetwork::changedRenderedAircraftModel, this->m_simulator, &ISimulator::changeRemoteAircraftModel);
c = connect(networkContext, &IContextNetwork::changedRemoteAircraftModel, this, &CContextSimulator::ps_changedRemoteAircraftModel);
Q_ASSERT(c);
c = connect(networkContext, &IContextNetwork::changedAircraftEnabled, this->m_simulator, &ISimulator::changeAircraftEnabled);
c = connect(networkContext, &IContextNetwork::changedRemoteAircraftEnabled, this, &CContextSimulator::ps_changedRemoteAircraftEnabled);
Q_ASSERT(c);
Q_UNUSED(c);
@@ -366,6 +367,22 @@ namespace BlackCore
this->getIContextOwnAircraft()->changedAircraftCockpit(ownAircraft, IContextSimulator::InterfaceName());
}
void CContextSimulator::ps_changedRemoteAircraftModel(const CSimulatedAircraft &aircraft, const QString &originator)
{
Q_ASSERT(this->m_simulator);
if (!this->m_simulator) { return; }
this->m_simulator->changeRemoteAircraftModel(aircraft, originator);
}
void CContextSimulator::ps_changedRemoteAircraftEnabled(const CSimulatedAircraft &aircraft, const QString &originator)
{
Q_ASSERT(this->m_simulator);
if (!this->m_simulator) { return; }
this->m_simulator->changeRemoteAircraftEnabled(aircraft, originator);
}
void CContextSimulator::ps_updateSimulatorCockpitFromContext(const CAircraft &ownAircraft, const QString &originator)
{
Q_ASSERT(this->m_simulator);
@@ -419,6 +436,12 @@ namespace BlackCore
return this->m_simulator->enableDebugMessages(driver, interpolator);
}
void CContextSimulator::highlightAircraft(const CSimulatedAircraft &aircraftToHighlight, bool enableHighlight, const CTime &displayTime)
{
if (!this->m_simulator) { return; }
this->m_simulator->highlightAircraft(aircraftToHighlight, enableHighlight, displayTime);
}
bool CContextSimulator::isPaused() const
{
if (!this->m_simulator) return false;

View File

@@ -119,6 +119,9 @@ namespace BlackCore
//! \copydoc ISimulator::enableDebuggingMessages
virtual void enableDebugMessages(bool driver, bool interpolator) override;
//! \copydoc IContextSimulator::highlightAircraft
virtual void highlightAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraftToHighlight, bool enableHighlight, const BlackMisc::PhysicalQuantities::CTime &displayTime) override;
protected:
//! \brief Constructor
CContextSimulator(CRuntimeConfig::ContextMode, CRuntime *runtime);
@@ -132,13 +135,13 @@ namespace BlackCore
}
private slots:
//! \copydoc ISimulator::addRemoteAircraft
//! Remote aircraft added
void ps_addRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft);
//! \copydoc ISimulator::removeRemoteAircraft
//! Remove remote aircraft
void ps_removedRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign);
//! Handle new connection status
//! Handle new connection status of simulator
void ps_onConnectionStatusChanged(ISimulator::ConnectionStatus status);
//! Text message received
@@ -147,6 +150,12 @@ namespace BlackCore
//! Simulator has changed cockpit
void ps_cockitChangedFromSim(const BlackMisc::Simulation::CSimulatedAircraft &ownAircraft);
//! Changed remote aircraft model
void ps_changedRemoteAircraftModel(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator);
//! Enable / disable aircraft
void ps_changedRemoteAircraftEnabled(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator);
//! Update simulator cockpit from context, because someone else has changed cockpit (e.g. GUI, 3rd party)
//! \remarks set by runtime, only to be used locally (not via DBus)
void ps_updateSimulatorCockpitFromContext(const BlackMisc::Aviation::CAircraft &ownAircraft, const QString &originator);
@@ -161,6 +170,6 @@ namespace BlackCore
QFuture<bool> m_canConnectResult;
};
} // namespace BlackCore
} // namespace
#endif // guard

View File

@@ -169,6 +169,11 @@ namespace BlackCore
return m_dBusInterface->callDBusRet<CPixmap>(QLatin1Literal("iconForModel"), modelString);
}
void CContextSimulatorProxy::highlightAircraft(const CSimulatedAircraft &aircraftToHighlight, bool enableHighlight, const CTime &displayTime)
{
m_dBusInterface->callDBus(QLatin1Literal("highlightAircraft"), aircraftToHighlight, enableHighlight, displayTime);
}
void CContextSimulatorProxy::enableDebugMessages(bool driver, bool interpolator)
{
m_dBusInterface->callDBus(QLatin1Literal("enableDebugMessages"), driver, interpolator);

View File

@@ -119,6 +119,9 @@ namespace BlackCore
//! \copydoc IContextSimulator::iconForModel
virtual BlackMisc::CPixmap iconForModel(const QString &modelString) const override;
//! \copydoc IContextSimulator::highlightAircraft
virtual void highlightAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraftToHighlight, bool enableHighlight, const BlackMisc::PhysicalQuantities::CTime &displayTime) override;
//! \copydoc ISimulator::enableDebuggingMessages
virtual void enableDebugMessages(bool driver, bool interpolator) override;

View File

@@ -75,6 +75,7 @@ namespace BlackCore
if (this->m_partsByCallsign.contains(callsign))
{
partsStatus.supportsParts = true;
if (cutoffTime < 0) { return this->m_partsByCallsign[callsign]; }
return this->m_partsByCallsign[callsign].findBeforeAndRemove(cutoffTime);
}
else
@@ -93,6 +94,16 @@ namespace BlackCore
m_partsByCallsign.clear();
}
bool IInterpolator::hasDataForCallsign(const CCallsign &callsign) const
{
if (callsign.isEmpty()) { return false; }
QReadLocker s(&m_lockSituations);
if (m_situationsByCallsign.contains(callsign)) { return true; }
QReadLocker p(&m_lockParts);
return m_partsByCallsign.contains(callsign);
}
CAircraftSituationList IInterpolator::getSituationsForCallsign(const CCallsign &callsign) const
{
QReadLocker l(&m_lockSituations);

View File

@@ -15,7 +15,6 @@
#include "blackmisc/avaircraftsituation.h"
#include "blackmisc/simulation/simdirectaccessremoteaircraft.h"
#include "blackmisc/worker.h"
#include "simulator.h"
#include <QHash>
#include <QList>
@@ -39,7 +38,7 @@ namespace BlackCore
virtual ~IInterpolator() {}
//! Log category
static QString getMessageCategory() { return "swift.iinterpolator"; }
static QString getMessageCategory() { return "swift.interpolator"; }
//! Status of interpolation
struct InterpolationStatus
@@ -79,23 +78,28 @@ namespace BlackCore
//!
virtual BlackMisc::Aviation::CAircraftSituationList getInterpolatedSituations(qint64 currentTimeMsSinceEpoch = -1);
//! The situations per callsign
//! All situations for all callsigns (in map as per callsign)
//! \threadsafe
CSituationsPerCallsign getSituationsByCallsign() const;
//! Parts before given offset time (aka pending parts)
//! \note
//! \threadsafe
virtual BlackMisc::Aviation::CAircraftPartsList getAndRemovePartsBeforeTime(const BlackMisc::Aviation::CCallsign &callsign, qint64 timeOffset, PartsStatus &partsStatus);
virtual BlackMisc::Aviation::CAircraftPartsList getAndRemovePartsBeforeTime(const BlackMisc::Aviation::CCallsign &callsign, qint64 cutoffTime, PartsStatus &partsStatus);
//! Clear all data
//! \threadsafe
virtual void clear();
//! Situations for given callsign
//! Knows callsign?
//! \threadsafe
virtual bool hasDataForCallsign(const BlackMisc::Aviation::CCallsign &callsign) const;
//! All situations for given callsign
//! \threadsafe
BlackMisc::Aviation::CAircraftSituationList getSituationsForCallsign(const BlackMisc::Aviation::CCallsign &callsign) const;
//! Parts for given callsign
//! All parts for given callsign
//! \threadsafe
BlackMisc::Aviation::CAircraftPartsList getPartsForCallsign(const BlackMisc::Aviation::CCallsign &callsign) const;

View File

@@ -8,8 +8,11 @@
*/
#include "simulator.h"
#include "interpolator.h"
using namespace BlackMisc::Aviation;
using namespace BlackMisc::Simulation;
using namespace BlackMisc::PhysicalQuantities;
using namespace BlackSim;
namespace BlackCore
@@ -21,7 +24,80 @@ namespace BlackCore
CSimulatorCommon::CSimulatorCommon(const BlackSim::CSimulatorInfo &simInfo, BlackMisc::Simulation::IOwnAircraftProvider *ownAircraftProvider, BlackMisc::Simulation::IRemoteAircraftProvider *remoteAircraftProvider, QObject *parent)
: ISimulator(parent), COwnAircraftProviderSupport(ownAircraftProvider), CRemoteAircraftProviderSupport(remoteAircraftProvider), m_simulatorInfo(simInfo)
{ }
{
m_oneSecondTimer = new QTimer(this);
connect(this->m_oneSecondTimer, &QTimer::timeout, this, &CSimulatorCommon::ps_oneSecondTimer);
m_oneSecondTimer->start(1000);
}
void CSimulatorCommon::blinkHighlightedAircraft()
{
if (m_highlightedAircraft.isEmpty() || m_highlightEndTimeMsEpoch < 1) { return; }
m_blinkCycle = !m_blinkCycle;
if (QDateTime::currentMSecsSinceEpoch() < m_highlightEndTimeMsEpoch)
{
// blink mode, toggle aircraft
for (const CSimulatedAircraft &aircraft : m_highlightedAircraft)
{
if (m_blinkCycle)
{
this->removeRemoteAircraft(aircraft.getCallsign());
}
else
{
this->addRemoteAircraft(aircraft);
}
}
}
else
{
// restore
for (const CSimulatedAircraft &aircraft : m_highlightedAircraft)
{
// get the current state for this aircraft
// it might has been removed in the mean time
const CCallsign cs(aircraft.getCallsign());
resetAircraftFromBacked(cs);
}
m_highlightedAircraft.clear();
m_highlightEndTimeMsEpoch = 0;
}
}
void CSimulatorCommon::resetAircraftFromBacked(const CCallsign &callsign)
{
CSimulatedAircraft aircraft(this->remoteAircraft().findFirstByCallsign(callsign));
bool enabled = aircraft.isEnabled();
if (enabled)
{
// are we already visible?
if (!isRenderedAircraft(callsign))
{
this->addRemoteAircraft(aircraft);
}
}
else
{
removeRemoteAircraft(callsign);
}
}
void CSimulatorCommon::setInitialAircraftSituationAndParts(CSimulatedAircraft &aircraft) const
{
if (!this->m_interpolator) { return; }
const CCallsign callsign(aircraft.getCallsign());
if (!this->m_interpolator->hasDataForCallsign(callsign)) { return; }
// with an interpolator the interpolated situation is used
// to avoid position jittering
qint64 time = QDateTime::currentMSecsSinceEpoch();
IInterpolator::InterpolationStatus is;
CAircraftSituation as(m_interpolator->getInterpolatedSituation(callsign, time, is));
if (is.interpolationSucceeded) { aircraft.setSituation(as); }
}
int CSimulatorCommon::getMaxRenderedAircraft() const
{
@@ -50,4 +126,26 @@ namespace BlackCore
return getInstalledModels().size();
}
void CSimulatorCommon::highlightAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraftToHighlight, bool enableHighlight, const BlackMisc::PhysicalQuantities::CTime &displayTime)
{
CCallsign cs(aircraftToHighlight.getCallsign());
this->m_highlightedAircraft.removeByCallsign(cs);
if (enableHighlight)
{
qint64 deltaT = displayTime.valueRounded(CTimeUnit::ms(), 0);
this->m_highlightEndTimeMsEpoch = QDateTime::currentMSecsSinceEpoch() + deltaT;
this->m_highlightedAircraft.push_back(aircraftToHighlight);
}
}
bool CSimulatorCommon::isRenderingEnabled() const
{
return m_maxRenderedAircraft < 1;
}
void CSimulatorCommon::ps_oneSecondTimer()
{
blinkHighlightedAircraft();
}
} // namespace

View File

@@ -12,6 +12,7 @@
#ifndef BLACKCORE_SIMULATOR_H
#define BLACKCORE_SIMULATOR_H
#include "blackcore/interpolator.h"
#include "blacksim/simulatorinfo.h"
#include "blackmisc/simulation/simulatedaircraftlist.h"
#include "blackmisc/simulation/aircraftmodellist.h"
@@ -26,6 +27,7 @@
namespace BlackCore
{
//! Interface to a simulator.
class ISimulator : public QObject
{
@@ -80,16 +82,20 @@ namespace BlackCore
virtual bool disconnectFrom() = 0;
//! Add new remote aircraft to the simulator
//! \sa changeRemoteAircraftEnabled to hide a remote aircraft
virtual bool addRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft) = 0;
//! Remove remote aircraft from simulator
virtual bool removeRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign) = 0;
//! Remove all remote aircraft
virtual void removeAllRemoteAircraft() = 0;
//! Change remote aircraft per property
virtual bool changeRemoteAircraftModel(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator) = 0;
//! Aircraft got enabled / disabled
virtual bool changeAircraftEnabled(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator) = 0;
virtual bool changeRemoteAircraftEnabled(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator) = 0;
//! Update own aircraft cockpit (usually from context)
virtual bool updateOwnSimulatorCockpit(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) = 0;
@@ -137,6 +143,15 @@ namespace BlackCore
//! Enable debugging messages
virtual void enableDebugMessages(bool driver, bool interpolator) = 0;
//! Is the aircraft rendered (displayed in simulator)?
virtual bool isRenderedAircraft(const BlackMisc::Aviation::CCallsign &callsign) const = 0;
//! Highlight the aircraft for given time (or disable highlight)
virtual void highlightAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraftToHighlight, bool enableHighlight, const BlackMisc::PhysicalQuantities::CTime &displayTime) = 0;
//! Is rendering enabled
virtual bool isRenderingEnabled() const = 0;
signals:
//! Emitted when the connection status has changed
void connectionStatusChanged(ISimulator::ConnectionStatus status);
@@ -197,7 +212,7 @@ namespace BlackCore
class CSimulatorCommon :
public BlackCore::ISimulator,
public BlackMisc::Simulation::COwnAircraftProviderSupport, // gain access to in memor own aircraft data
public BlackMisc::Simulation::CRemoteAircraftProviderSupport // gain access to in memory rendered aircraft data
public BlackMisc::Simulation::CRemoteAircraftProviderSupport // gain access to in memory remote aircraft data
{
Q_OBJECT
@@ -219,6 +234,16 @@ namespace BlackCore
//! \copydoc ISimulator::getInstalledModelsCount
virtual int getInstalledModelsCount() const override;
//! \copydoc IContextSimulator::highlightAircraft
virtual void highlightAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraftToHighlight, bool enableHighlight, const BlackMisc::PhysicalQuantities::CTime &displayTime) override;
//! \copydoc IContextSimulator::isRenderingEnabled
virtual bool isRenderingEnabled() const override;
protected slots:
//! Slow timer used to highlight aircraft, can be used for other things too
virtual void ps_oneSecondTimer();
protected:
//! Constructor
CSimulatorCommon(
@@ -227,10 +252,26 @@ namespace BlackCore
BlackMisc::Simulation::IRemoteAircraftProvider *remoteAircraftProvider,
QObject *parent = nullptr);
//! Blink the highlighted aircraft
void blinkHighlightedAircraft();
//! Restore aircraft from backedn data
void resetAircraftFromBacked(const BlackMisc::Aviation::CCallsign &callsign);
//! Override parts and situation from current interpolator values, if any!
void setInitialAircraftSituationAndParts(BlackMisc::Simulation::CSimulatedAircraft &aircraft) const;
BlackSim::CSimulatorInfo m_simulatorInfo; //!< about the simulator
int m_maxRenderedAircraft = 99; //!< max. rendered aircraft
int m_maxRenderedAircraft = 90; //!< max. rendered aircraft
bool m_debugMessages = false; //!< Display debug messages
BlackMisc::Aviation::CCallsignList m_callsignsToBeRendered; //!< all other aircraft are to be ignored
bool m_blinkCycle = false; //!< use for highlighting
IInterpolator *m_interpolator = nullptr; //!< interpolator instance
qint64 m_highlightEndTimeMsEpoch = 0;
BlackMisc::Simulation::CSimulatedAircraftList m_highlightedAircraft; //!< all other aircraft are to be ignored
BlackMisc::Aviation::CCallsignList m_callsignsToBeRendered;
QTimer *m_oneSecondTimer = nullptr;
};
} // namespace