Merge with master after fixes for containers,

refs #106
This commit is contained in:
Klaus Basan
2014-01-26 00:09:30 +01:00
14 changed files with 721 additions and 470 deletions

View File

@@ -27,7 +27,7 @@ namespace BlackCore
{
// 1. Init by "network driver"
this->m_network = new CNetworkVatlib(CNetworkVatlib::LoginNormal, this);
this->m_network = new CNetworkVatlib(this);
// 2. Init own aircraft
this->initOwnAircraft();
@@ -42,15 +42,15 @@ namespace BlackCore
// 4. connect signals and slots
this->connect(this->m_network, &INetwork::connectionStatusChanged, this, &CContextNetwork::psFsdConnectionStatusChanged);
this->connect(this->m_network, &INetwork::atcPositionUpdate, this, &CContextNetwork::psFsdAtcPositionUpdate);
this->connect(this->m_network, &INetwork::atisQueryReplyReceived, this, &CContextNetwork::psFsdAtisQueryReceived);
this->connect(this->m_network, &INetwork::atisQueryVoiceRoomReplyReceived, this, &CContextNetwork::psFsdAtisVoiceRoomQueryReceived);
this->connect(this->m_network, &INetwork::atisQueryLogoffTimeReplyReceived, this, &CContextNetwork::psFsdAtisLogoffTimeQueryReceived);
this->connect(this->m_network, &INetwork::metarReceived, this, &CContextNetwork::psFsdMetarReceived);
this->connect(this->m_network, &INetwork::nameQueryReplyReceived, this, &CContextNetwork::psFsdNameQueryReplyReceived);
this->connect(this->m_network, &INetwork::aircraftInfoReceived, this, &CContextNetwork::psFsdAircraftInfoReceived);
this->connect(this->m_network, &INetwork::atisReplyReceived, this, &CContextNetwork::psFsdAtisQueryReceived);
this->connect(this->m_network, &INetwork::atisVoiceRoomReplyReceived, this, &CContextNetwork::psFsdAtisVoiceRoomQueryReceived);
this->connect(this->m_network, &INetwork::atisLogoffTimeReplyReceived, this, &CContextNetwork::psFsdAtisLogoffTimeQueryReceived);
this->connect(this->m_network, &INetwork::metarReplyReceived, this, &CContextNetwork::psFsdMetarReceived);
this->connect(this->m_network, &INetwork::realNameReplyReceived, this, &CContextNetwork::psFsdRealNameReplyReceived);
this->connect(this->m_network, &INetwork::icaoCodesReplyReceived, this, &CContextNetwork::psFsdIcaoCodesReceived);
this->connect(this->m_network, &INetwork::pilotDisconnected, this, &CContextNetwork::psFsdPilotDisconnected);
this->connect(this->m_network, &INetwork::aircraftPositionUpdate, this, &CContextNetwork::psFsdAircraftUpdateReceived);
this->connect(this->m_network, &INetwork::frequencyQueryReplyReceived, this, &CContextNetwork::psFsdFrequencyReceived);
this->connect(this->m_network, &INetwork::frequencyReplyReceived, this, &CContextNetwork::psFsdFrequencyReceived);
this->connect(this->m_network, &INetwork::textMessagesReceived, this, &CContextNetwork::psFsdTextMessageReceived);
this->connect(this->m_network, &INetwork::statusMessage, this, &CContextNetwork::statusMessage);
}
@@ -107,8 +107,10 @@ namespace BlackCore
}
else
{
this->m_ownAircraft.setPilot(currentServer.getUser());
this->m_network->setServer(currentServer);
this->m_ownAircraft.setPilot(currentServer.getUser()); // still needed?
this->m_network->presetServer(currentServer);
this->m_network->presetCallsign(this->m_ownAircraft.getCallsign());
this->m_network->presetIcaoCodes(this->m_ownAircraft.getIcaoInfo());
this->m_network->setOwnAircraft(this->m_ownAircraft);
this->m_network->initiateConnection();
QString msg = "Connection pending ";
@@ -259,7 +261,7 @@ namespace BlackCore
/*
* Name query
*/
void CContextNetwork::psFsdNameQueryReplyReceived(const CCallsign &callsign, const QString &realname)
void CContextNetwork::psFsdRealNameReplyReceived(const CCallsign &callsign, const QString &realname)
{
// this->log(Q_FUNC_INFO, callsign.toQString(), realname);
if (realname.isEmpty()) return;

View File

@@ -271,12 +271,12 @@ namespace BlackCore
/*!
* \brief Realname recevied
*/
void psFsdNameQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname);
void psFsdRealNameReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname);
/*!
* \brief Plane info received
* \brief Plane ICAO codes received
*/
void psFsdAircraftInfoReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icaoData);
void psFsdIcaoCodesReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icaoData);
/*!
* \brief Aircraft position update received

View File

@@ -19,7 +19,7 @@ namespace BlackCore
/*
* Aircraft info received
*/
void CContextNetwork::psFsdAircraftInfoReceived(const CCallsign &callsign, const CAircraftIcao &icaoData)
void CContextNetwork::psFsdIcaoCodesReceived(const CCallsign &callsign, const CAircraftIcao &icaoData)
{
// this->log(Q_FUNC_INFO, callsign.toQString(), icaoData.toQString());
CAircraftList aircraftsWithCallsign = this->m_aircraftsInRange.findByCallsign(callsign);
@@ -32,7 +32,7 @@ namespace BlackCore
aircraft.calculcateDistanceToPlane(this->m_ownAircraft.getPosition());
this->m_aircraftsInRange.push_back(aircraft);
emit this->m_network->sendFrequencyQuery(callsign);
emit this->m_network->sendNameQuery(callsign);
emit this->m_network->sendRealNameQuery(callsign);
emit this->changedAircraftsInRange();
}
else
@@ -61,8 +61,8 @@ namespace BlackCore
aircraft.calculcateDistanceToPlane(this->m_ownAircraft.getPosition());
this->m_aircraftsInRange.push_back(aircraft);
emit this->m_network->sendFrequencyQuery(callsign);
emit this->m_network->sendNameQuery(callsign);
emit this->m_network->requestAircraftInfo(callsign);
emit this->m_network->sendRealNameQuery(callsign);
emit this->m_network->sendIcaoCodesQuery(callsign);
emit this->changedAircraftsInRange();
}
else

