diff --git a/samples/cli_client/client.cpp b/samples/cli_client/client.cpp index 31514daa6..7e9f25334 100644 --- a/samples/cli_client/client.cpp +++ b/samples/cli_client/client.cpp @@ -26,13 +26,10 @@ Client::Client(BlackMisc::IContext &ctx) connect(m_net, &INetwork::atisQueryReplyReceived, this, &Client::atisQueryReplyReceived); connect(m_net, &INetwork::nameQueryReplyReceived, this, &Client::nameQueryReplyReceived); connect(m_net, &INetwork::capabilitiesQueryReplyReceived, this, &Client::capabilitiesQueryReplyReceived); - connect(m_net, &INetwork::frequencyQueryRequestReceived, this, &Client::freqQueryRequestReceived); - connect(m_net, &INetwork::nameQueryRequestReceived, this, &Client::nameQueryRequestReceived); connect(m_net, &INetwork::kicked, this, &Client::kicked); connect(m_net, &INetwork::metarReceived, this, &Client::metarReceived); connect(m_net, &INetwork::pilotDisconnected, this, &Client::pilotDisconnected); connect(m_net, &INetwork::aircraftInfoReceived, this, &Client::aircraftInfoReceived); - connect(m_net, &INetwork::aircraftInfoRequestReceived, this, &Client::aircraftInfoRequestReceived); connect(m_net, &INetwork::pong, this, &Client::pong); connect(m_net, &INetwork::textMessagesReceived, this, &Client::textMessagesReceived); @@ -49,10 +46,11 @@ Client::Client(BlackMisc::IContext &ctx) connect(this, &Client::sendAtisQuery, m_net, &INetwork::sendAtisQuery); connect(this, &Client::sendNameQuery, m_net, &INetwork::sendNameQuery); connect(this, &Client::sendCapabilitiesQuery, m_net, &INetwork::sendCapabilitiesQuery); - connect(this, &Client::replyToFreqQuery, m_net, &INetwork::replyToFrequencyQuery); - connect(this, &Client::replyToNameQuery, m_net, &INetwork::replyToNameQuery); connect(this, &Client::requestPlaneInfo, m_net, &INetwork::requestAircraftInfo); - connect(this, &Client::sendAircraftInfo, m_net, &INetwork::sendAircraftInfo); + connect(this, &Client::setOwnAircraftPosition, m_net, &INetwork::setOwnAircraftPosition); + connect(this, &Client::setOwnAircraftTransponder, m_net, &INetwork::setOwnAircraftTransponder); + connect(this, &Client::setOwnAircraftFrequency, m_net, &INetwork::setOwnAircraftFrequency); + connect(this, &Client::setOwnAircraftIcao, m_net, &INetwork::setOwnAircraftIcao); connect(this, &Client::ping, m_net, &INetwork::ping); connect(this, &Client::requestMetar, m_net, &INetwork::requestMetar); connect(this, &Client::requestWeatherData, m_net, &INetwork::requestWeatherData); @@ -75,10 +73,11 @@ Client::Client(BlackMisc::IContext &ctx) m_commands["atis"] = std::bind(&Client::sendAtisQueryCmd, this, _1); m_commands["name"] = std::bind(&Client::sendNameQueryCmd, this, _1); m_commands["caps"] = std::bind(&Client::sendCapabilitiesQueryCmd, this, _1); - m_commands["freqreply"] = std::bind(&Client::replyToFreqQueryCmd, this, _1); - m_commands["namereply"] = std::bind(&Client::replyToNameQueryCmd, this, _1); m_commands["aircraftinfo"] = std::bind(&Client::requestAircraftInfoCmd, this, _1); - m_commands["aircraftinforeply"] = std::bind(&Client::sendAircraftInfoCmd, this, _1); + m_commands["setposition"] = std::bind(&Client::setOwnAircraftPositionCmd, this, _1); + m_commands["setsquawk"] = std::bind(&Client::setOwnAircraftTransponderCmd, this, _1); + m_commands["setfreq"] = std::bind(&Client::setOwnAircraftFrequencyCmd, this, _1); + m_commands["seticao"] = std::bind(&Client::setOwnAircraftIcaoCmd, this, _1); m_commands["ping"] = std::bind(&Client::pingCmd, this, _1); m_commands["metar"] = std::bind(&Client::requestMetarCmd, this, _1); m_commands["weather"] = std::bind(&Client::requestWeatherDataCmd, this, _1); @@ -228,23 +227,6 @@ void Client::sendCapabilitiesQueryCmd(QTextStream &args) emit sendCapabilitiesQuery(callsign); } -void Client::replyToFreqQueryCmd(QTextStream &args) -{ - QString callsign; - double num; - args >> callsign >> num; - BlackMisc::PhysicalQuantities::CFrequency freq(num, BlackMisc::PhysicalQuantities::CFrequencyUnit::kHz()); - emit replyToFreqQuery(callsign, freq); -} - -void Client::replyToNameQueryCmd(QTextStream &args) -{ - QString callsign; - QString realname; - args >> callsign >> realname; - emit replyToNameQuery(callsign, realname); -} - void Client::requestAircraftInfoCmd(QTextStream &args) { QString callsign; @@ -252,7 +234,16 @@ void Client::requestAircraftInfoCmd(QTextStream &args) emit requestPlaneInfo(callsign); } -void Client::sendAircraftInfoCmd(QTextStream &args) +void Client::setOwnAircraftFrequencyCmd(QTextStream &args) +{ + QString callsign; + double num; + args >> callsign >> num; + BlackMisc::PhysicalQuantities::CFrequency freq(num, BlackMisc::PhysicalQuantities::CFrequencyUnit::kHz()); + emit setOwnAircraftFrequency(freq); +} + +void Client::setOwnAircraftIcaoCmd(QTextStream &args) { QString callsign; QString acTypeICAO; @@ -260,7 +251,37 @@ void Client::sendAircraftInfoCmd(QTextStream &args) QString livery; args >> callsign >> acTypeICAO >> airlineICAO >> livery; BlackMisc::Aviation::CAircraftIcao icao(acTypeICAO, "L2J", airlineICAO, livery, ""); - emit sendAircraftInfo(callsign, icao); + emit setOwnAircraftIcao(icao); +} + +void Client::setOwnAircraftPositionCmd(QTextStream &args) +{ + QString lat; + QString lon; + QString alt; + QString speed; + QString hdg; + QString pitch; + QString bank; + args >> lat >> lon >> alt >> speed >> hdg >> pitch >> bank; + BlackMisc::Aviation::CAircraftSituation position(BlackMisc::Geo::CCoordinateGeodetic(lat.toDouble(), lon.toDouble(), 0), + BlackMisc::Aviation::CAltitude(alt.toDouble(), BlackMisc::Aviation::CAltitude::MeanSeaLevel, BlackMisc::PhysicalQuantities::CLengthUnit::ft()), + BlackMisc::Aviation::CHeading(hdg.toDouble(), BlackMisc::Aviation::CHeading::True, BlackMisc::PhysicalQuantities::CAngleUnit::deg()), + BlackMisc::PhysicalQuantities::CAngle(pitch.toDouble(), BlackMisc::PhysicalQuantities::CAngleUnit::deg()), + BlackMisc::PhysicalQuantities::CAngle(bank.toDouble(), BlackMisc::PhysicalQuantities::CAngleUnit::deg()), + BlackMisc::PhysicalQuantities::CSpeed(speed.toDouble(), BlackMisc::PhysicalQuantities::CSpeedUnit::kts())); + emit setOwnAircraftPosition(position); +} + +void Client::setOwnAircraftTransponderCmd(QTextStream &args) +{ + QString code; + QString mode; + args >> code >> mode; + BlackMisc::Aviation::CTransponder xpdr("transponder", code.toInt(), BlackMisc::Aviation::CTransponder::StateStandby); + if (mode == "c") { xpdr.setTransponderCode(BlackMisc::Aviation::CTransponder::ModeC); } + else if (mode == "i") { xpdr.setTransponderCode(BlackMisc::Aviation::CTransponder::StateIdent); } + emit setOwnAircraftTransponder(xpdr); } void Client::pingCmd(QTextStream &args) @@ -359,16 +380,6 @@ void Client::capabilitiesQueryReplyReceived(const BlackMisc::Aviation::CCallsign std::cout << "CAPS_REPLY " << callsign << " " << flags << std::endl; } -void Client::freqQueryRequestReceived(const BlackMisc::Aviation::CCallsign &callsign) -{ - std::cout << "FREQ_QUERY " << callsign << std::endl; -} - -void Client::nameQueryRequestReceived(const BlackMisc::Aviation::CCallsign &callsign) -{ - std::cout << "NAME_QUERY " << callsign << std::endl; -} - void Client::kicked(const QString &msg) { std::cout << "KICKED " << msg.toStdString() << std::endl; @@ -389,11 +400,6 @@ void Client::aircraftInfoReceived(const BlackMisc::Aviation::CCallsign &callsign std::cout << "PLANE_INFO_REPLY " << callsign << " " << icaoData.toStdString(); } -void Client::aircraftInfoRequestReceived(const BlackMisc::Aviation::CCallsign &callsign) -{ - std::cout << "PLANE_INFO_QUERY " << callsign << std::endl; -} - void Client::pong(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CTime &elapsedTime) { std::cout << "PONG " << callsign << " " << elapsedTime << std::endl; diff --git a/samples/cli_client/client.h b/samples/cli_client/client.h index ac98eb109..4d891a2fb 100644 --- a/samples/cli_client/client.h +++ b/samples/cli_client/client.h @@ -44,10 +44,11 @@ private: //commands void sendAtisQueryCmd(QTextStream &args); void sendNameQueryCmd(QTextStream &args); void sendCapabilitiesQueryCmd(QTextStream &args); - void replyToFreqQueryCmd(QTextStream &args); - void replyToNameQueryCmd(QTextStream &args); void requestAircraftInfoCmd(QTextStream &args); - void sendAircraftInfoCmd(QTextStream &args); + void setOwnAircraftPositionCmd(QTextStream &args); + void setOwnAircraftTransponderCmd(QTextStream &args); + void setOwnAircraftFrequencyCmd(QTextStream &args); + void setOwnAircraftIcaoCmd(QTextStream &args); void pingCmd(QTextStream &args); void requestMetarCmd(QTextStream &args); void requestWeatherDataCmd(QTextStream &args); @@ -67,10 +68,11 @@ signals: //to send to INetwork void sendAtisQuery(const BlackMisc::Aviation::CCallsign &callsign); void sendNameQuery(const BlackMisc::Aviation::CCallsign &callsign); void sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &callsign); - void replyToFreqQuery(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq); - void replyToNameQuery(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname); void requestPlaneInfo(const BlackMisc::Aviation::CCallsign &callsign); - void sendAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icao); + void setOwnAircraftPosition(const BlackMisc::Aviation::CAircraftSituation &position); + void setOwnAircraftTransponder(const BlackMisc::Aviation::CTransponder &xpdr); + void setOwnAircraftFrequency(const BlackMisc::PhysicalQuantities::CFrequency &freq); + void setOwnAircraftIcao(const BlackMisc::Aviation::CAircraftIcao &icao); void ping(const BlackMisc::Aviation::CCallsign &callsign); void requestMetar(const QString &airportICAO); void requestWeatherData(const QString &airportICAO); @@ -91,13 +93,10 @@ public slots: //to receive from INetwork void atisQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &data); void nameQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname); void capabilitiesQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, quint32 flags); - void freqQueryRequestReceived(const BlackMisc::Aviation::CCallsign &callsign); - void nameQueryRequestReceived(const BlackMisc::Aviation::CCallsign &callsign); void kicked(const QString &msg); void metarReceived(const QString &data); void pilotDisconnected(const BlackMisc::Aviation::CCallsign &callsign); void aircraftInfoReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icaoData); - void aircraftInfoRequestReceived(const BlackMisc::Aviation::CCallsign &callsign); void pong(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CTime &elapsedTime); void textMessagesReceived(const BlackMisc::Network::CTextMessageList &messages); diff --git a/src/blackcore/network.h b/src/blackcore/network.h index 81809f1ec..7a9d7a86d 100644 --- a/src/blackcore/network.h +++ b/src/blackcore/network.h @@ -63,7 +63,6 @@ namespace BlackCore virtual void ping(const BlackMisc::Aviation::CCallsign &callsign) = 0; virtual void sendNameQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0; - virtual void replyToNameQuery(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname) = 0; virtual void sendIpQuery() = 0; virtual void sendServerQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0; @@ -77,10 +76,11 @@ namespace BlackCore // Aircraft virtual void sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0; virtual void requestAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign) = 0; - virtual void sendAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icao) = 0; virtual void sendFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0; - virtual void replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq) = 0; - // TODO virtual void setOwnAircraftPosition(...) = 0; + virtual void setOwnAircraftPosition(const BlackMisc::Aviation::CAircraftSituation &aircraft) = 0; + virtual void setOwnAircraftTransponder(const BlackMisc::Aviation::CTransponder &xpdr) = 0; + virtual void setOwnAircraftFrequency(const BlackMisc::PhysicalQuantities::CFrequency &freq) = 0; + virtual void setOwnAircraftIcao(const BlackMisc::Aviation::CAircraftIcao &icao) = 0; // Weather / flight plan virtual void requestMetar(const QString &airportICAO) = 0; @@ -99,12 +99,10 @@ namespace BlackCore // Aircraft void pilotDisconnected(const BlackMisc::Aviation::CCallsign &callsign); void aircraftInfoReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icao); - void aircraftInfoRequestReceived(const BlackMisc::Aviation::CCallsign &callsign); void aircraftPositionUpdate(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CTransponder &transponder); // TODO void aircraftInterimPositionUpdate(...); void frequencyQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq); - void frequencyQueryRequestReceived(const BlackMisc::Aviation::CCallsign &callsign); // Connection / Network in general void kicked(const QString &msg); @@ -117,9 +115,7 @@ namespace BlackCore void capabilitiesQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, quint32 flags); void ipQueryReplyReceived(const QString &ip); void serverQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &hostname); - void nameQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname); - void nameQueryRequestReceived(const BlackMisc::Aviation::CCallsign &callsign); // Text messages void textMessagesReceived(const BlackMisc::Network::CTextMessageList &messages); @@ -143,7 +139,6 @@ namespace BlackCore virtual void terminateConnection() {} virtual void ping(const BlackMisc::Aviation::CCallsign &) {} virtual void sendNameQuery(const BlackMisc::Aviation::CCallsign &) {} - virtual void replyToNameQuery(const BlackMisc::Aviation::CCallsign &, const QString &) {} virtual void sendIpQuery() {} virtual void sendServerQuery(const BlackMisc::Aviation::CCallsign &) {} virtual void sendTextMessages(const BlackMisc::Network::CTextMessageList &) {} @@ -151,9 +146,11 @@ namespace BlackCore virtual void sendAtisQuery(const BlackMisc::Aviation::CCallsign &) {} virtual void sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &) {} virtual void requestAircraftInfo(const BlackMisc::Aviation::CCallsign &) {} - virtual void sendAircraftInfo(const BlackMisc::Aviation::CCallsign &, const BlackMisc::Aviation::CAircraftIcao &) {} virtual void sendFrequencyQuery(const BlackMisc::Aviation::CCallsign &) {} - virtual void replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &, const BlackMisc::PhysicalQuantities::CFrequency &) {} + virtual void setOwnAircraftPosition(const BlackMisc::Aviation::CAircraftSituation &) {} + virtual void setOwnAircraftTransponder(const BlackMisc::Aviation::CTransponder &) {} + virtual void setOwnAircraftFrequency(const BlackMisc::PhysicalQuantities::CFrequency &) {} + virtual void setOwnAircraftIcao(const BlackMisc::Aviation::CAircraftIcao &) {} virtual void requestMetar(const QString &) {} virtual void requestWeatherData(const QString &) {} }; diff --git a/src/blackcore/network_vatlib.cpp b/src/blackcore/network_vatlib.cpp index aeef11a94..6133c031f 100644 --- a/src/blackcore/network_vatlib.cpp +++ b/src/blackcore/network_vatlib.cpp @@ -75,15 +75,15 @@ namespace BlackCore m_net->InstallOnPilotInfoRequestReceivedEvent(onPilotInfoRequestReceived, this); m_net->InstallOnPilotInfoReceivedEvent(onPilotInfoReceived, this); - m_timer.start(c_updateIntervalMillisecs, this); + connect(&m_processingTimer, SIGNAL(timeout()), this, SLOT(process())); + connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(update())); + m_processingTimer.start(c_processingIntervalMsec); } catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } NetworkVatlib::~NetworkVatlib() { - m_timer.stop(); - try { if (m_net->IsNetworkConnected()) @@ -99,7 +99,7 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - void NetworkVatlib::timerEvent(QTimerEvent *) + void NetworkVatlib::process() { try { @@ -111,6 +111,35 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } + void NetworkVatlib::update() + { + try + { + if (m_net->IsValid() && m_net->IsSessionExists()) + { + Cvatlib_Network::PilotPosUpdate pos; + pos.altAdj = 0; // TODO + pos.altTrue = m_ownAircraft.getAltitude().value(CLengthUnit::ft()); + pos.bank = m_ownAircraft.getBank().value(CAngleUnit::deg()); + pos.groundSpeed = m_ownAircraft.getGroundSpeed().value(CSpeedUnit::kts()); + pos.heading = m_ownAircraft.getHeading().value(CAngleUnit::deg()); + pos.lat = m_ownAircraft.getPosition().latitude().value(CAngleUnit::deg()); + pos.lon = m_ownAircraft.getPosition().longitude().value(CAngleUnit::deg()); + pos.pitch = m_ownAircraft.getPitch().value(CAngleUnit::deg()); + pos.rating = Cvatlib_Network::pilotRating_Unknown; + pos.xpdrCode = m_ownTransponder.getTransponderCodeFormatted().toShort(); + switch (m_ownTransponder.getTransponderMode()) + { + case CTransponder::ModeC: pos.xpdrMode = Cvatlib_Network::xpndrMode_Normal; break; + case CTransponder::StateIdent: pos.xpdrMode = Cvatlib_Network::xpndrMode_Ident; break; + default: pos.xpdrMode = Cvatlib_Network::xpndrMode_Standby; break; + } + m_net->SendPilotUpdate(pos); + } + } + catch (...) { exceptionDispatcher(Q_FUNC_INFO); } + } + QByteArray NetworkVatlib::toFSD(QString qstr) const { return m_fsdTextCodec->fromUnicode(qstr); @@ -202,11 +231,36 @@ namespace BlackCore { try { - m_net->LogoffAndDisconnect(c_logoffTimeoutSeconds); + m_net->LogoffAndDisconnect(c_logoffTimeoutSec); } catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } + void NetworkVatlib::setOwnAircraftPosition(const BlackMisc::Aviation::CAircraftSituation &aircraft) + { + m_ownAircraft = aircraft; + + if (! m_updateTimer.isActive()) + { + m_updateTimer.start(c_updateIntervalMsec); + } + } + + void NetworkVatlib::setOwnAircraftTransponder(const BlackMisc::Aviation::CTransponder &xpdr) + { + m_ownTransponder = xpdr; + } + + void NetworkVatlib::setOwnAircraftFrequency(const BlackMisc::PhysicalQuantities::CFrequency &freq) + { + m_ownFrequency = freq; + } + + void NetworkVatlib::setOwnAircraftIcao(const BlackMisc::Aviation::CAircraftIcao &icao) + { + m_ownAircraftIcao = icao; + } + void NetworkVatlib::sendTextMessages(const BlackMisc::Network::CTextMessageList &messages) { if (messages.isEmpty()) return; @@ -296,20 +350,20 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - void NetworkVatlib::replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq) + void NetworkVatlib::replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign) { try { - m_net->ReplyToInfoQuery(Cvatlib_Network::infoQuery_Freq, toFSD(callsign), toFSD(QString::number(freq.value(CFrequencyUnit::MHz()), 'f', 3))); + m_net->ReplyToInfoQuery(Cvatlib_Network::infoQuery_Freq, toFSD(callsign), toFSD(QString::number(m_ownFrequency.value(CFrequencyUnit::MHz()), 'f', 3))); } catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - void NetworkVatlib::replyToNameQuery(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname) + void NetworkVatlib::replyToNameQuery(const BlackMisc::Aviation::CCallsign &callsign) { try { - m_net->ReplyToInfoQuery(Cvatlib_Network::infoQuery_Name, toFSD(callsign), toFSD(realname)); + m_net->ReplyToInfoQuery(Cvatlib_Network::infoQuery_Name, toFSD(callsign), toFSD(m_realname)); } catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } @@ -323,25 +377,25 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - void NetworkVatlib::sendAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icao) + void NetworkVatlib::sendAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign) { try { - const QByteArray acTypeICAObytes = toFSD(icao.getDesignator()); - const QByteArray airlineICAObytes = toFSD(icao.getAirline()); - const QByteArray liverybytes = toFSD(icao.getLivery()); + const QByteArray acTypeICAObytes = toFSD(m_ownAircraftIcao.getDesignator()); + const QByteArray airlineICAObytes = toFSD(m_ownAircraftIcao.getAirline()); + const QByteArray liverybytes = toFSD(m_ownAircraftIcao.getLivery()); std::vector keysValues; - if (!icao.getDesignator().isEmpty()) + if (!m_ownAircraftIcao.getDesignator().isEmpty()) { keysValues.push_back(m_net->acinfo_Equipment); keysValues.push_back(acTypeICAObytes); } - if (icao.hasAirline()) + if (m_ownAircraftIcao.hasAirline()) { keysValues.push_back(m_net->acinfo_Airline); keysValues.push_back(airlineICAObytes); } - if (icao.hasLivery()) + if (m_ownAircraftIcao.hasLivery()) { keysValues.push_back(m_net->acinfo_Livery); keysValues.push_back(liverybytes); @@ -490,12 +544,21 @@ namespace BlackCore emit cbvar_cast(cbvar)->metarReceived(cbvar_cast(cbvar)->fromFSD(data)); } - void NetworkVatlib::onInfoQueryRequestReceived(Cvatlib_Network *, const char *callsign, Cvatlib_Network::infoQuery type, const char *, void *cbvar) + void NetworkVatlib::onInfoQueryRequestReceived(Cvatlib_Network *, const char *callsignString, Cvatlib_Network::infoQuery type, const char *, void *cbvar) { + auto timer = new QTimer(cbvar_cast(cbvar)); + timer->setSingleShot(true); + timer->start(0); + + BlackMisc::Aviation::CCallsign callsign(callsignString); switch (type) { - case Cvatlib_Network::infoQuery_Freq: emit cbvar_cast(cbvar)->frequencyQueryRequestReceived(cbvar_cast(cbvar)->fromFSD(callsign)); break; - case Cvatlib_Network::infoQuery_Name: emit cbvar_cast(cbvar)->nameQueryRequestReceived(cbvar_cast(cbvar)->fromFSD(callsign)); break; + case Cvatlib_Network::infoQuery_Freq: + connect(timer, &QTimer::timeout, [ = ]() { cbvar_cast(cbvar)->replyToFrequencyQuery(callsign); }); + break; + case Cvatlib_Network::infoQuery_Name: + connect(timer, &QTimer::timeout, [ = ]() { cbvar_cast(cbvar)->replyToNameQuery(callsign); }); + break; } } @@ -582,9 +645,14 @@ namespace BlackCore //TODO } - void NetworkVatlib::onPilotInfoRequestReceived(Cvatlib_Network *, const char *callsign, void *cbvar) + void NetworkVatlib::onPilotInfoRequestReceived(Cvatlib_Network *, const char *callsignString, void *cbvar) { - emit cbvar_cast(cbvar)->aircraftInfoRequestReceived(cbvar_cast(cbvar)->fromFSD(callsign)); + auto timer = new QTimer(cbvar_cast(cbvar)); + timer->setSingleShot(true); + timer->start(0); + + BlackMisc::Aviation::CCallsign callsign(callsignString); + connect(timer, &QTimer::timeout, [ = ]() { cbvar_cast(cbvar)->sendAircraftInfo(callsign); }); } void NetworkVatlib::onPilotInfoReceived(Cvatlib_Network *net, const char *callsign, const char **keysValues, void *cbvar) diff --git a/src/blackcore/network_vatlib.h b/src/blackcore/network_vatlib.h index c06acdafc..5e7101d72 100644 --- a/src/blackcore/network_vatlib.h +++ b/src/blackcore/network_vatlib.h @@ -14,7 +14,7 @@ #include "blackmisc/avallclasses.h" #include #include -#include +#include #include #include @@ -29,9 +29,6 @@ namespace BlackCore NetworkVatlib(QObject *parent = nullptr); virtual ~NetworkVatlib(); - protected: // QObject overrides - virtual void timerEvent(QTimerEvent *); - public: // INetwork slots overrides // Network @@ -44,7 +41,6 @@ namespace BlackCore virtual void sendServerQuery(const BlackMisc::Aviation::CCallsign &callsign); virtual void sendNameQuery(const BlackMisc::Aviation::CCallsign &callsign); virtual void sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &callsign); - virtual void replyToNameQuery(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname); virtual void ping(const BlackMisc::Aviation::CCallsign &callsign); // Weather @@ -55,15 +51,22 @@ namespace BlackCore // Aircraft virtual void requestAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign); - virtual void sendAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icao); virtual void sendFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign); - virtual void replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq); + virtual void setOwnAircraftPosition(const BlackMisc::Aviation::CAircraftSituation &aircraft); + virtual void setOwnAircraftTransponder(const BlackMisc::Aviation::CTransponder &xpdr); + virtual void setOwnAircraftFrequency(const BlackMisc::PhysicalQuantities::CFrequency &freq); + virtual void setOwnAircraftIcao(const BlackMisc::Aviation::CAircraftIcao &icao); // ATC virtual void sendAtcQuery(const BlackMisc::Aviation::CCallsign &callsign); virtual void sendAtisQuery(const BlackMisc::Aviation::CCallsign &callsign); virtual void requestMetar(const QString &airportICAO); + private slots: + void replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign); + void replyToNameQuery(const BlackMisc::Aviation::CCallsign &callsign); + void sendAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign); + private: //shimlib callbacks static void onConnectionStatusChanged(Cvatlib_Network *, Cvatlib_Network::connStatus oldStatus, Cvatlib_Network::connStatus newStatus, void *cbvar); static void onTextMessageReceived(Cvatlib_Network *, const char *from, const char *to, const char *msg, void *cbvar); @@ -93,6 +96,10 @@ namespace BlackCore QString fromFSD(const char *cstr) const; bool isDisconnected() const { return m_status == Cvatlib_Network::connStatus_Idle || m_status == Cvatlib_Network::connStatus_Disconnected; } + private slots: + void process(); + void update(); + signals: void terminate(); @@ -107,14 +114,20 @@ namespace BlackCore private: QScopedPointer m_net; Cvatlib_Network::connStatus m_status; - - QBasicTimer m_timer; BlackMisc::Network::CServer m_server; - static int const c_updateIntervalMillisecs = 100; - static int const c_logoffTimeoutSeconds = 5; + + QTimer m_processingTimer; + QTimer m_updateTimer; + static int const c_processingIntervalMsec = 100; + static int const c_updateIntervalMsec = 5000; + static int const c_logoffTimeoutSec = 5; QByteArray m_callsign; QByteArray m_realname; + BlackMisc::Aviation::CAircraftSituation m_ownAircraft; + BlackMisc::Aviation::CTransponder m_ownTransponder; + BlackMisc::PhysicalQuantities::CFrequency m_ownFrequency; + BlackMisc::Aviation::CAircraftIcao m_ownAircraftIcao; QTextCodec *m_fsdTextCodec; };