From 356f134ab88efa7d6f6805f88ad55854fa9fccd2 Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Sun, 4 May 2014 19:17:40 +0100 Subject: [PATCH] refs #218 enable retreiving user's flightplan from the network after it was potentially amended by a controller --- samples/cli_client/client.cpp | 27 ++++++++++++++++ samples/cli_client/client.h | 3 ++ src/blackcore/network.h | 13 ++++++++ src/blackcore/network_vatlib.cpp | 55 ++++++++++++++++++++++++++++++++ src/blackcore/network_vatlib.h | 2 ++ 5 files changed, 100 insertions(+) diff --git a/samples/cli_client/client.cpp b/samples/cli_client/client.cpp index 98dd338f2..5cbe95413 100644 --- a/samples/cli_client/client.cpp +++ b/samples/cli_client/client.cpp @@ -24,6 +24,7 @@ Client::Client(QObject *parent) connect(m_net, &INetwork::capabilitiesReplyReceived, this, &Client::capabilitiesReplyReceived); connect(m_net, &INetwork::kicked, this, &Client::kicked); connect(m_net, &INetwork::metarReplyReceived, this, &Client::metarReplyReceived); + connect(m_net, &INetwork::flightPlanReplyReceived, this, &Client::flightPlanReplyReceived); connect(m_net, &INetwork::pilotDisconnected, this, &Client::pilotDisconnected); connect(m_net, &INetwork::icaoCodesReplyReceived, this, &Client::icaoCodesReplyReceived); connect(m_net, &INetwork::pongReceived, this, &Client::pongReceived); @@ -44,6 +45,7 @@ Client::Client(QObject *parent) connect(this, &Client::sendAtcQuery, m_net, &INetwork::sendAtcQuery); connect(this, &Client::sendAtisQuery, m_net, &INetwork::sendAtisQuery); connect(this, &Client::sendFlightPlan, m_net, &INetwork::sendFlightPlan); + connect(this, &Client::sendFlightPlanQuery, m_net, &INetwork::sendFlightPlanQuery); connect(this, &Client::sendRealNameQuery, m_net, &INetwork::sendRealNameQuery); connect(this, &Client::sendCapabilitiesQuery, m_net, &INetwork::sendCapabilitiesQuery); connect(this, &Client::sendIcaoCodesQuery, m_net, &INetwork::sendIcaoCodesQuery); @@ -76,6 +78,7 @@ Client::Client(QObject *parent) m_commands["atc"] = std::bind(&Client::sendAtcQueryCmd, this, _1); m_commands["atis"] = std::bind(&Client::sendAtisQueryCmd, this, _1); m_commands["flightplan"] = std::bind(&Client::sendFlightPlanCmd, this, _1); + m_commands["getflightplan"] = std::bind(&Client::sendFlightPlanQueryCmd, this, _1); m_commands["name"] = std::bind(&Client::sendRealNameQueryCmd, this, _1); m_commands["caps"] = std::bind(&Client::sendCapabilitiesQueryCmd, this, _1); m_commands["icao"] = std::bind(&Client::sendIcaoCodesQueryCmd, this, _1); @@ -266,6 +269,11 @@ void Client::sendFlightPlanCmd(QTextStream &args) emit sendFlightPlan(fp); } +void Client::sendFlightPlanQueryCmd(QTextStream &) +{ + emit sendFlightPlanQuery(); +} + void Client::sendServerQueryCmd(QTextStream &args) { QString callsign; @@ -505,6 +513,25 @@ void Client::metarReplyReceived(const QString &data) std::cout << "METAR " << data.toStdString() << std::endl; } +void Client::flightPlanReplyReceived(const BlackMisc::Aviation::CFlightPlan &flightPlan) +{ + std::string rules; + switch (flightPlan.getFlightRules()) + { + default: + case BlackMisc::Aviation::CFlightPlan::IFR: rules = "IFR"; break; + case BlackMisc::Aviation::CFlightPlan::VFR: rules = "VFR"; break; + case BlackMisc::Aviation::CFlightPlan::SVFR: rules = "SVFR"; break; + } + + std::cout << "FLIGHTPLAN " << flightPlan.getEquipmentIcao().toStdString() << " " << flightPlan.getOriginAirportIcao() << " " + << flightPlan.getDestinationAirportIcao() << " " << flightPlan.getAlternateAirportIcao() << " " + << flightPlan.getTakeoffTimePlannedHourMin().toStdString() << " " << flightPlan.getTakeoffTimeActualHourMin().toStdString() << " " + << flightPlan.getEnrouteTime() << " " << flightPlan.getFuelTime() << " " + << flightPlan.getCruiseAltitude() << " " << flightPlan.getCruiseTrueAirspeed() << " " << rules << " " + << flightPlan.getRoute().toStdString() << " " << flightPlan.getRemarks().toStdString() << "\n"; +} + void Client::pilotDisconnected(const BlackMisc::Aviation::CCallsign &callsign) { std::cout << "PILOT_DISCONNECTED " << callsign << std::endl; diff --git a/samples/cli_client/client.h b/samples/cli_client/client.h index 1f39bda30..ee6bcf302 100644 --- a/samples/cli_client/client.h +++ b/samples/cli_client/client.h @@ -45,6 +45,7 @@ private: //commands void sendAtcQueryCmd(QTextStream &args); void sendAtisQueryCmd(QTextStream &args); void sendFlightPlanCmd(QTextStream &args); + void sendFlightPlanQueryCmd(QTextStream &args); void sendRealNameQueryCmd(QTextStream &args); void sendCapabilitiesQueryCmd(QTextStream &args); void sendIcaoCodesQueryCmd(QTextStream &args); @@ -73,6 +74,7 @@ signals: //to send to INetwork void sendAtcQuery(const BlackMisc::Aviation::CCallsign &callsign); void sendAtisQuery(const BlackMisc::Aviation::CCallsign &callsign); void sendFlightPlan(const BlackMisc::Aviation::CFlightPlan &fp); + void sendFlightPlanQuery(); void sendRealNameQuery(const BlackMisc::Aviation::CCallsign &callsign); void sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &callsign); void sendIcaoCodesQuery(const BlackMisc::Aviation::CCallsign &callsign); @@ -101,6 +103,7 @@ public slots: //to receive from INetwork void capabilitiesReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, quint32 flags); void kicked(const QString &msg); void metarReplyReceived(const QString &data); + void flightPlanReplyReceived(const BlackMisc::Aviation::CFlightPlan &flightPlan); void pilotDisconnected(const BlackMisc::Aviation::CCallsign &callsign); void icaoCodesReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icaoData); void pongReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CTime &elapsedTime); diff --git a/src/blackcore/network.h b/src/blackcore/network.h index f99f162fc..06617e73c 100644 --- a/src/blackcore/network.h +++ b/src/blackcore/network.h @@ -246,6 +246,13 @@ namespace BlackCore */ virtual void sendFlightPlan(const BlackMisc::Aviation::CFlightPlan &flightPlan) = 0; + /*! + * Send a message querying our currently filed flight plan, which may have been amended by a controller. + * \pre Network must be connected when calling this function. + * \sa flightPlanReplyReceived + */ + virtual void sendFlightPlanQuery() = 0; + //! @} //////////////////////////////////////////////////////////////// //! \name Aircraft slots @@ -366,6 +373,12 @@ namespace BlackCore */ void atisLogoffTimeReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &zuluTime); + /*! + * We received a reply to one of our flight plan queries, containing our up-to-date flight plan. + * \sa sendFlightPlanQuery + */ + void flightPlanReplyReceived(const BlackMisc::Aviation::CFlightPlan &flightPlan); + //! @} //////////////////////////////////////////////////////////////// //! \name Aircraft signals diff --git a/src/blackcore/network_vatlib.cpp b/src/blackcore/network_vatlib.cpp index c11c992d8..eb082d70a 100644 --- a/src/blackcore/network_vatlib.cpp +++ b/src/blackcore/network_vatlib.cpp @@ -82,6 +82,7 @@ namespace BlackCore m_net->InstallOnInfoQueryReplyReceivedEvent(onInfoQueryReplyReceived, this); m_net->InstallOnCapabilitiesReplyReceivedEvent(onCapabilitiesReplyReceived, this); m_net->InstallOnAtisReplyReceivedEvent(onAtisReplyReceived, this); + m_net->InstallOnFlightPlanReceivedEvent(onFlightPlanReceived, this); m_net->InstallOnTemperatureDataReceivedEvent(onTemperatureDataReceived, this); m_net->InstallOnErrorReceivedEvent(onErrorReceived, this); m_net->InstallOnWindDataReceivedEvent(onWindDataReceived, this); @@ -645,6 +646,17 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } + void CNetworkVatlib::sendFlightPlanQuery() + { + Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); + + try + { + m_net->SendInfoQuery(Cvatlib_Network::infoQuery_FP, toFSD(m_callsign)); + } + catch (...) { exceptionDispatcher(Q_FUNC_INFO); } + } + void CNetworkVatlib::sendRealNameQuery(const BlackMisc::Aviation::CCallsign &callsign) { Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); @@ -984,6 +996,49 @@ namespace BlackCore } } + void CNetworkVatlib::onFlightPlanReceived(Cvatlib_Network *, const char *callsign, Cvatlib_Network::FlightPlan fp, void *cbvar) + { + if (cbvar_cast(cbvar)->m_callsign != cbvar_cast(cbvar)->fromFSD(callsign)) + { + return; // ignore other pilots' flightplans + } + + BlackMisc::Aviation::CFlightPlan::FlightRules rules = BlackMisc::Aviation::CFlightPlan::VFR; + switch (fp.fpRules) + { + default: + case Cvatlib_Network::fpRuleType_VFR: rules = BlackMisc::Aviation::CFlightPlan::VFR; break; + case Cvatlib_Network::fpRuleType_IFR: rules = BlackMisc::Aviation::CFlightPlan::IFR; break; + case Cvatlib_Network::fpRuleType_SVFR: rules = BlackMisc::Aviation::CFlightPlan::SVFR; break; + } + + auto cruiseAltString = cbvar_cast(cbvar)->fromFSD(fp.cruiseAlt); + if (! cruiseAltString.contains(QRegExp("[A-Z][a-z]"))) + { + cruiseAltString += "ft"; + } + BlackMisc::Aviation::CAltitude cruiseAlt; + cruiseAlt.parseFromString(cruiseAltString); + + BlackMisc::Aviation::CFlightPlan flightPlan( + cbvar_cast(cbvar)->fromFSD(fp.acType), + cbvar_cast(cbvar)->fromFSD(fp.depApt), + cbvar_cast(cbvar)->fromFSD(fp.destApt), + cbvar_cast(cbvar)->fromFSD(fp.altApt), + QDateTime::fromString(QString::number(fp.depTimePlanned), "hhmm"), + QDateTime::fromString(QString::number(fp.depTimeActual), "hhmm"), + BlackMisc::PhysicalQuantities::CTime(fp.enrouteHrs * 60 + fp.enrouteMins, BlackMisc::PhysicalQuantities::CTimeUnit::min()), + BlackMisc::PhysicalQuantities::CTime(fp.fuelHrs * 60 + fp.fuelMins, BlackMisc::PhysicalQuantities::CTimeUnit::min()), + cruiseAlt, + BlackMisc::PhysicalQuantities::CSpeed(fp.trueCruiseSpeed, BlackMisc::PhysicalQuantities::CSpeedUnit::kts()), + rules, + cbvar_cast(cbvar)->fromFSD(fp.route), + cbvar_cast(cbvar)->fromFSD(fp.remarks) + ); + + emit cbvar_cast(cbvar)->flightPlanReplyReceived(flightPlan); + } + void CNetworkVatlib::onTemperatureDataReceived(Cvatlib_Network *, Cvatlib_Network::TempLayer /** layers **/ [4], INT /** pressure **/, void * /** cbvar **/) { //TODO diff --git a/src/blackcore/network_vatlib.h b/src/blackcore/network_vatlib.h index ce8d12c6c..3003f90c5 100644 --- a/src/blackcore/network_vatlib.h +++ b/src/blackcore/network_vatlib.h @@ -64,6 +64,7 @@ namespace BlackCore virtual void sendAtcQuery(const BlackMisc::Aviation::CCallsign &callsign) override; virtual void sendAtisQuery(const BlackMisc::Aviation::CCallsign &callsign) override; virtual void sendFlightPlan(const BlackMisc::Aviation::CFlightPlan &flightPlan) override; + virtual void sendFlightPlanQuery() override; // Aircraft slots virtual void sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &callsign) override; @@ -126,6 +127,7 @@ namespace BlackCore static void onInfoQueryReplyReceived(Cvatlib_Network *, const char *callsign, Cvatlib_Network::infoQuery type, const char *data, const char *data2, void *cbvar); static void onCapabilitiesReplyReceived(Cvatlib_Network *, const char *callsign, const char **keysValues, void *cbvar); static void onAtisReplyReceived(Cvatlib_Network *, const char *callsign, Cvatlib_Network::atisLineType type, const char *data, void *cbvar); + static void onFlightPlanReceived(Cvatlib_Network *, const char *callsign, Cvatlib_Network::FlightPlan fp, void *cbvar); static void onTemperatureDataReceived(Cvatlib_Network *, Cvatlib_Network::TempLayer layers[4], INT pressure, void *cbvar); static void onErrorReceived(Cvatlib_Network *, Cvatlib_Network::error type, const char *msg, const char *data, void *cbvar); static void onWindDataReceived(Cvatlib_Network *, Cvatlib_Network::WindLayer layers[4], void *cbvar);