View File

@@ -63,7 +63,7 @@ namespace BlackCore
if (metar.isEmpty() || metar.timeDiffReceivedMs() > 10 * 1000)
{
// outdated, or not in cache at all
this->m_network->requestMetar(airportIcaoCode.trimmed().toUpper());
this->m_network->sendMetarQuery(airportIcaoCode.trimmed().toUpper());
// with this little trick we try to make an asynchronous signal / slot
// based approach a synchronous return value
@@ -183,7 +183,7 @@ namespace BlackCore
this->m_atcStationsOnline.push_back(station);
emit this->changedAtcStationsOnline();
emit this->m_network->sendAtisQuery(callsign); // request ATIS
emit this->m_network->sendNameQuery(callsign);
emit this->m_network->sendRealNameQuery(callsign);
emit this->m_network->sendServerQuery(callsign);
}
else

View File

@@ -31,6 +31,16 @@ namespace BlackCore
/*!
* Interface for a connection to a multi-user flight simulation and ATC network.
*
* The connection can be in one of three essential states: disconnected, connecting, and
* connected. (There is a fourth state, disconnected due to error, which is a substate of
* disconnected.) Some slots may only be called when connected, and some may only be called
* when disconnected; there is a naming convention to highlight this fact using prefixes:
* "preset" slots are only callable when disconnected, "send" slots are only callable when
* connected, and "set" slots are callable in any state.
*
* Slots with the word "query" in their names are handled asynchronously, with one or more
* "reply" signals being sent in response to each invokation of a query slot.
*
* \warning If an INetwork signal is connected to a slot, and that slot emits a signal
* which is connected to an INetwork slot, then at least one of those connections
* must be a Qt::QueuedConnection.
@@ -42,14 +52,19 @@ namespace BlackCore
protected:
/*!
* \brief Constructor
* \param parent
* Constructor
*/
INetwork(QObject *parent = nullptr) : QObject(parent) {}
public:
/*!
* Destructor.
*/
virtual ~INetwork() {}
/*!
* Flags for capabilities bitfield.
*/
enum
{
AcceptsAtisResponses = 1 << 0,
@@ -57,14 +72,30 @@ namespace BlackCore
SupportsModelDescriptions = 1 << 2
};
enum ConnectionStatus
/*!
* Login modes
*/
enum LoginMode
{
Disconnected = 0,
DisconnectedError,
Connecting,
Connected
LoginNormal = 0, //!< Normal login
LoginAsObserver, //!< Login as observer
LoginStealth //!< Login stealth mode
};
/*!
* Status of the connection.
*/
enum ConnectionStatus
{
Disconnected = 0, //!< Not connected
DisconnectedError, //!< Disconnected due to socket error
Connecting, //!< Connection initiated but not established
Connected //!< Connection established
};
/*!
* Convert a ConnectionStatus to a string.
*/
static QString connectionStatusToString(ConnectionStatus status)
{
int index = staticMetaObject.indexOfEnumerator("ConnectionStatus");
@@ -72,79 +103,340 @@ namespace BlackCore
return metaEnum.valueToKey(status);
}
/*!
* Returns true if the given ConnectionStatus represents an error state.
*/
static bool isErrorStatus(ConnectionStatus status)
{
return status == DisconnectedError;
}
/*!
* Returns true if the current ConnectionStatus is a connected state.
*/
virtual bool isConnected() const = 0;
public slots:
// Network
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 ping(const BlackMisc::Aviation::CCallsign &callsign) = 0;
////////////////////////////////////////////////////////////////
//! \name Network slots
//! @{
////////////////////////////////////////////////////////////////
virtual void sendNameQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0;
/*!
* Set the server which will be connected to.
* \pre Network must be disconnected when calling this function.
*/
virtual void presetServer(const BlackMisc::Network::CServer &server) = 0;
/*!
* Set our own callsign before connecting.
* \pre Network must be disconnected when calling this function.
*/
virtual void presetCallsign(const BlackMisc::Aviation::CCallsign &callsign) = 0;
/*!
* Set our own aircraft ICAO codes before connecting.
* \pre Network must be disconnected when calling this function.
*/
virtual void presetIcaoCodes(const BlackMisc::Aviation::CAircraftIcao &icao) = 0;
/*!
* Select a login mode before connecting.
* \pre Network must be disconnected when calling this function.
*/
virtual void presetLoginMode(LoginMode mode) = 0;
/*!
* Initiate a connection to the network server.
* \pre Network must be disconnected when calling this function.
* \post Connection status changes from Disconnected to either Connecting or DisconnectedError.
*/
virtual void initiateConnection() = 0;
/*!
* Ask the connection to the network server to terminate itself.
* \pre It is not legal to call this function when already disconnected.
* \post Connection status changes to Disconnected, but maybe not immediately.
*/
virtual void terminateConnection() = 0;
/*!
* Send a ping message to a user with a specific callsign.
* \pre Network must be connected when calling this function.
* \sa pongReceived
*/
virtual void sendPing(const BlackMisc::Aviation::CCallsign &callsign) = 0;
/*!
* Send a message querying the real name of the user with a specific callsign.
* \pre Network must be connected when calling this function.
* \sa realNameReplyReceived
*/
virtual void sendRealNameQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0;
/*!
* Send a message querying our own IP address as reported by the server.
* \pre Network must be connected when calling this function.
* \sa ipReplyReceived
*/
virtual void sendIpQuery() = 0;
/*!
* Send a message querying which server the user with a specific callsign is connected to.
* \pre Network must be connected when calling this function.
* \sa serverReplyReceived
*/
virtual void sendServerQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0;
// Text messages
virtual void sendTextMessages(const BlackMisc::Network::CTextMessageList &textMessages) = 0;
/*!
* Send one or more text messages.
* \pre Network must be connected when calling this function.
*/
virtual void sendTextMessages(const BlackMisc::Network::CTextMessageList &messages) = 0;
// ATC
//! @}
////////////////////////////////////////////////////////////////
//! \name ATC slots
//! @{
////////////////////////////////////////////////////////////////
/*!
* Send a message querying whether or not the user with a specific callsign is an ATC station.
* \pre Network must be connected when calling this function.
* \sa atcReplyReceived
*/
virtual void sendAtcQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0;
/*!
* Send a message querying the ATIS for the ATC station with a specific callsign.
* \pre Network must be connected when calling this function.
* \sa atisReplyReceived
* \sa atisVoiceRoomReplyReceived
* \sa atisLogoffTimeReplyReceived
*/
virtual void sendAtisQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0;
// Aircraft
// TODO virtual void sendFlightPlan(...) = 0;
//! @}
////////////////////////////////////////////////////////////////
//! \name Aircraft slots
//! @{
////////////////////////////////////////////////////////////////
/*!
* Send a message querying the capabilities of the client software of the user with a specific callsign.
* \pre Network must be connected when calling this function.
* \sa capabilitiesReplyReceived
*/
virtual void sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0;
virtual void requestAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign) = 0;
/*!
* Send a message querying the ICAO codes of the aircraft of the user with a specific callsign.
* \pre Network must be connected when calling this function.
* \sa icaoCodesReplyReceived
*/
virtual void sendIcaoCodesQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0;
/*!
* Send a message querying the COM frequency of the user with a specific callsign.
* \pre Network must be connected when calling this function.
* \sa frequencyReplyReceived
*/
virtual void sendFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0;
/*!
* Set our own aircraft data.
* \param aircraft Only the situation and avionics parts are used. Callsign, user, and ICAO code parts are ignored.
*/
virtual void setOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft) = 0;
/*!
* Set the position and altitude of our own aircraft.
*/
virtual void setOwnAircraftPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) = 0;
/*!
* Set the position, altitude, orientation, and miscellaneous state of our own aircraft.
*/
virtual void setOwnAircraftSituation(const BlackMisc::Aviation::CAircraftSituation &situation) = 0;
/*!
* Set the COM frequencies and transponder code and mode of our own aircraft.
*/
virtual void setOwnAircraftAvionics(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2,
const BlackMisc::Aviation::CTransponder &transponder) = 0;
// Weather / flight plan
virtual void requestMetar(const QString &airportICAO) = 0;
virtual void requestWeatherData(const QString &airportICAO) = 0;
// TODO virtual void sendFlightPlan(...) = 0;
//! @}
////////////////////////////////////////////////////////////////
//! \name Weather slots
//! @{
////////////////////////////////////////////////////////////////
/*!
* Send a message querying the METAR for the airport with a specific ICAO code.
* \pre Network must be connected when calling this function.
* \sa metarReplyReceived
*/
virtual void sendMetarQuery(const QString &airportICAO) = 0;
/*!
* Send a message querying the weather data for the airport with a specific ICAO code.
* \pre Network must be connected when calling this function.
* \sa temperatureDataReplyReceived
* \sa windDataReplyReceived
* \sa cloudDataReplyReceived
*/
virtual void sendWeatherDataQuery(const QString &airportICAO) = 0;
signals:
// ATC
//! @}
////////////////////////////////////////////////////////////////
//! \name ATC signals
//! @{
////////////////////////////////////////////////////////////////
/*!
* We received a notification of the state of an ATC station on the network.
*/
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 BlackMisc::Aviation::CInformationMessage &atis);
void atisQueryVoiceRoomReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &url);
void atisQueryLogoffTimeReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &zuluTime);
void metarReceived(const QString &data);
// Aircraft
/*!
* We received a notification that an ATC station has disconnected from the network.
*/
void atcDisconnected(const BlackMisc::Aviation::CCallsign &callsign);
/*!
* We received a reply to one of our queries.
* \sa sendAtcQuery
*/
void atcReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, bool isATC);
/*!
* We received a reply to one of our ATIS queries.
* \sa sendAtisQuery
*/
void atisReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CInformationMessage &atis);
/*!
* We received a reply to one of our ATIS queries, containing the controller's voice room URL.
* \sa sendAtisQuery
*/
void atisVoiceRoomReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &url);
/*!
* We received a reply to one of our ATIS queries, containing the controller's planned logoff time.
* \sa sendAtisQuery
*/
void atisLogoffTimeReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &zuluTime);
/*!
* We received a reply to one of our METAR queries.
* \sa sendMetarQuery
*/
void metarReplyReceived(const QString &data);
//! @}
////////////////////////////////////////////////////////////////
//! \name Aircraft signals
//! @{
////////////////////////////////////////////////////////////////
/*!
* We received a notification that a pilot has disconnected from the network.
*/
void pilotDisconnected(const BlackMisc::Aviation::CCallsign &callsign);
void aircraftInfoReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icao);
/*!
* We received a reply to one of our queries.
* \sa sendIcaoCodesQuery
*/
void icaoCodesReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icao);
/*!
* We received a notification of the state of another aircraft on the network.
*/
void aircraftPositionUpdate(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation,
const BlackMisc::Aviation::CTransponder &transponder);
/*!
* We received a reply to one of our queries.
* \sa sendFrequencyQuery
*/
void frequencyReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq);
// TODO void aircraftInterimPositionUpdate(...);
void frequencyQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq);
// Connection / Network in general
//! @}
////////////////////////////////////////////////////////////////
//! \name Network signals
//! @{
////////////////////////////////////////////////////////////////
/*!
* We sent a message about the status of the network connection, for the attention of the user.
*/
void statusMessage(const BlackMisc::CStatusMessage &message);
void kicked(const QString &msg);
void connectionStatusChanged(ConnectionStatus oldStatus, ConnectionStatus newStatus);
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);
void serverQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &hostname);
void nameQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname);
// Text messages
/*!
* We were kicked from the network. (A connectionStatusChanged signal will also be sent.)
*/
void kicked(const QString &msg);
/*!
* The status of our connection has changed.
*/
void connectionStatusChanged(ConnectionStatus oldStatus, ConnectionStatus newStatus);
/*!
* We received a reply to one of our pings.
* \sa sendPing
*/
void pongReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CTime &elapsedTime);
/*!
* We received a reply to one of our queries.
* \param flags A combination of capabilities flags.
* \sa sendCapabilitiesQuery
*/
void capabilitiesReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, quint32 flags);
/*!
* We received a reply to one of our queries.
* \param ip Our IP address, as seen by the server.
* \sa sendIpQuery
*/
void ipReplyReceived(const QString &ip);
/*!
* We received a reply to one of our queries.
* \sa sendServerQuery
*/
void serverReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &hostname);
/*!
* We received a reply to one of our queries.
* \sa sendRealNameQuery
*/
void realNameReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname);
/*!
* We received one or more text messages from another user.
*/
void textMessagesReceived(const BlackMisc::Network::CTextMessageList &messages);
// Weather
// TODO void temperatureDataReceived(...);
// TODO void windDataReceived(...);
// TODO void cloudDataReceived(...);
//! @}
////////////////////////////////////////////////////////////////
//! \name Weather signals
//! @{
////////////////////////////////////////////////////////////////
// TODO void temperatureDataReplyReceived(...);
// TODO void windDataReplyReceived(...);
// TODO void cloudDataReplyReceived(...);
//! @}
};
} // namespace

