]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/options.cxx
Add David Culp's AI model manager code which is derived from David Luff's AI/ATC...
[flightgear.git] / src / Main / options.cxx
index 9a28333d0fe105c197b0ec3aa78ee8c16465335b..1a9016369068498108a234be56a6819915073de5 100644 (file)
@@ -26,7 +26,7 @@
 #endif
 
 #include <simgear/compiler.h>
-#include <simgear/misc/exception.hxx>
+#include <simgear/structure/exception.hxx>
 #include <simgear/debug/logstream.hxx>
 
 #include <math.h>              // rint()
@@ -50,9 +50,6 @@
 // #include <Cockpit/cockpit.hxx>
 // #include <FDM/flight.hxx>
 // #include <FDM/UIUCModel/uiuc_aircraftdir.h>
-#ifdef FG_NETWORK_OLK
-#  include <NetworkOLK/network.h>
-#endif
 
 #include <GUI/gui.h>
 
@@ -181,13 +178,14 @@ fgSetDefaults ()
 #else
     fgSetString("/sim/startup/browser-app", "webrun.bat");
 #endif
-    fgSetInt("/sim/log-level", SG_WARN);
+    fgSetString("/sim/logging/priority", "alert");
 
                                // Features
+    fgSetBool("/sim/hud/antialiased", false);
+    fgSetBool("/sim/hud/enable3d", true);
     fgSetBool("/sim/hud/visibility", false);
     fgSetBool("/sim/panel/visibility", true);
     fgSetBool("/sim/sound/audible", true);
-    fgSetBool("/sim/hud/antialiased", false);
 
                                // Flight Model options
     fgSetString("/sim/flight-model", "jsb");
@@ -206,6 +204,7 @@ fgSetDefaults ()
     fgSetBool("/sim/rendering/horizon-effect", false);
     fgSetBool("/sim/rendering/enhanced-lighting", false);
     fgSetBool("/sim/rendering/distance-attenuation", false);
+    fgSetBool("/sim/rendering/specular-highlight", true);
     fgSetInt("/sim/startup/xsize", 800);
     fgSetInt("/sim/startup/ysize", 600);
     fgSetInt("/sim/rendering/bits-per-pixel", 16);
@@ -221,9 +220,6 @@ fgSetDefaults ()
     fgSetString("/sim/startup/time-offset-type", "system-offset");
     fgSetLong("/sim/time/cur-time-override", 0);
 
-    fgSetBool("/sim/networking/network-olk", false);
-    fgSetString("/sim/networking/call-sign", "Johnny");
-
                                 // Freeze options
     fgSetBool("/sim/freeze/master", false);
     fgSetBool("/sim/freeze/position", false);
@@ -240,7 +236,6 @@ fgSetDefaults ()
 
 }
 
-
 static bool
 parse_wind (const string &wind, double * min_hdg, double * max_hdg,
            double * speed, double * gust)
