From 01f90fc9bf09b9c2431dc4c620d2f2c523ad6268 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Tue, 30 Jul 2019 01:03:03 +0200 Subject: [PATCH] Ref T709, check position for "follow aircraft" --- src/xswiftbus/traffic.cpp | 20 ++++++++++++++++++-- src/xswiftbus/traffic.h | 3 +++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/xswiftbus/traffic.cpp b/src/xswiftbus/traffic.cpp index a42023ee7..cccf45cb1 100644 --- a/src/xswiftbus/traffic.cpp +++ b/src/xswiftbus/traffic.cpp @@ -917,11 +917,16 @@ namespace XSwiftBus } else { - auto planeIt = traffic->m_planesByCallsign.find(traffic->m_followPlaneViewCallsign); + const auto planeIt = traffic->m_planesByCallsign.find(traffic->m_followPlaneViewCallsign); if (planeIt == traffic->m_planesByCallsign.end()) { return 0; } - Plane *plane = planeIt->second; + const Plane *plane = planeIt->second; XPLMWorldToLocal(plane->position.lat, plane->position.lon, plane->position.elevation * kFtToMeters, &lx, &ly, &lz); + if (!isValidPosition(plane->position)) + { + INFO_LOG("Invalid follow aircraft position for " + plane->callsign); + return 0; + } } // Fill out the camera position info. @@ -969,6 +974,17 @@ namespace XSwiftBus * Returning 0 would consume the keystroke. */ return 1; } + + bool CTraffic::isValidPosition(const XPMPPlanePosition_t &position) + { + if (position.lat > 180.001 || position.lat < -180.001) { return false; } + if (position.lon > 180.001 || position.lon < -180.001) { return false; } + if (position.pitch > 180.001f || position.pitch < -180.001f) { return false; } + if (position.heading > 180.001f || position.heading < -180.001f) { return false; } + if (position.elevation < -2000.0 || position.elevation > 100000.0) { return false; } + + return true; + } } //! \endcond diff --git a/src/xswiftbus/traffic.h b/src/xswiftbus/traffic.h index 219bb9c41..53ab687c0 100644 --- a/src/xswiftbus/traffic.h +++ b/src/xswiftbus/traffic.h @@ -187,6 +187,9 @@ namespace XSwiftBus const std::string &livery_, const std::string &modelName_); }; + //! Check the position if values are valid + static bool isValidPosition(const XPMPPlanePosition_t &position); + std::unordered_map m_planesByCallsign; std::unordered_map m_planesById; std::vector m_followPlaneViewSequence;