]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/options.cxx
better error message to help users and support staff
[flightgear.git] / src / Main / options.cxx
index df0513a4916f52f763ba76d4e8183956369e4cf0..11b5e7c0bd8f1cbe77eecc1c8b7f1b19fc31df0a 100644 (file)
@@ -2,7 +2,7 @@
 //
 // Written by Curtis Olson, started April 1998.
 //
-// Copyright (C) 1998  Curtis L. Olson  - curt@me.umn.edu
+// Copyright (C) 1998  Curtis L. Olson  - http://www.flightgear.org/~curt
 //
 // This program is free software; you can redistribute it and/or
 // modify it under the terms of the GNU General Public License as
@@ -184,7 +184,7 @@ fgSetDefaults ()
     fgSetBool("/sim/hud/enable3d", true);
     fgSetBool("/sim/hud/visibility", false);
     fgSetBool("/sim/panel/visibility", true);
-    fgSetBool("/sim/sound/audible", true);
+    fgSetBool("/sim/sound/pause", false);
 
                                // Flight Model options
     fgSetString("/sim/flight-model", "jsb");
@@ -534,36 +534,19 @@ add_channel( const string& type, const string& channel_str ) {
     return true;
 }
 
+// The parse wp and parse flight-plan options don't work anymore, because 
+// the route manager and the airport subsystems have not yet been initialized
+// at this stage. 
 
 // Parse --wp=ID[@alt]
