start using our value classes as arguments in INetwork signals and slots

refs #81
This commit is contained in:
Klaus Basan
2013-12-22 20:33:47 +00:00
committed by Mathew Sutcliffe
parent 4747b3b484
commit 535ea65a9a
5 changed files with 300 additions and 278 deletions

View File

@@ -20,42 +20,39 @@ Client::Client(BlackMisc::IContext &ctx)
connect(m_net, &INetwork::connectionStatusDisconnected, this, &Client::connectionStatusDisconnected); connect(m_net, &INetwork::connectionStatusDisconnected, this, &Client::connectionStatusDisconnected);
connect(m_net, &INetwork::connectionStatusError, this, &Client::connectionStatusError); connect(m_net, &INetwork::connectionStatusError, this, &Client::connectionStatusError);
connect(m_net, &INetwork::ipQueryReplyReceived, this, &Client::ipQueryReplyReceived); 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::serverQueryReplyReceived, this, &Client::serverQueryReplyReceived);
connect(m_net, &INetwork::atcQueryReplyReceived, this, &Client::atcQueryReplyReceived); connect(m_net, &INetwork::atcQueryReplyReceived, this, &Client::atcQueryReplyReceived);
connect(m_net, &INetwork::atisQueryReplyReceived, this, &Client::atisQueryReplyReceived); connect(m_net, &INetwork::atisQueryReplyReceived, this, &Client::atisQueryReplyReceived);
connect(m_net, &INetwork::nameQueryReplyReceived, this, &Client::nameQueryReplyReceived); connect(m_net, &INetwork::nameQueryReplyReceived, this, &Client::nameQueryReplyReceived);
connect(m_net, &INetwork::capabilitiesQueryReplyReceived, this, &Client::capabilitiesQueryReplyReceived); 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::nameQueryRequestReceived, this, &Client::nameQueryRequestReceived);
connect(m_net, &INetwork::kicked, this, &Client::kicked); connect(m_net, &INetwork::kicked, this, &Client::kicked);
connect(m_net, &INetwork::metarReceived, this, &Client::metarReceived); connect(m_net, &INetwork::metarReceived, this, &Client::metarReceived);
connect(m_net, &INetwork::pilotDisconnected, this, &Client::pilotDisconnected); connect(m_net, &INetwork::pilotDisconnected, this, &Client::pilotDisconnected);
connect(m_net, &INetwork::planeInfoReceived, this, &Client::planeInfoReceived); connect(m_net, &INetwork::aircraftInfoReceived, this, &Client::aircraftInfoReceived);
connect(m_net, &INetwork::planeInfoRequestReceived, this, &Client::planeInfoRequestReceived); connect(m_net, &INetwork::aircraftInfoRequestReceived, this, &Client::aircraftInfoRequestReceived);
connect(m_net, &INetwork::pong, this, &Client::pong); connect(m_net, &INetwork::pong, this, &Client::pong);
connect(m_net, &INetwork::radioTextMessageReceived, this, &Client::radioTextMessageReceived); connect(m_net, &INetwork::textMessagesReceived, this, &Client::textMessagesReceived);
connect(m_net, &INetwork::privateTextMessageReceived, this, &Client::privateTextMessageReceived);
connect(this, &Client::setServerDetails, m_net, &INetwork::setServerDetails); connect(this, &Client::setServer, m_net, &INetwork::setServer);
connect(this, &Client::setUserCredentials, m_net, &INetwork::setUserCredentials);
connect(this, &Client::setCallsign, m_net, &INetwork::setCallsign); connect(this, &Client::setCallsign, m_net, &INetwork::setCallsign);
connect(this, &Client::setRealName, m_net, &INetwork::setRealName); connect(this, &Client::setRealName, m_net, &INetwork::setRealName);
connect(this, &Client::initiateConnection, m_net, &INetwork::initiateConnection); connect(this, &Client::initiateConnection, m_net, &INetwork::initiateConnection);
connect(this, &Client::terminateConnection, m_net, &INetwork::terminateConnection); connect(this, &Client::terminateConnection, m_net, &INetwork::terminateConnection);
connect(this, &Client::sendPrivateTextMessage, m_net, &INetwork::sendPrivateTextMessage); connect(this, &Client::sendTextMessages, m_net, &INetwork::sendTextMessages);
connect(this, &Client::sendRadioTextMessage, m_net, &INetwork::sendRadioTextMessage);
connect(this, &Client::sendIpQuery, m_net, &INetwork::sendIpQuery); 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::sendServerQuery, m_net, &INetwork::sendServerQuery);
connect(this, &Client::sendAtcQuery, m_net, &INetwork::sendAtcQuery); connect(this, &Client::sendAtcQuery, m_net, &INetwork::sendAtcQuery);
connect(this, &Client::sendAtisQuery, m_net, &INetwork::sendAtisQuery); connect(this, &Client::sendAtisQuery, m_net, &INetwork::sendAtisQuery);
connect(this, &Client::sendNameQuery, m_net, &INetwork::sendNameQuery); connect(this, &Client::sendNameQuery, m_net, &INetwork::sendNameQuery);
connect(this, &Client::sendCapabilitiesQuery, m_net, &INetwork::sendCapabilitiesQuery); 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::replyToNameQuery, m_net, &INetwork::replyToNameQuery);
connect(this, &Client::requestPlaneInfo, m_net, &INetwork::requestPlaneInfo); connect(this, &Client::requestPlaneInfo, m_net, &INetwork::requestAircraftInfo);
connect(this, &Client::sendPlaneInfo, m_net, &INetwork::sendPlaneInfo); connect(this, &Client::sendAircraftInfo, m_net, &INetwork::sendAircraftInfo);
connect(this, &Client::ping, m_net, &INetwork::ping); connect(this, &Client::ping, m_net, &INetwork::ping);
connect(this, &Client::requestMetar, m_net, &INetwork::requestMetar); connect(this, &Client::requestMetar, m_net, &INetwork::requestMetar);
connect(this, &Client::requestWeatherData, m_net, &INetwork::requestWeatherData); 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["help"] = std::bind(&Client::help, this, _1);
m_commands["echo"] = std::bind(&Client::echo, this, _1); m_commands["echo"] = std::bind(&Client::echo, this, _1);
m_commands["exit"] = std::bind(&Client::exit, this, _1); m_commands["exit"] = std::bind(&Client::exit, this, _1);
m_commands["setserver"] = std::bind(&Client::setServerDetailsCmd, this, _1); m_commands["setserver"] = std::bind(&Client::setServerCmd, this, _1);
m_commands["setuser"] = std::bind(&Client::setUserCredentialsCmd, this, _1);
m_commands["setcallsign"] = std::bind(&Client::setCallsignCmd, this, _1); m_commands["setcallsign"] = std::bind(&Client::setCallsignCmd, this, _1);
m_commands["setrealname"] = std::bind(&Client::setRealNameCmd, this, _1); m_commands["setrealname"] = std::bind(&Client::setRealNameCmd, this, _1);
m_commands["initconnect"] = std::bind(&Client::initiateConnectionCmd, 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["caps"] = std::bind(&Client::sendCapabilitiesQueryCmd, this, _1);
m_commands["freqreply"] = std::bind(&Client::replyToFreqQueryCmd, this, _1); m_commands["freqreply"] = std::bind(&Client::replyToFreqQueryCmd, this, _1);
m_commands["namereply"] = std::bind(&Client::replyToNameQueryCmd, this, _1); m_commands["namereply"] = std::bind(&Client::replyToNameQueryCmd, this, _1);
m_commands["planeinfo"] = std::bind(&Client::requestPlaneInfoCmd, this, _1); m_commands["aircraftinfo"] = std::bind(&Client::requestAircraftInfoCmd, this, _1);
m_commands["planeinforeply"] = std::bind(&Client::sendPlaneInfoCmd, this, _1); m_commands["aircraftinforeply"] = std::bind(&Client::sendAircraftInfoCmd, this, _1);
m_commands["ping"] = std::bind(&Client::pingCmd, this, _1); m_commands["ping"] = std::bind(&Client::pingCmd, this, _1);
m_commands["metar"] = std::bind(&Client::requestMetarCmd, this, _1); m_commands["metar"] = std::bind(&Client::requestMetarCmd, this, _1);
m_commands["weather"] = std::bind(&Client::requestWeatherDataCmd, this, _1); m_commands["weather"] = std::bind(&Client::requestWeatherDataCmd, this, _1);
@@ -130,20 +126,14 @@ void Client::exit(QTextStream &)
emit quit(); emit quit();
} }
void Client::setServerDetailsCmd(QTextStream &args) void Client::setServerCmd(QTextStream &args)
{ {
QString hostname; QString hostname;
quint16 port; quint16 port;
args >> hostname >> port;
emit setServerDetails(hostname, port);
}
void Client::setUserCredentialsCmd(QTextStream &args)
{
QString username; QString username;
QString password; QString password;
args >> username >> password; args >> hostname >> port >> username >> password;
emit setUserCredentials(username, password); emit setServer(BlackMisc::Network::CServer("", "", hostname, port, BlackMisc::Network::CUser(username, "", "", password)));
} }
void Client::setCallsignCmd(QTextStream &args) void Client::setCallsignCmd(QTextStream &args)
@@ -173,7 +163,8 @@ void Client::sendPrivateTextMessageCmd(QTextStream &args)
QString callsign; QString callsign;
args >> callsign; args >> callsign;
args.skipWhiteSpace(); 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) void Client::sendRadioTextMessageCmd(QTextStream &args)
@@ -181,12 +172,13 @@ void Client::sendRadioTextMessageCmd(QTextStream &args)
QString freqsBlob; QString freqsBlob;
args >> freqsBlob; args >> freqsBlob;
QStringList freqStrings = freqsBlob.split("|"); QStringList freqStrings = freqsBlob.split("|");
QVector<BlackMisc::PhysicalQuantities::CFrequency> freqs; QList<BlackMisc::PhysicalQuantities::CFrequency> frequencies;
for (auto i = freqStrings.begin(); i != freqStrings.end(); ++i) 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 &) void Client::sendIpQueryCmd(QTextStream &)
@@ -253,21 +245,22 @@ void Client::replyToNameQueryCmd(QTextStream &args)
emit replyToNameQuery(callsign, realname); emit replyToNameQuery(callsign, realname);
} }
void Client::requestPlaneInfoCmd(QTextStream& args) void Client::requestAircraftInfoCmd(QTextStream &args)
{ {
QString callsign; QString callsign;
args >> callsign; args >> callsign;
emit requestPlaneInfo(callsign); emit requestPlaneInfo(callsign);
} }
void Client::sendPlaneInfoCmd(QTextStream& args) void Client::sendAircraftInfoCmd(QTextStream &args)
{ {
QString callsign; QString callsign;
QString acTypeICAO; QString acTypeICAO;
QString airlineICAO; QString airlineICAO;
QString livery; QString livery;
args >> callsign >> acTypeICAO >> airlineICAO >> 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) void Client::pingCmd(QTextStream &args)
@@ -295,15 +288,15 @@ void Client::requestWeatherDataCmd(QTextStream &args)
/************ Slots to receive signals from INetwork *************/ /************ Slots to receive signals from INetwork *************/
/****************************************************************************/ /****************************************************************************/
void Client::atcPositionUpdate(const QString& callsign, const BlackMisc::PhysicalQuantities::CFrequency& freq, void Client::atcPositionUpdate(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq,
const BlackMisc::Geo::CCoordinateGeodetic &pos, const BlackMisc::PhysicalQuantities::CLength &range) 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() void Client::connectionStatusIdle()
@@ -336,44 +329,44 @@ void Client::ipQueryReplyReceived(const QString &ip)
std::cout << "IP_REPLY " << ip.toStdString() << std::endl; 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) void Client::kicked(const QString &msg)
@@ -386,38 +379,27 @@ void Client::metarReceived(const QString &data)
std::cout << "METAR " << data.toStdString() << std::endl; 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<BlackMisc::PhysicalQuantities::CFrequency>& freqs) void Client::textMessagesReceived(const BlackMisc::Network::CTextMessageList &list)
{ {
QString freqsBlob = freqs[0].toQString(); std::cout << "TEXT MESSAGE" << list.toStdString();
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;
} }