View File

@@ -28,19 +28,29 @@ namespace BlackCore
void exceptionDispatcher(const char *caller);
CNetworkVatlib::CNetworkVatlib(CNetworkVatlib::LoginMode loginMode, QObject *parent)
CNetworkVatlib::CNetworkVatlib(QObject *parent)
: INetwork(parent),
m_net(Cvatlib_Network::Create()),
m_loginMode(loginMode),
m_loginMode(LoginNormal),
m_status(Cvatlib_Network::connStatus_Idle),
m_fsdTextCodec(QTextCodec::codecForName("latin1"))
{
connect(this, &CNetworkVatlib::terminate, this, &INetwork::terminateConnection, Qt::QueuedConnection);
Q_ASSERT_X(m_fsdTextCodec, "CNetworkVatlib", "Missing default wire text encoding");
//TODO reinit m_fsdTextCodec from WireTextEncoding config setting if present
connect(&m_processingTimer, SIGNAL(timeout()), this, SLOT(process()));
connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(update()));
m_processingTimer.start(c_processingIntervalMsec);
}
void CNetworkVatlib::initializeSession()
{
Q_ASSERT_X(isDisconnected(), "CNetworkVatlib", "attempted to reinitialize session while still connected");
try
{
connect(this, SIGNAL(terminate()), this, SLOT(terminateConnection()), Qt::QueuedConnection);
Q_ASSERT_X(m_fsdTextCodec, "CNetworkVatlib", "Missing default wire text encoding");
//TODO reinit m_fsdTextCodec from WireTextEncoding config setting if present
m_net.reset(Cvatlib_Network::Create());
QString capabilities;
capabilities += m_net->capability_AtcInfo;
@@ -49,7 +59,7 @@ namespace BlackCore
capabilities += "=1:";
capabilities += m_net->capability_ModelDesc;
capabilities += "=1";
if (loginMode == LoginStealth)
if (m_loginMode == LoginStealth)
{
capabilities += "STEALTH"; // TODO m_net->capability_Stealth
capabilities += "=1";
@@ -79,21 +89,19 @@ namespace BlackCore
m_net->InstallOnCloudDataReceivedEvent(onCloudDataReceived, this);
m_net->InstallOnPilotInfoRequestReceivedEvent(onPilotInfoRequestReceived, this);
m_net->InstallOnPilotInfoReceivedEvent(onPilotInfoReceived, this);
connect(&m_processingTimer, SIGNAL(timeout()), this, SLOT(process()));
connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(update()));
m_processingTimer.start(c_processingIntervalMsec);
}
catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
}
CNetworkVatlib::~CNetworkVatlib()
{
if (!m_net) { return; }
try
{
if (m_net->IsNetworkConnected())
if (m_net->IsValid() && m_net->IsNetworkConnected())
{
m_net->LogoffAndDisconnect(0);
m_net->LogoffAndDisconnect(0); // emits a connectionStatusChanged signal
}
}
catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
@@ -106,6 +114,8 @@ namespace BlackCore
void CNetworkVatlib::process()
{
if (!m_net) { return; }
try
{
if (m_net->IsValid() && m_net->IsSessionExists())
@@ -118,6 +128,8 @@ namespace BlackCore
void CNetworkVatlib::update()
{
if (!m_net) { return; }
try
{
if (m_net->IsValid() && m_net->IsSessionExists() && isConnected())
@@ -161,6 +173,34 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
}
INetwork::ConnectionStatus convertConnectionStatus(Cvatlib_Network::connStatus status)
{
switch (status)
{
case Cvatlib_Network::connStatus_Idle: return INetwork::Disconnected;
case Cvatlib_Network::connStatus_Connecting: return INetwork::Connecting;
case Cvatlib_Network::connStatus_Connected: return INetwork::Connected;
case Cvatlib_Network::connStatus_Disconnected: return INetwork::Disconnected;
case Cvatlib_Network::connStatus_Error: return INetwork::DisconnectedError;
}
qFatal("unrecognised connection status");
return INetwork::DisconnectedError;
}
void CNetworkVatlib::changeConnectionStatus(Cvatlib_Network::connStatus status)
{
if (m_status != status)
{
qSwap(m_status, status);
emit connectionStatusChanged(convertConnectionStatus(status), convertConnectionStatus(m_status));
if (isDisconnected())
{
m_updateTimer.stop();
}
}
}
QByteArray CNetworkVatlib::toFSD(QString qstr) const
{
return m_fsdTextCodec->fromUnicode(qstr);
@@ -176,11 +216,6 @@ namespace BlackCore
return m_fsdTextCodec->toUnicode(cstr);
}
bool CNetworkVatlib::isConnected() const
{
return m_status == Cvatlib_Network::connStatus_Connected;
}
void exceptionDispatcher(const char *caller)
{
try
@@ -210,26 +245,30 @@ namespace BlackCore
/********************************** INetwork slots ************************************/
/********************************** * * * * * * * * * * * * * * * * * * * ************************************/
void CNetworkVatlib::setServer(const CServer &server)
void CNetworkVatlib::presetServer(const CServer &server)
{
Q_ASSERT_X(isDisconnected(), "CNetworkVatlib", "Can't change server details while still connected");
this->m_server = server;
m_server = server;
}
void CNetworkVatlib::setCallsign(const BlackMisc::Aviation::CCallsign &callsign)
void CNetworkVatlib::presetCallsign(const BlackMisc::Aviation::CCallsign &callsign)
{
Q_ASSERT_X(isDisconnected(), "CNetworkVatlib", "Can't change callsign while still connected");
m_ownAircraft.setCallsign(callsign);
m_callsign = callsign;
}
void CNetworkVatlib::setRealName(const QString &name)
void CNetworkVatlib::presetIcaoCodes(const BlackMisc::Aviation::CAircraftIcao &icao)
{
Q_ASSERT_X(isDisconnected(), "CNetworkVatlib", "Can't change name while still connected");
Q_ASSERT_X(isDisconnected(), "CNetworkVatlib", "Can't change ICAO codes while still connected");
m_icaoCodes = icao;
}
auto pilot = m_ownAircraft.getPilot();
pilot.setRealName(name);
m_ownAircraft.setPilot(pilot);
void CNetworkVatlib::presetLoginMode(LoginMode mode)
{
Q_ASSERT_X(isDisconnected(), "CNetworkVatlib", "Can't change login mode while still connected");
m_loginMode = mode;
m_net.reset(nullptr);
}
void CNetworkVatlib::initiateConnection()
@@ -238,12 +277,17 @@ namespace BlackCore
try
{
m_status = Cvatlib_Network::connStatus_Connecting; // paranoia
if (!m_net)
{
initializeSession();
}
changeConnectionStatus(Cvatlib_Network::connStatus_Connecting); // paranoia
QByteArray callsign = toFSD(m_loginMode == LoginAsObserver ?
m_ownAircraft.getCallsign().getAsObserverCallsignString() :
m_ownAircraft.getCallsign().asString());
QByteArray name = toFSD(m_ownAircraft.getPilot().getRealName());
m_callsign.getAsObserverCallsignString() :
m_callsign.asString());
QByteArray name = toFSD(m_server.getUser().getRealName());
if (this->m_loginMode == LoginAsObserver)
{
@@ -270,15 +314,22 @@ namespace BlackCore
toFSD(m_server.getUser().getPassword()),
info);
}
m_net->ConnectAndLogon();
if (! m_updateTimer.isActive())
if (m_net->ConnectAndLogon())
{
m_updateTimer.start(c_updateIntervalMsec);
if (! m_updateTimer.isActive())
{
m_updateTimer.start(c_updateIntervalMsec);
}
}
else
{
changeConnectionStatus(Cvatlib_Network::connStatus_Error);
}
}
catch (...)
{
m_status = Cvatlib_Network::connStatus_Idle;
changeConnectionStatus(Cvatlib_Network::connStatus_Error);
exceptionDispatcher(Q_FUNC_INFO);
}
}
@@ -288,7 +339,11 @@ namespace BlackCore
try
{
m_updateTimer.stop();
m_net->LogoffAndDisconnect(c_logoffTimeoutSec);
if (m_net && m_net->IsValid() && m_net->IsNetworkConnected())
{
m_net->LogoffAndDisconnect(c_logoffTimeoutSec);
}
}
catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
}
@@ -319,6 +374,8 @@ namespace BlackCore
void CNetworkVatlib::sendTextMessages(const BlackMisc::Network::CTextMessageList &messages)
{
Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected");
if (messages.isEmpty()) return;
try
{
@@ -345,6 +402,8 @@ namespace BlackCore
void CNetworkVatlib::sendIpQuery()
{
Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected");
try
{
m_net->SendInfoQuery(Cvatlib_Network::infoQuery_IP, "SERVER");
@@ -354,6 +413,8 @@ namespace BlackCore
void CNetworkVatlib::sendFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign)
{
Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected");
try
{
m_net->SendInfoQuery(Cvatlib_Network::infoQuery_Freq, toFSD(callsign));
@@ -363,6 +424,8 @@ namespace BlackCore
void CNetworkVatlib::sendServerQuery(const BlackMisc::Aviation::CCallsign &callsign)
{
Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected");
try
{
m_net->SendInfoQuery(Cvatlib_Network::infoQuery_Server, toFSD(callsign));
@@ -372,6 +435,8 @@ namespace BlackCore
void CNetworkVatlib::sendAtcQuery(const BlackMisc::Aviation::CCallsign &callsign)
{
Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected");
try
{
m_net->SendInfoQuery(Cvatlib_Network::infoQuery_ATC, toFSD(callsign));
@@ -381,6 +446,8 @@ namespace BlackCore
void CNetworkVatlib::sendAtisQuery(const BlackMisc::Aviation::CCallsign &callsign)
{
Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected");
try
{
m_net->SendInfoQuery(Cvatlib_Network::infoQuery_ATIS, toFSD(callsign));
@@ -388,8 +455,10 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
}
void CNetworkVatlib::sendNameQuery(const BlackMisc::Aviation::CCallsign &callsign)
void CNetworkVatlib::sendRealNameQuery(const BlackMisc::Aviation::CCallsign &callsign)
{
Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected");
try
{
m_net->SendInfoQuery(Cvatlib_Network::infoQuery_Name, toFSD(callsign));
@@ -399,6 +468,8 @@ namespace BlackCore
void CNetworkVatlib::sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &callsign)
{
Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected");
try
{
m_net->SendInfoQuery(Cvatlib_Network::infoQuery_Capabilities, toFSD(callsign));
@@ -406,7 +477,7 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
}
void CNetworkVatlib::replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign)
void CNetworkVatlib::replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign) // private
{
try
{
@@ -416,7 +487,7 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
}
void CNetworkVatlib::replyToNameQuery(const BlackMisc::Aviation::CCallsign &callsign)
void CNetworkVatlib::replyToNameQuery(const BlackMisc::Aviation::CCallsign &callsign) // private
{
try
{
@@ -425,8 +496,10 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
}
void CNetworkVatlib::requestAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign)
void CNetworkVatlib::sendIcaoCodesQuery(const BlackMisc::Aviation::CCallsign &callsign)
{
Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected");
try
{
m_net->RequestPlaneInfo(toFSD(callsign));
@@ -434,25 +507,25 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
}
void CNetworkVatlib::sendAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign)
void CNetworkVatlib::sendAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign) // private
{
try
{
const QByteArray acTypeICAObytes = toFSD(m_ownAircraft.getIcaoInfo().getDesignator());
const QByteArray airlineICAObytes = toFSD(m_ownAircraft.getIcaoInfo().getAirline());
const QByteArray liverybytes = toFSD(m_ownAircraft.getIcaoInfo().getLivery());
const QByteArray acTypeICAObytes = toFSD(m_icaoCodes.getDesignator());
const QByteArray airlineICAObytes = toFSD(m_icaoCodes.getAirline());
const QByteArray liverybytes = toFSD(m_icaoCodes.getLivery());
std::vector<const char *> keysValues;
if (!m_ownAircraft.getIcaoInfo().getDesignator().isEmpty())
if (!m_icaoCodes.getDesignator().isEmpty())
{
keysValues.push_back(m_net->acinfo_Equipment);
keysValues.push_back(acTypeICAObytes);
}
if (m_ownAircraft.getIcaoInfo().hasAirline())
if (m_icaoCodes.hasAirline())
{
keysValues.push_back(m_net->acinfo_Airline);
keysValues.push_back(airlineICAObytes);
}
if (m_ownAircraft.getIcaoInfo().hasLivery())
if (m_icaoCodes.hasLivery())
{
keysValues.push_back(m_net->acinfo_Livery);
keysValues.push_back(liverybytes);
@@ -463,8 +536,10 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
}
void CNetworkVatlib::ping(const BlackMisc::Aviation::CCallsign &callsign)
void CNetworkVatlib::sendPing(const BlackMisc::Aviation::CCallsign &callsign)
{
Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected");
try
{
m_net->PingUser(toFSD(callsign));
@@ -472,8 +547,10 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
}
void CNetworkVatlib::requestMetar(const QString &airportICAO)
void CNetworkVatlib::sendMetarQuery(const QString &airportICAO)
{
Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected");
try
{
m_net->RequestMetar(toFSD(airportICAO));
@@ -481,8 +558,10 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
}
void CNetworkVatlib::requestWeatherData(const QString &airportICAO)
void CNetworkVatlib::sendWeatherDataQuery(const QString &airportICAO)
{
Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected");
try
{
m_net->RequestWeatherData(toFSD(airportICAO));
@@ -499,24 +578,9 @@ namespace BlackCore
return static_cast<CNetworkVatlib *>(cbvar);
}
CNetworkVatlib::ConnectionStatus convertConnectionStatus(Cvatlib_Network::connStatus status)
void CNetworkVatlib::onConnectionStatusChanged(Cvatlib_Network *, Cvatlib_Network::connStatus, Cvatlib_Network::connStatus newStatus, void *cbvar)
{
switch (status)
{
case Cvatlib_Network::connStatus_Idle: return CNetworkVatlib::Disconnected;
case Cvatlib_Network::connStatus_Connecting: return CNetworkVatlib::Connecting;
case Cvatlib_Network::connStatus_Connected: return CNetworkVatlib::Connected;
case Cvatlib_Network::connStatus_Disconnected: return CNetworkVatlib::Disconnected;
case Cvatlib_Network::connStatus_Error: return CNetworkVatlib::DisconnectedError;
}
qFatal("unrecognised connection status");
return CNetworkVatlib::DisconnectedError;
}
void CNetworkVatlib::onConnectionStatusChanged(Cvatlib_Network *, Cvatlib_Network::connStatus oldStatus, Cvatlib_Network::connStatus newStatus, void *cbvar)
{
cbvar_cast(cbvar)->m_status = newStatus;
emit cbvar_cast(cbvar)->connectionStatusChanged(convertConnectionStatus(oldStatus), convertConnectionStatus(newStatus));
cbvar_cast(cbvar)->changeConnectionStatus(newStatus);
}
void CNetworkVatlib::onTextMessageReceived(Cvatlib_Network *, const char *from, const char *to, const char *msg, void *cbvar)
@@ -596,16 +660,17 @@ namespace BlackCore
void CNetworkVatlib::onKicked(Cvatlib_Network *, const char *reason, void *cbvar)
{
emit cbvar_cast(cbvar)->kicked(cbvar_cast(cbvar)->fromFSD(reason));
emit cbvar_cast(cbvar)->terminate();
}
void CNetworkVatlib::onPong(Cvatlib_Network *, const char *callsign, INT elapsedTime, void *cbvar)
{
emit cbvar_cast(cbvar)->pong(cbvar_cast(cbvar)->fromFSD(callsign), CTime(elapsedTime, CTimeUnit::s()));
emit cbvar_cast(cbvar)->pongReceived(cbvar_cast(cbvar)->fromFSD(callsign), CTime(elapsedTime, CTimeUnit::s()));
}
void CNetworkVatlib::onMetarReceived(Cvatlib_Network *, const char *data, void *cbvar)
{
emit cbvar_cast(cbvar)->metarReceived(cbvar_cast(cbvar)->fromFSD(data));
emit cbvar_cast(cbvar)->metarReplyReceived(cbvar_cast(cbvar)->fromFSD(data));
}
void CNetworkVatlib::onInfoQueryRequestReceived(Cvatlib_Network *, const char *callsignString, Cvatlib_Network::infoQuery type, const char *, void *cbvar)
@@ -630,11 +695,11 @@ namespace BlackCore
{
switch (type)
{
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;
case Cvatlib_Network::infoQuery_IP: emit cbvar_cast(cbvar)->ipQueryReplyReceived(cbvar_cast(cbvar)->fromFSD(data)); break;
case Cvatlib_Network::infoQuery_Freq: emit cbvar_cast(cbvar)->frequencyReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), CFrequency(cbvar_cast(cbvar)->fromFSD(data).toFloat(), CFrequencyUnit::MHz())); break;
case Cvatlib_Network::infoQuery_Server: emit cbvar_cast(cbvar)->serverReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(data)); break;
case Cvatlib_Network::infoQuery_ATC: emit cbvar_cast(cbvar)->atcReplyReceived(cbvar_cast(cbvar)->fromFSD(data2), *data == 'Y'); break;
case Cvatlib_Network::infoQuery_Name: emit cbvar_cast(cbvar)->realNameReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(data)); break;
case Cvatlib_Network::infoQuery_IP: emit cbvar_cast(cbvar)->ipReplyReceived(cbvar_cast(cbvar)->fromFSD(data)); break;
}
}
@@ -653,7 +718,7 @@ namespace BlackCore
}
keysValues += 2;
}
emit cbvar_cast(cbvar)->capabilitiesQueryReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), flags);
emit cbvar_cast(cbvar)->capabilitiesReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), flags);
}
void CNetworkVatlib::onAtisReplyReceived(Cvatlib_Network *, const char *callsign, Cvatlib_Network::atisLineType lineType, const char *data, void *cbvar)
@@ -662,17 +727,17 @@ namespace BlackCore
if (lineType == Cvatlib_Network::atisLineType_VoiceRoom)
{
emit cbvar_cast(cbvar)->atisQueryVoiceRoomReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(data));
emit cbvar_cast(cbvar)->atisVoiceRoomReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(data));
}
if (lineType == Cvatlib_Network::atisLineType_ZuluLogoff)
{
emit cbvar_cast(cbvar)->atisQueryLogoffTimeReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(data));
emit cbvar_cast(cbvar)->atisLogoffTimeReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(data));
}
if (lineType == Cvatlib_Network::atisLineType_LineCount)
{
atis.setType(CInformationMessage::ATIS);
emit cbvar_cast(cbvar)->atisQueryReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), atis);
emit cbvar_cast(cbvar)->atisReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), atis);
cbvar_cast(cbvar)->m_atisParts.remove(cbvar_cast(cbvar)->fromFSD(callsign));
}
else
@@ -734,7 +799,7 @@ namespace BlackCore
terminate:
emit cbvar_cast(cbvar)->statusMessage(BlackMisc::CStatusMessage(BlackMisc::CStatusMessage::TypeTrafficNetwork, BlackMisc::CStatusMessage::SeverityError, msg));
emit cbvar_cast(cbvar)->terminate();
emit cbvar_cast(cbvar)->terminate(); // private, will be handled during the next pass of the Qt event loop
}
void CNetworkVatlib::onWindDataReceived(Cvatlib_Network *, Cvatlib_Network::WindLayer /** layers **/[4], void * /** cbvar **/)
@@ -769,7 +834,7 @@ namespace BlackCore
else if (key == net->acinfo_Livery) { icao.setLivery(*keysValues); }
keysValues++;
}
emit cbvar_cast(cbvar)->aircraftInfoReceived(cbvar_cast(cbvar)->fromFSD(callsign), icao);
emit cbvar_cast(cbvar)->icaoCodesReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), icao);
}
} // namespace

