]> git.mxchange.org Git - flightgear.git/commitdiff
Support loading plain-text routes, and stop aggressively using the cruise altitude...
authorjmt <jmt>
Mon, 12 Apr 2010 23:27:29 +0000 (23:27 +0000)
committerTim Moore <timoore33@gmail.com>
Mon, 19 Apr 2010 07:52:17 +0000 (09:52 +0200)
src/Autopilot/route_mgr.cxx
src/Autopilot/route_mgr.hxx

index 5996682e19b6779037b137da48f4b770cae063e4..c9fbe0bfd4e91da22af7c16773c1778e3e8eb911 100644 (file)
@@ -39,6 +39,7 @@
 
 #include <simgear/misc/strutils.hxx>
 #include <simgear/structure/exception.hxx>
+#include <simgear/misc/sgstream.hxx>
 
 #include <simgear/props/props_io.hxx>
 #include <simgear/misc/sg_path.hxx>
@@ -666,16 +667,23 @@ void FGRouteMgr::saveRoute()
 
 void FGRouteMgr::loadRoute()
 {
-  try {
-    // deactivate route first
-    active->setBoolValue(false);
-    
-    SGPropertyNode_ptr routeData(new SGPropertyNode);
-    SGPath path(_pathNode->getStringValue());
+  // 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());
     
-    SG_LOG(SG_IO, SG_INFO, "going to read flight-plan from:" << path.str());
+  try {
     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) {
index a8168924807a5ec582759dfd63becd271d527ce6..f3720d09e58a7bc49cb39331c2e2ddb264f7427a 100644 (file)
@@ -135,6 +135,9 @@ private:
      */
     bool checkFinished();
     
+    
+    void loadPlainTextRoute(const SGPath& path);
+    
 // tied getters and setters
     const char* getDepartureICAO() const;
     const char* getDepartureName() const;