View File

@@ -27,13 +27,10 @@ public slots:
void command(QString line); void command(QString line);
private: //commands private: //commands
void requestPlaneInfoCmd(QTextStream& args);
void sendPlaneInfoCmd(QTextStream& args);
void help(QTextStream &args); void help(QTextStream &args);
void echo(QTextStream &args); void echo(QTextStream &args);
void exit(QTextStream &args); void exit(QTextStream &args);
void setServerDetailsCmd(QTextStream &args); void setServerCmd(QTextStream &args);
void setUserCredentialsCmd(QTextStream &args);
void setCallsignCmd(QTextStream &args); void setCallsignCmd(QTextStream &args);
void setRealNameCmd(QTextStream &args); void setRealNameCmd(QTextStream &args);
void initiateConnectionCmd(QTextStream &args); void initiateConnectionCmd(QTextStream &args);
@@ -49,60 +46,60 @@ private: //commands
void sendCapabilitiesQueryCmd(QTextStream &args); void sendCapabilitiesQueryCmd(QTextStream &args);
void replyToFreqQueryCmd(QTextStream &args); void replyToFreqQueryCmd(QTextStream &args);
void replyToNameQueryCmd(QTextStream &args); void replyToNameQueryCmd(QTextStream &args);
void requestAircraftInfoCmd(QTextStream &args);
void sendAircraftInfoCmd(QTextStream &args);
void pingCmd(QTextStream &args); void pingCmd(QTextStream &args);
void requestMetarCmd(QTextStream &args); void requestMetarCmd(QTextStream &args);
void requestWeatherDataCmd(QTextStream &args); void requestWeatherDataCmd(QTextStream &args);
signals: //to send to INetwork signals: //to send to INetwork
void setCallsign(const QString& callsign); void setServer(const BlackMisc::Network::CServer &server);
void setServerDetails(const QString &hostname, quint16 port); void setCallsign(const BlackMisc::Aviation::CCallsign &callsign);
void setUserCredentials(const QString &username, const QString &password);
void setRealName(const QString &name); void setRealName(const QString &name);
void initiateConnection(); void initiateConnection();
void terminateConnection(); void terminateConnection();
void sendPrivateTextMessage(const QString& callsign, const QString& msg); void sendTextMessages(const BlackMisc::Network::CTextMessageList &textMessages);
void sendRadioTextMessage(const QVector<BlackMisc::PhysicalQuantities::CFrequency> &freqs, const QString &msg); void sendRadioTextMessage(const QVector<BlackMisc::PhysicalQuantities::CFrequency> &freqs, const QString &msg);
void sendIpQuery(); void sendIpQuery();
void sendFreqQuery(const QString& callsign); void sendFreqQuery(const BlackMisc::Aviation::CCallsign &callsign);
void sendServerQuery(const QString& callsign); void sendServerQuery(const BlackMisc::Aviation::CCallsign &callsign);
void sendAtcQuery(const QString& callsign); void sendAtcQuery(const BlackMisc::Aviation::CCallsign &callsign);
void sendAtisQuery(const QString& callsign); void sendAtisQuery(const BlackMisc::Aviation::CCallsign &callsign);
void sendNameQuery(const QString& callsign); void sendNameQuery(const BlackMisc::Aviation::CCallsign &callsign);
void sendCapabilitiesQuery(const QString& callsign); void sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &callsign);
void replyToFreqQuery(const QString& callsign, const BlackMisc::PhysicalQuantities::CFrequency& freq); void replyToFreqQuery(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq);
void replyToNameQuery(const QString& callsign, const QString& realname); void replyToNameQuery(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname);
void requestPlaneInfo(const QString& callsign); void requestPlaneInfo(const BlackMisc::Aviation::CCallsign &callsign);
void sendPlaneInfo(const QString& callsign, const QString& acTypeICAO, const QString& airlineICAO, const QString& livery); void sendAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icao);
void ping(const QString& callsign); void ping(const BlackMisc::Aviation::CCallsign &callsign);
void requestMetar(const QString &airportICAO); void requestMetar(const QString &airportICAO);
void requestWeatherData(const QString &airportICAO); void requestWeatherData(const QString &airportICAO);
public slots: //to receive from INetwork public slots: //to receive from INetwork
void atcPositionUpdate(const QString& callsign, const BlackMisc::PhysicalQuantities::CFrequency& freq, void atcPositionUpdate(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq,
const BlackMisc::Geo::CCoordinateGeodetic &pos, const BlackMisc::PhysicalQuantities::CLength &range); const BlackMisc::Geo::CCoordinateGeodetic &pos, const BlackMisc::PhysicalQuantities::CLength &range);
void atcDisconnected(const QString& callsign); void atcDisconnected(const BlackMisc::Aviation::CCallsign &callsign);
void connectionStatusIdle(); void connectionStatusIdle();
void connectionStatusConnecting(); void connectionStatusConnecting();
void connectionStatusConnected(); void connectionStatusConnected();
void connectionStatusDisconnected(); void connectionStatusDisconnected();
void connectionStatusError(); 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<BlackMisc::PhysicalQuantities::CFrequency>& freqs);
void privateTextMessageReceived(const QString& fromCallsign, const QString& toCallsign, const QString& msg);
void ipQueryReplyReceived(const QString &ip); 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 kicked(const QString &msg);
void metarReceived(const QString &data); 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: private:
QMap<QString, std::function<void(QTextStream &)>> m_commands; QMap<QString, std::function<void(QTextStream &)>> m_commands;

