mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-13 07:35:41 +08:00
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:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)));
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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) {}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user