INetwork: refactor request/reply pattern and sending position updates to be more encapsulated

refs #81
This commit is contained in:
Mathew Sutcliffe
2013-12-31 17:57:44 +00:00
parent 7cbfca1402
commit c77951743e
5 changed files with 178 additions and 95 deletions

View File

@@ -63,7 +63,6 @@ namespace BlackCore
virtual void ping(const BlackMisc::Aviation::CCallsign &callsign) = 0;
virtual void sendNameQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0;
virtual void replyToNameQuery(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname) = 0;
virtual void sendIpQuery() = 0;
virtual void sendServerQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0;
@@ -77,10 +76,11 @@ namespace BlackCore
// Aircraft
virtual void sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0;
virtual void requestAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign) = 0;
virtual void sendAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icao) = 0;
virtual void sendFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0;
virtual void replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq) = 0;
// TODO virtual void setOwnAircraftPosition(...) = 0;
virtual void setOwnAircraftPosition(const BlackMisc::Aviation::CAircraftSituation &aircraft) = 0;
virtual void setOwnAircraftTransponder(const BlackMisc::Aviation::CTransponder &xpdr) = 0;
virtual void setOwnAircraftFrequency(const BlackMisc::PhysicalQuantities::CFrequency &freq) = 0;
virtual void setOwnAircraftIcao(const BlackMisc::Aviation::CAircraftIcao &icao) = 0;
// Weather / flight plan
virtual void requestMetar(const QString &airportICAO) = 0;
@@ -99,12 +99,10 @@ namespace BlackCore
// Aircraft
void pilotDisconnected(const BlackMisc::Aviation::CCallsign &callsign);
void aircraftInfoReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icao);
void aircraftInfoRequestReceived(const BlackMisc::Aviation::CCallsign &callsign);
void aircraftPositionUpdate(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation,
const BlackMisc::Aviation::CTransponder &transponder);
// TODO void aircraftInterimPositionUpdate(...);
void frequencyQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq);
void frequencyQueryRequestReceived(const BlackMisc::Aviation::CCallsign &callsign);
// Connection / Network in general
void kicked(const QString &msg);
@@ -117,9 +115,7 @@ namespace BlackCore
void capabilitiesQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, quint32 flags);
void ipQueryReplyReceived(const QString &ip);
void serverQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &hostname);
void nameQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname);
void nameQueryRequestReceived(const BlackMisc::Aviation::CCallsign &callsign);
// Text messages
void textMessagesReceived(const BlackMisc::Network::CTextMessageList &messages);
@@ -143,7 +139,6 @@ namespace BlackCore
virtual void terminateConnection() {}
virtual void ping(const BlackMisc::Aviation::CCallsign &) {}
virtual void sendNameQuery(const BlackMisc::Aviation::CCallsign &) {}
virtual void replyToNameQuery(const BlackMisc::Aviation::CCallsign &, const QString &) {}
virtual void sendIpQuery() {}
virtual void sendServerQuery(const BlackMisc::Aviation::CCallsign &) {}
virtual void sendTextMessages(const BlackMisc::Network::CTextMessageList &) {}
@@ -151,9 +146,11 @@ namespace BlackCore
virtual void sendAtisQuery(const BlackMisc::Aviation::CCallsign &) {}
virtual void sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &) {}
virtual void requestAircraftInfo(const BlackMisc::Aviation::CCallsign &) {}
virtual void sendAircraftInfo(const BlackMisc::Aviation::CCallsign &, const BlackMisc::Aviation::CAircraftIcao &) {}
virtual void sendFrequencyQuery(const BlackMisc::Aviation::CCallsign &) {}
virtual void replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &, const BlackMisc::PhysicalQuantities::CFrequency &) {}
virtual void setOwnAircraftPosition(const BlackMisc::Aviation::CAircraftSituation &) {}
virtual void setOwnAircraftTransponder(const BlackMisc::Aviation::CTransponder &) {}
virtual void setOwnAircraftFrequency(const BlackMisc::PhysicalQuantities::CFrequency &) {}
virtual void setOwnAircraftIcao(const BlackMisc::Aviation::CAircraftIcao &) {}
virtual void requestMetar(const QString &) {}
virtual void requestWeatherData(const QString &) {}
};