View File

@@ -10,10 +10,13 @@
#ifndef BLACKCORE_NETWORK_H #ifndef BLACKCORE_NETWORK_H
#define BLACKCORE_NETWORK_H #define BLACKCORE_NETWORK_H
#include "../blackmisc/pqfrequency.h" #include "blackmisc/avaircraft.h"
#include "../blackmisc/coordinategeodetic.h" #include "blackmisc/pqfrequency.h"
#include "../blackmisc/pqlength.h" #include "blackmisc/coordinategeodetic.h"
#include "../blackmisc/pqtime.h" #include "blackmisc/pqlength.h"
#include "blackmisc/pqtime.h"
#include "blackmisc/nwtextmessagelist.h"
#include "blackmisc/nwserver.h"
#include <QObject> #include <QObject>
#include <QString> #include <QString>
#include <QMap> #include <QMap>
@@ -44,43 +47,58 @@ namespace BlackCore
}; };
public slots: public slots:
virtual void setCallsign(const QString& callsign) = 0;
// Network // Network
virtual void setServerDetails(const QString &hostname, quint16 port) = 0; virtual void setServer(const BlackMisc::Network::CServer &server) = 0;
virtual void setUserCredentials(const QString &username, const QString &password) = 0; virtual void setCallsign(const BlackMisc::Aviation::CCallsign &callsign) = 0;
virtual void setRealName(const QString &name) = 0; virtual void setRealName(const QString &name) = 0;
virtual void initiateConnection() = 0; virtual void initiateConnection() = 0;
virtual void terminateConnection() = 0; virtual void terminateConnection() = 0;
virtual void sendPrivateTextMessage(const QString& callsign, const QString& msg) = 0; virtual void ping(const BlackMisc::Aviation::CCallsign &callsign) = 0;
virtual void sendRadioTextMessage(const QVector<BlackMisc::PhysicalQuantities::CFrequency>& freqs, const QString& msg) = 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 sendIpQuery() = 0;
virtual void sendFreqQuery(const QString& callsign) = 0; virtual void sendServerQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0;
virtual void sendServerQuery(const QString& callsign) = 0;
virtual void sendAtcQuery(const QString& callsign) = 0; // Text messages
virtual void sendAtisQuery(const QString& callsign) = 0; virtual void sendTextMessages(const BlackMisc::Network::CTextMessageList &textMessages) = 0;
virtual void sendNameQuery(const QString& callsign) = 0;
virtual void sendCapabilitiesQuery(const QString& callsign) = 0; // ATC
virtual void replyToFreqQuery(const QString& callsign, const BlackMisc::PhysicalQuantities::CFrequency& freq) = 0; virtual void sendAtcQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0;
virtual void replyToNameQuery(const QString& callsign, const QString& realname) = 0; virtual void sendAtisQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0;
virtual void requestPlaneInfo(const QString& callsign) = 0;
//TODO virtual void setPlanePosition(...) = 0; // Aircraft
//TODO virtual void sendFlightPlan(...) = 0; virtual void sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0;
virtual void sendPlaneInfo(const QString& callsign, const QString& acTypeICAO, const QString& airlineICAO, const QString& livery) = 0; virtual void requestAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign) = 0;
virtual void ping(const QString& 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 // Weather / flight plan
virtual void requestMetar(const QString &airportICAO) = 0; virtual void requestMetar(const QString &airportICAO) = 0;
virtual void requestWeatherData(const QString &airportICAO) = 0; virtual void requestWeatherData(const QString &airportICAO) = 0;
// TODO virtual void sendFlightPlan(...) = 0;
signals: signals:
void atcPositionUpdate(const QString& callsign, const BlackMisc::PhysicalQuantities::CFrequency& freq, // ATC
void atcPositionUpdate(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq,
const BlackMisc::Geo::CCoordinateGeodetic &pos, const BlackMisc::PhysicalQuantities::CLength &range); const BlackMisc::Geo::CCoordinateGeodetic &pos, const BlackMisc::PhysicalQuantities::CLength &range);
void atcDisconnected(const QString& callsign); void atcDisconnected(const BlackMisc::Aviation::CCallsign &callsign);
//TODO void cloudDataReceived(...); void atcQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, bool isATC);
void atisQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &data);
void metarReceived(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 // Connection / Network in general
void kicked(const QString &msg); void kicked(const QString &msg);
void connectionStatusIdle(); void connectionStatusIdle();
@@ -88,25 +106,21 @@ namespace BlackCore
void connectionStatusConnected(); void connectionStatusConnected();
void connectionStatusDisconnected(); void connectionStatusDisconnected();
void connectionStatusError(); void connectionStatusError();
void freqQueryReplyReceived(const QString& callsign, const BlackMisc::PhysicalQuantities::CFrequency& freq); void pong(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CTime &elapsedTime);
void serverQueryReplyReceived(const QString& callsign, const QString& hostname); void capabilitiesQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, quint32 flags);
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<BlackMisc::PhysicalQuantities::CFrequency>& freqs);
void privateTextMessageReceived(const QString& fromCallsign, const QString& toCallsign, const QString& msg);
void ipQueryReplyReceived(const QString &ip); 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);
// Weather
// TODO void temperatureDataReceived(...); // TODO void temperatureDataReceived(...);
// TODO void windDataReceived(...); // TODO void windDataReceived(...);
// TODO void cloudDataReceived(...);
}; };
/*! /*!
@@ -115,26 +129,24 @@ namespace BlackCore
class NetworkDummy : public INetwork class NetworkDummy : public INetwork
{ {
public: //INetwork slots overrides public: //INetwork slots overrides
virtual void setServerDetails(const QString&, quint16) {} virtual void setServer(const BlackMisc::Network::CServer &) {}
virtual void setUserCredentials(const QString&, const QString&) {} virtual void setCallsign(const BlackMisc::Aviation::CCallsign &) {}
virtual void setCallsign(const QString&) {}
virtual void setRealName(const QString &) {} virtual void setRealName(const QString &) {}
virtual void initiateConnection() {} virtual void initiateConnection() {}
virtual void terminateConnection() {} virtual void terminateConnection() {}
virtual void sendPrivateTextMessage(const QString&, const QString&) {} virtual void ping(const BlackMisc::Aviation::CCallsign &) {}
virtual void sendRadioTextMessage(const QVector<BlackMisc::PhysicalQuantities::CFrequency>&, const QString&) {} virtual void sendNameQuery(const BlackMisc::Aviation::CCallsign &) {}
virtual void replyToNameQuery(const BlackMisc::Aviation::CCallsign &, const QString &) {}
virtual void sendIpQuery() {} virtual void sendIpQuery() {}
virtual void sendFreqQuery(const QString&) {} virtual void sendServerQuery(const BlackMisc::Aviation::CCallsign &) {}
virtual void sendServerQuery(const QString&) {} virtual void sendTextMessages(const BlackMisc::Network::CTextMessageList &) {}
virtual void sendAtcQuery(const QString&) {} virtual void sendAtcQuery(const BlackMisc::Aviation::CCallsign &) {}
virtual void sendAtisQuery(const QString&) {} virtual void sendAtisQuery(const BlackMisc::Aviation::CCallsign &) {}
virtual void sendNameQuery(const QString&) {} virtual void sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &) {}
virtual void sendCapabilitiesQuery(const QString&) {} virtual void requestAircraftInfo(const BlackMisc::Aviation::CCallsign &) {}
virtual void replyToFreqQuery(const QString&, const BlackMisc::PhysicalQuantities::CFrequency&) {} virtual void sendAircraftInfo(const BlackMisc::Aviation::CCallsign &, const BlackMisc::Aviation::CAircraftIcao &) {}
virtual void replyToNameQuery(const QString&, const QString&) {} virtual void sendFrequencyQuery(const BlackMisc::Aviation::CCallsign &) {}
virtual void requestPlaneInfo(const QString&) {} virtual void replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &, const BlackMisc::PhysicalQuantities::CFrequency &) {}
virtual void sendPlaneInfo(const QString&, const QString&, const QString&, const QString&) {}
virtual void ping(const QString&) {}
virtual void requestMetar(const QString &) {} virtual void requestMetar(const QString &) {}
virtual void requestWeatherData(const QString &) {} virtual void requestWeatherData(const QString &) {}
}; };

View File

@@ -9,6 +9,7 @@
#include <type_traits> #include <type_traits>
static_assert(! std::is_abstract<BlackCore::NetworkVatlib>::value, "Must implement all pure virtuals"); static_assert(! std::is_abstract<BlackCore::NetworkVatlib>::value, "Must implement all pure virtuals");
static_assert(! std::is_abstract<BlackCore::NetworkDummy>::value, "Must implement all pure virtuals");
//TODO just placeholders to allow this to compile //TODO just placeholders to allow this to compile
#define CLIENT_NAME_VERSION "BlackBox 0.1" #define CLIENT_NAME_VERSION "BlackBox 0.1"
@@ -23,6 +24,8 @@ namespace BlackCore
using namespace BlackMisc::PhysicalQuantities; using namespace BlackMisc::PhysicalQuantities;
using namespace BlackMisc::Geo; using namespace BlackMisc::Geo;
using namespace BlackMisc::Aviation;
using namespace BlackMisc::Network;
void exceptionDispatcher(const char* caller); void exceptionDispatcher(const char* caller);
@@ -112,6 +115,10 @@ namespace BlackCore
return m_fsdTextCodec->fromUnicode(qstr); 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 QString NetworkVatlib::fromFSD(const char *cstr) const
{ {
@@ -147,23 +154,13 @@ namespace BlackCore
/********************************** INetwork slots ************************************/ /********************************** 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"); Q_ASSERT_X(isDisconnected(), "NetworkVatlib", "Can't change server details while still connected");
this->m_server = server;
m_serverHost = host;
m_serverPort = port;
} }
void NetworkVatlib::setUserCredentials(const QString &username, const QString &password) void NetworkVatlib::setCallsign(const BlackMisc::Aviation::CCallsign &callsign)
{
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)
{ {
Q_ASSERT_X(isDisconnected(), "NetworkVatlib", "Can't change callsign while still connected"); Q_ASSERT_X(isDisconnected(), "NetworkVatlib", "Can't change callsign while still connected");
@@ -189,8 +186,8 @@ namespace BlackCore
info.name = m_realname.data(); info.name = m_realname.data();
info.rating = Cvatlib_Network::pilotRating_Student; //TODO info.rating = Cvatlib_Network::pilotRating_Student; //TODO
info.sim = Cvatlib_Network::simType_XPlane; //TODO info.sim = Cvatlib_Network::simType_XPlane; //TODO
m_net->SetPilotLoginInfo(toFSD(m_serverHost).data(), m_serverPort, m_net->SetPilotLoginInfo(toFSD(m_server.getAddress()).data(), m_server.getPort(),
toFSD(m_username).data(), toFSD(m_password).data(), info); toFSD(m_server.getUser().getId()).data(), toFSD(m_server.getUser().getPassword()).data(), info);
m_net->ConnectAndLogon(); m_net->ConnectAndLogon();
} }
catch (...) catch (...)
@@ -209,25 +206,28 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); } 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 try
{ {
m_net->SendPrivateTextMessage(toFSD(callsign), toFSD(msg)); CTextMessageList privateMessages = messages.getPrivateMessages();
} foreach(BlackMisc::Network::CTextMessage message, privateMessages)
catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
}
void NetworkVatlib::sendRadioTextMessage(const QVector<CFrequency>& freqs, const QString& msg)
{ {
try 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<INT> freqsVec; std::vector<INT> freqsVec;
for (int i = 0; i < freqs.size(); ++i) freqsVec.push_back(message.getFrequency().value(CFrequencyUnit::kHz()));
{ m_net->SendRadioTextMessage(freqsVec.size(), freqsVec.data(), toFSD(message.getMessage()));
freqsVec.push_back(freqs[i].value(CFrequencyUnit::kHz()));
} }
m_net->SendRadioTextMessage(freqsVec.size(), freqsVec.data(), toFSD(msg));
} }
catch (...) { exceptionDispatcher(Q_FUNC_INFO); } catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
} }
@@ -241,7 +241,7 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); } catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
} }
void NetworkVatlib::sendFreqQuery(const QString& callsign) void NetworkVatlib::sendFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign)
{ {
try try
{ {
@@ -250,7 +250,7 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); } catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
} }
void NetworkVatlib::sendServerQuery(const QString& callsign) void NetworkVatlib::sendServerQuery(const BlackMisc::Aviation::CCallsign &callsign)
{ {
try try
{ {
@@ -259,7 +259,7 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); } catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
} }
void NetworkVatlib::sendAtcQuery(const QString& callsign) void NetworkVatlib::sendAtcQuery(const BlackMisc::Aviation::CCallsign &callsign)
{ {
try try
{ {
@@ -268,7 +268,7 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); } catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
} }
void NetworkVatlib::sendAtisQuery(const QString& callsign) void NetworkVatlib::sendAtisQuery(const BlackMisc::Aviation::CCallsign &callsign)
{ {
try try
{ {
@@ -277,7 +277,7 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); } catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
} }
void NetworkVatlib::sendNameQuery(const QString& callsign) void NetworkVatlib::sendNameQuery(const BlackMisc::Aviation::CCallsign &callsign)
{ {
try try
{ {
@@ -286,7 +286,7 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); } catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
} }
void NetworkVatlib::sendCapabilitiesQuery(const QString& callsign) void NetworkVatlib::sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &callsign)
{ {
try try
{ {
@@ -295,7 +295,7 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); } 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 try
{ {
@@ -304,7 +304,7 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); } 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 try
{ {
@@ -313,7 +313,7 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); } catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
} }
void NetworkVatlib::requestPlaneInfo(const QString& callsign) void NetworkVatlib::requestAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign)
{ {
try try
{ {
@@ -322,36 +322,36 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); } 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 try
{ {
const QByteArray acTypeICAObytes = toFSD(acTypeICAO); const QByteArray acTypeICAObytes = toFSD(icao.getDesignator());
const QByteArray airlineICAObytes = toFSD(airlineICAO); const QByteArray airlineICAObytes = toFSD(icao.getAirline());
const QByteArray liverybytes = toFSD(livery); const QByteArray liverybytes = toFSD(icao.getLivery());
std::vector<const char *> keysValues; std::vector<const char *> keysValues;
if (! acTypeICAO.isEmpty()) if (!icao.getDesignator().isEmpty())
{ {
keysValues.push_back(m_net->acinfo_Equipment); keysValues.push_back(m_net->acinfo_Equipment);
keysValues.push_back(acTypeICAObytes); keysValues.push_back(acTypeICAObytes);
} }
if (! airlineICAO.isEmpty()) if (icao.hasAirline())
{ {
keysValues.push_back(m_net->acinfo_Airline); keysValues.push_back(m_net->acinfo_Airline);
keysValues.push_back(airlineICAObytes); keysValues.push_back(airlineICAObytes);
} }
if (! livery.isEmpty()) if (icao.hasLivery())
{ {
keysValues.push_back(m_net->acinfo_Livery); keysValues.push_back(m_net->acinfo_Livery);
keysValues.push_back(liverybytes); keysValues.push_back(liverybytes);
} }
keysValues.push_back(0); keysValues.push_back(nullptr);
m_net->SendPlaneInfo(toFSD(callsign), keysValues.data()); m_net->SendPlaneInfo(toFSD(callsign), keysValues.data());
} }
catch (...) { exceptionDispatcher(Q_FUNC_INFO); } catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
} }
void NetworkVatlib::ping(const QString& callsign) void NetworkVatlib::ping(const BlackMisc::Aviation::CCallsign &callsign)
{ {
try try
{ {
@@ -387,7 +387,7 @@ namespace BlackCore
return static_cast<NetworkVatlib *>(cbvar); return static_cast<NetworkVatlib *>(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; cbvar_cast(cbvar)->m_status = newStatus;
switch (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) 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) void NetworkVatlib::onRadioMessageReceived(Cvatlib_Network *, const char *from, INT numFreq, INT *freqList, const char *msg, void *cbvar)
{ {
QVector<CFrequency> freqs; QList<CFrequency> frequencies;
for (int i = 0; i < numFreq; ++i) 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) void NetworkVatlib::onPilotDisconnected(Cvatlib_Network *, const char *callsign, void *cbvar)
@@ -425,19 +427,50 @@ namespace BlackCore
emit cbvar_cast(cbvar)->atcDisconnected(cbvar_cast(cbvar)->fromFSD(callsign)); 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)
{ {
//TODO 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*/) void NetworkVatlib::onInterimPilotPositionUpdate(Cvatlib_Network *, const char * /** callsign **/, Cvatlib_Network::PilotPosUpdate /** pos **/, void * /** cbvar **/)
{ {
//TODO //TODO
} }
void NetworkVatlib::onAtcPositionUpdate(Cvatlib_Network *, const char *callsign, Cvatlib_Network::ATCPosUpdate pos, void *cbvar) 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()), 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())); CCoordinateGeodetic(pos.lat, pos.lon, 0), CLength(pos.visibleRange, CLengthUnit::NM()));
} }
@@ -460,7 +493,7 @@ namespace BlackCore
{ {
switch (type) 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; case Cvatlib_Network::infoQuery_Name: emit cbvar_cast(cbvar)->nameQueryRequestReceived(cbvar_cast(cbvar)->fromFSD(callsign)); break;
} }
} }
@@ -469,7 +502,7 @@ namespace BlackCore
{ {
switch (type) 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_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_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; 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)); 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 //TODO
} }
@@ -538,37 +571,34 @@ namespace BlackCore
emit cbvar_cast(cbvar)->terminate(); 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 //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 //TODO
} }
void NetworkVatlib::onPilotInfoRequestReceived(Cvatlib_Network *, const char *callsign, void *cbvar) 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) void NetworkVatlib::onPilotInfoReceived(Cvatlib_Network *net, const char *callsign, const char **keysValues, void *cbvar)
{ {
const char* acTypeICAO = nullptr; BlackMisc::Aviation::CAircraftIcao icao;
const char* airlineICAO = nullptr;
const char* livery = nullptr;
while (*keysValues) while (*keysValues)
{ {
QString key(*keysValues); QString key(*keysValues);
keysValues++; keysValues++;
if (key == net->acinfo_Equipment) { acTypeICAO = *keysValues; } if (key == net->acinfo_Equipment) { icao.setDesignator(*keysValues); }
else if (key == net->acinfo_Airline) { airlineICAO = *keysValues; } else if (key == net->acinfo_Airline) { icao.setAirline(*keysValues); }
else if (key == net->acinfo_Livery) { livery = *keysValues; } else if (key == net->acinfo_Livery) { icao.setLivery(*keysValues); }
keysValues++; keysValues++;
} }
emit cbvar_cast(cbvar)->planeInfoReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(acTypeICAO), emit cbvar_cast(cbvar)->aircraftInfoReceived(cbvar_cast(cbvar)->fromFSD(callsign), icao);
cbvar_cast(cbvar)->fromFSD(airlineICAO), cbvar_cast(cbvar)->fromFSD(livery));
} }
} // namespace } // namespace

