mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-16 10:25:36 +08:00
Ref T702, hardcoded min.ranges for ATC stations
This commit is contained in:
@@ -102,10 +102,10 @@ namespace BlackCore
|
|||||||
m_positionUpdateTimer.setObjectName(this->objectName().append(":m_positionUpdateTimer"));
|
m_positionUpdateTimer.setObjectName(this->objectName().append(":m_positionUpdateTimer"));
|
||||||
m_interimPositionUpdateTimer.setObjectName(this->objectName().append(":m_interimPositionUpdateTimer"));
|
m_interimPositionUpdateTimer.setObjectName(this->objectName().append(":m_interimPositionUpdateTimer"));
|
||||||
|
|
||||||
connect(&m_processingTimer, &QTimer::timeout, this, &CNetworkVatlib::process);
|
connect(&m_processingTimer, &QTimer::timeout, this, &CNetworkVatlib::process);
|
||||||
connect(&m_positionUpdateTimer, &QTimer::timeout, this, &CNetworkVatlib::sendPositionUpdate);
|
connect(&m_positionUpdateTimer, &QTimer::timeout, this, &CNetworkVatlib::sendPositionUpdate);
|
||||||
connect(&m_interimPositionUpdateTimer, &QTimer::timeout, this, &CNetworkVatlib::sendInterimPositions);
|
connect(&m_interimPositionUpdateTimer, &QTimer::timeout, this, &CNetworkVatlib::sendInterimPositions);
|
||||||
connect(&m_scheduledConfigUpdate, &QTimer::timeout, this, &CNetworkVatlib::sendIncrementalAircraftConfig);
|
connect(&m_scheduledConfigUpdate, &QTimer::timeout, this, &CNetworkVatlib::sendIncrementalAircraftConfig);
|
||||||
m_scheduledConfigUpdate.setSingleShot(true);
|
m_scheduledConfigUpdate.setSingleShot(true);
|
||||||
|
|
||||||
m_processingTimer.start(c_processingIntervalMsec);
|
m_processingTimer.start(c_processingIntervalMsec);
|
||||||
@@ -1167,19 +1167,50 @@ namespace BlackCore
|
|||||||
const int frequencyKHz = pos->frequency;
|
const int frequencyKHz = pos->frequency;
|
||||||
CFrequency freq(frequencyKHz, CFrequencyUnit::kHz());
|
CFrequency freq(frequencyKHz, CFrequencyUnit::kHz());
|
||||||
freq.switchUnit(CFrequencyUnit::MHz()); // we would not need to bother, but this makes it easier to identify
|
freq.switchUnit(CFrequencyUnit::MHz()); // we would not need to bother, but this makes it easier to identify
|
||||||
CLength range(pos->visibleRange, CLengthUnit::NM());
|
const CLength networkRange(pos->visibleRange, CLengthUnit::NM());
|
||||||
const QString cs = cbvar_cast(cbvar)->fromFSD(callsign);
|
const CCallsign cs(cbvar_cast(cbvar)->fromFSD(callsign), CCallsign::Atc);
|
||||||
|
|
||||||
// Filter non-ATC like OBS stations, like pilots logging in as shared cockpit co-pilots.
|
// Filter non-ATC like OBS stations, like pilots logging in as shared cockpit co-pilots.
|
||||||
if (pos->facility == vatFacilityTypeUnknown && !cs.endsWith("_OBS")) { return; }
|
if (pos->facility == vatFacilityTypeUnknown && !cs.isObserverCallsign()) { return; }
|
||||||
|
|
||||||
// ATIS often have a range of 0 nm. Correct this to a proper value.
|
const CLength range = fixAtcRange(networkRange, cs);
|
||||||
if (cs.contains("_ATIS") && pos->visibleRange == 0) { range.setValueSameUnit(150.0); }
|
|
||||||
const CCoordinateGeodetic position(pos->latitude, pos->longitude, 0);
|
const CCoordinateGeodetic position(pos->latitude, pos->longitude, 0);
|
||||||
|
|
||||||
emit self->atcPositionUpdate(CCallsign(cs, CCallsign::Atc), freq, position, range);
|
emit self->atcPositionUpdate(cs, freq, position, range);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const CLength &CNetworkVatlib::fixAtcRange(const CLength &networkRange, const CCallsign &cs)
|
||||||
|
{
|
||||||
|
/** T702, https://discordapp.com/channels/539048679160676382/539846348275449887/597814208125730826
|
||||||
|
DEL 5 NM
|
||||||
|
GND 10 NM
|
||||||
|
TWR 25 NM
|
||||||
|
DEP/APP 150 NM
|
||||||
|
CTR 300 NM
|
||||||
|
FSS fixed 1500NM, no minimum
|
||||||
|
**/
|
||||||
|
|
||||||
|
// ATIS often have a range of 0 nm. Correct this to a proper value.
|
||||||
|
const QString suffix = cs.getSuffix();
|
||||||
|
if (suffix.contains(QStringLiteral("ATIS"), Qt::CaseInsensitive)) { static const CLength l_Atis(150.0, CLengthUnit::NM()); return maxOrNotNull(networkRange, l_Atis); }
|
||||||
|
if (suffix.contains(QStringLiteral("GND"), Qt::CaseInsensitive)) { static const CLength l_Gnd(10.0, CLengthUnit::NM()); return maxOrNotNull(networkRange, l_Gnd); }
|
||||||
|
if (suffix.contains(QStringLiteral("TWR"), Qt::CaseInsensitive)) { static const CLength l_Twr(25.0, CLengthUnit::NM()); return maxOrNotNull(networkRange, l_Twr); }
|
||||||
|
if (suffix.contains(QStringLiteral("DEP"), Qt::CaseInsensitive)) { static const CLength l_Dep(150.0, CLengthUnit::NM()); return maxOrNotNull(networkRange, l_Dep); }
|
||||||
|
if (suffix.contains(QStringLiteral("APP"), Qt::CaseInsensitive)) { static const CLength l_App(150.0, CLengthUnit::NM()); return maxOrNotNull(networkRange, l_App); }
|
||||||
|
if (suffix.contains(QStringLiteral("CTR"), Qt::CaseInsensitive)) { static const CLength l_Ctr(300.0, CLengthUnit::NM()); return maxOrNotNull(networkRange, l_Ctr); }
|
||||||
|
if (suffix.contains(QStringLiteral("FSS"), Qt::CaseInsensitive)) { static const CLength l_Fss(1500.0, CLengthUnit::NM()); return maxOrNotNull(networkRange, l_Fss); }
|
||||||
|
|
||||||
|
return networkRange;
|
||||||
|
}
|
||||||
|
|
||||||
|
const CLength &CNetworkVatlib::maxOrNotNull(const CLength &l1, const CLength &l2)
|
||||||
|
{
|
||||||
|
if (l1.isNull()) { return l2; }
|
||||||
|
if (l2.isNull()) { return l1; }
|
||||||
|
return (l2 > l1) ? l2 : l1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void CNetworkVatlib::onKicked(VatFsdClient *, const char *reason, void *cbvar)
|
void CNetworkVatlib::onKicked(VatFsdClient *, const char *reason, void *cbvar)
|
||||||
{
|
{
|
||||||
emit cbvar_cast(cbvar)->kicked(cbvar_cast(cbvar)->fromFSD(reason));
|
emit cbvar_cast(cbvar)->kicked(cbvar_cast(cbvar)->fromFSD(reason));
|
||||||
|
|||||||
@@ -264,7 +264,13 @@ namespace BlackCore
|
|||||||
//! Remove colon
|
//! Remove colon
|
||||||
static QString removeColon(const QString &candidate);
|
static QString removeColon(const QString &candidate);
|
||||||
|
|
||||||
//! Enum as type
|
//! Fix ATC station range
|
||||||
|
static const BlackMisc::PhysicalQuantities::CLength &fixAtcRange(const BlackMisc::PhysicalQuantities::CLength &networkRange, const BlackMisc::Aviation::CCallsign &cs);
|
||||||
|
|
||||||
|
//! Max or 1st non-null value
|
||||||
|
static const BlackMisc::PhysicalQuantities::CLength &maxOrNotNull(const BlackMisc::PhysicalQuantities::CLength &l1, const BlackMisc::PhysicalQuantities::CLength &l2);
|
||||||
|
|
||||||
|
//! Enum as
|
||||||
static const QString &enumToString(VatClientQueryType type);
|
static const QString &enumToString(VatClientQueryType type);
|
||||||
|
|
||||||
//! Deletion policy for QScopedPointer
|
//! Deletion policy for QScopedPointer
|
||||||
|
|||||||
Reference in New Issue
Block a user