View File

@@ -27,40 +27,36 @@ namespace BlackCore
Q_OBJECT
public:
enum LoginMode
{
LoginNormal = 0,
LoginAsObserver,
LoginStealth
};
CNetworkVatlib(LoginMode loginMode = LoginNormal, QObject *parent = nullptr);
CNetworkVatlib(QObject *parent = nullptr);
virtual ~CNetworkVatlib();
bool isConnected() const;
bool isConnected() const { return m_status == Cvatlib_Network::connStatus_Connected; }
public: // INetwork slots overrides
// Network
virtual void setServer(const BlackMisc::Network::CServer &server);
virtual void setCallsign(const BlackMisc::Aviation::CCallsign &callsign);
virtual void setRealName(const QString &name);
virtual void presetServer(const BlackMisc::Network::CServer &server);
virtual void presetCallsign(const BlackMisc::Aviation::CCallsign &callsign);
virtual void presetIcaoCodes(const BlackMisc::Aviation::CAircraftIcao &icao);
virtual void presetLoginMode(LoginMode mode);
virtual void initiateConnection();
virtual void terminateConnection();
virtual void sendPing(const BlackMisc::Aviation::CCallsign &callsign);
virtual void sendRealNameQuery(const BlackMisc::Aviation::CCallsign &callsign);
virtual void sendIpQuery();
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 ping(const BlackMisc::Aviation::CCallsign &callsign);
// Weather
virtual void requestWeatherData(const QString &airportICAO);
// Text messages
virtual void sendTextMessages(const BlackMisc::Network::CTextMessageList &messages);
// ATC
virtual void sendAtcQuery(const BlackMisc::Aviation::CCallsign &callsign);
virtual void sendAtisQuery(const BlackMisc::Aviation::CCallsign &callsign);
// Aircraft
virtual void requestAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign);
virtual void sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &callsign);
virtual void sendIcaoCodesQuery(const BlackMisc::Aviation::CCallsign &callsign);
virtual void sendFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign);
virtual void setOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft);
virtual void setOwnAircraftPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude);
@@ -68,10 +64,9 @@ namespace BlackCore
virtual void setOwnAircraftAvionics(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2,
const BlackMisc::Aviation::CTransponder &xpdr);
// ATC
virtual void sendAtcQuery(const BlackMisc::Aviation::CCallsign &callsign);
virtual void sendAtisQuery(const BlackMisc::Aviation::CCallsign &callsign);
virtual void requestMetar(const QString &airportICAO);
// Weather
virtual void sendMetarQuery(const QString &airportICAO);
virtual void sendWeatherDataQuery(const QString &airportICAO);
private slots:
void replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign);
@@ -105,6 +100,8 @@ namespace BlackCore
QByteArray toFSD(QString qstr) const;
QByteArray toFSD(const BlackMisc::Aviation::CCallsign &callsign) const;
QString fromFSD(const char *cstr) const;
void initializeSession();
void changeConnectionStatus(Cvatlib_Network::connStatus newStatus);
bool isDisconnected() const { return m_status != Cvatlib_Network::connStatus_Connecting && m_status != Cvatlib_Network::connStatus_Connected; }
private slots:
@@ -127,7 +124,9 @@ namespace BlackCore
LoginMode m_loginMode;
Cvatlib_Network::connStatus m_status;
BlackMisc::Network::CServer m_server;
BlackMisc::Aviation::CAircraft m_ownAircraft;
BlackMisc::Aviation::CCallsign m_callsign;
BlackMisc::Aviation::CAircraftIcao m_icaoCodes;
BlackMisc::Aviation::CAircraft m_ownAircraft; // not using callsign, user, or icao parts of this member because they can't be changed when connected
QMap<BlackMisc::Aviation::CCallsign, BlackMisc::Aviation::CInformationMessage> m_atisParts;
QTimer m_processingTimer;