Ref T259, Ref T243 created an implementation for remote aircraft provider

* this implementation is used by airspace monitor
* also used by dummy provider (advantage, unit tests test the real provider)
* some functions adjusted
This commit is contained in:
Klaus Basan
2018-03-25 23:02:49 +02:00
parent 9abc57bb3d
commit 1c89f4c8e3
9 changed files with 766 additions and 904 deletions

View File

@@ -10,13 +10,6 @@
#include "blackmisc/aviation/callsign.h"
#include "blackmisc/geo/elevationplane.h"
#include "blackmisc/simulation/remoteaircraftproviderdummy.h"
#include "blackmisc/collection.h"
#include "blackmisc/compare.h"
#include "blackmisc/dictionary.h"
#include "blackmisc/propertyindexvariantmap.h"
#include "blackmisc/variant.h"
#include <QTimer>
#include <QHash>
using namespace BlackMisc::Aviation;
using namespace BlackMisc::Geo;
@@ -25,227 +18,38 @@ namespace BlackMisc
{
namespace Simulation
{
CRemoteAircraftProviderDummy::CRemoteAircraftProviderDummy(QObject *parent) : QObject(parent)
CRemoteAircraftProviderDummy::CRemoteAircraftProviderDummy(QObject *parent) : CRemoteAircraftProvider(parent)
{ }
CSimulatedAircraftList CRemoteAircraftProviderDummy::getAircraftInRange() const
{
return m_aircraft;
}
int CRemoteAircraftProviderDummy::getAircraftInRangeCount() const
{
return m_aircraft.size();
}
CCallsignSet CRemoteAircraftProviderDummy::getAircraftInRangeCallsigns() const
{
return m_aircraft.getCallsigns();
}
CSimulatedAircraft CRemoteAircraftProviderDummy::getAircraftInRangeForCallsign(const CCallsign &callsign) const
{
return m_aircraft.findFirstByCallsign(callsign);
}
CAircraftModel CRemoteAircraftProviderDummy::getAircraftInRangeModelForCallsign(const CCallsign &callsign) const
{
return getAircraftInRangeForCallsign(callsign).getModel();
}
bool CRemoteAircraftProviderDummy::isAircraftInRange(const CCallsign &callsign) const
{
return m_aircraft.containsCallsign(callsign);
}
bool CRemoteAircraftProviderDummy::isVtolAircraft(const CCallsign &callsign) const
{
return m_aircraft.findFirstByCallsign(callsign).isVtol();
}
CAirspaceAircraftSnapshot CRemoteAircraftProviderDummy::getLatestAirspaceAircraftSnapshot() const
{
return CAirspaceAircraftSnapshot(m_aircraft);
}
CAircraftPartsList CRemoteAircraftProviderDummy::remoteAircraftParts(const BlackMisc::Aviation::CCallsign &callsign, qint64 cutoffTimeBefore) const
{
if (cutoffTimeBefore < 0) { return m_parts.value(callsign); }
return m_parts.value(callsign).findBefore(cutoffTimeBefore);
}
int CRemoteAircraftProviderDummy::remoteAircraftPartsCount(const CCallsign &callsign, qint64 cutoffTimeBefore) const
{
return this->remoteAircraftParts(callsign, cutoffTimeBefore).size();
}
CAircraftSituationList CRemoteAircraftProviderDummy::remoteAircraftSituations(const BlackMisc::Aviation::CCallsign &callsign) const
{
return m_situations.findByCallsign(callsign);
}
int CRemoteAircraftProviderDummy::remoteAircraftSituationsCount(const CCallsign &callsign) const
{
return remoteAircraftSituations(callsign).size();
}
int CRemoteAircraftProviderDummy::getRemoteAircraftSupportingPartsCount() const
{
return m_parts.keys().size();
}
CCallsignSet CRemoteAircraftProviderDummy::remoteAircraftSupportingParts() const
{
return CCollection<CCallsign>(m_parts.keys());
}
bool CRemoteAircraftProviderDummy::isRemoteAircraftSupportingParts(const CCallsign &callsign) const
{
return remoteAircraftParts(callsign).size() > 0;
}
QList<QMetaObject::Connection> CRemoteAircraftProviderDummy::connectRemoteAircraftProviderSignals(
QObject *receiver,
std::function<void (const CAircraftSituation &)> situationSlot,
std::function<void (const BlackMisc::Aviation::CCallsign &, const CAircraftParts &)> partsSlot,
std::function<void (const CCallsign &)> removedAircraftSlot,
std::function<void (const CAirspaceAircraftSnapshot &)> aircraftSnapshotSlot
)
{
Q_ASSERT_X(receiver, Q_FUNC_INFO, "Missing receiver");
QList<QMetaObject::Connection> c(
{
connect(this, &CRemoteAircraftProviderDummy::addedRemoteAircraftSituation, receiver, situationSlot),
connect(this, &CRemoteAircraftProviderDummy::addedRemoteAircraftParts, receiver, partsSlot),
connect(this, &CRemoteAircraftProviderDummy::removedRemoteAircraft, receiver, removedAircraftSlot),
connect(this, &CRemoteAircraftProviderDummy::airspaceAircraftSnapshot, receiver, aircraftSnapshotSlot)
});
return c;
}
bool CRemoteAircraftProviderDummy::updateAircraftEnabled(const CCallsign &callsign, bool enabledForRendering)
{
CPropertyIndexVariantMap vm(CSimulatedAircraft::IndexEnabled, CVariant::fromValue(enabledForRendering));
const int n = m_aircraft.applyIfCallsign(callsign, vm);
return n > 0;
}
bool CRemoteAircraftProviderDummy::updateAircraftModel(const CCallsign &callsign, const CAircraftModel &model, const CIdentifier &originator)
{
Q_UNUSED(originator);
CPropertyIndexVariantMap vm(CSimulatedAircraft::IndexModel, CVariant::from(model));
const int n = m_aircraft.applyIfCallsign(callsign, vm);
return n > 0;
}
bool CRemoteAircraftProviderDummy::updateAircraftNetworkModel(const CCallsign &callsign, const CAircraftModel &model, const CIdentifier &originator)
{
Q_UNUSED(originator);
CPropertyIndexVariantMap vm(CSimulatedAircraft::IndexNetworkModel, CVariant::from(model));
const int n = m_aircraft.applyIfCallsign(callsign, vm);
return n > 0;
}
bool CRemoteAircraftProviderDummy::updateFastPositionEnabled(const CCallsign &callsign, bool enableFastPositionUpdates)
{
CPropertyIndexVariantMap vm(CSimulatedAircraft::IndexFastPositionUpdates, CVariant::fromValue(enableFastPositionUpdates));
const int n = m_aircraft.applyIfCallsign(callsign, vm);
return n > 0;
}
bool CRemoteAircraftProviderDummy::updateAircraftRendered(const CCallsign &callsign, bool rendered)
{
CPropertyIndexVariantMap vm(CSimulatedAircraft::IndexRendered, CVariant::fromValue(rendered));
const int n = m_aircraft.applyIfCallsign(callsign, vm);
return n > 0;
}
bool CRemoteAircraftProviderDummy::updateAircraftGroundElevation(const CCallsign &callsign, const CElevationPlane &elevation)
{
CPropertyIndexVariantMap vm({ CSimulatedAircraft::IndexSituation, CAircraftSituation::IndexGroundElevationPlane }, CVariant::fromValue(elevation));
const int c = m_aircraft.applyIfCallsign(callsign, vm);
return c > 0;
}
void CRemoteAircraftProviderDummy::updateMarkAllAsNotRendered()
{
m_aircraft.markAllAsNotRendered();
}
CStatusMessageList CRemoteAircraftProviderDummy::getReverseLookupMessages(const CCallsign &callsign) const
{
Q_UNUSED(callsign);
return CStatusMessageList();
}
bool CRemoteAircraftProviderDummy::isReverseLookupMessagesEnabled() const
{
return false;
}
void CRemoteAircraftProviderDummy::enableReverseLookupMessages(bool enabled)
{
Q_UNUSED(enabled);
}
CStatusMessageList CRemoteAircraftProviderDummy::getAircraftPartsHistory(const CCallsign &callsign) const
{
Q_UNUSED(callsign);
return CStatusMessageList();
}
bool CRemoteAircraftProviderDummy::isAircraftPartsHistoryEnabled() const
{
return false;
}
void CRemoteAircraftProviderDummy::enableAircraftPartsHistory(bool enabled)
{
Q_UNUSED(enabled);
}
void CRemoteAircraftProviderDummy::insertNewSituation(const CAircraftSituation &situation)
{
m_situations.push_frontKeepLatestAdjustedFirst(situation);
emit addedRemoteAircraftSituation(situation);
this->storeAircraftSituation(situation);
}
void CRemoteAircraftProviderDummy::insertNewSituations(const CAircraftSituationList &situations)
{
for (const CAircraftSituation &situation : situations)
{
m_situations.push_frontKeepLatestAdjustedFirst(situation);
QTimer::singleShot(0, this, [ = ]
{
emit this->addedRemoteAircraftSituation(situation);
});
this->storeAircraftSituation(situation);
}
}
void CRemoteAircraftProviderDummy::insertNewAircraftParts(const CCallsign &callsign, const CAircraftParts &parts)
void CRemoteAircraftProviderDummy::insertNewAircraftParts(const CCallsign &callsign, const CAircraftParts &parts, bool removeOutdatedParts)
{
m_parts[callsign].push_frontKeepLatestAdjustedFirst(parts);
emit addedRemoteAircraftParts(callsign, parts);
this->storeAircraftParts(callsign, parts, removeOutdatedParts);
}
void CRemoteAircraftProviderDummy::insertNewAircraftParts(const CCallsign &callsign, const CAircraftPartsList &partsList)
void CRemoteAircraftProviderDummy::insertNewAircraftParts(const CCallsign &callsign, const CAircraftPartsList &partsList, bool removeOutdatedParts)
{
CAircraftPartsList &pl = m_parts[callsign];
for (const CAircraftParts &parts : partsList)
{
pl.push_frontKeepLatestAdjustedFirst(parts);
QTimer::singleShot(0, this, [ = ]
{
emit this->addedRemoteAircraftParts(callsign, parts);
});
this->storeAircraftParts(callsign, parts, removeOutdatedParts);
}
}
void CRemoteAircraftProviderDummy::clear()
CAirspaceAircraftSnapshot CRemoteAircraftProviderDummy::getLatestAirspaceAircraftSnapshot() const
{
m_situations.clear();
m_parts.clear();
m_aircraft.clear();
return CAirspaceAircraftSnapshot();
}
} // namespace
} // namespace