]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/options.cxx
Changes from David Megginson in support of an xml based configuration file.
[flightgear.git] / src / Main / options.cxx
index 2738b85ff8f738bf5f70c0f1fc3ecf3162bb6402..8571b1ca0f82457951b9b164a8447a77d2043dbe 100644 (file)
@@ -41,6 +41,8 @@ bool global_fullscreen = true;
 #include <simgear/constants.h>
 #include <simgear/debug/logstream.hxx>
 #include <simgear/misc/fgstream.hxx>
+#include <simgear/misc/props.hxx>
+#include <simgear/timing/sg_time.hxx>
 
 #include <Include/general.hxx>
 #include <Cockpit/cockpit.hxx>
@@ -49,10 +51,10 @@ bool global_fullscreen = true;
 #ifdef FG_NETWORK_OLK
 #  include <NetworkOLK/network.h>
 #endif
-#include <Time/fg_time.hxx>
 
-#include "views.hxx"
+#include "globals.hxx"
 #include "options.hxx"
+#include "views.hxx"
 
 FG_USING_STD(string);
 FG_USING_NAMESPACE(std);
@@ -147,31 +149,32 @@ fgOPTIONS::fgOPTIONS() :
     pitch(0.424),        // pitch angle in degrees (Theta)
 
     // Initialize current options velocities to 0.0
-    uBody(0.0), vBody(0.0), wBody(0.0),
+    uBody(0.0), vBody(0.0), wBody(0.0), vkcas(0.0), mach(0.0),
 
     // Miscellaneous
     game_mode(0),
     splash_screen(1),
     intro_music(1),
     mouse_pointer(0),
-    pause(0),
     control_mode(FG_JOYSTICK),
     auto_coordination(FG_AUTO_COORD_NOT_SPECIFIED),
 
     // Features
-    hud_status(1),
-    panel_status(0),
+    hud_status(0),
+    panel_status(1),
     sound(1),
+    anti_alias_hud(0),
 
     // Flight Model options
     flight_model( FGInterface::FG_LARCSIM ),
     aircraft( "c172" ),
     model_hz( NEW_DEFAULT_MODEL_HZ ),
     speed_up( 1 ),
+    trim(0),
 
     // Rendering options
     fog(FG_FOG_NICEST),  // nicest
-    clouds(true),
+    clouds(false),
     clouds_asl(5000*FEET_TO_METER),
     fov(55.0),
     fullscreen(0),
@@ -179,8 +182,9 @@ fgOPTIONS::fgOPTIONS() :
     skyblend(1),
     textures(1),
     wireframe(0),
-    xsize(640),
-    ysize(480),
+    xsize(800),
+    ysize(600),
+    bpp(16),
     view_mode(FG_VIEW_PILOT),
 
     // Scenery options
