Ref T232, aircraft can be re-added or removed via "dot-commands"

* can be used for testing
* utility functions to find inconsistent aircraft states
* reset highlight state
This commit is contained in:
Klaus Basan
2018-01-25 21:56:01 +01:00
parent 3ee5e68054
commit 897a6f301f
7 changed files with 140 additions and 28 deletions

View File

@@ -107,6 +107,17 @@ namespace BlackCore
//! it will physically added to the simulator. //! it will physically added to the simulator.
virtual bool logicallyRemoveRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign) = 0; virtual bool logicallyRemoveRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign) = 0;
//! Removes and adds again the aircraft
//! \sa logicallyRemoveRemoteAircraft
//! \sa logicallyAddRemoteAircraft
virtual bool logicallyReAddRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign) = 0;
//! Find the unrendered enabled aircraft
virtual BlackMisc::Aviation::CCallsignSet unrenderedEnabledAircraft() const = 0;
//! Find the rendered disabled aircraft
virtual BlackMisc::Aviation::CCallsignSet renderedDisabledAircraft() const = 0;
//! Change remote aircraft per property //! Change remote aircraft per property
virtual bool changeRemoteAircraftModel(const BlackMisc::Simulation::CSimulatedAircraft &aircraft) = 0; virtual bool changeRemoteAircraftModel(const BlackMisc::Simulation::CSimulatedAircraft &aircraft) = 0;

View File