@@ -544,12 +539,50 @@ add_channel( const string& type, const string& channel_str ) {
 static void
 setup_wind (double min_hdg, double max_hdg, double speed, double gust)
 {
+                                // Initialize to a reasonable state
   fgDefaultWeatherValue("wind-from-heading-deg", min_hdg);
   fgDefaultWeatherValue("wind-speed-kt", speed);
 
   SG_LOG(SG_GENERAL, SG_INFO, "WIND: " << min_hdg << '@' << 
         speed << " knots" << endl);
 
+                                // Now, add some variety to the layers
+  min_hdg += 10;
+  if (min_hdg > 360)
+      min_hdg -= 360;
+  speed *= 1.1;
+  fgSetDouble("/environment/config/boundary/entry[1]/wind-from-heading-deg",
+              min_hdg);
+  fgSetDouble("/environment/config/boundary/entry[1]/wind-speed-kt",
+              speed);
+
+  min_hdg += 20;
+  if (min_hdg > 360)
+      min_hdg -= 360;
+  speed *= 1.1;
+  fgSetDouble("/environment/config/aloft/entry[0]/wind-from-heading-deg",
+              min_hdg);
+  fgSetDouble("/environment/config/aloft/entry[0]/wind-speed-kt",
+              speed);
+              
+  min_hdg += 10;
+  if (min_hdg > 360)
+      min_hdg -= 360;
+  speed *= 1.1;
+  fgSetDouble("/environment/config/aloft/entry[1]/wind-from-heading-deg",
+              min_hdg);
+  fgSetDouble("/environment/config/aloft/entry[1]/wind-speed-kt",
+              speed);
+              
+  min_hdg += 10;
+  if (min_hdg > 360)
+      min_hdg -= 360;
+  speed *= 1.1;
+  fgSetDouble("/environment/config/aloft/entry[2]/wind-from-heading-deg",
+              min_hdg);
+  fgSetDouble("/environment/config/aloft/entry[2]/wind-speed-kt",
+              speed);
+
 #ifdef FG_WEATHERCM
   // convert to fps
   speed *= SG_NM_TO_METER * SG_METER_TO_FEET * (1.0/3600);
@@ -897,16 +930,6 @@ fgOptStartDateGmt( const char *arg )
     return FG_OPTIONS_OK;
 }
 
-#ifdef FG_NETWORK_OLK
-static int
-fgOptNetHud( const char *arg )
-{
-    fgSetBool("/sim/hud/net-display", true);
-    net_hud_display = 1;       // FIXME
-    return FG_OPTIONS_OK;
-}
-#endif
-
 static int
 fgOptTraceRead( const char *arg )
 {
@@ -917,6 +940,33 @@ fgOptTraceRead( const char *arg )
     return FG_OPTIONS_OK;
 }
 
+static int
+fgOptLogLevel( const char *arg )
+{
+    fgSetString("/sim/logging/classes", "all");
+    fgSetString("/sim/logging/priority", arg);
+
+    string priority = arg;
+    logbuf::set_log_classes(SG_ALL);
+    if (priority == "bulk") {
+      logbuf::set_log_priority(SG_BULK);
+    } else if (priority == "debug") {
+      logbuf::set_log_priority(SG_DEBUG);
+    } else if (priority == "info") {
+      logbuf::set_log_priority(SG_INFO);
+    } else if (priority == "warn") {
+      logbuf::set_log_priority(SG_WARN);
+    } else if (priority == "alert") {
+      logbuf::set_log_priority(SG_ALERT);
+    } else {
+      SG_LOG(SG_GENERAL, SG_WARN, "Unknown logging priority " << priority);
+    }
+    SG_LOG(SG_GENERAL, SG_DEBUG, "Logging priority is " << priority);
+
+    return FG_OPTIONS_OK;
+}
+
+
 static int
 fgOptTraceWrite( const char *arg )
 {
@@ -974,7 +1024,7 @@ fgOptRandomWind( const char *arg )
 {
     double min_hdg = sg_random() * 360.0;
     double max_hdg = min_hdg + (20 - sqrt(sg_random() * 400));
-    double speed = 40 - sqrt(sg_random() * 1600.0);
+    double speed = sg_random() * sg_random() * 40;
     double gust = speed + (10 - sqrt(sg_random() * 100));
     setup_wind(min_hdg, max_hdg, speed, gust);
     return FG_OPTIONS_OK;
@@ -993,12 +1043,31 @@ fgOptWind( const char *arg )
 }
 
 static int
-fgOptTurbulence( const char *arg)
+fgOptTurbulence( const char *arg )
 {
     fgDefaultWeatherValue("turbulence/magnitude-norm", atof(arg));
     return FG_OPTIONS_OK;
 }
 
+static int
+fgOptCeiling( const char *arg )
+{
+    double elevation, thickness;
+    string spec = arg;
+    string::size_type pos = spec.find(':');
+    if (pos == string::npos) {
+        elevation = atof(spec.c_str());
+        thickness = 2000;
+    } else {
+        elevation = atof(spec.substr(0, pos).c_str());
+        thickness = atof(spec.substr(pos + 1).c_str());
+    }
+    fgSetDouble("/environment/clouds/layer[0]/elevation-ft", elevation);
+    fgSetDouble("/environment/clouds/layer[0]/thickness-ft", thickness);
+    fgSetString("/environment/clouds/layer[0]/coverage", "overcast");
+    return FG_OPTIONS_OK;
+}
+
 static int
 fgOptWp( const char *arg )
 {
@@ -1028,6 +1097,93 @@ fgOptConfig( const char *arg )
     return FG_OPTIONS_OK;
 }
 
+static bool
+parse_colon (const string &s, double * val1, double * val2)
+{
+    string::size_type pos = s.find(':');
+    if (pos == string::npos) {
+        *val2 = atof(s);
+        return false;
+    } else {
+        *val1 = atof(s.substr(0, pos).c_str());
+        *val2 = atof(s.substr(pos+1).c_str());
+        return true;
+    }
+}
+
+
+static int
+fgOptFailure( const char * arg )
+{
+    string a = arg;
+    if (a == "pitot") {
+        fgSetBool("/systems/pitot/serviceable", false);
+    } else if (a == "static") {
+        fgSetBool("/systems/static/serviceable", false);
+    } else if (a == "vacuum") {
+        fgSetBool("/systems/vacuum/serviceable", false);
+    } else if (a == "electrical") {
+        fgSetBool("/systems/electrical/serviceable", false);
+    } else {
+        SG_LOG(SG_INPUT, SG_ALERT, "Unknown failure mode: " << a);
+        return FG_OPTIONS_ERROR;
+    }
+
+    return FG_OPTIONS_OK;
+}
+
+
+static int
+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);
+    return FG_OPTIONS_OK;
+}
+
+static int
+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);
+    return FG_OPTIONS_OK;
+}
+
+static int
+fgOptADF( const char * arg )
+{
+    double rot, freq;
+    if (parse_colon(arg, &rot, &freq))
+        fgSetDouble("/instrumentation/adf/rotation-deg", rot);
+    fgSetDouble("/instrumentation/adf/frequencies/selected-khz", freq);
+    return FG_OPTIONS_OK;
+}
+
+static int
+fgOptDME( const char *arg )
+{
+    string opt = arg;
+    if (opt == "nav1") {
+        fgSetInt("/instrumentation/dme/switch-position", 1);
+        fgSetString("/instrumentation/dme/frequencies/source",
+                    "/radios/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");
+    } else {
+        fgSetInt("/instrumentation/dme/switch-position", 2);
+        fgSetString("/instrumentation/dme/frequencies/source",
+                    "/instrumentation/dme/frequencies/selected-mhz");
+        fgSetString("/instrumentation/dme/frequencies/selected-mhz", arg);
+    }
+    return FG_OPTIONS_OK;
+}
+
 static map<string,size_t> fgOptionMap;
 
 /*
@@ -1085,6 +1241,8 @@ struct OptionDesc {
     {"enable-fuel-freeze",           false, OPTION_BOOL,   "/sim/freeze/fuel", true, "", 0 },
     {"disable-clock-freeze",         false, OPTION_BOOL,   "/sim/freeze/clock", false, "", 0 },
     {"enable-clock-freeze",          false, OPTION_BOOL,   "/sim/freeze/clock", true, "", 0 },
+    {"disable-hud-3d",               false, OPTION_BOOL,   "/sim/hud/enable3d", false, "", 0 },
+    {"enable-hud-3d",                false, OPTION_BOOL,   "/sim/hud/enable3d", true, "", 0 },
     {"disable-anti-alias-hud",       false, OPTION_BOOL,   "/sim/hud/antialiased", false, "", 0 },
     {"enable-anti-alias-hud",        false, OPTION_BOOL,   "/sim/hud/antialiased", true, "", 0 },
     {"control",                      true,  OPTION_STRING, "/sim/control-mode", false, "", 0 },
@@ -1141,6 +1299,8 @@ struct OptionDesc {
     {"enable-enhanced-lighting",     false, OPTION_BOOL,   "/sim/rendering/enhanced-lighting", true, "", 0 },
     {"disable-distance-attenuation", false, OPTION_BOOL,   "/sim/rendering/distance-attenuation", false, "", 0 },
     {"enable-distance-attenuation",  false, OPTION_BOOL,   "/sim/rendering/distance-attenuation", true, "", 0 },
+    {"disable-specular-highlight",   false, OPTION_BOOL,   "/sim/rendering/specular-highlight", false, "", 0 },
+    {"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
@@ -1162,6 +1322,7 @@ struct OptionDesc {
     {"bpp",                          true,  OPTION_FUNC,   "", false, "", fgOptBpp },
     {"units-feet",                   false, OPTION_STRING, "/sim/startup/units", false, "feet", 0 },
     {"units-meters",                 false, OPTION_STRING, "/sim/startup/units", false, "meters", 0 },
+    {"timeofday",                    true,  OPTION_STRING, "/sim/startup/time-offset-type", false, "noon", 0 },
     {"time-offset",                  true,  OPTION_FUNC,   "", false, "", fgOptTimeOffset },
     {"time-match-real",              false, OPTION_STRING, "/sim/startup/time-offset-type", false, "system-offset", 0 },
     {"time-match-local",             false, OPTION_STRING, "/sim/startup/time-offset-type", false, "latitude-offset", 0 },
@@ -1190,29 +1351,32 @@ struct OptionDesc {
     {"ray",                          true,  OPTION_CHANNEL, "", false, "", 0 },
     {"rul",                          true,  OPTION_CHANNEL, "", false, "", 0 },
     {"joyclient",                    true,  OPTION_CHANNEL, "", false, "", 0 },
-#ifdef FG_NETWORK_OLK
-    {"disable-network-olk",          false, OPTION_BOOL,   "/sim/networking/olk", false, "", 0 },
-    {"enable-network-olk",           false, OPTION_BOOL,   "/sim/networking/olk", true, "", 0 },
-    {"net-hud",                      false, OPTION_FUNC,   "", false, "", fgOptNetHud },
-    {"net-id",                       true,  OPTION_STRING, "sim/networking/call-sign", false, "", 0 },
-#endif
+    {"jsclient",                     true,  OPTION_CHANNEL, "", false, "", 0 },
 #ifdef FG_MPLAYER_AS
     {"callsign",                     true, OPTION_STRING,  "sim/multiplay/callsign", false, "", 0 },
     {"multiplay",                    true,  OPTION_CHANNEL, "", false, "", 0 },
 #endif
     {"trace-read",                   true,  OPTION_FUNC,   "", false, "", fgOptTraceRead },
     {"trace-write",                  true,  OPTION_FUNC,   "", false, "", fgOptTraceWrite },
-    {"log-level",                    true,  OPTION_INT,    "/sim/log-level", false, "", 0 },
+    {"log-level",                    true,  OPTION_FUNC,   "", false, "", fgOptLogLevel },
     {"view-offset",                  true,  OPTION_FUNC,   "", false, "", fgOptViewOffset },
     {"visibility",                   true,  OPTION_FUNC,   "", false, "", fgOptVisibilityMeters },
     {"visibility-miles",             true,  OPTION_FUNC,   "", false, "", fgOptVisibilityMiles },
     {"random-wind",                  false, OPTION_FUNC,   "", false, "", fgOptRandomWind },
     {"wind",                         true,  OPTION_FUNC,   "", false, "", fgOptWind },
     {"turbulence",                   true,  OPTION_FUNC,   "", false, "", fgOptTurbulence },
+    {"ceiling",                      true,  OPTION_FUNC,   "", false, "", fgOptCeiling },
     {"wp",                           true,  OPTION_FUNC,   "", false, "", fgOptWp },
     {"flight-plan",                  true,  OPTION_FUNC,   "", false, "", fgOptFlightPlan },
     {"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 },
+    {"nav1",                         true,  OPTION_FUNC,   "", false, "", fgOptNAV1 },
+    {"nav2",                         true,  OPTION_FUNC,   "", false, "", fgOptNAV2 },
+    {"adf",                          true,  OPTION_FUNC,   "", false, "", fgOptADF },
+    {"dme",                          true,  OPTION_FUNC,   "", false, "", fgOptDME },
     {0}
 };
 
@@ -1361,7 +1525,10 @@ fgParseArgs (int argc, char **argv)
               verbose = true;
 
             else if (result == FG_OPTIONS_SHOW_AIRCRAFT) {
-               fgShowAircraft();
+               fgOptLogLevel( "alert" );
+               SGPath path( globals->get_fg_root() );
+               path.append("Aircraft");
+               fgShowAircraft(path, true);
                exit(0);
             }
          }
@@ -1374,6 +1541,7 @@ fgParseArgs (int argc, char **argv)
     }
 
     if (help) {
+       fgOptLogLevel( "alert" );
        fgUsage(verbose);
        exit(0);
     }
@@ -1554,17 +1722,11 @@ fgUsage (bool verbose)
     }
 }
 
-// Show available aircraft types
-void fgShowAircraft(void) {
-   vector<string> aircraft;
-
-   SGPath path( globals->get_fg_root() );
-   path.append("Aircraft");
-
+static void fgSearchAircraft(const SGPath &path, string_list &aircraft,
+                             bool recursive)
+{
    ulDirEnt* dire;
-   ulDir *dirp;
-
-   dirp = ulOpenDir(path.c_str());
+   ulDir *dirp = ulOpenDir(path.str().c_str());
    if (dirp == NULL) {
       cerr << "Unable to open aircraft directory." << endl;
       exit(-1);
@@ -1573,7 +1735,17 @@ void fgShowAircraft(void) {
    while ((dire = ulReadDir(dirp)) != NULL) {
       char *ptr;
 
-      if ((ptr = strstr(dire->d_name, "-set.xml")) && ptr[8] == '\0' ) {
+      if (dire->d_isdir) {
+          if (recursive && strcmp("CVS", dire->d_name)
+              && strcmp(".", dire->d_name) && strcmp("..", dire->d_name))
+          {
+              SGPath next = path;
+              next.append(dire->d_name);
+
+              fgSearchAircraft(next, aircraft, true);
+          }
+      } else if ((ptr = strstr(dire->d_name, "-set.xml")) && (ptr[8] == '\0')) {
+
           SGPath afile = path;
           afile.append(dire->d_name);
 
@@ -1593,24 +1765,39 @@ void fgShowAircraft(void) {
           }
 
           char cstr[96];
-          if (strlen(dire->d_name) <= 27)
+          if (strlen(dire->d_name) <= 27) {
              snprintf(cstr, 96, "   %-27s  %s", dire->d_name,
                       (desc) ? desc->getStringValue() : "" );
 
-          else
+          } else {
              snprintf(cstr, 96, "   %-27s\n%32c%s", dire->d_name, ' ',
                       (desc) ? desc->getStringValue() : "" );
+          }
 
           aircraft.push_back(cstr);
       }
    }
 
-   sort(aircraft.begin(), aircraft.end());
-   cout << "Available aircraft:" << endl;
-   for ( unsigned int i = 0; i < aircraft.size(); i++ ) {
-       cout << aircraft[i] << endl;
-   }
-
-   aircraft.clear();
    ulCloseDir(dirp);
 }
+
+
+/*
+ * Search in the current directory, and in on directory deeper
+ * for <aircraft>-set.xml configuration files and show the aircaft name
+ * and the contents of the<description> tag in a sorted manner.
+ *
+ * @parampath the directory to search for configuration files
+ * @param recursive defines whether the directory should be searched recursively
+ */
+void fgShowAircraft(const SGPath &path, bool recursive) {
+    string_list aircraft;
+
+    fgSearchAircraft( path, aircraft, recursive );
+
+    sort(aircraft.begin(), aircraft.end());
+    cout << "Available aircraft:" << endl;
+    for ( unsigned int i = 0; i < aircraft.size(); i++ ) {
+        cout << aircraft[i] << endl;
+    }
+}