@@ -196,7 +200,7 @@ fgOPTIONS::fgOPTIONS() :
     network_olk(false)
 {
     // set initial values/defaults
-    time_offset_type=FG_TIME_SYS_OFFSET;
+    time_offset_type = FG_TIME_SYS_OFFSET;
     char* envp = ::getenv( "FG_ROOT" );
 
     if ( envp != NULL ) {
@@ -204,20 +208,32 @@ fgOPTIONS::fgOPTIONS() :
        // variable $FG_ROOT if it is set.
        fg_root = envp;
     } else {
-       // Otherwise, default to a random compiled in location if
+       // Otherwise, default to a random compiled-in location if
        // $FG_ROOT is not set.  This can still be overridden from the
        // command line or a config file.
 
 #if defined( WIN32 )
        fg_root = "\\FlightGear";
-#elif defined( MACOS )
+#elif defined( macintosh )
        fg_root = "";
 #else
        fg_root = PKGLIBDIR;
 #endif
     }
 
-    airport_id = "";           // default airport id
+    // set a possibly independent location for scenery data
+    envp = ::getenv( "FG_SCENERY" );
+
+    if ( envp != NULL ) {
+       // fg_root could be anywhere, so default to environmental
+       // variable $FG_ROOT if it is set.
+       fg_scenery = envp;
+    } else {
+       // Otherwise, default to Scenery being in $FG_ROOT/Scenery
+       fg_scenery = "";
+    }
+
+    airport_id = "P13";                // default airport id
     net_id = "Johnney";                // default pilot's name
 
     // initialize port config string list
@@ -227,12 +243,10 @@ fgOPTIONS::fgOPTIONS() :
 void 
 fgOPTIONS::toggle_panel() {
     
-    FGTime *t = FGTime::cur_time_params;
-    
-    int toggle_pause = t->getPause();
-    
-    if( !toggle_pause )
-        t->togglePauseMode();
+    bool freeze = globals->get_freeze();
+
+    if( !freeze )
+        globals->set_freeze(true);
     
     if( panel_status ) {
        panel_status = false;
@@ -243,15 +257,19 @@ fgOPTIONS::toggle_panel() {
        if ( current_panel != NULL )
          current_panel->setVisibility(true);
     }
-    if ( panel_status ) {
+
+    // new rule .. "fov" shouldn't get messed with like this.
+    /* if ( panel_status ) {
        fov *= 0.4232;
     } else {
        fov *= (1.0 / 0.4232);
-    }
-    fgReshape( xsize, ysize);
-    
-    if( !toggle_pause )
-        t->togglePauseMode();
+    } */
+
+    // fgReshape( xsize, ysize);
+    fgReshape( current_view.get_winWidth(), current_view.get_winHeight() );
+
+    if( !freeze )
+        globals->set_freeze( false );
 }
 
 double
@@ -431,12 +449,8 @@ long int fgOPTIONS::parse_date( const string& date)
        num[i] = '\0';
        gmt.tm_sec = atoi(num);
     }
-    time_t theTime = FGTime::cur_time_params->get_gmt(gmt.tm_year,
-                                                      gmt.tm_mon,
-                                                     gmt.tm_mday,
-                                                     gmt.tm_hour,
-                                                     gmt.tm_min,
-                                                     gmt.tm_sec);
+    time_t theTime = sgTimeGetGMT( gmt.tm_year, gmt.tm_mon, gmt.tm_mday,
+                                  gmt.tm_hour, gmt.tm_min, gmt.tm_sec );
     //printf ("Date is %s\n", ctime(&theTime));
     //printf ("in seconds that is %d\n", theTime);
     //exit(1);
@@ -555,10 +569,11 @@ fgOPTIONS::parse_fov( const string& arg ) {
 //  device = OS device name of serial line to be open()'ed
 //  baud = {300, 1200, 2400, ..., 230400}
 //
-// Socket exacmple "--native=socket,dir,hz,machine,port" where
+// Socket exacmple "--native=socket,dir,hz,machine,port,style" where
 // 
 //  machine = machine name or ip address if client (leave empty if server)
 //  port = port, leave empty to let system choose
+//  style = tcp or udp
 //
 // File example "--garmin=file,dir,hz,filename" where
 // 
@@ -596,10 +611,14 @@ int fgOPTIONS::parse_option( const string& arg ) {
        mouse_pointer = 1;
     } else if ( arg == "--enable-mouse-pointer" ) {
        mouse_pointer = 2;
-    } else if ( arg == "--disable-pause" ) {
-       pause = false;  
-    } else if ( arg == "--enable-pause" ) {
-       pause = true;   
+    } else if ( arg == "--disable-freeze" ) {
+       globals->set_freeze( false );
+    } else if ( arg == "--enable-freeze" ) {
+       globals->set_freeze( true );
+    } else if ( arg == "--disable-anti-alias-hud" ) {
+       anti_alias_hud = false; 
+    } else if ( arg == "--enable-anti-alias-hud" ) {
+       anti_alias_hud = true;  
     } else if ( arg.find( "--control=") != string::npos ) {
        parse_control( arg.substr(10) );
     } else if ( arg == "--disable-auto-coordination" ) {
@@ -617,8 +636,8 @@ int fgOPTIONS::parse_option( const string& arg ) {
     } else if ( arg == "--enable-panel" ) {
        panel_status = true;
        if ( current_panel != NULL )
-         current_panel->setVisibility(true);
-       fov *= 0.4232;
+           current_panel->setVisibility(true);
+       // fov *= 0.4232; /* NO!!! */
     } else if ( arg == "--disable-sound" ) {
        sound = false;
     } else if ( arg == "--enable-sound" ) {
@@ -627,50 +646,82 @@ int fgOPTIONS::parse_option( const string& arg ) {
        airport_id = arg.substr( 13 );
     } else if ( arg.find( "--lon=" ) != string::npos ) {
        lon = parse_degree( arg.substr(6) );
+       airport_id = "";
+       current_properties.setDoubleValue("/position/longitude", lon);
     } else if ( arg.find( "--lat=" ) != string::npos ) {
        lat = parse_degree( arg.substr(6) );
+       airport_id = "";
+       current_properties.setDoubleValue("/position/latitude", lat);
     } else if ( arg.find( "--altitude=" ) != string::npos ) {
        if ( units == FG_UNITS_FEET ) {
            altitude = atof( arg.substr(11) ) * FEET_TO_METER;
        } else {
            altitude = atof( arg.substr(11) );
        }
+       current_properties.setDoubleValue("/position/altitude", altitude);
     } else if ( arg.find( "--uBody=" ) != string::npos ) {
+       vkcas=mach=-1;
        if ( units == FG_UNITS_FEET ) {
            uBody = atof( arg.substr(8) );
        } else {
            uBody = atof( arg.substr(8) ) * FEET_TO_METER;
        }
+       current_properties.setDoubleValue("/velocities/speed-north", uBody);
     } else if ( arg.find( "--vBody=" ) != string::npos ) {
+       vkcas=mach=-1;
        if ( units == FG_UNITS_FEET ) {
            vBody = atof( arg.substr(8) );
        } else {
            vBody = atof( arg.substr(8) ) * FEET_TO_METER;
        }
+       current_properties.setDoubleValue("/velocities/speed-east", vBody);
     } else if ( arg.find( "--wBody=" ) != string::npos ) {
+       vkcas=mach=-1;
        if ( units == FG_UNITS_FEET ) {
            wBody = atof( arg.substr(8) );
        } else {
            wBody = atof( arg.substr(8) ) * FEET_TO_METER;
        }
+       current_properties.setDoubleValue("/velocities/speed-down", wBody);
+    } else if ( arg.find( "--vc=" ) != string::npos) {
+       mach=-1;
+       vkcas=atof( arg.substr(5) );
+       cout << "Got vc: " << vkcas << endl;
+    } else if ( arg.find( "--mach=" ) != string::npos) {
+       vkcas=-1;
+       mach=atof( arg.substr(7) );
     } else if ( arg.find( "--heading=" ) != string::npos ) {
        heading = atof( arg.substr(10) );
+       current_properties.setDoubleValue("/orientation/heading", heading);
     } else if ( arg.find( "--roll=" ) != string::npos ) {
        roll = atof( arg.substr(7) );
+       current_properties.setDoubleValue("/orientation/roll", roll);
     } else if ( arg.find( "--pitch=" ) != string::npos ) {
        pitch = atof( arg.substr(8) );
+       current_properties.setDoubleValue("/orientation/pitch", pitch);
     } else if ( arg.find( "--fg-root=" ) != string::npos ) {
        fg_root = arg.substr( 10 );
+    } else if ( arg.find( "--fg-scenery=" ) != string::npos ) {
+       fg_scenery = arg.substr( 13 );
     } else if ( arg.find( "--fdm=" ) != string::npos ) {
        flight_model = parse_fdm( arg.substr(6) );
+       current_properties.setIntValue("/sim/flight-model", flight_model);
+    if((flight_model == FGInterface::FG_JSBSIM) && (get_trim_mode() == 0)) {
+       set_trim_mode(1);
+    } else {
+       set_trim_mode(0);
+    }        
     } else if ( arg.find( "--aircraft=" ) != string::npos ) {
        aircraft = arg.substr(11);
+       current_properties.setStringValue("/sim/aircraft", aircraft);
     } else if ( arg.find( "--aircraft-dir=" ) != string::npos ) {
        aircraft_dir =  arg.substr(15); //  (UIUC)
     } else if ( arg.find( "--model-hz=" ) != string::npos ) {
        model_hz = atoi( arg.substr(11) );
     } else if ( arg.find( "--speed=" ) != string::npos ) {
        speed_up = atoi( arg.substr(8) );
+    } else if ( arg.find( "--notrim") != string::npos) {
+       trim=-1;
     } else if ( arg == "--fog-disable" ) {
        fog = FG_FOG_DISABLED;  
     } else if ( arg == "--fog-fastest" ) {
@@ -733,6 +784,15 @@ int fgOPTIONS::parse_option( const string& arg ) {
            FG_LOG( FG_GENERAL, FG_ALERT,
                    "Setting geometry to " << xsize << 'x' << ysize << '\n');
        }
+    } else if ( arg.find( "--bpp=" ) != string::npos ) {
+       string bits_per_pix = arg.substr( 6 );
+       if ( bits_per_pix == "16" ) {
+           bpp = 16;
+       } else if ( bits_per_pix == "24" ) {
+           bpp = 24;
+       } else if ( bits_per_pix == "32" ) {
+           bpp = 32;
+       }
     } else if ( arg == "--units-feet" ) {
        units = FG_UNITS_FEET;  
     } else if ( arg == "--units-meters" ) {
@@ -771,6 +831,8 @@ int fgOPTIONS::parse_option( const string& arg ) {
        parse_channel( "nmea", arg.substr(7) );
     } else if ( arg.find( "--pve=" ) != string::npos ) {
        parse_channel( "pve", arg.substr(6) );
+    } else if ( arg.find( "--ray=" ) != string::npos ) {
+       parse_channel( "ray", arg.substr(6) );
     } else if ( arg.find( "--rul=" ) != string::npos ) {
        parse_channel( "rul", arg.substr(6) );
     } else if ( arg.find( "--joyclient=" ) != string::npos ) {
@@ -785,6 +847,18 @@ int fgOPTIONS::parse_option( const string& arg ) {
     } else if ( arg.find( "--net-id=") != string::npos ) {
        net_id = arg.substr( 9 );
 #endif
+    } else if ( arg.find( "--prop:" ) == 0 ) {
+        string assign = arg.substr(7);
+       int pos = assign.find('=');
+       if (pos == arg.npos || pos == 0) {
+           FG_LOG(FG_GENERAL, FG_ALERT, "Bad property assignment: " << arg);
+           return FG_OPTIONS_ERROR;
+       }
+       string name = assign.substr(0, pos);
+       string value = assign.substr(pos + 1);
+       current_properties.setStringValue(name.c_str(), value);
+       FG_LOG(FG_GENERAL, FG_INFO, "Setting default value of property "
+              << name << " to \"" << value << '"');
     } else {
        FG_LOG( FG_GENERAL, FG_ALERT, "Unknown option '" << arg << "'" );
        return FG_OPTIONS_ERROR;
@@ -836,7 +910,7 @@ int fgOPTIONS::parse_config_file( const string& path ) {
 
 #ifdef GETLINE_NEEDS_TERMINATOR
         getline( in, line, '\n' );
-#elif defined (MACOS)
+#elif defined( macintosh )
        getline( in, line, '\r' );
 #else
         getline( in, line );
@@ -864,6 +938,9 @@ void fgOPTIONS::usage ( void ) {
     cout << "\t--help -h:  print usage" << endl;
     cout << "\t--fg-root=path:  specify the root path for all the data files"
         << endl;
+    cout << "\t--fg-scenery=path:  specify the base path for all the scenery"
+        << " data." << endl
+        << "\t\tdefaults to $FG_ROOT/Scenery" << endl;
     cout << "\t--disable-game-mode:  disable full-screen game mode" << endl;
     cout << "\t--enable-game-mode:  enable full-screen game mode" << endl;
     cout << "\t--disable-splash-screen:  disable splash screen" << endl;
@@ -874,8 +951,8 @@ void fgOPTIONS::usage ( void ) {
     cout << "\t--enable-mouse-pointer:  enable extra mouse pointer (i.e. for"
         << endl;
     cout << "\t\tfull screen voodoo/voodoo-II based cards.)" << endl;
-    cout << "\t--disable-pause:  start out in an active state" << endl;
-    cout << "\t--enable-pause:  start out in a paused state" << endl;
+    cout << "\t--disable-freeze:  start out in an running state" << endl;
+    cout << "\t--enable-freeze:  start out in a frozen state" << endl;
     cout << "\t--control=mode:  primary control mode " 
         << "(joystick, keyboard, mouse)" << endl;
     cout << endl;
@@ -887,6 +964,8 @@ void fgOPTIONS::usage ( void ) {
     cout << "\t--enable-panel:  enable instrumetn panel" << endl;
     cout << "\t--disable-sound:  disable sound effects" << endl;
     cout << "\t--enable-sound:  enable sound effects" << endl;
+    cout << "\t--disable-anti-alias-hud:  disable anti aliased hud" << endl;
+    cout << "\t--enable-anti-alias-hud:  enable anti aliased hud" << endl;
     cout << endl;
  
     cout << "Flight Model:" << endl;
@@ -896,6 +975,7 @@ void fgOPTIONS::usage ( void ) {
     cout << "\t--model-hz=n:  run the FDM this rate (iterations per second)" 
         << endl;
     cout << "\t--speed=n:  run the FDM this much faster than real time" << endl;
+    cout << "\t--notrim:  Do NOT attempt to trim the model when initializing JSBsim" << endl;
     cout << endl;
     //(UIUC)
     cout <<"Aircraft model directory" << endl;
@@ -922,6 +1002,8 @@ void fgOPTIONS::usage ( void ) {
     cout << "\t--wBody=feet per second:  velocity along the body Z axis"
         << endl;
     cout << "\t\t(unless --units-meters specified" << endl;
+    cout << "\t--vc= initial airspeed in knots (--fdm=jsb only)" << endl;
+    cout << "\t--mach= initial mach number (--fdm=jsb only)" << endl;
     cout << endl;
 
     cout << "Rendering Options:" << endl;
@@ -975,6 +1057,8 @@ void fgOPTIONS::usage ( void ) {
     cout << "" << endl;
 
     cout << "Network Options:" << endl;
+    cout << "\t--enable-network-olk:  enable Multipilot mode" << endl;
+    cout << "\t--disable-network-olk:  disable Multipilot mode (default)" << endl;
     cout << "\t--net-hud:  Hud displays network info" << endl;
     cout << "\t--net-id=name:  specify your own callsign" << endl;
 #endif