From 3270a610f837434dd7b013b17eadf0305280d426 Mon Sep 17 00:00:00 2001 From: jmt Date: Mon, 12 Apr 2010 23:27:29 +0000 Subject: [PATCH 1/2] Support loading plain-text routes, and stop aggressively using the cruise altitude when loading waypoints. --- src/Autopilot/route_mgr.cxx | 50 +++++++++++++++++++++++++++++-------- src/Autopilot/route_mgr.hxx | 3 +++ 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/src/Autopilot/route_mgr.cxx b/src/Autopilot/route_mgr.cxx index 5996682e1..c9fbe0bfd 100644 --- a/src/Autopilot/route_mgr.cxx +++ b/src/Autopilot/route_mgr.cxx @@ -39,6 +39,7 @@ #include #include +#include #include #include @@ -666,16 +667,23 @@ void FGRouteMgr::saveRoute() void FGRouteMgr::loadRoute() { + // deactivate route first + active->setBoolValue(false); + + SGPropertyNode_ptr routeData(new SGPropertyNode); + SGPath path(_pathNode->getStringValue()); + + SG_LOG(SG_IO, SG_INFO, "going to read flight-plan from:" << path.str()); + try { - // deactivate route first - active->setBoolValue(false); - - SGPropertyNode_ptr routeData(new SGPropertyNode); - SGPath path(_pathNode->getStringValue()); - - SG_LOG(SG_IO, SG_INFO, "going to read flight-plan from:" << path.str()); readProperties(path.str(), routeData); - + } catch (sg_exception& e) { + // if XML parsing fails, the file might be simple textual list of waypoints + loadPlainTextRoute(path); + return; + } + + try { // departure nodes SGPropertyNode* dep = routeData->getChild("departure"); if (!dep) { @@ -704,7 +712,9 @@ void FGRouteMgr::loadRoute() // cruise SGPropertyNode* crs = routeData->getChild("cruise"); if (crs) { - cruise->setDoubleValue(crs->getDoubleValue("speed")); + cruise->setDoubleValue("speed-kts", crs->getDoubleValue("speed-kts")); + cruise->setDoubleValue("mach", crs->getDoubleValue("mach")); + cruise->setDoubleValue("altitude-ft", crs->getDoubleValue("altitude-ft")); } // of cruise data loading // route nodes @@ -735,7 +745,7 @@ void FGRouteMgr::parseRouteWaypoint(SGPropertyNode* aWP) } SGPropertyNode_ptr altProp = aWP->getChild("altitude-ft"); - double altM = cruise->getDoubleValue("altitude-ft") * SG_FEET_TO_METER; + double altM = -9999.0; if (altProp) { altM = altProp->getDoubleValue() * SG_FEET_TO_METER; } @@ -781,6 +791,26 @@ void FGRouteMgr::parseRouteWaypoint(SGPropertyNode* aWP) } } +void FGRouteMgr::loadPlainTextRoute(const SGPath& path) +{ + sg_gzifstream in(path.str().c_str()); + if (!in.is_open()) { + return; + } + + _route->clear(); + while (!in.eof()) { + string line; + getline(in, line, '\n'); + // trim CR from end of line, if found + if (line[line.size() - 1] == '\r') { + line.erase(line.size() - 1, 1); + } + + new_waypoint(line, -1); + } // of line iteration +} + const char* FGRouteMgr::getDepartureICAO() const { if (!_departure) { diff --git a/src/Autopilot/route_mgr.hxx b/src/Autopilot/route_mgr.hxx index a81689248..f3720d09e 100644 --- a/src/Autopilot/route_mgr.hxx +++ b/src/Autopilot/route_mgr.hxx @@ -135,6 +135,9 @@ private: */ bool checkFinished(); + + void loadPlainTextRoute(const SGPath& path); + // tied getters and setters const char* getDepartureICAO() const; const char* getDepartureName() const; From 8ffa65a821d74d915e02bcd90a9b4ddfb987ab18 Mon Sep 17 00:00:00 2001 From: jmt Date: Mon, 12 Apr 2010 23:27:48 +0000 Subject: [PATCH 2/2] Route-file saving. --- src/Autopilot/route_mgr.cxx | 38 +++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/Autopilot/route_mgr.cxx b/src/Autopilot/route_mgr.cxx index c9fbe0bfd..967ca992a 100644 --- a/src/Autopilot/route_mgr.cxx +++ b/src/Autopilot/route_mgr.cxx @@ -658,10 +658,44 @@ void FGRouteMgr::saveRoute() SGPath path(_pathNode->getStringValue()); SG_LOG(SG_IO, SG_INFO, "Saving route to " << path.str()); try { - writeProperties(path.str(), mirror, false, SGPropertyNode::ARCHIVE); + SGPropertyNode_ptr d(new SGPropertyNode); + SGPath path(_pathNode->getStringValue()); + d->setIntValue("version", 1); + + if (_departure) { + d->setStringValue("departure/airport", _departure->ident()); + d->setStringValue("departure/sid", departure->getStringValue("sid")); + d->setStringValue("departure/runway", departure->getStringValue("runway")); + } + + if (_destination) { + d->setStringValue("destination/airport", _destination->ident()); + d->setStringValue("destination/star", destination->getStringValue("star")); + d->setStringValue("destination/transition", destination->getStringValue("transition")); + d->setStringValue("destination/runway", destination->getStringValue("runway")); + } + + // route nodes + SGPropertyNode* routeNode = d->getChild("route", 0, true); + for (int i=0; i<_route->size(); ++i) { + SGPropertyNode* wpNode = routeNode->getChild("wp",i, true); + SGWayPoint wp(_route->get_waypoint(i)); + + wpNode->setStringValue("ident", wp.get_id()); + wpNode->setStringValue("name", wp.get_name()); + SGGeod geod(wp.get_target()); + + wpNode->setDoubleValue("longitude-deg", geod.getLongitudeDeg()); + wpNode->setDoubleValue("latitude-deg", geod.getLatitudeDeg()); + + if (geod.getElevationFt() > -9990.0) { + wpNode->setDoubleValue("altitude-ft", geod.getElevationFt()); + } + } // of waypoint iteration + + writeProperties(path.str(), d, true /* write-all */); } catch (const sg_exception &e) { SG_LOG(SG_IO, SG_WARN, "Error saving route:" << e.getMessage()); - //guiErrorMessage("Error writing autosave.xml: ", e); } }