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

@@ -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 <QObject>
#include <QString>
#include <QMap>
@@ -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<BlackMisc::PhysicalQuantities::CFrequency>& 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<BlackMisc::PhysicalQuantities::CFrequency>& 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<BlackMisc::PhysicalQuantities::CFrequency>&, 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

View File

@@ -9,6 +9,7 @@
#include <type_traits>
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
#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<CFrequency>& freqs, const QString& msg)
{
try
{
std::vector<INT> 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<INT> 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<const char*> keysValues;
if (! acTypeICAO.isEmpty())
const QByteArray acTypeICAObytes = toFSD(icao.getDesignator());
const QByteArray airlineICAObytes = toFSD(icao.getAirline());
const QByteArray liverybytes = toFSD(icao.getLivery());
std::vector<const char *> 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<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;
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<CFrequency> freqs;
QList<CFrequency> 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

View File

@@ -11,6 +11,7 @@
#define BLACKCORE_NETWORK_VATLIB_H
#include "network.h"
#include "blackmisc/avallclasses.h"
#include <vatlib/vatlib.h>
#include <QScopedPointer>
#include <QBasicTimer>
@@ -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<BlackMisc::PhysicalQuantities::CFrequency>& 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;