diff --git a/src/blackcore/context_network_atc.cpp b/src/blackcore/context_network_atc.cpp index b56236110..de27f0426 100644 --- a/src/blackcore/context_network_atc.cpp +++ b/src/blackcore/context_network_atc.cpp @@ -152,12 +152,75 @@ namespace BlackCore /* * ATIS received */ - void CContextNetwork::psFsdAtisQueryReceived(const CCallsign &callsign, const QString &atisMessage) + void CContextNetwork::psFsdAtisQueryReceived(const CCallsign &callsign, Cvatlib_Network::atisLineType lineType, const QString &atisMessage) { - this->log(Q_FUNC_INFO, callsign.toQString(), atisMessage); - CValueMap vm(CAtcStation::IndexAtisMessage, atisMessage); - this->m_atcStationsOnline.applyIf(&CAtcStation::getCallsign, callsign, vm); - this->m_atcStationsBooked.applyIf(&CAtcStation::getCallsign, callsign, vm); + // this->log(Q_FUNC_INFO, callsign.toQString(), atisMessage); + + // The ATIS consists of several lines, so the complete + // message needs to be build up before it can be set + // :V -> voice room address. + // :T Controller atis message + // :E Zulu logoff time + // :Z atis line count including this one + + QString currentAtisMessage = this->m_atisMessageBuilder.contains(callsign.asString()) ? + this->m_atisMessageBuilder[callsign.asString()] : ""; + switch (lineType) + { + case Cvatlib_Network::atisLineType_LineCount: + { + // line count denotes end of ATIS + CValueMap vm(CAtcStation::IndexAtisMessage, currentAtisMessage); + this->m_atcStationsOnline.applyIf(&CAtcStation::getCallsign, callsign, vm); + this->m_atcStationsBooked.applyIf(&CAtcStation::getCallsign, callsign, vm); + this->m_atisMessageBuilder.remove(callsign.asString()); + return; // ignore, nothing to do + } + case Cvatlib_Network::atisLineType_VoiceRoom: + { + QString voiceRoomUrl = atisMessage.trimmed(); + CValueMap vm(CAtcStation::IndexVoiceRoomUrl, voiceRoomUrl); + this->m_atcStationsOnline.applyIf(&CAtcStation::getCallsign, callsign, vm); + this->m_atcStationsBooked.applyIf(&CAtcStation::getCallsign, callsign, vm); + break; // voice room set, but also add to message + } + case Cvatlib_Network::atisLineType_ZuluLogoff: + { + if (atisMessage.length() == 4) + { + // Logic to set logoff time + bool ok; + int h = atisMessage.left(2).toInt(&ok); + if (!ok) break; + int m = atisMessage.right(2).toInt(&ok); + if (!ok) break; + QDateTime zuluLogoff = QDateTime::currentDateTimeUtc(); + zuluLogoff.setTime(QTime(h, m)); + CValueMap vm(CAtcStation::IndexBookedUntil, zuluLogoff); + this->m_atcStationsOnline.applyIf(&CAtcStation::getCallsign, callsign, vm); + this->m_atcStationsBooked.applyIf(&CAtcStation::getCallsign, callsign, vm); + } + break; // ZULU time set, but also add to message + } + case Cvatlib_Network::atisLineType_TextMessage: + break; + default: + break; + } + + const QString fixedAtisMessage = atisMessage.trimmed(); + if (fixedAtisMessage.isEmpty()) return; + + // detect the stupid z1, z2, z3 placeholders + // TODO: Anything better as this stupid code here? + const QString atisTest = fixedAtisMessage.toLower().remove(QRegExp("[\\n\\t\\r]")); + if (atisTest == "z") return; + if (atisTest.startsWith("z") && atisTest.length() == 2) return; // z1, z2, .. + if (atisTest.length() == 1) return; // sometimes just z + + if (!currentAtisMessage.isEmpty()) currentAtisMessage.append("\n"); + currentAtisMessage.append(fixedAtisMessage); + this->m_atisMessageBuilder[callsign.asString()] = currentAtisMessage; } /*