View File

@@ -75,15 +75,15 @@ namespace BlackCore
m_net->InstallOnPilotInfoRequestReceivedEvent(onPilotInfoRequestReceived, this);
m_net->InstallOnPilotInfoReceivedEvent(onPilotInfoReceived, this);
m_timer.start(c_updateIntervalMillisecs, this);
connect(&m_processingTimer, SIGNAL(timeout()), this, SLOT(process()));
connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(update()));
m_processingTimer.start(c_processingIntervalMsec);
}
catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
}
NetworkVatlib::~NetworkVatlib()
{
m_timer.stop();
try
{
if (m_net->IsNetworkConnected())
@@ -99,7 +99,7 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
}
void NetworkVatlib::timerEvent(QTimerEvent *)
void NetworkVatlib::process()
{
try
{
@@ -111,6 +111,35 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
}
void NetworkVatlib::update()
{
try
{
if (m_net->IsValid() && m_net->IsSessionExists())
{
Cvatlib_Network::PilotPosUpdate pos;
pos.altAdj = 0; // TODO
pos.altTrue = m_ownAircraft.getAltitude().value(CLengthUnit::ft());
pos.bank = m_ownAircraft.getBank().value(CAngleUnit::deg());
pos.groundSpeed = m_ownAircraft.getGroundSpeed().value(CSpeedUnit::kts());
pos.heading = m_ownAircraft.getHeading().value(CAngleUnit::deg());
pos.lat = m_ownAircraft.getPosition().latitude().value(CAngleUnit::deg());
pos.lon = m_ownAircraft.getPosition().longitude().value(CAngleUnit::deg());
pos.pitch = m_ownAircraft.getPitch().value(CAngleUnit::deg());
pos.rating = Cvatlib_Network::pilotRating_Unknown;
pos.xpdrCode = m_ownTransponder.getTransponderCodeFormatted().toShort();
switch (m_ownTransponder.getTransponderMode())
{
case CTransponder::ModeC: pos.xpdrMode = Cvatlib_Network::xpndrMode_Normal; break;
case CTransponder::StateIdent: pos.xpdrMode = Cvatlib_Network::xpndrMode_Ident; break;
default: pos.xpdrMode = Cvatlib_Network::xpndrMode_Standby; break;
}
m_net->SendPilotUpdate(pos);
}
}
catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
}
QByteArray NetworkVatlib::toFSD(QString qstr) const
{
return m_fsdTextCodec->fromUnicode(qstr);
@@ -202,11 +231,36 @@ namespace BlackCore
{
try
{
m_net->LogoffAndDisconnect(c_logoffTimeoutSeconds);
m_net->LogoffAndDisconnect(c_logoffTimeoutSec);
}
catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
}
void NetworkVatlib::setOwnAircraftPosition(const BlackMisc::Aviation::CAircraftSituation &aircraft)
{
m_ownAircraft = aircraft;
if (! m_updateTimer.isActive())
{
m_updateTimer.start(c_updateIntervalMsec);
}
}
void NetworkVatlib::setOwnAircraftTransponder(const BlackMisc::Aviation::CTransponder &xpdr)
{
m_ownTransponder = xpdr;
}
void NetworkVatlib::setOwnAircraftFrequency(const BlackMisc::PhysicalQuantities::CFrequency &freq)
{
m_ownFrequency = freq;
}
void NetworkVatlib::setOwnAircraftIcao(const BlackMisc::Aviation::CAircraftIcao &icao)
{
m_ownAircraftIcao = icao;
}
void NetworkVatlib::sendTextMessages(const BlackMisc::Network::CTextMessageList &messages)
{
if (messages.isEmpty()) return;
@@ -296,20 +350,20 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
}
void NetworkVatlib::replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq)
void NetworkVatlib::replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign)
{
try
{
m_net->ReplyToInfoQuery(Cvatlib_Network::infoQuery_Freq, toFSD(callsign), toFSD(QString::number(freq.value(CFrequencyUnit::MHz()), 'f', 3)));
m_net->ReplyToInfoQuery(Cvatlib_Network::infoQuery_Freq, toFSD(callsign), toFSD(QString::number(m_ownFrequency.value(CFrequencyUnit::MHz()), 'f', 3)));
}
catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
}
void NetworkVatlib::replyToNameQuery(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname)
void NetworkVatlib::replyToNameQuery(const BlackMisc::Aviation::CCallsign &callsign)
{
try
{
m_net->ReplyToInfoQuery(Cvatlib_Network::infoQuery_Name, toFSD(callsign), toFSD(realname));
m_net->ReplyToInfoQuery(Cvatlib_Network::infoQuery_Name, toFSD(callsign), toFSD(m_realname));
}
catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
}
@@ -323,25 +377,25 @@ namespace BlackCore
catch (...) { exceptionDispatcher(Q_FUNC_INFO); }
}
void NetworkVatlib::sendAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icao)
void NetworkVatlib::sendAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign)
{
try
{
const QByteArray acTypeICAObytes = toFSD(icao.getDesignator());
const QByteArray airlineICAObytes = toFSD(icao.getAirline());
const QByteArray liverybytes = toFSD(icao.getLivery());
const QByteArray acTypeICAObytes = toFSD(m_ownAircraftIcao.getDesignator());
const QByteArray airlineICAObytes = toFSD(m_ownAircraftIcao.getAirline());
const QByteArray liverybytes = toFSD(m_ownAircraftIcao.getLivery());
std::vector<const char *> keysValues;
if (!icao.getDesignator().isEmpty())
if (!m_ownAircraftIcao.getDesignator().isEmpty())
{
keysValues.push_back(m_net->acinfo_Equipment);
keysValues.push_back(acTypeICAObytes);
}
if (icao.hasAirline())
if (m_ownAircraftIcao.hasAirline())
{
keysValues.push_back(m_net->acinfo_Airline);
keysValues.push_back(airlineICAObytes);
}
if (icao.hasLivery())
if (m_ownAircraftIcao.hasLivery())
{
keysValues.push_back(m_net->acinfo_Livery);
keysValues.push_back(liverybytes);
@@ -490,12 +544,21 @@ namespace BlackCore
emit cbvar_cast(cbvar)->metarReceived(cbvar_cast(cbvar)->fromFSD(data));
}
void NetworkVatlib::onInfoQueryRequestReceived(Cvatlib_Network *, const char *callsign, Cvatlib_Network::infoQuery type, const char *, void *cbvar)
void NetworkVatlib::onInfoQueryRequestReceived(Cvatlib_Network *, const char *callsignString, Cvatlib_Network::infoQuery type, const char *, void *cbvar)
{
auto timer = new QTimer(cbvar_cast(cbvar));
timer->setSingleShot(true);
timer->start(0);
BlackMisc::Aviation::CCallsign callsign(callsignString);
switch (type)
{
case Cvatlib_Network::infoQuery_Freq: emit cbvar_cast(cbvar)->frequencyQueryRequestReceived(cbvar_cast(cbvar)->fromFSD(callsign)); break;
case Cvatlib_Network::infoQuery_Name: emit cbvar_cast(cbvar)->nameQueryRequestReceived(cbvar_cast(cbvar)->fromFSD(callsign)); break;
case Cvatlib_Network::infoQuery_Freq:
connect(timer, &QTimer::timeout, [ = ]() { cbvar_cast(cbvar)->replyToFrequencyQuery(callsign); });
break;
case Cvatlib_Network::infoQuery_Name:
connect(timer, &QTimer::timeout, [ = ]() { cbvar_cast(cbvar)->replyToNameQuery(callsign); });
break;
}
}
@@ -582,9 +645,14 @@ namespace BlackCore
//TODO
}
void NetworkVatlib::onPilotInfoRequestReceived(Cvatlib_Network *, const char *callsign, void *cbvar)
void NetworkVatlib::onPilotInfoRequestReceived(Cvatlib_Network *, const char *callsignString, void *cbvar)
{
emit cbvar_cast(cbvar)->aircraftInfoRequestReceived(cbvar_cast(cbvar)->fromFSD(callsign));
auto timer = new QTimer(cbvar_cast(cbvar));
timer->setSingleShot(true);
timer->start(0);
BlackMisc::Aviation::CCallsign callsign(callsignString);
connect(timer, &QTimer::timeout, [ = ]() { cbvar_cast(cbvar)->sendAircraftInfo(callsign); });
}
void NetworkVatlib::onPilotInfoReceived(Cvatlib_Network *net, const char *callsign, const char **keysValues, void *cbvar)

View File

@@ -14,7 +14,7 @@
#include "blackmisc/avallclasses.h"
#include <vatlib/vatlib.h>
#include <QScopedPointer>
#include <QBasicTimer>
#include <QTimer>
#include <QTextCodec>
#include <QByteArray>
@@ -29,9 +29,6 @@ namespace BlackCore
NetworkVatlib(QObject *parent = nullptr);
virtual ~NetworkVatlib();
protected: // QObject overrides
virtual void timerEvent(QTimerEvent *);
public: // INetwork slots overrides
// Network
@@ -44,7 +41,6 @@ namespace BlackCore
virtual void sendServerQuery(const BlackMisc::Aviation::CCallsign &callsign);
virtual void sendNameQuery(const BlackMisc::Aviation::CCallsign &callsign);
virtual void sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &callsign);
virtual void replyToNameQuery(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname);
virtual void ping(const BlackMisc::Aviation::CCallsign &callsign);
// Weather
@@ -55,15 +51,22 @@ namespace BlackCore
// Aircraft
virtual void requestAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign);
virtual void sendAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icao);
virtual void sendFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign);
virtual void replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq);
virtual void setOwnAircraftPosition(const BlackMisc::Aviation::CAircraftSituation &aircraft);
virtual void setOwnAircraftTransponder(const BlackMisc::Aviation::CTransponder &xpdr);
virtual void setOwnAircraftFrequency(const BlackMisc::PhysicalQuantities::CFrequency &freq);
virtual void setOwnAircraftIcao(const BlackMisc::Aviation::CAircraftIcao &icao);
// ATC
virtual void sendAtcQuery(const BlackMisc::Aviation::CCallsign &callsign);
virtual void sendAtisQuery(const BlackMisc::Aviation::CCallsign &callsign);
virtual void requestMetar(const QString &airportICAO);
private slots:
void replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign);
void replyToNameQuery(const BlackMisc::Aviation::CCallsign &callsign);
void sendAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign);
private: //shimlib callbacks
static void onConnectionStatusChanged(Cvatlib_Network *, Cvatlib_Network::connStatus oldStatus, Cvatlib_Network::connStatus newStatus, void *cbvar);
static void onTextMessageReceived(Cvatlib_Network *, const char *from, const char *to, const char *msg, void *cbvar);
@@ -93,6 +96,10 @@ namespace BlackCore
QString fromFSD(const char *cstr) const;
bool isDisconnected() const { return m_status == Cvatlib_Network::connStatus_Idle || m_status == Cvatlib_Network::connStatus_Disconnected; }
private slots:
void process();
void update();
signals:
void terminate();
@@ -107,14 +114,20 @@ namespace BlackCore
private:
QScopedPointer<Cvatlib_Network, VatlibQScopedPointerDeleter> m_net;
Cvatlib_Network::connStatus m_status;
QBasicTimer m_timer;
BlackMisc::Network::CServer m_server;
static int const c_updateIntervalMillisecs = 100;
static int const c_logoffTimeoutSeconds = 5;
QTimer m_processingTimer;
QTimer m_updateTimer;
static int const c_processingIntervalMsec = 100;
static int const c_updateIntervalMsec = 5000;
static int const c_logoffTimeoutSec = 5;
QByteArray m_callsign;
QByteArray m_realname;
BlackMisc::Aviation::CAircraftSituation m_ownAircraft;
BlackMisc::Aviation::CTransponder m_ownTransponder;
BlackMisc::PhysicalQuantities::CFrequency m_ownFrequency;
BlackMisc::Aviation::CAircraftIcao m_ownAircraftIcao;
QTextCodec *m_fsdTextCodec;
};