View File

@@ -11,6 +11,7 @@
#define BLACKCORE_NETWORK_VATLIB_H #define BLACKCORE_NETWORK_VATLIB_H
#include "network.h" #include "network.h"
#include "blackmisc/avallclasses.h"
#include <vatlib/vatlib.h> #include <vatlib/vatlib.h>
#include <QScopedPointer> #include <QScopedPointer>
#include <QBasicTimer> #include <QBasicTimer>
@@ -34,31 +35,33 @@ namespace BlackCore
public: // INetwork slots overrides public: // INetwork slots overrides
// Network // Network
virtual void setCallsign(const QString& callsign); virtual void setServer(const BlackMisc::Network::CServer &server);
virtual void setServerDetails(const QString &hostname, quint16 port); virtual void setCallsign(const BlackMisc::Aviation::CCallsign &callsign);
virtual void setUserCredentials(const QString &username, const QString &password);
virtual void setRealName(const QString &name); virtual void setRealName(const QString &name);
virtual void initiateConnection(); virtual void initiateConnection();
virtual void terminateConnection(); virtual void terminateConnection();
virtual void sendPrivateTextMessage(const QString& callsign, const QString& msg);
virtual void sendRadioTextMessage(const QVector<BlackMisc::PhysicalQuantities::CFrequency>& freqs, const QString& msg);
virtual void sendIpQuery(); virtual void sendIpQuery();
virtual void sendFreqQuery(const QString& callsign); virtual void sendServerQuery(const BlackMisc::Aviation::CCallsign &callsign);
virtual void sendServerQuery(const QString& callsign); virtual void sendNameQuery(const BlackMisc::Aviation::CCallsign &callsign);
virtual void sendAtcQuery(const QString& callsign); virtual void sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &callsign);
virtual void sendAtisQuery(const QString& callsign); virtual void replyToNameQuery(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname);
virtual void sendNameQuery(const QString& callsign); virtual void ping(const BlackMisc::Aviation::CCallsign &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);
// Weather // Weather
virtual void requestWeatherData(const QString &airportICAO); 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 // ATC
virtual void sendAtcQuery(const BlackMisc::Aviation::CCallsign &callsign);
virtual void sendAtisQuery(const BlackMisc::Aviation::CCallsign &callsign);
virtual void requestMetar(const QString &airportICAO); virtual void requestMetar(const QString &airportICAO);
private: //shimlib callbacks private: //shimlib callbacks
@@ -86,6 +89,7 @@ namespace BlackCore
private: private:
QByteArray toFSD(QString qstr) const; QByteArray toFSD(QString qstr) const;
QByteArray toFSD(const BlackMisc::Aviation::CCallsign &callsign) const;
QString fromFSD(const char *cstr) const; QString fromFSD(const char *cstr) const;
bool isDisconnected() const { return m_status == Cvatlib_Network::connStatus_Idle || m_status == Cvatlib_Network::connStatus_Disconnected; } bool isDisconnected() const { return m_status == Cvatlib_Network::connStatus_Idle || m_status == Cvatlib_Network::connStatus_Disconnected; }
@@ -105,13 +109,10 @@ namespace BlackCore
Cvatlib_Network::connStatus m_status; Cvatlib_Network::connStatus m_status;
QBasicTimer m_timer; QBasicTimer m_timer;
BlackMisc::Network::CServer m_server;
static int const c_updateIntervalMillisecs = 100; static int const c_updateIntervalMillisecs = 100;
static int const c_logoffTimeoutSeconds = 5; static int const c_logoffTimeoutSeconds = 5;
QString m_serverHost;
quint16 m_serverPort;
QString m_username;
QString m_password;
QByteArray m_callsign; QByteArray m_callsign;
QByteArray m_realname; QByteArray m_realname;