From 2e468062d62748274d158240f895b23ad8836c20 Mon Sep 17 00:00:00 2001 From: Phil7789 <87429599+Phil7789@users.noreply.github.com> Date: Sun, 5 Apr 2026 22:57:11 +0200 Subject: [PATCH 1/3] Update toDeg with area version --- utils.cpp | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/utils.cpp b/utils.cpp index c1ac62e..8a7ac2d 100644 --- a/utils.cpp +++ b/utils.cpp @@ -144,25 +144,38 @@ EuroScopePlugIn::CPosition vsid::utils::toPoint(const std::pairwriteMessage("WARNING", "Empty coordinate string found! Skipping coordinate."); + return 0.0; + } + std::vector dms = vsid::utils::split(coord, '.'); int multi = 0; // default state in exception case try { + if (dms.size() < 4) + throw std::out_of_range("Coordinate string \"" + coord + "\" does not contain enough parts for DMS conversion!"); + multi = (dms.at(0).find('S') != std::string::npos || dms.at(0).find('W') != std::string::npos) ? -1 : 1; + + double deg = std::stod(dms[0].substr(1, dms[0].length())); + double min = std::stod(dms[1]) / 60; + double sec = (std::stod(dms[2]) + std::stod("0." + dms[3])) / 3600; + + return (deg + min + sec) * multi; } - catch (std::out_of_range) + catch (std::out_of_range& e) { - messageHandler->writeMessage("ERROR", "Failed to get multiplier while calculating coordinate: " + coord); + messageHandler->writeMessage("ERROR", "Out of bounds while calculating coordinate: " + coord + ". " + e.what()); } - - double deg = std::stod(dms[0].substr(1, dms[0].length())); - double min = std::stod(dms[1]) / 60; - double sec = (std::stod(dms[2]) + std::stod("0." + dms[3])) / 3600; - - if (multi == 0) + catch (const std::invalid_argument& e) { - messageHandler->writeMessage("WARNING", "Coordinate \"" + coord + "\" will be multiplied with 0 which will render false results!"); + messageHandler->writeMessage("ERROR", "Invalid number format in coord " + coord + ". " + e.what()); } - return (deg + min + sec) * multi; + + messageHandler->writeMessage("WARNING", "Fallback state for \"" + coord + "\"! Failed to calculate. DMS will be set to 0.0"); + + return 0.0; } From a07d0c5587abe45615c7d4f694cd32f2f26b5985 Mon Sep 17 00:00:00 2001 From: Phil7789 <87429599+Phil7789@users.noreply.github.com> Date: Sun, 5 Apr 2026 22:58:09 +0200 Subject: [PATCH 2/3] Add guard for wrong coordinates * change toPoint() to utils::toPoint() --- area.cpp | 78 ++++++++++++++++++++++++++++++++------------------------ area.h | 2 +- 2 files changed, 45 insertions(+), 35 deletions(-) diff --git a/area.cpp b/area.cpp index 896b96b..60c4153 100644 --- a/area.cpp +++ b/area.cpp @@ -11,6 +11,12 @@ vsid::Area::Area(std::vector> &coords, bool { for (std::pair& coord : coords) { + if(coord.first.empty() || coord.second.empty()) + { + messageHandler->writeMessage("WARNING", "Empty coordinate string found (first: \"" + coord.first + + "\" / second: \"" + coord.second + "\"! Skipping coordinate."); + continue; + } this->points.push_back(toPoint(coord)); } @@ -37,49 +43,53 @@ void vsid::Area::showline() { for (auto& line : this->lines) { - messageHandler->writeMessage("DEBUG", "line: " + std::to_string(line.first.lon) + ":" + std::to_string(line.first.lat) + " - " + std::to_string(line.second.lon) + "." + std::to_string(line.second.lat)); + messageHandler->writeMessage("DEBUG", "line: " + std::to_string(line.first.lon) + ":" + std::to_string(line.first.lat) + " - " + + std::to_string(line.second.lon) + "." + std::to_string(line.second.lat)); } } vsid::Area::Point vsid::Area::toPoint(std::pair &pos) { - double lat = toDeg(pos.first); - double lon = toDeg(pos.second); + /*double lat = toDeg(pos.first); + double lon = toDeg(pos.second);*/ + + double lat = vsid::utils::toDeg(pos.first); + double lon = vsid::utils::toDeg(pos.second); return {lat, lon}; } -double vsid::Area::toDeg(std::string& coord) -{ - std::vector dms = vsid::utils::split(coord, '.'); - int multi = 0; // default state in exception case - - try - { - if (dms.size() < 4) - throw std::out_of_range("Coordinate string \"" + coord + "\" does not contain enough parts for DMS conversion!"); - - multi = (dms.at(0).find('S') != std::string::npos || dms.at(0).find('W') != std::string::npos) ? -1 : 1; - - double deg = std::stod(dms[0].substr(1, dms[0].length())); - double min = std::stod(dms[1]) / 60; - double sec = (std::stod(dms[2]) + std::stod("0." + dms[3])) / 3600; - - return (deg + min + sec) * multi; - } - catch (std::out_of_range &e) - { - messageHandler->writeMessage("ERROR", "Out of bounds while calculating coordinate: " + coord + ". " + e.what()); - } - catch (const std::invalid_argument& e) - { - messageHandler->writeMessage("ERROR", "Invalid number format in coord " + coord + ". " + e.what()); - } - - messageHandler->writeMessage("WARNING", "Fallback state for \"" + coord + "\"! Failed to calculate. DMS will be set to 0.0"); - - return 0.0; -} +//double vsid::Area::toDeg(std::string& coord) +//{ +// std::vector dms = vsid::utils::split(coord, '.'); +// int multi = 0; // default state in exception case +// +// try +// { +// if (dms.size() < 4) +// throw std::out_of_range("Coordinate string \"" + coord + "\" does not contain enough parts for DMS conversion!"); +// +// multi = (dms.at(0).find('S') != std::string::npos || dms.at(0).find('W') != std::string::npos) ? -1 : 1; +// +// double deg = std::stod(dms[0].substr(1, dms[0].length())); +// double min = std::stod(dms[1]) / 60; +// double sec = (std::stod(dms[2]) + std::stod("0." + dms[3])) / 3600; +// +// return (deg + min + sec) * multi; +// } +// catch (std::out_of_range &e) +// { +// messageHandler->writeMessage("ERROR", "Out of bounds while calculating coordinate: " + coord + ". " + e.what()); +// } +// catch (const std::invalid_argument& e) +// { +// messageHandler->writeMessage("ERROR", "Invalid number format in coord " + coord + ". " + e.what()); +// } +// +// messageHandler->writeMessage("WARNING", "Fallback state for \"" + coord + "\"! Failed to calculate. DMS will be set to 0.0"); +// +// return 0.0; +//} bool vsid::Area::inside(const EuroScopePlugIn::CPosition& fplnPos) { diff --git a/area.h b/area.h index 9cd9b32..4516dc8 100644 --- a/area.h +++ b/area.h @@ -77,6 +77,6 @@ namespace vsid * @param coord * @return double */ - double toDeg(std::string& coord); + /*double toDeg(std::string& coord);*/ }; } From 97b29284510717fbe8ec2f9f8c53be28286d5011 Mon Sep 17 00:00:00 2001 From: Phil7789 <87429599+Phil7789@users.noreply.github.com> Date: Sun, 5 Apr 2026 22:58:26 +0200 Subject: [PATCH 3/3] Add guard for wrong coordinates --- eseparser.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/eseparser.cpp b/eseparser.cpp index 36f136a..3240034 100644 --- a/eseparser.cpp +++ b/eseparser.cpp @@ -85,6 +85,18 @@ void vsid::EseParser::line(Section s, std::string_view l) if (((visLat.front() == 'N' || visLat.front() == 'S') && std::isdigit(static_cast(visLat.back()))) && ((visLon.front() == 'E' || visLon.front() == 'W') && std::isdigit(static_cast(visLon.back())))) { + if (visLat.empty() || visLon.empty()) + { + messageHandler->writeMessage("WARNING", "Empty coordinate string found for ATC station \"" + atcVec.at(0) + + "\" vis point (lat: \"" + visLat + "\" / lon: \"" + visLon + "\"! Skipping coordinate."); + + messageHandler->writeMessage("DEBUG", "[ESE] empty vispoint lat (\"" + visLat + "\" / lon (\"" + visLon + + "\" in line : " + std::string(l), vsid::MessageHandler::DebugArea::Conf); + + ++idx; + continue; + } + visPoints.push_back(vsid::utils::toPoint({ visLat, visLon })); }