@@ -27,6 +27,7 @@
#include <QDateTime> #include <QDateTime>
#include <QString> #include <QString>
#include <QStringBuilder>
#include <QThread> #include <QThread>
#include <QDir> #include <QDir>
#include <QUrl> #include <QUrl>
@@ -161,16 +162,7 @@ namespace BlackCore
} }
else else
{ {
// restore this->stopHighlighting();
for (const CSimulatedAircraft &aircraft : as_const(m_highlightedAircraft))
{
// get the current state for this aircraft
// it might has been removed in the meantime
const CCallsign cs(aircraft.getCallsign());
this->resetAircraftFromProvider(cs);
}
m_highlightedAircraft.clear();
m_highlightEndTimeMsEpoch = 0;
} }
} }
@@ -339,6 +331,45 @@ namespace BlackCore
return (!sApp || sApp->isShuttingDown()); return (!sApp || sApp->isShuttingDown());
} }
bool CSimulatorCommon::logicallyReAddRemoteAircraft(const CCallsign &callsign)
{
if (this->isShuttingDown()) { return false; }
if (callsign.isEmpty()) { return false; }
this->stopHighlighting();
this->logicallyRemoveRemoteAircraft(callsign);
if (!this->isAircraftInRange(callsign)) { return false; }
QTimer::singleShot(2500, this, [ = ]
{
if (this->isShuttingDown()) { return; }
if (!this->isAircraftInRange(callsign)) { return; }
const CSimulatedAircraft aircraft = this->getAircraftInRangeForCallsign(callsign);
if (aircraft.isEnabled() && aircraft.hasModelString())
{
this->logicallyAddRemoteAircraft(aircraft);
}
});
return true;
}
CCallsignSet CSimulatorCommon::unrenderedEnabledAircraft() const
{
const CSimulatedAircraftList aircraft = this->getAircraftInRange().findByEnabled(true);
if (aircraft.isEmpty()) { return CCallsignSet(); }
CCallsignSet enabledOnes = aircraft.getCallsigns();
const CCallsignSet renderedOnes = this->physicallyRenderedAircraft();
enabledOnes.remove(renderedOnes);
return enabledOnes;
}
CCallsignSet CSimulatorCommon::renderedDisabledAircraft() const
{
const CSimulatedAircraftList aircraft = this->getAircraftInRange().findByEnabled(false);
if (aircraft.isEmpty()) { return CCallsignSet(); }
const CCallsignSet disabledOnes = aircraft.getCallsigns();
const CCallsignSet renderedOnes = this->physicallyRenderedAircraft();
return renderedOnes.intersection(disabledOnes);
}
void CSimulatorCommon::setInterpolationAndRenderingSetup(const CInterpolationAndRenderingSetup &setup) void CSimulatorCommon::setInterpolationAndRenderingSetup(const CInterpolationAndRenderingSetup &setup)
{ {
{ {
@@ -373,6 +404,8 @@ namespace BlackCore
int CSimulatorCommon::physicallyRemoveMultipleRemoteAircraft(const CCallsignSet &callsigns) int CSimulatorCommon::physicallyRemoveMultipleRemoteAircraft(const CCallsignSet &callsigns)
{ {
if (callsigns.isEmpty()) { return 0; }
this->stopHighlighting();
int removed = 0; int removed = 0;
for (const CCallsign &callsign : callsigns) for (const CCallsign &callsign : callsigns)
{ {
@@ -501,6 +534,42 @@ namespace BlackCore
return false; return false;
} }
if (parser.hasPart(2) && (part1.startsWith("aircraft") || part1.startsWith("ac")))
{
const QString part2 = parser.part(2).toLower();
if (parser.hasPart(3) && (part2.startsWith("readd") || part2.startsWith("re-add")))
{
const QString cs = parser.part(3).toUpper();
if (cs == "all")
{
this->physicallyRemoveAllRemoteAircraft();
const CStatusMessageList msgs = this->debugVerifyStateAfterAllAircraftRemoved();
this->clearAllRemoteAircraftData();
if (!msgs.isEmpty()) { emit this->driverMessages(msgs); }
const CSimulatedAircraftList aircraft = this->getAircraftInRange();
for (const CSimulatedAircraft a : aircraft)
{
if (a.isEnabled()) { this->logicallyAddRemoteAircraft(a); }
}
}
else if (CCallsign::isValidAircraftCallsign(cs))
{
this->logicallyReAddRemoteAircraft(cs);
return true;
}
return false;
}
if (parser.hasPart(3) && (part2.startsWith("rm") || part2.startsWith("remove")))
{
const QString cs = parser.part(3).toUpper();
if (CCallsign::isValidAircraftCallsign(cs))
{
this->logicallyRemoveRemoteAircraft(cs);
}
}
return false;
}
// driver specific cmd line arguments // driver specific cmd line arguments
return this->parseDetails(parser); return this->parseDetails(parser);
} }
@@ -516,10 +585,16 @@ namespace BlackCore
CSimpleCommandParser::registerCommand({".drv logint max number", "max.number of entries logged"}); CSimpleCommandParser::registerCommand({".drv logint max number", "max.number of entries logged"});
CSimpleCommandParser::registerCommand({".drv pos callsign", "show position for callsign"}); CSimpleCommandParser::registerCommand({".drv pos callsign", "show position for callsign"});
CSimpleCommandParser::registerCommand({".drv spline|linear callsign", "set spline/linear interpolator for one/all callsign(s)"}); CSimpleCommandParser::registerCommand({".drv spline|linear callsign", "set spline/linear interpolator for one/all callsign(s)"});
CSimpleCommandParser::registerCommand({".drv aircraft readd callsign", "add again a given callsign"});
CSimpleCommandParser::registerCommand({".drv aircraft readd all", "add again all aircraft"});
CSimpleCommandParser::registerCommand({".drv aircraft rm callsign", "remove a given callsign"});
} }
void CSimulatorCommon::resetAircraftStatistics() void CSimulatorCommon::resetAircraftStatistics()
{ {
m_statsUpdateAircraftCountMs = 0;
m_statsUpdateAircraftTimeAvgMs = 0;
m_statsUpdateAircraftTimeTotalMs = 0;
m_statsPhysicallyAddedAircraft = 0; m_statsPhysicallyAddedAircraft = 0;
m_statsPhysicallyRemovedAircraft = 0; m_statsPhysicallyRemovedAircraft = 0;
m_statsPartsAdded = 0; m_statsPartsAdded = 0;
@@ -610,20 +685,38 @@ namespace BlackCore
void CSimulatorCommon::reset() void CSimulatorCommon::reset()
{ {
m_statsUpdateAircraftCountMs = 0; this->clearAllRemoteAircraftData();
m_statsUpdateAircraftTimeAvgMs = 0; }
m_statsUpdateAircraftTimeTotalMs = 0;
void CSimulatorCommon::resetHighlighting()
{
m_highlightedAircraft.clear();
m_blinkCycle = false; m_blinkCycle = false;
m_highlightEndTimeMsEpoch = false; m_highlightEndTimeMsEpoch = false;
this->clearAllRemoteAircraftData(); }
void CSimulatorCommon::stopHighlighting()
{
// restore
const CSimulatedAircraftList highlightedAircraft(m_highlightedAircraft);
for (const CSimulatedAircraft &aircraft : highlightedAircraft)
{
// get the current state for this aircraft
// it might has been removed in the meantime
const CCallsign cs(aircraft.getCallsign());
this->resetAircraftFromProvider(cs);
}
this->resetHighlighting();
} }
void CSimulatorCommon::clearAllRemoteAircraftData() void CSimulatorCommon::clearAllRemoteAircraftData()
{ {
// rendering related stuff
m_addAgainAircraftWhenRemoved.clear(); m_addAgainAircraftWhenRemoved.clear();
m_highlightedAircraft.clear();
m_callsignsToBeRendered.clear(); m_callsignsToBeRendered.clear();
m_hints.clear(); m_hints.clear();
this->resetHighlighting();
this->resetAircraftStatistics(); this->resetAircraftStatistics();
} }

View File

@@ -84,6 +84,9 @@ namespace BlackCore
virtual void setWeatherActivated(bool activated) override; virtual void setWeatherActivated(bool activated) override;
virtual void unload() override; virtual void unload() override;
virtual bool isShuttingDown() const override; virtual bool isShuttingDown() const override;
virtual bool logicallyReAddRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign) override;
virtual BlackMisc::Aviation::CCallsignSet unrenderedEnabledAircraft() const override;
virtual BlackMisc::Aviation::CCallsignSet renderedDisabledAircraft() const override;
virtual int physicallyRemoveMultipleRemoteAircraft(const BlackMisc::Aviation::CCallsignSet &callsigns) override; virtual int physicallyRemoveMultipleRemoteAircraft(const BlackMisc::Aviation::CCallsignSet &callsigns) override;
virtual int physicallyRemoveAllRemoteAircraft() override; virtual int physicallyRemoveAllRemoteAircraft() override;
virtual void clearAllRemoteAircraftData() override; virtual void clearAllRemoteAircraftData() override;
@@ -97,8 +100,11 @@ namespace BlackCore
//! .drv logint off no log information for interpolator BlackCore::CSimulatorCommon //! .drv logint off no log information for interpolator BlackCore::CSimulatorCommon
//! .drv logint write write interpolator log to file BlackCore::CSimulatorCommon //! .drv logint write write interpolator log to file BlackCore::CSimulatorCommon
//! .drv logint clear clear current log BlackCore::CSimulatorCommon //! .drv logint clear clear current log BlackCore::CSimulatorCommon
//! .drv pos callsign shows current position in simulator //! .drv pos callsign shows current position in simulator BlackCore::CSimulatorCommon
//! .drv spline|linear callsign interpolator spline or linear BlackCore::CSimulatorCommon //! .drv spline|linear callsign interpolator spline or linear BlackCore::CSimulatorCommon
//! .drv aircraft readd callsign re-add (add again) aircraft BlackCore::CSimulatorCommon
//! .drv aircraft readd all re-add all aircraft BlackCore::CSimulatorCommon
//! .drv aircraft rm callsign remove aircraft BlackCore::CSimulatorCommon
//! </pre> //! </pre>
//! @} //! @}
//! \copydoc ISimulator::parseCommandLine //! \copydoc ISimulator::parseCommandLine
@@ -168,6 +174,12 @@ namespace BlackCore
//! \sa ISimulator::clearAllRemoteAircraftData //! \sa ISimulator::clearAllRemoteAircraftData
virtual void reset(); virtual void reset();
//! Reset highlighting
void resetHighlighting();
//! Restore all highlighted aircraft
void stopHighlighting();
//! Inject weather grid to simulator //! Inject weather grid to simulator
virtual void injectWeatherGrid(const BlackMisc::Weather::CWeatherGrid &weatherGrid) { Q_UNUSED(weatherGrid); } virtual void injectWeatherGrid(const BlackMisc::Weather::CWeatherGrid &weatherGrid) { Q_UNUSED(weatherGrid); }

View File

@@ -206,6 +206,7 @@ namespace BlackSimPlugin
int CSimulatorFs9::physicallyRemoveAllRemoteAircraft() int CSimulatorFs9::physicallyRemoveAllRemoteAircraft()
{ {
resetHighlighting();
if (m_hashFs9Clients.isEmpty()) { return 0; } if (m_hashFs9Clients.isEmpty()) { return 0; }
QList<CCallsign> callsigns(m_hashFs9Clients.keys()); QList<CCallsign> callsigns(m_hashFs9Clients.keys());
int r = 0; int r = 0;

View File

@@ -137,16 +137,10 @@ namespace BlackSimPlugin
bool CSimulatorFsCommon::changeRemoteAircraftEnabled(const CSimulatedAircraft &aircraft) bool CSimulatorFsCommon::changeRemoteAircraftEnabled(const CSimulatedAircraft &aircraft)
{ {
if (aircraft.isEnabled()) return aircraft.isEnabled() ?
{ this->physicallyAddRemoteAircraft(aircraft) :
this->physicallyAddRemoteAircraft(aircraft);
}
else
{
this->physicallyRemoveRemoteAircraft(aircraft.getCallsign()); this->physicallyRemoveRemoteAircraft(aircraft.getCallsign());
} }
return true;
}
void CSimulatorFsCommon::onSwiftDbAirportsRead() void CSimulatorFsCommon::onSwiftDbAirportsRead()
{ {

View File

@@ -968,6 +968,7 @@ namespace BlackSimPlugin
{ {
// make sure they are not added again // make sure they are not added again
// cleaning here is somewhat redundant, but double checks // cleaning here is somewhat redundant, but double checks
this->resetHighlighting();
m_addPendingAircraft.clear(); m_addPendingAircraft.clear();
m_addAgainAircraftWhenRemoved.clear(); m_addAgainAircraftWhenRemoved.clear();
@@ -978,7 +979,6 @@ namespace BlackSimPlugin
{ {
if (this->physicallyRemoveRemoteAircraft(cs)) { r++; } if (this->physicallyRemoveRemoteAircraft(cs)) { r++; }
} }
this->clearAllRemoteAircraftData();
return r; return r;
} }

View File

@@ -577,6 +577,7 @@ namespace BlackSimPlugin
{ {
Q_ASSERT(isConnected()); Q_ASSERT(isConnected());
//! \todo XP driver obtain number of removed aircraft //! \todo XP driver obtain number of removed aircraft
resetHighlighting();
int r = getAircraftInRangeCount(); int r = getAircraftInRangeCount();
m_traffic->removeAllPlanes(); m_traffic->removeAllPlanes();
updateMarkAllAsNotRendered(); updateMarkAllAsNotRendered();