From 535ea65a9a57f802f7779974a8b6dbd52c56ad97 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sun, 22 Dec 2013 20:33:47 +0000 Subject: [PATCH] start using our value classes as arguments in INetwork signals and slots refs #81 --- samples/cli_client/client.cpp | 134 ++++++++++------------ samples/cli_client/client.h | 75 ++++++------- src/blackcore/network.h | 140 ++++++++++++----------- src/blackcore/network_vatlib.cpp | 186 ++++++++++++++++++------------- src/blackcore/network_vatlib.h | 43 +++---- 5 files changed, 300 insertions(+), 278 deletions(-) diff --git a/samples/cli_client/client.cpp b/samples/cli_client/client.cpp index aac90ad5f..31514daa6 100644 --- a/samples/cli_client/client.cpp +++ b/samples/cli_client/client.cpp @@ -20,42 +20,39 @@ Client::Client(BlackMisc::IContext &ctx) connect(m_net, &INetwork::connectionStatusDisconnected, this, &Client::connectionStatusDisconnected); connect(m_net, &INetwork::connectionStatusError, this, &Client::connectionStatusError); connect(m_net, &INetwork::ipQueryReplyReceived, this, &Client::ipQueryReplyReceived); - connect(m_net, &INetwork::freqQueryReplyReceived, this, &Client::freqQueryReplyReceived); + connect(m_net, &INetwork::frequencyQueryReplyReceived, this, &Client::freqQueryReplyReceived); connect(m_net, &INetwork::serverQueryReplyReceived, this, &Client::serverQueryReplyReceived); connect(m_net, &INetwork::atcQueryReplyReceived, this, &Client::atcQueryReplyReceived); 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::freqQueryRequestReceived, this, &Client::freqQueryRequestReceived); + 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::planeInfoReceived, this, &Client::planeInfoReceived); - connect(m_net, &INetwork::planeInfoRequestReceived, this, &Client::planeInfoRequestReceived); + 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::radioTextMessageReceived, this, &Client::radioTextMessageReceived); - connect(m_net, &INetwork::privateTextMessageReceived, this, &Client::privateTextMessageReceived); + connect(m_net, &INetwork::textMessagesReceived, this, &Client::textMessagesReceived); - connect(this, &Client::setServerDetails, m_net, &INetwork::setServerDetails); - connect(this, &Client::setUserCredentials, m_net, &INetwork::setUserCredentials); + connect(this, &Client::setServer, m_net, &INetwork::setServer); connect(this, &Client::setCallsign, m_net, &INetwork::setCallsign); connect(this, &Client::setRealName, m_net, &INetwork::setRealName); connect(this, &Client::initiateConnection, m_net, &INetwork::initiateConnection); connect(this, &Client::terminateConnection, m_net, &INetwork::terminateConnection); - connect(this, &Client::sendPrivateTextMessage, m_net, &INetwork::sendPrivateTextMessage); - connect(this, &Client::sendRadioTextMessage, m_net, &INetwork::sendRadioTextMessage); + connect(this, &Client::sendTextMessages, m_net, &INetwork::sendTextMessages); connect(this, &Client::sendIpQuery, m_net, &INetwork::sendIpQuery); - connect(this, &Client::sendFreqQuery, m_net, &INetwork::sendFreqQuery); + connect(this, &Client::sendFreqQuery, m_net, &INetwork::sendFrequencyQuery); connect(this, &Client::sendServerQuery, m_net, &INetwork::sendServerQuery); connect(this, &Client::sendAtcQuery, m_net, &INetwork::sendAtcQuery); 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::replyToFreqQuery); + connect(this, &Client::replyToFreqQuery, m_net, &INetwork::replyToFrequencyQuery); connect(this, &Client::replyToNameQuery, m_net, &INetwork::replyToNameQuery); - connect(this, &Client::requestPlaneInfo, m_net, &INetwork::requestPlaneInfo); - connect(this, &Client::sendPlaneInfo, m_net, &INetwork::sendPlaneInfo); + connect(this, &Client::requestPlaneInfo, m_net, &INetwork::requestAircraftInfo); + connect(this, &Client::sendAircraftInfo, m_net, &INetwork::sendAircraftInfo); connect(this, &Client::ping, m_net, &INetwork::ping); connect(this, &Client::requestMetar, m_net, &INetwork::requestMetar); connect(this, &Client::requestWeatherData, m_net, &INetwork::requestWeatherData); @@ -64,8 +61,7 @@ Client::Client(BlackMisc::IContext &ctx) m_commands["help"] = std::bind(&Client::help, this, _1); m_commands["echo"] = std::bind(&Client::echo, this, _1); m_commands["exit"] = std::bind(&Client::exit, this, _1); - m_commands["setserver"] = std::bind(&Client::setServerDetailsCmd, this, _1); - m_commands["setuser"] = std::bind(&Client::setUserCredentialsCmd, this, _1); + m_commands["setserver"] = std::bind(&Client::setServerCmd, this, _1); m_commands["setcallsign"] = std::bind(&Client::setCallsignCmd, this, _1); m_commands["setrealname"] = std::bind(&Client::setRealNameCmd, this, _1); m_commands["initconnect"] = std::bind(&Client::initiateConnectionCmd, this, _1); @@ -81,8 +77,8 @@ Client::Client(BlackMisc::IContext &ctx) 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["planeinfo"] = std::bind(&Client::requestPlaneInfoCmd, this, _1); - m_commands["planeinforeply"] = std::bind(&Client::sendPlaneInfoCmd, this, _1); + m_commands["aircraftinfo"] = std::bind(&Client::requestAircraftInfoCmd, this, _1); + m_commands["aircraftinforeply"] = std::bind(&Client::sendAircraftInfoCmd, 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); @@ -130,20 +126,14 @@ void Client::exit(QTextStream &) emit quit(); } -void Client::setServerDetailsCmd(QTextStream &args) +void Client::setServerCmd(QTextStream &args) { QString hostname; quint16 port; - args >> hostname >> port; - emit setServerDetails(hostname, port); -} - -void Client::setUserCredentialsCmd(QTextStream &args) -{ QString username; QString password; - args >> username >> password; - emit setUserCredentials(username, password); + args >> hostname >> port >> username >> password; + emit setServer(BlackMisc::Network::CServer("", "", hostname, port, BlackMisc::Network::CUser(username, "", "", password))); } void Client::setCallsignCmd(QTextStream &args) @@ -173,7 +163,8 @@ void Client::sendPrivateTextMessageCmd(QTextStream &args) QString callsign; args >> callsign; args.skipWhiteSpace(); - emit sendPrivateTextMessage(callsign, args.readAll()); + BlackMisc::Network::CTextMessageList msgs(args.readAll(), BlackMisc::Aviation::CCallsign(callsign)); + emit sendTextMessages(msgs); } void Client::sendRadioTextMessageCmd(QTextStream &args) @@ -181,12 +172,13 @@ void Client::sendRadioTextMessageCmd(QTextStream &args) QString freqsBlob; args >> freqsBlob; QStringList freqStrings = freqsBlob.split("|"); - QVector freqs; + QList frequencies; for (auto i = freqStrings.begin(); i != freqStrings.end(); ++i) { - freqs.push_back(BlackMisc::PhysicalQuantities::CFrequency(i->toDouble(), BlackMisc::PhysicalQuantities::CFrequencyUnit::MHz())); + frequencies.push_back(BlackMisc::PhysicalQuantities::CFrequency(i->toDouble(), BlackMisc::PhysicalQuantities::CFrequencyUnit::MHz())); } - emit sendRadioTextMessage(freqs, args.readAll()); + BlackMisc::Network::CTextMessageList msgs(args.readAll(), frequencies); + emit sendTextMessages(msgs); } void Client::sendIpQueryCmd(QTextStream &) @@ -253,21 +245,22 @@ void Client::replyToNameQueryCmd(QTextStream &args) emit replyToNameQuery(callsign, realname); } -void Client::requestPlaneInfoCmd(QTextStream& args) +void Client::requestAircraftInfoCmd(QTextStream &args) { QString callsign; args >> callsign; emit requestPlaneInfo(callsign); } -void Client::sendPlaneInfoCmd(QTextStream& args) +void Client::sendAircraftInfoCmd(QTextStream &args) { QString callsign; QString acTypeICAO; QString airlineICAO; QString livery; args >> callsign >> acTypeICAO >> airlineICAO >> livery; - emit sendPlaneInfo(callsign, acTypeICAO, airlineICAO, livery); + BlackMisc::Aviation::CAircraftIcao icao(acTypeICAO, "L2J", airlineICAO, livery, ""); + emit sendAircraftInfo(callsign, icao); } void Client::pingCmd(QTextStream &args) @@ -295,15 +288,15 @@ void Client::requestWeatherDataCmd(QTextStream &args) /************ Slots to receive signals from INetwork *************/ /****************************************************************************/ -void Client::atcPositionUpdate(const QString& callsign, const BlackMisc::PhysicalQuantities::CFrequency& freq, - const BlackMisc::Geo::CCoordinateGeodetic& pos, const BlackMisc::PhysicalQuantities::CLength& range) +void Client::atcPositionUpdate(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq, + const BlackMisc::Geo::CCoordinateGeodetic &pos, const BlackMisc::PhysicalQuantities::CLength &range) { - std::cout << "POSITION " << callsign.toStdString() << " " << freq << " " << pos << " " << range << std::endl; + std::cout << "POSITION " << callsign << " " << freq << " " << pos << " " << range << std::endl; } -void Client::atcDisconnected(const QString& callsign) +void Client::atcDisconnected(const BlackMisc::Aviation::CCallsign &callsign) { - std::cout << "ATC_DISCONNECTED " << callsign.toStdString() << std::endl; + std::cout << "ATC_DISCONNECTED " << callsign << std::endl; } void Client::connectionStatusIdle() @@ -336,44 +329,44 @@ void Client::ipQueryReplyReceived(const QString &ip) std::cout << "IP_REPLY " << ip.toStdString() << std::endl; } -void Client::freqQueryReplyReceived(const QString& callsign, const BlackMisc::PhysicalQuantities::CFrequency& freq) +void Client::freqQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq) { - std::cout << "FREQ_REPLY " << callsign.toStdString() << " " << freq << std::endl; + std::cout << "FREQ_REPLY " << callsign << " " << freq << std::endl; } -void Client::serverQueryReplyReceived(const QString& callsign, const QString& hostname) +void Client::serverQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &hostname) { - std::cout << "SERVER_REPLY " << callsign.toStdString() << " " << hostname.toStdString() << std::endl; + std::cout << "SERVER_REPLY " << callsign << " " << hostname.toStdString() << std::endl; } -void Client::atcQueryReplyReceived(const QString& callsign, bool isATC) +void Client::atcQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, bool isATC) { - std::cout << "ATC_REPLY " << callsign.toStdString() << (isATC ? " yes" : " no") << std::endl; + std::cout << "ATC_REPLY " << callsign << (isATC ? " yes" : " no") << std::endl; } -void Client::atisQueryReplyReceived(const QString& callsign, const QString& data) +void Client::atisQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &data) { - std::cout << "ATIS_REPLY " << callsign.toStdString() << " " << data.toStdString() << std::endl; + std::cout << "ATIS_REPLY " << callsign << " " << data.toStdString() << std::endl; } -void Client::nameQueryReplyReceived(const QString& callsign, const QString& realname) +void Client::nameQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname) { - std::cout << "NAME_REPLY " << callsign.toStdString() << " " << realname.toStdString() << std::endl; + std::cout << "NAME_REPLY " << callsign << " " << realname.toStdString() << std::endl; } -void Client::capabilitiesQueryReplyReceived(const QString& callsign, quint32 flags) +void Client::capabilitiesQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, quint32 flags) { - std::cout << "CAPS_REPLY " << callsign.toStdString() << " " << flags << std::endl; + std::cout << "CAPS_REPLY " << callsign << " " << flags << std::endl; } -void Client::freqQueryRequestReceived(const QString& callsign) +void Client::freqQueryRequestReceived(const BlackMisc::Aviation::CCallsign &callsign) { - std::cout << "FREQ_QUERY " << callsign.toStdString() << std::endl; + std::cout << "FREQ_QUERY " << callsign << std::endl; } -void Client::nameQueryRequestReceived(const QString& callsign) +void Client::nameQueryRequestReceived(const BlackMisc::Aviation::CCallsign &callsign) { - std::cout << "NAME_QUERY " << callsign.toStdString() << std::endl; + std::cout << "NAME_QUERY " << callsign << std::endl; } void Client::kicked(const QString &msg) @@ -386,38 +379,27 @@ void Client::metarReceived(const QString &data) std::cout << "METAR " << data.toStdString() << std::endl; } -void Client::pilotDisconnected(const QString& callsign) +void Client::pilotDisconnected(const BlackMisc::Aviation::CCallsign &callsign) { - std::cout << "PILOT_DISCONNECTED " << callsign.toStdString() << std::endl; + std::cout << "PILOT_DISCONNECTED " << callsign << std::endl; } -void Client::planeInfoReceived(const QString& callsign, const QString& acTypeICAO, const QString& airlineICAO, const QString& livery) +void Client::aircraftInfoReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icaoData) { - std::cout << "PLANE_INFO_REPLY " << callsign.toStdString() << " " << acTypeICAO.toStdString() << " " << airlineICAO.toStdString() << " " << livery.toStdString() << std::endl; + std::cout << "PLANE_INFO_REPLY " << callsign << " " << icaoData.toStdString(); } -void Client::planeInfoRequestReceived(const QString& callsign) +void Client::aircraftInfoRequestReceived(const BlackMisc::Aviation::CCallsign &callsign) { - std::cout << "PLANE_INFO_QUERY " << callsign.toStdString() << std::endl; + std::cout << "PLANE_INFO_QUERY " << callsign << std::endl; } -void Client::pong(const QString& callsign, const BlackMisc::PhysicalQuantities::CTime& elapsedTime) +void Client::pong(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CTime &elapsedTime) { - std::cout << "PONG " << callsign.toStdString() << " " << elapsedTime << std::endl; + std::cout << "PONG " << callsign << " " << elapsedTime << std::endl; } -void Client::radioTextMessageReceived(const QString& callsign, const QString& msg, const QVector& freqs) +void Client::textMessagesReceived(const BlackMisc::Network::CTextMessageList &list) { - QString freqsBlob = freqs[0].toQString(); - for (auto i = freqs.begin() + 1; i != freqs.end(); ++i) - { - freqsBlob.append("|"); - freqsBlob.append(i->toQString()); - } - std::cout << "TEXT_MSG " << callsign.toStdString() << " " << freqsBlob.toStdString() << " " << msg.toStdString() << std::endl; -} - -void Client::privateTextMessageReceived(const QString& fromCallsign, const QString& toCallsign, const QString& msg) -{ - std::cout << "PRIV_MSG " << fromCallsign.toStdString() << " -> " << toCallsign.toStdString() << " " << msg.toStdString() << std::endl; + std::cout << "TEXT MESSAGE" << list.toStdString(); } diff --git a/samples/cli_client/client.h b/samples/cli_client/client.h index 06987c554..ac98eb109 100644 --- a/samples/cli_client/client.h +++ b/samples/cli_client/client.h @@ -27,13 +27,10 @@ public slots: void command(QString line); private: //commands - void requestPlaneInfoCmd(QTextStream& args); - void sendPlaneInfoCmd(QTextStream& args); void help(QTextStream &args); void echo(QTextStream &args); void exit(QTextStream &args); - void setServerDetailsCmd(QTextStream &args); - void setUserCredentialsCmd(QTextStream &args); + void setServerCmd(QTextStream &args); void setCallsignCmd(QTextStream &args); void setRealNameCmd(QTextStream &args); void initiateConnectionCmd(QTextStream &args); @@ -49,60 +46,60 @@ private: //commands void sendCapabilitiesQueryCmd(QTextStream &args); void replyToFreqQueryCmd(QTextStream &args); void replyToNameQueryCmd(QTextStream &args); + void requestAircraftInfoCmd(QTextStream &args); + void sendAircraftInfoCmd(QTextStream &args); void pingCmd(QTextStream &args); void requestMetarCmd(QTextStream &args); void requestWeatherDataCmd(QTextStream &args); signals: //to send to INetwork - void setCallsign(const QString& callsign); - void setServerDetails(const QString &hostname, quint16 port); - void setUserCredentials(const QString &username, const QString &password); + void setServer(const BlackMisc::Network::CServer &server); + void setCallsign(const BlackMisc::Aviation::CCallsign &callsign); void setRealName(const QString &name); void initiateConnection(); void terminateConnection(); - void sendPrivateTextMessage(const QString& callsign, const QString& msg); - void sendRadioTextMessage(const QVector& freqs, const QString& msg); + void sendTextMessages(const BlackMisc::Network::CTextMessageList &textMessages); + void sendRadioTextMessage(const QVector &freqs, const QString &msg); void sendIpQuery(); - void sendFreqQuery(const QString& callsign); - void sendServerQuery(const QString& callsign); - void sendAtcQuery(const QString& callsign); - void sendAtisQuery(const QString& callsign); - void sendNameQuery(const QString& callsign); - void sendCapabilitiesQuery(const QString& callsign); - void replyToFreqQuery(const QString& callsign, const BlackMisc::PhysicalQuantities::CFrequency& freq); - void replyToNameQuery(const QString& callsign, const QString& realname); - void requestPlaneInfo(const QString& callsign); - void sendPlaneInfo(const QString& callsign, const QString& acTypeICAO, const QString& airlineICAO, const QString& livery); - void ping(const QString& callsign); - void requestMetar(const QString& airportICAO); - void requestWeatherData(const QString& airportICAO); + void sendFreqQuery(const BlackMisc::Aviation::CCallsign &callsign); + void sendServerQuery(const BlackMisc::Aviation::CCallsign &callsign); + void sendAtcQuery(const BlackMisc::Aviation::CCallsign &callsign); + 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 ping(const BlackMisc::Aviation::CCallsign &callsign); + void requestMetar(const QString &airportICAO); + void requestWeatherData(const QString &airportICAO); public slots: //to receive from INetwork - void atcPositionUpdate(const QString& callsign, const BlackMisc::PhysicalQuantities::CFrequency& freq, - const BlackMisc::Geo::CCoordinateGeodetic& pos, const BlackMisc::PhysicalQuantities::CLength& range); - void atcDisconnected(const QString& callsign); + void atcPositionUpdate(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq, + const BlackMisc::Geo::CCoordinateGeodetic &pos, const BlackMisc::PhysicalQuantities::CLength &range); + void atcDisconnected(const BlackMisc::Aviation::CCallsign &callsign); void connectionStatusIdle(); void connectionStatusConnecting(); void connectionStatusConnected(); void connectionStatusDisconnected(); void connectionStatusError(); - void freqQueryReplyReceived(const QString& callsign, const BlackMisc::PhysicalQuantities::CFrequency& freq); - void serverQueryReplyReceived(const QString& callsign, const QString& hostname); - void atcQueryReplyReceived(const QString& callsign, bool isATC); - void atisQueryReplyReceived(const QString& callsign, const QString& data); - void nameQueryReplyReceived(const QString& callsign, const QString& realname); - void capabilitiesQueryReplyReceived(const QString& callsign, quint32 flags); - void freqQueryRequestReceived(const QString& callsign); - void nameQueryRequestReceived(const QString& callsign); - void pilotDisconnected(const QString& callsign); - void planeInfoReceived(const QString& callsign, const QString& acTypeICAO, const QString& airlineICAO, const QString& livery); - void planeInfoRequestReceived(const QString& callsign); - void pong(const QString& callsign, const BlackMisc::PhysicalQuantities::CTime& elapsedTime); - void radioTextMessageReceived(const QString& callsign, const QString& msg, const QVector& freqs); - void privateTextMessageReceived(const QString& fromCallsign, const QString& toCallsign, const QString& msg); void ipQueryReplyReceived(const QString &ip); + void freqQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq); + void serverQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &hostname); + void atcQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, bool isATC); + 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); private: QMap> m_commands; diff --git a/src/blackcore/network.h b/src/blackcore/network.h index 9b569dc90..7c4b23491 100644 --- a/src/blackcore/network.h +++ b/src/blackcore/network.h @@ -10,10 +10,13 @@ #ifndef BLACKCORE_NETWORK_H #define BLACKCORE_NETWORK_H -#include "../blackmisc/pqfrequency.h" -#include "../blackmisc/coordinategeodetic.h" -#include "../blackmisc/pqlength.h" -#include "../blackmisc/pqtime.h" +#include "blackmisc/avaircraft.h" +#include "blackmisc/pqfrequency.h" +#include "blackmisc/coordinategeodetic.h" +#include "blackmisc/pqlength.h" +#include "blackmisc/pqtime.h" +#include "blackmisc/nwtextmessagelist.h" +#include "blackmisc/nwserver.h" #include #include #include @@ -44,43 +47,58 @@ namespace BlackCore }; public slots: - virtual void setCallsign(const QString& callsign) = 0; - // Network - virtual void setServerDetails(const QString &hostname, quint16 port) = 0; - virtual void setUserCredentials(const QString &username, const QString &password) = 0; + virtual void setServer(const BlackMisc::Network::CServer &server) = 0; + virtual void setCallsign(const BlackMisc::Aviation::CCallsign &callsign) = 0; virtual void setRealName(const QString &name) = 0; virtual void initiateConnection() = 0; virtual void terminateConnection() = 0; - virtual void sendPrivateTextMessage(const QString& callsign, const QString& msg) = 0; - virtual void sendRadioTextMessage(const QVector& freqs, const QString& msg) = 0; + 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 sendFreqQuery(const QString& callsign) = 0; - virtual void sendServerQuery(const QString& callsign) = 0; - virtual void sendAtcQuery(const QString& callsign) = 0; - virtual void sendAtisQuery(const QString& callsign) = 0; - virtual void sendNameQuery(const QString& callsign) = 0; - virtual void sendCapabilitiesQuery(const QString& callsign) = 0; - virtual void replyToFreqQuery(const QString& callsign, const BlackMisc::PhysicalQuantities::CFrequency& freq) = 0; - virtual void replyToNameQuery(const QString& callsign, const QString& realname) = 0; - virtual void requestPlaneInfo(const QString& callsign) = 0; - //TODO virtual void setPlanePosition(...) = 0; - //TODO virtual void sendFlightPlan(...) = 0; - virtual void sendPlaneInfo(const QString& callsign, const QString& acTypeICAO, const QString& airlineICAO, const QString& livery) = 0; - virtual void ping(const QString& callsign) = 0; + virtual void sendServerQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0; + + // Text messages + virtual void sendTextMessages(const BlackMisc::Network::CTextMessageList &textMessages) = 0; + + // ATC + virtual void sendAtcQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0; + virtual void sendAtisQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0; + + // 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; // Weather / flight plan virtual void requestMetar(const QString &airportICAO) = 0; virtual void requestWeatherData(const QString &airportICAO) = 0; + // TODO virtual void sendFlightPlan(...) = 0; signals: - void atcPositionUpdate(const QString& callsign, const BlackMisc::PhysicalQuantities::CFrequency& freq, - const BlackMisc::Geo::CCoordinateGeodetic& pos, const BlackMisc::PhysicalQuantities::CLength& range); - void atcDisconnected(const QString& callsign); - //TODO void cloudDataReceived(...); + // ATC + void atcPositionUpdate(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq, + const BlackMisc::Geo::CCoordinateGeodetic &pos, const BlackMisc::PhysicalQuantities::CLength &range); + void atcDisconnected(const BlackMisc::Aviation::CCallsign &callsign); + void atcQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, bool isATC); + void atisQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &data); void metarReceived(const QString &data); + // 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); void connectionStatusIdle(); @@ -88,25 +106,21 @@ namespace BlackCore void connectionStatusConnected(); void connectionStatusDisconnected(); void connectionStatusError(); - void freqQueryReplyReceived(const QString& callsign, const BlackMisc::PhysicalQuantities::CFrequency& freq); - void serverQueryReplyReceived(const QString& callsign, const QString& hostname); - void atcQueryReplyReceived(const QString& callsign, bool isATC); - void atisQueryReplyReceived(const QString& callsign, const QString& data); - void nameQueryReplyReceived(const QString& callsign, const QString& realname); - void capabilitiesQueryReplyReceived(const QString& callsign, quint32 flags); - void freqQueryRequestReceived(const QString& callsign); - void nameQueryRequestReceived(const QString& callsign); - //TODO void interimPilotPositionUpdate(...); - void pilotDisconnected(const QString& callsign); - void planeInfoReceived(const QString& callsign, const QString& acTypeICAO, const QString& airlineICAO, const QString& livery); - void planeInfoRequestReceived(const QString& callsign); - //TODO void pilotPositionUpdate(...); - void pong(const QString& callsign, const BlackMisc::PhysicalQuantities::CTime& elapsedTime); - void radioTextMessageReceived(const QString& callsign, const QString& msg, const QVector& freqs); - void privateTextMessageReceived(const QString& fromCallsign, const QString& toCallsign, const QString& msg); + void pong(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CTime &elapsedTime); + void capabilitiesQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, quint32 flags); void ipQueryReplyReceived(const QString &ip); - //TODO void temperatureDataReceived(...); - //TODO void windDataReceived(...); + 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); + + // Weather + // TODO void temperatureDataReceived(...); + // TODO void windDataReceived(...); + // TODO void cloudDataReceived(...); }; /*! @@ -115,28 +129,26 @@ namespace BlackCore class NetworkDummy : public INetwork { public: //INetwork slots overrides - virtual void setServerDetails(const QString&, quint16) {} - virtual void setUserCredentials(const QString&, const QString&) {} - virtual void setCallsign(const QString&) {} - virtual void setRealName(const QString&) {} + virtual void setServer(const BlackMisc::Network::CServer &) {} + virtual void setCallsign(const BlackMisc::Aviation::CCallsign &) {} + virtual void setRealName(const QString &) {} virtual void initiateConnection() {} virtual void terminateConnection() {} - virtual void sendPrivateTextMessage(const QString&, const QString&) {} - virtual void sendRadioTextMessage(const QVector&, const QString&) {} + 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 sendFreqQuery(const QString&) {} - virtual void sendServerQuery(const QString&) {} - virtual void sendAtcQuery(const QString&) {} - virtual void sendAtisQuery(const QString&) {} - virtual void sendNameQuery(const QString&) {} - virtual void sendCapabilitiesQuery(const QString&) {} - virtual void replyToFreqQuery(const QString&, const BlackMisc::PhysicalQuantities::CFrequency&) {} - virtual void replyToNameQuery(const QString&, const QString&) {} - virtual void requestPlaneInfo(const QString&) {} - virtual void sendPlaneInfo(const QString&, const QString&, const QString&, const QString&) {} - virtual void ping(const QString&) {} - virtual void requestMetar(const QString&) {} - virtual void requestWeatherData(const QString&) {} + virtual void sendServerQuery(const BlackMisc::Aviation::CCallsign &) {} + virtual void sendTextMessages(const BlackMisc::Network::CTextMessageList &) {} + virtual void sendAtcQuery(const BlackMisc::Aviation::CCallsign &) {} + 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 requestMetar(const QString &) {} + virtual void requestWeatherData(const QString &) {} }; } // namespace diff --git a/src/blackcore/network_vatlib.cpp b/src/blackcore/network_vatlib.cpp index 93013c261..faa609ba2 100644 --- a/src/blackcore/network_vatlib.cpp +++ b/src/blackcore/network_vatlib.cpp @@ -9,6 +9,7 @@ #include static_assert(! std::is_abstract::value, "Must implement all pure virtuals"); +static_assert(! std::is_abstract::value, "Must implement all pure virtuals"); //TODO just placeholders to allow this to compile #define CLIENT_NAME_VERSION "BlackBox 0.1" @@ -23,6 +24,8 @@ namespace BlackCore using namespace BlackMisc::PhysicalQuantities; using namespace BlackMisc::Geo; + using namespace BlackMisc::Aviation; + using namespace BlackMisc::Network; void exceptionDispatcher(const char* caller); @@ -112,6 +115,10 @@ namespace BlackCore return m_fsdTextCodec->fromUnicode(qstr); } + QByteArray NetworkVatlib::toFSD(const BlackMisc::Aviation::CCallsign &callsign) const + { + return toFSD(callsign.getStringAsSet()); + } QString NetworkVatlib::fromFSD(const char *cstr) const { @@ -147,23 +154,13 @@ namespace BlackCore /********************************** INetwork slots ************************************/ /********************************** * * * * * * * * * * * * * * * * * * * ************************************/ - void NetworkVatlib::setServerDetails(const QString &host, quint16 port) + void NetworkVatlib::setServer(const CServer &server) { Q_ASSERT_X(isDisconnected(), "NetworkVatlib", "Can't change server details while still connected"); - - m_serverHost = host; - m_serverPort = port; + this->m_server = server; } - void NetworkVatlib::setUserCredentials(const QString &username, const QString &password) - { - Q_ASSERT_X(isDisconnected(), "NetworkVatlib", "Can't change login details while still connected"); - - m_username = username; - m_password = password; - } - - void NetworkVatlib::setCallsign(const QString& callsign) + void NetworkVatlib::setCallsign(const BlackMisc::Aviation::CCallsign &callsign) { Q_ASSERT_X(isDisconnected(), "NetworkVatlib", "Can't change callsign while still connected"); @@ -189,8 +186,8 @@ namespace BlackCore info.name = m_realname.data(); info.rating = Cvatlib_Network::pilotRating_Student; //TODO info.sim = Cvatlib_Network::simType_XPlane; //TODO - m_net->SetPilotLoginInfo(toFSD(m_serverHost).data(), m_serverPort, - toFSD(m_username).data(), toFSD(m_password).data(), info); + m_net->SetPilotLoginInfo(toFSD(m_server.getAddress()).data(), m_server.getPort(), + toFSD(m_server.getUser().getId()).data(), toFSD(m_server.getUser().getPassword()).data(), info); m_net->ConnectAndLogon(); } catch (...) @@ -209,25 +206,28 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - void NetworkVatlib::sendPrivateTextMessage(const QString& callsign, const QString& msg) + void NetworkVatlib::sendTextMessages(const BlackMisc::Network::CTextMessageList &messages) { + if (messages.isEmpty()) return; try { - m_net->SendPrivateTextMessage(toFSD(callsign), toFSD(msg)); - } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } - } - - void NetworkVatlib::sendRadioTextMessage(const QVector& freqs, const QString& msg) - { - try - { - std::vector freqsVec; - for (int i = 0; i < freqs.size(); ++i) + CTextMessageList privateMessages = messages.getPrivateMessages(); + foreach(BlackMisc::Network::CTextMessage message, privateMessages) { - freqsVec.push_back(freqs[i].value(CFrequencyUnit::kHz())); + if (message.getToCallsign().isEmpty()) continue; + m_net->SendPrivateTextMessage(toFSD(message.getToCallsign()), toFSD(message.getMessage())); + } + CTextMessageList radioMessages = messages.getRadioMessages(); + if (radioMessages.isEmpty()) return; + foreach(BlackMisc::Network::CTextMessage message, radioMessages) + { + // I could send the same message to n frequencies in one step + // if this is really required, I need to group by message + // currently I send individual messages + std::vector freqsVec; + freqsVec.push_back(message.getFrequency().value(CFrequencyUnit::kHz())); + m_net->SendRadioTextMessage(freqsVec.size(), freqsVec.data(), toFSD(message.getMessage())); } - m_net->SendRadioTextMessage(freqsVec.size(), freqsVec.data(), toFSD(msg)); } catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } @@ -241,7 +241,7 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - void NetworkVatlib::sendFreqQuery(const QString& callsign) + void NetworkVatlib::sendFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign) { try { @@ -250,7 +250,7 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - void NetworkVatlib::sendServerQuery(const QString& callsign) + void NetworkVatlib::sendServerQuery(const BlackMisc::Aviation::CCallsign &callsign) { try { @@ -259,7 +259,7 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - void NetworkVatlib::sendAtcQuery(const QString& callsign) + void NetworkVatlib::sendAtcQuery(const BlackMisc::Aviation::CCallsign &callsign) { try { @@ -268,7 +268,7 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - void NetworkVatlib::sendAtisQuery(const QString& callsign) + void NetworkVatlib::sendAtisQuery(const BlackMisc::Aviation::CCallsign &callsign) { try { @@ -277,7 +277,7 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - void NetworkVatlib::sendNameQuery(const QString& callsign) + void NetworkVatlib::sendNameQuery(const BlackMisc::Aviation::CCallsign &callsign) { try { @@ -286,7 +286,7 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - void NetworkVatlib::sendCapabilitiesQuery(const QString& callsign) + void NetworkVatlib::sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &callsign) { try { @@ -295,7 +295,7 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - void NetworkVatlib::replyToFreqQuery(const QString& callsign, const BlackMisc::PhysicalQuantities::CFrequency& freq) + void NetworkVatlib::replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq) { try { @@ -304,7 +304,7 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - void NetworkVatlib::replyToNameQuery(const QString& callsign, const QString& realname) + void NetworkVatlib::replyToNameQuery(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname) { try { @@ -313,7 +313,7 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - void NetworkVatlib::requestPlaneInfo(const QString& callsign) + void NetworkVatlib::requestAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign) { try { @@ -322,36 +322,36 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - void NetworkVatlib::sendPlaneInfo(const QString& callsign, const QString& acTypeICAO, const QString& airlineICAO, const QString& livery) + void NetworkVatlib::sendAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icao) { try { - const QByteArray acTypeICAObytes = toFSD(acTypeICAO); - const QByteArray airlineICAObytes = toFSD(airlineICAO); - const QByteArray liverybytes = toFSD(livery); - std::vector keysValues; - if (! acTypeICAO.isEmpty()) + const QByteArray acTypeICAObytes = toFSD(icao.getDesignator()); + const QByteArray airlineICAObytes = toFSD(icao.getAirline()); + const QByteArray liverybytes = toFSD(icao.getLivery()); + std::vector keysValues; + if (!icao.getDesignator().isEmpty()) { keysValues.push_back(m_net->acinfo_Equipment); keysValues.push_back(acTypeICAObytes); } - if (! airlineICAO.isEmpty()) + if (icao.hasAirline()) { keysValues.push_back(m_net->acinfo_Airline); keysValues.push_back(airlineICAObytes); } - if (! livery.isEmpty()) + if (icao.hasLivery()) { keysValues.push_back(m_net->acinfo_Livery); keysValues.push_back(liverybytes); } - keysValues.push_back(0); + keysValues.push_back(nullptr); m_net->SendPlaneInfo(toFSD(callsign), keysValues.data()); } catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - void NetworkVatlib::ping(const QString& callsign) + void NetworkVatlib::ping(const BlackMisc::Aviation::CCallsign &callsign) { try { @@ -387,7 +387,7 @@ namespace BlackCore return static_cast(cbvar); } - void NetworkVatlib::onConnectionStatusChanged(Cvatlib_Network *, Cvatlib_Network::connStatus oldStatus, Cvatlib_Network::connStatus newStatus, void *cbvar) + void NetworkVatlib::onConnectionStatusChanged(Cvatlib_Network *, Cvatlib_Network::connStatus, Cvatlib_Network::connStatus newStatus, void *cbvar) { cbvar_cast(cbvar)->m_status = newStatus; switch (newStatus) @@ -402,17 +402,19 @@ namespace BlackCore void NetworkVatlib::onTextMessageReceived(Cvatlib_Network *, const char *from, const char *to, const char *msg, void *cbvar) { - emit cbvar_cast(cbvar)->privateTextMessageReceived(cbvar_cast(cbvar)->fromFSD(from), cbvar_cast(cbvar)->fromFSD(to), cbvar_cast(cbvar)->fromFSD(msg)); + BlackMisc::Network::CTextMessageList messages(cbvar_cast(cbvar)->fromFSD(msg), CCallsign(cbvar_cast(cbvar)->fromFSD(from)), CCallsign(cbvar_cast(cbvar)->fromFSD(to))); + emit cbvar_cast(cbvar)->textMessagesReceived(messages); } void NetworkVatlib::onRadioMessageReceived(Cvatlib_Network *, const char *from, INT numFreq, INT *freqList, const char *msg, void *cbvar) { - QVector freqs; + QList frequencies; for (int i = 0; i < numFreq; ++i) { - freqs.push_back(CFrequency(freqList[i], CFrequencyUnit::kHz())); + frequencies.push_back(CFrequency(freqList[i], CFrequencyUnit::kHz())); } - emit cbvar_cast(cbvar)->radioTextMessageReceived(cbvar_cast(cbvar)->fromFSD(from), cbvar_cast(cbvar)->fromFSD(msg), freqs); + BlackMisc::Network::CTextMessageList messages(cbvar_cast(cbvar)->fromFSD(msg), frequencies, CCallsign(cbvar_cast(cbvar)->fromFSD(from))); + emit cbvar_cast(cbvar)->textMessagesReceived(messages); } void NetworkVatlib::onPilotDisconnected(Cvatlib_Network *, const char *callsign, void *cbvar) @@ -420,25 +422,56 @@ namespace BlackCore emit cbvar_cast(cbvar)->pilotDisconnected(cbvar_cast(cbvar)->fromFSD(callsign)); } - void NetworkVatlib::onControllerDisconnected(Cvatlib_Network*, const char* callsign, void* cbvar) + void NetworkVatlib::onControllerDisconnected(Cvatlib_Network *, const char *callsign, void *cbvar) { emit cbvar_cast(cbvar)->atcDisconnected(cbvar_cast(cbvar)->fromFSD(callsign)); } - void NetworkVatlib::onPilotPositionUpdate(Cvatlib_Network*, const char* /*callsign*/, Cvatlib_Network::PilotPosUpdate /*pos*/, void* /*cbvar*/) + void NetworkVatlib::onPilotPositionUpdate(Cvatlib_Network *, const char *callsignChar , Cvatlib_Network::PilotPosUpdate pos, void *cbvar) + { + const CCallsign callsign(callsignChar); + const CAircraftSituation situation( + CCoordinateGeodetic(pos.lat, pos.lon, 0.0), + CAltitude(pos.altTrue, CAltitude::AboveGround, CLengthUnit::ft()), + CHeading(pos.heading, CHeading::True, CAngleUnit::deg()), + CAngle(pos.pitch, CAngleUnit::deg()), + CAngle(pos.bank, CAngleUnit::deg()), + CSpeed(pos.groundSpeed, CSpeedUnit::kts()) + ); + + QString tn("transponder "); + tn.append(callsign.asString()); + CTransponder::TransponderMode mode = CTransponder::ModeS; + switch (pos.xpdrMode) + { + case Cvatlib_Network::xpndrMode_Normal: + mode = CTransponder::ModeC; + break; + case Cvatlib_Network::xpndrMode_Standby: + mode = CTransponder::ModeS; + break; + case Cvatlib_Network::xpndrMode_Ident: + mode = CTransponder::StateIdent; + break; + default: + mode = CTransponder::ModeC; + break; + } + CTransponder transponder(tn, pos.xpdrCode, mode); + emit cbvar_cast(cbvar)->aircraftPositionUpdate(callsign, situation, transponder); + } + + void NetworkVatlib::onInterimPilotPositionUpdate(Cvatlib_Network *, const char * /** callsign **/, Cvatlib_Network::PilotPosUpdate /** pos **/, void * /** cbvar **/) { //TODO } - void NetworkVatlib::onInterimPilotPositionUpdate(Cvatlib_Network*, const char* /*callsign*/, Cvatlib_Network::PilotPosUpdate /*pos*/, void* /*cbvar*/) + void NetworkVatlib::onAtcPositionUpdate(Cvatlib_Network *, const char *callsign, Cvatlib_Network::ATCPosUpdate pos, void *cbvar) { - //TODO - } - - void NetworkVatlib::onAtcPositionUpdate(Cvatlib_Network*, const char* callsign, Cvatlib_Network::ATCPosUpdate pos, void* cbvar) - { - emit cbvar_cast(cbvar)->atcPositionUpdate(cbvar_cast(cbvar)->fromFSD(callsign), CFrequency(pos.frequency, CFrequencyUnit::kHz()), - CCoordinateGeodetic(pos.lat, pos.lon, 0), CLength(pos.visibleRange, CLengthUnit::NM())); + CFrequency freq(pos.frequency, CFrequencyUnit::kHz()); + freq.switchUnit(CFrequencyUnit::MHz()); // we would not need to bother, but this makes it easier to identify + emit cbvar_cast(cbvar)->atcPositionUpdate(cbvar_cast(cbvar)->fromFSD(callsign), freq, + CCoordinateGeodetic(pos.lat, pos.lon, 0), CLength(pos.visibleRange, CLengthUnit::NM())); } void NetworkVatlib::onKicked(Cvatlib_Network *, const char *reason, void *cbvar) @@ -460,7 +493,7 @@ namespace BlackCore { switch (type) { - case Cvatlib_Network::infoQuery_Freq: emit cbvar_cast(cbvar)->freqQueryRequestReceived(cbvar_cast(cbvar)->fromFSD(callsign)); break; + 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; } } @@ -469,7 +502,7 @@ namespace BlackCore { switch (type) { - case Cvatlib_Network::infoQuery_Freq: emit cbvar_cast(cbvar)->freqQueryReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), CFrequency(cbvar_cast(cbvar)->fromFSD(data).toFloat(), CFrequencyUnit::MHz())); break; + case Cvatlib_Network::infoQuery_Freq: emit cbvar_cast(cbvar)->frequencyQueryReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), CFrequency(cbvar_cast(cbvar)->fromFSD(data).toFloat(), CFrequencyUnit::MHz())); break; case Cvatlib_Network::infoQuery_Server: emit cbvar_cast(cbvar)->serverQueryReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(data)); break; case Cvatlib_Network::infoQuery_ATC: emit cbvar_cast(cbvar)->atcQueryReplyReceived(cbvar_cast(cbvar)->fromFSD(data2), *data == 'Y'); break; case Cvatlib_Network::infoQuery_Name: emit cbvar_cast(cbvar)->nameQueryReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(data)); break; @@ -500,7 +533,7 @@ namespace BlackCore emit cbvar_cast(cbvar)->atisQueryReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(data)); } - void NetworkVatlib::onTemperatureDataReceived(Cvatlib_Network*, Cvatlib_Network::TempLayer /*layers*/[4], INT /*pressure*/, void* /*cbvar*/) + void NetworkVatlib::onTemperatureDataReceived(Cvatlib_Network *, Cvatlib_Network::TempLayer /** layers **/ [4], INT /** pressure **/, void * /** cbvar **/) { //TODO } @@ -538,37 +571,34 @@ namespace BlackCore emit cbvar_cast(cbvar)->terminate(); } - void NetworkVatlib::onWindDataReceived(Cvatlib_Network*, Cvatlib_Network::WindLayer /*layers*/[4], void* /*cbvar*/) + void NetworkVatlib::onWindDataReceived(Cvatlib_Network *, Cvatlib_Network::WindLayer /** layers **/[4], void * /** cbvar **/) { //TODO } - void NetworkVatlib::onCloudDataReceived(Cvatlib_Network*, Cvatlib_Network::CloudLayer /*layers*/[2], Cvatlib_Network::StormLayer /*storm*/, float /*vis*/, void* /*cbvar*/) + void NetworkVatlib::onCloudDataReceived(Cvatlib_Network *, Cvatlib_Network::CloudLayer /** layers **/ [2], Cvatlib_Network::StormLayer /** storm **/, float /** vis **/, void * /** cbvar **/) { //TODO } void NetworkVatlib::onPilotInfoRequestReceived(Cvatlib_Network *, const char *callsign, void *cbvar) { - emit cbvar_cast(cbvar)->planeInfoRequestReceived(cbvar_cast(cbvar)->fromFSD(callsign)); + emit cbvar_cast(cbvar)->aircraftInfoRequestReceived(cbvar_cast(cbvar)->fromFSD(callsign)); } void NetworkVatlib::onPilotInfoReceived(Cvatlib_Network *net, const char *callsign, const char **keysValues, void *cbvar) { - const char* acTypeICAO = nullptr; - const char* airlineICAO = nullptr; - const char* livery = nullptr; + BlackMisc::Aviation::CAircraftIcao icao; while (*keysValues) { - QString key (*keysValues); + QString key(*keysValues); keysValues++; - if (key == net->acinfo_Equipment) { acTypeICAO = *keysValues; } - else if (key == net->acinfo_Airline) { airlineICAO = *keysValues; } - else if (key == net->acinfo_Livery) { livery = *keysValues; } + if (key == net->acinfo_Equipment) { icao.setDesignator(*keysValues); } + else if (key == net->acinfo_Airline) { icao.setAirline(*keysValues); } + else if (key == net->acinfo_Livery) { icao.setLivery(*keysValues); } keysValues++; } - emit cbvar_cast(cbvar)->planeInfoReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(acTypeICAO), - cbvar_cast(cbvar)->fromFSD(airlineICAO), cbvar_cast(cbvar)->fromFSD(livery)); + emit cbvar_cast(cbvar)->aircraftInfoReceived(cbvar_cast(cbvar)->fromFSD(callsign), icao); } } // namespace diff --git a/src/blackcore/network_vatlib.h b/src/blackcore/network_vatlib.h index d9bf84556..2e6268db5 100644 --- a/src/blackcore/network_vatlib.h +++ b/src/blackcore/network_vatlib.h @@ -11,6 +11,7 @@ #define BLACKCORE_NETWORK_VATLIB_H #include "network.h" +#include "blackmisc/avallclasses.h" #include #include #include @@ -34,31 +35,33 @@ namespace BlackCore public: // INetwork slots overrides // Network - virtual void setCallsign(const QString& callsign); - virtual void setServerDetails(const QString &hostname, quint16 port); - virtual void setUserCredentials(const QString &username, const QString &password); + virtual void setServer(const BlackMisc::Network::CServer &server); + virtual void setCallsign(const BlackMisc::Aviation::CCallsign &callsign); virtual void setRealName(const QString &name); virtual void initiateConnection(); virtual void terminateConnection(); - virtual void sendPrivateTextMessage(const QString& callsign, const QString& msg); - virtual void sendRadioTextMessage(const QVector& freqs, const QString& msg); virtual void sendIpQuery(); - virtual void sendFreqQuery(const QString& callsign); - virtual void sendServerQuery(const QString& callsign); - virtual void sendAtcQuery(const QString& callsign); - virtual void sendAtisQuery(const QString& callsign); - virtual void sendNameQuery(const QString& callsign); - virtual void sendCapabilitiesQuery(const QString& callsign); - virtual void replyToFreqQuery(const QString& callsign, const BlackMisc::PhysicalQuantities::CFrequency& freq); - virtual void replyToNameQuery(const QString& callsign, const QString& realname); - virtual void requestPlaneInfo(const QString& callsign); - virtual void sendPlaneInfo(const QString& callsign, const QString& acTypeICAO, const QString& airlineICAO, const QString& livery); - virtual void ping(const QString& callsign); + 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 virtual void requestWeatherData(const QString &airportICAO); + // Text messages + virtual void sendTextMessages(const BlackMisc::Network::CTextMessageList &messages); + + // 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); // ATC + virtual void sendAtcQuery(const BlackMisc::Aviation::CCallsign &callsign); + virtual void sendAtisQuery(const BlackMisc::Aviation::CCallsign &callsign); virtual void requestMetar(const QString &airportICAO); private: //shimlib callbacks @@ -86,7 +89,8 @@ namespace BlackCore private: QByteArray toFSD(QString qstr) const; - QString fromFSD(const char* cstr) const; + QByteArray toFSD(const BlackMisc::Aviation::CCallsign &callsign) const; + QString fromFSD(const char *cstr) const; bool isDisconnected() const { return m_status == Cvatlib_Network::connStatus_Idle || m_status == Cvatlib_Network::connStatus_Disconnected; } signals: @@ -105,13 +109,10 @@ namespace BlackCore 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; - QString m_serverHost; - quint16 m_serverPort; - QString m_username; - QString m_password; QByteArray m_callsign; QByteArray m_realname;