-static bool 
+static void 
 parse_wp( const string& arg ) {
-    string id, alt_str;
-    double alt = 0.0;
-
-    string::size_type pos = arg.find( "@" );
-    if ( pos != string::npos ) {
-       id = arg.substr( 0, pos );
-       alt_str = arg.substr( pos + 1 );
-       // cout << "id str = " << id << "  alt str = " << alt_str << endl;
-       alt = atof( alt_str.c_str() );
-       if ( !strcmp(fgGetString("/sim/startup/units"), "feet") ) {
-           alt *= SG_FEET_TO_METER;
-       }
-    } else {
-       id = arg;
-    }
-
-    FGAirport a;
-    if ( fgFindAirportID( id, &a ) ) {
-        FGRouteMgr *rm = (FGRouteMgr *)globals->get_subsystem("route-manager");
-       SGWayPoint wp( a.longitude, a.latitude, alt, SGWayPoint::WGS84, id );
-       rm->add_waypoint( wp );
-
-       return true;
-    } else {
-       return false;
+    string_list *waypoints = globals->get_initial_waypoints();
+    if (!waypoints) {
+        waypoints = new string_list;
     }
+    waypoints->push_back(arg);
+    globals->set_initial_waypoints(waypoints);
 }
 
 
@@ -571,31 +554,34 @@ parse_wp( const string& arg ) {
 static bool 
 parse_flightplan(const string& arg)
 {
-    sg_gzifstream in(arg.c_str());
-    if ( !in.is_open() ) {
-       return false;
-    }
-    while ( true ) {
-       string line;
-
+  string_list *waypoints = globals->get_initial_waypoints();
+  if (!waypoints)
+    waypoints = new string_list;
+  sg_gzifstream in(arg.c_str());
+  if ( !in.is_open() ) {
+    return false;
+  }
+  while ( true ) {
+    string line;
+    
 #if defined( macintosh )
-        getline( in, line, '\r' );
+    getline( in, line, '\r' );
 #else
-       getline( in, line, '\n' );
+    getline( in, line, '\n' );
 #endif
-
-        // catch extraneous (DOS) line ending character
-        if ( line[line.length() - 1] < 32 ) {
-            line = line.substr( 0, line.length()-1 );
-        }
-
-       if ( in.eof() ) {
-           break;
-       }
-       parse_wp(line);
+    
+    // catch extraneous (DOS) line ending character
+    if ( line[line.length() - 1] < 32 ) {
+      line = line.substr( 0, line.length()-1 );
     }
-
-    return true;
+    
+    if ( in.eof() ) {
+      break;
+    }
+    waypoints->push_back(line);
+  }
+  globals->set_initial_waypoints(waypoints);
+  return true;
 }
 
 static int
@@ -611,6 +597,8 @@ clearLocation ()
     fgSetString("/sim/presets/airport-id", "");
     fgSetString("/sim/presets/vor-id", "");
     fgSetString("/sim/presets/ndb-id", "");
+    fgSetString("/sim/presets/carrier", "");
+    fgSetString("/sim/presets/parkpos", "");
     fgSetString("/sim/presets/fix", "");
 }
 
@@ -630,6 +618,21 @@ fgOptNDB( const char * arg )
     return FG_OPTIONS_OK;
 }
 
+static int
+fgOptCarrier( const char * arg )
+{
+    clearLocation();
+    fgSetString("/sim/presets/carrier", arg);
+    return FG_OPTIONS_OK;
+}
+
+static int
+fgOptParkpos( const char * arg )
+{
+    fgSetString("/sim/presets/parkpos", arg);
+    return FG_OPTIONS_OK;
+}
+
 static int
 fgOptFIX( const char * arg )
 {
@@ -874,7 +877,7 @@ fgSetupProxy( const char *arg )
 {
     string options = arg;
     string host, port, auth;
-    int pos;
+    unsigned int pos;
 
     host = port = auth = "";
     if ((pos = options.find("@")) != string::npos) 
@@ -1103,8 +1106,8 @@ fgOptNAV1( const char * arg )
 {
     double radial, freq;
     if (parse_colon(arg, &radial, &freq))
-        fgSetDouble("/radios/nav[0]/radials/selected-deg", radial);
-    fgSetDouble("/radios/nav[0]/frequencies/selected-mhz", freq);
+        fgSetDouble("/instrumentation/nav[0]/radials/selected-deg", radial);
+    fgSetDouble("/instrumentation/nav[0]/frequencies/selected-mhz", freq);
     return FG_OPTIONS_OK;
 }
 
@@ -1113,8 +1116,8 @@ fgOptNAV2( const char * arg )
 {
     double radial, freq;
     if (parse_colon(arg, &radial, &freq))
-        fgSetDouble("/radios/nav[1]/radials/selected-deg", radial);
-    fgSetDouble("/radios/nav[1]/frequencies/selected-mhz", freq);
+        fgSetDouble("/instrumentation/nav[1]/radials/selected-deg", radial);
+    fgSetDouble("/instrumentation/nav[1]/frequencies/selected-mhz", freq);
     return FG_OPTIONS_OK;
 }
 
@@ -1135,11 +1138,11 @@ fgOptDME( const char *arg )
     if (opt == "nav1") {
         fgSetInt("/instrumentation/dme/switch-position", 1);
         fgSetString("/instrumentation/dme/frequencies/source",
-                    "/radios/nav[0]/frequencies/selected-mhz");
+                    "/instrumentation/nav[0]/frequencies/selected-mhz");
     } else if (opt == "nav2") {
         fgSetInt("/instrumentation/dme/switch-position", 3);
         fgSetString("/instrumentation/dme/frequencies/source",
-                    "/radios/nav[1]/frequencies/selected-mhz");
+                    "/instrumentation/nav[1]/frequencies/selected-mhz");
     } else {
         fgSetInt("/instrumentation/dme/switch-position", 2);
         fgSetString("/instrumentation/dme/frequencies/source",
@@ -1200,6 +1203,10 @@ struct OptionDesc {
     {"enable-mouse-pointer",         false, OPTION_STRING, "/sim/startup/mouse-pointer", false, "enabled", 0 },
     {"disable-random-objects",       false, OPTION_BOOL,   "/sim/rendering/random-objects", false, "", 0 },
     {"enable-random-objects",        false, OPTION_BOOL,   "/sim/rendering/random-objects", true, "", 0 },
+    {"disable-real-weather-fetch",   false, OPTION_BOOL,   "/environment/params/real-world-weather-fetch", false, "", 0 },
+    {"enable-real-weather-fetch",    false, OPTION_BOOL,   "/environment/params/real-world-weather-fetch", true, "", 0 },
+    {"disable-ai-models",            false, OPTION_BOOL,   "/sim/ai/enabled", false, "", 0 },
+    {"enable-ai-models",             false, OPTION_BOOL,   "/sim/ai/enabled", true, "", 0 },
     {"disable-freeze",               false, OPTION_BOOL,   "/sim/freeze/master", false, "", 0 },
     {"enable-freeze",                false, OPTION_BOOL,   "/sim/freeze/master", true, "", 0 },
     {"disable-fuel-freeze",          false, OPTION_BOOL,   "/sim/freeze/fuel", false, "", 0 },
@@ -1218,13 +1225,15 @@ struct OptionDesc {
     {"enable-hud",                   false, OPTION_BOOL,   "/sim/hud/visibility", true, "", 0 },
     {"disable-panel",                false, OPTION_BOOL,   "/sim/panel/visibility", false, "", 0 },
     {"enable-panel",                 false, OPTION_BOOL,   "/sim/panel/visibility", true, "", 0 },
-    {"disable-sound",                false, OPTION_BOOL,   "/sim/sound/audible", false, "", 0 },
-    {"enable-sound",                 false, OPTION_BOOL,   "/sim/sound/audible", true, "", 0 },
+    {"disable-sound",                false, OPTION_BOOL,   "/sim/sound/pause", true, "", 0 },
+    {"enable-sound",                 false, OPTION_BOOL,   "/sim/sound/pause", false, "", 0 },
     {"airport",                      true,  OPTION_STRING, "/sim/presets/airport-id", false, "", 0 },
     {"airport-id",                   true,  OPTION_STRING, "/sim/presets/airport-id", false, "", 0 },
     {"runway",                       true,  OPTION_STRING, "/sim/presets/runway", false, "", 0 },
     {"vor",                          true,  OPTION_FUNC,   "", false, "", fgOptVOR },
     {"ndb",                          true,  OPTION_FUNC,   "", false, "", fgOptNDB },
+    {"carrier",                      true,  OPTION_FUNC,   "", false, "", fgOptCarrier },
+    {"parkpos",                      true,  OPTION_FUNC,   "", false, "", fgOptParkpos },
     {"fix",                          true,  OPTION_FUNC,   "", false, "", fgOptFIX },
     {"offset-distance",              true,  OPTION_DOUBLE, "/sim/presets/offset-distance", false, "", 0 },
     {"offset-azimuth",               true,  OPTION_DOUBLE, "/sim/presets/offset-azimuth", false, "", 0 },
@@ -1268,11 +1277,10 @@ struct OptionDesc {
     {"enable-specular-highlight",    false, OPTION_BOOL,   "/sim/rendering/specular-highlight", true, "", 0 },
     {"disable-clouds",               false, OPTION_BOOL,   "/environment/clouds/status", false, "", 0 },
     {"enable-clouds",                false, OPTION_BOOL,   "/environment/clouds/status", true, "", 0 },
-#ifdef FG_USE_CLOUDS_3D
-    {"disable-clouds3d",             false, OPTION_BOOL,   "/sim/rendering/clouds3d", false, "", 0 },
-    {"enable-clouds3d",              false, OPTION_BOOL,   "/sim/rendering/clouds3d", true, "", 0 },
-#endif
+    {"disable-clouds3d",             false, OPTION_BOOL,   "/sim/rendering/clouds3d-enable", false, "", 0 },
+    {"enable-clouds3d",              false, OPTION_BOOL,   "/sim/rendering/clouds3d-enable", true, "", 0 },
     {"fov",                          true,  OPTION_FUNC,   "", false, "", fgOptFov },
+    {"aspect-ratio-multiplier",      true,  OPTION_DOUBLE, "/sim/current-view/aspect-ratio-multiplier", false, "", 0 },
     {"disable-fullscreen",           false, OPTION_BOOL,   "/sim/startup/fullscreen", false, "", 0 },
     {"enable-fullscreen",            false, OPTION_BOOL,   "/sim/startup/fullscreen", true, "", 0 },
     {"shading-flat",                 false, OPTION_BOOL,   "/sim/rendering/shading", false, "", 0 },
@@ -1296,7 +1304,7 @@ struct OptionDesc {
     {"start-date-gmt",               true,  OPTION_FUNC,   "", false, "", fgOptStartDateGmt },
     {"hud-tris",                     false, OPTION_STRING, "/sim/hud/frame-stat-type", false, "tris", 0 },
     {"hud-culled",                   false, OPTION_STRING, "/sim/hud/frame-stat-type", false, "culled", 0 },
-    {"atc610x",                      true,  OPTION_CHANNEL, "", false, "dummy", 0 },
+    {"atcsim",                       true,  OPTION_CHANNEL, "", false, "dummy", 0 },
     {"atlas",                        true,  OPTION_CHANNEL, "", false, "", 0 },
     {"httpd",                        true,  OPTION_CHANNEL, "", false, "", 0 },
 #ifdef FG_JPEG_SERVER
@@ -1337,12 +1345,13 @@ struct OptionDesc {
     {"config",                       true,  OPTION_FUNC,   "", false, "", fgOptConfig },
     {"aircraft",                     true,  OPTION_STRING, "/sim/aircraft", false, "", 0 },
     {"failure",                      true,  OPTION_FUNC,   "", false, "", fgOptFailure },
-    {"com1",                         true,  OPTION_DOUBLE, "/radios/comm[0]/frequencies/selected-mhz", false, "", 0 },
-    {"com2",                         true,  OPTION_DOUBLE, "/radios/comm[1]/frequencies/selected-mhz", false, "", 0 },
+    {"com1",                         true,  OPTION_DOUBLE, "/instrumentation/comm[0]/frequencies/selected-mhz", false, "", 0 },
+    {"com2",                         true,  OPTION_DOUBLE, "/instrumentation/comm[1]/frequencies/selected-mhz", false, "", 0 },
     {"nav1",                         true,  OPTION_FUNC,   "", false, "", fgOptNAV1 },
     {"nav2",                         true,  OPTION_FUNC,   "", false, "", fgOptNAV2 },
     {"adf",                          true,  OPTION_FUNC,   "", false, "", fgOptADF },
     {"dme",                          true,  OPTION_FUNC,   "", false, "", fgOptDME },
+    {"min-status",                   true,  OPTION_STRING,  "/sim/aircraft-min-status", false, "all", 0 },
     {0}
 };
 
@@ -1543,9 +1552,11 @@ fgParseOptions (const string& path) {
 #endif
 
         // catch extraneous (DOS) line ending character
-        if ( line[line.length() - 1] < 32 ) {
-            line = line.substr( 0, line.length()-1 );
-        }
+        int i;
+        for (i = line.length(); i > 0; i--)
+            if (line[i - 1] > 32)
+                break;
+        line = line.substr( 0, i );
 
        if ( parse_option( line ) == FG_OPTIONS_ERROR ) {
             cerr << endl << "Config file parse error: " << path << " '" 
@@ -1566,6 +1577,7 @@ fgUsage (bool verbose)
 
     SGPropertyNode options_root;
 
+    SG_LOG( SG_GENERAL, SG_ALERT, "" ); // To popup the console on Windows
     cout << endl;
 
     try {
@@ -1686,15 +1698,36 @@ fgUsage (bool verbose)
         cout << endl;
         cout << "For a complete list of options use --help --verbose" << endl;
     }
+#ifdef _MSC_VER
+    cout << "Hit a key to continue..." << endl;
+    cin.get();
+#endif
 }
 
+// A simple function to return an integer depending on the position
+// of the status string within the array in order to determine the hierarchy.
+unsigned int getNumMaturity(const char * str) 
+{
+  // changes should also be reflected in $FG_ROOT/data/options.xml & 
+  // $FG_ROOT/data/Translations/string-default.xml
+  const char levels[][20]= {"alpha","beta","early-production","production",0}; 
+
+  for (unsigned int i=0; i<(sizeof(levels)/sizeof(levels[0])-1);i++) 
+    if (strcmp(str,levels[i])==0)
+      return i;
+
+  return 0;
+};
+
+
 static void fgSearchAircraft(const SGPath &path, string_list &aircraft,
                              bool recursive)
-{
+{   
+   
    ulDirEnt* dire;
    ulDir *dirp = ulOpenDir(path.str().c_str());
    if (dirp == NULL) {
-      cerr << "Unable to open aircraft directory." << endl;
+      cerr << "Unable to open aircraft directory '" << path.str() << '\'' << endl;
       exit(-1);
    }
 
@@ -1725,29 +1758,57 @@ static void fgSearchAircraft(const SGPath &path, string_list &aircraft,
           }
 
           SGPropertyNode *desc = NULL;
+         SGPropertyNode *status = NULL;
+         
           SGPropertyNode *node = root.getNode("sim");
           if (node) {
              desc = node->getNode("description");
+            // if a status tag is found, read it in
+            if (node->hasValue("status"))
+               status = node->getNode("status");
           }
 
           char cstr[96];
+         //additionally display status information where it is available
+          
           if (strlen(dire->d_name) <= 27) {
              snprintf(cstr, 96, "   %-27s  %s", dire->d_name,
-                      (desc) ? desc->getStringValue() : "" );
+                      (desc) ? desc->getStringValue() : "");
 
           } else {
              snprintf(cstr, 96, "   %-27s\n%32c%s", dire->d_name, ' ',
-                      (desc) ? desc->getStringValue() : "" );
+                      (desc) ? desc->getStringValue() : "");
           }
 
-          aircraft.push_back(cstr);
-      }
+         SGPropertyNode * required_status
+                             = fgGetNode ("/sim/aircraft-min-status", true);
+         
+         // If the node holds the value "all", then there wasn't any status 
+         // level specified, so we simply go ahead and output ALL aircraft
+         if (strcmp(required_status->getStringValue(),"all")==0) {        
+                 aircraft.push_back(cstr);
+                 }
+         else
+         {
+         // If the node doesn't hold "all" as its value, then we are supposed
+         // to show only aircraft meeting specific status (development status)
+          // requirements:
+     if (node->hasValue("status"))     {
+         //Compare (minimally) required status level with actual aircraft status:
+          if ( getNumMaturity(status->getStringValue() ) >= 
+               getNumMaturity(required_status->getStringValue() ) )
+                                 aircraft.push_back(cstr); }
+                                                 
+         }
+      
+   
+   }
    }
 
    ulCloseDir(dirp);
 }
 
-
 /*
  * Search in the current directory, and in on directory deeper
  * for <aircraft>-set.xml configuration files and show the aircaft name
@@ -1762,8 +1823,13 @@ void fgShowAircraft(const SGPath &path, bool recursive) {
     fgSearchAircraft( path, aircraft, recursive );
 
     sort(aircraft.begin(), aircraft.end());
+    SG_LOG( SG_GENERAL, SG_ALERT, "" ); // To popup the console on Windows
     cout << "Available aircraft:" << endl;
     for ( unsigned int i = 0; i < aircraft.size(); i++ ) {
         cout << aircraft[i] << endl;
     }
+#ifdef _MSC_VER
+    cout << "Hit a key to continue..." << endl;
+    cin.get();
+#endif
 }