refs #218 enable retreiving user's flightplan from the network

after it was potentially amended by a controller
This commit is contained in:
Mathew Sutcliffe
2014-05-04 19:17:40 +01:00
parent 07fc42f790
commit 356f134ab8
5 changed files with 100 additions and 0 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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);