]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/options.cxx
Panel tweaks to support "shaped" panels.
[flightgear.git] / src / Main / options.cxx
index 5f59043847118e4d95351a27f583e1359a63fa04..4cf73e7779ffa3a3b40efa08c8736502376c4751 100644 (file)
@@ -45,6 +45,7 @@ bool global_fullscreen = true;
 #include <simgear/timing/sg_time.hxx>
 
 #include <Include/general.hxx>
+#include <Airports/simple.hxx>
 #include <Cockpit/cockpit.hxx>
 #include <FDM/flight.hxx>
 #include <FDM/UIUCModel/uiuc_aircraftdir.h>
@@ -52,6 +53,7 @@ bool global_fullscreen = true;
 #  include <NetworkOLK/network.h>
 #endif
 
+#include "fg_init.hxx"
 #include "globals.hxx"
 #include "options.hxx"
 #include "views.hxx"
@@ -160,8 +162,8 @@ fgOPTIONS::fgOPTIONS() :
     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),
 
@@ -182,8 +184,8 @@ fgOPTIONS::fgOPTIONS() :
     skyblend(1),
     textures(1),
     wireframe(0),
-    xsize(640),
-    ysize(480),
+    xsize(800),
+    ysize(600),
     bpp(16),
     view_mode(FG_VIEW_PILOT),
 
@@ -214,7 +216,7 @@ fgOPTIONS::fgOPTIONS() :
 
 #if defined( WIN32 )
        fg_root = "\\FlightGear";
-#elif defined( MACOS )
+#elif defined( macintosh )
        fg_root = "";
 #else
        fg_root = PKGLIBDIR;
@@ -233,7 +235,7 @@ fgOPTIONS::fgOPTIONS() :
        fg_scenery = "";
     }
 
-    airport_id = "";           // default airport id
+    airport_id = "KPAO";       // default airport id
     net_id = "Johnney";                // default pilot's name
 
     // initialize port config string list
@@ -257,11 +259,14 @@ 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);
     fgReshape( current_view.get_winWidth(), current_view.get_winHeight() );
 
@@ -586,6 +591,36 @@ fgOPTIONS::parse_channel( const string& type, const string& channel_str ) {
 }
 
 
+// Parse --wp=ID[,alt]
+bool fgOPTIONS::parse_wp( const string& arg ) {
+    string id, alt_str;
+    double alt = 0.0;
+
+    int 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 ( units == FG_UNITS_FEET ) {
+           alt *= FEET_TO_METER;
+       }
+    } else {
+       id = arg;
+    }
+
+    FGAirport a;
+    if ( fgFindAirportID( id, &a ) ) {
+       SGWayPoint wp( a.longitude, a.latitude, alt, SGWayPoint::WGS84, id );
+       globals->get_route()->add_waypoint( wp );
+
+       return true;
+    } else {
+       return false;
+    }
+}
+
+
 // Parse a single option
 int fgOPTIONS::parse_option( const string& arg ) {
     // General Options
@@ -633,24 +668,32 @@ 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" ) {
        sound = true;
     } else if ( arg.find( "--airport-id=") != string::npos ) {
        airport_id = arg.substr( 13 );
+       current_properties.setStringValue("/position/airport-id", airport_id);
     } else if ( arg.find( "--lon=" ) != string::npos ) {
        lon = parse_degree( arg.substr(6) );
+       airport_id = "";
+       current_properties.setDoubleValue("/position/longitude", lon);
+       current_properties.setStringValue("/position/airport-id", airport_id);
     } else if ( arg.find( "--lat=" ) != string::npos ) {
        lat = parse_degree( arg.substr(6) );
+       airport_id = "";
+       current_properties.setDoubleValue("/position/latitude", lat);
+       current_properties.setStringValue("/position/airport-id", airport_id);
     } 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 ) {
@@ -658,6 +701,7 @@ int fgOPTIONS::parse_option( const string& arg ) {
        } 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 ) {
@@ -665,6 +709,7 @@ int fgOPTIONS::parse_option( const string& arg ) {
        } 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 ) {
@@ -672,6 +717,7 @@ int fgOPTIONS::parse_option( const string& arg ) {
        } 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) );
@@ -681,16 +727,20 @@ int fgOPTIONS::parse_option( const string& arg ) {
        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 {
@@ -698,6 +748,7 @@ int fgOPTIONS::parse_option( const string& arg ) {
     }        
     } 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 ) {
@@ -813,6 +864,8 @@ int fgOPTIONS::parse_option( const string& arg ) {
        parse_channel( "garmin", arg.substr(9) );
     } else if ( arg.find( "--nmea=" ) != string::npos ) {
        parse_channel( "nmea", arg.substr(7) );
+    } else if ( arg.find( "--props=" ) != string::npos ) {
+       parse_channel( "props", arg.substr(8) );
     } else if ( arg.find( "--pve=" ) != string::npos ) {
        parse_channel( "pve", arg.substr(6) );
     } else if ( arg.find( "--ray=" ) != string::npos ) {
@@ -843,6 +896,8 @@ int fgOPTIONS::parse_option( const string& arg ) {
        current_properties.setStringValue(name.c_str(), value);
        FG_LOG(FG_GENERAL, FG_INFO, "Setting default value of property "
               << name << " to \"" << value << '"');
+    } else if ( arg.find( "--wp=" ) != string::npos ) {
+       parse_wp( arg.substr( 5 ) );
     } else {
        FG_LOG( FG_GENERAL, FG_ALERT, "Unknown option '" << arg << "'" );
        return FG_OPTIONS_ERROR;
@@ -852,6 +907,66 @@ int fgOPTIONS::parse_option( const string& arg ) {
 }
 
 
+// Scan the command line options for an fg_root definition and set
+// just that.
+int fgOPTIONS::scan_command_line_for_root( int argc, char **argv ) {
+    int i = 1;
+    int result;
+
+    FG_LOG(FG_GENERAL, FG_INFO, "Processing command line arguments");
+
+    while ( i < argc ) {
+       FG_LOG( FG_GENERAL, FG_DEBUG, "argv[" << i << "] = " << argv[i] );
+
+       string arg = argv[i];
+       if ( arg.find( "--fg-root=" ) != string::npos ) {
+           fg_root = arg.substr( 10 );
+       }
+
+       i++;
+    }
+    
+    return FG_OPTIONS_OK;
+}
+
+
+// Scan the config file for an fg_root definition and set just that.
+int fgOPTIONS::scan_config_file_for_root( const string& path ) {
+    fg_gzifstream in( path );
+    if ( !in.is_open() )
+       return(FG_OPTIONS_ERROR);
+
+    FG_LOG( FG_GENERAL, FG_INFO, "Processing config file: " << path );
+
+    in >> skipcomment;
+#ifndef __MWERKS__
+    while ( ! in.eof() ) {
+#else
+    char c = '\0';
+    while ( in.get(c) && c != '\0' ) {
+       in.putback(c);
+#endif
+       string line;
+
+#ifdef GETLINE_NEEDS_TERMINATOR
+        getline( in, line, '\n' );
+#elif defined( macintosh )
+       getline( in, line, '\r' );
+#else
+        getline( in, line );
+#endif
+
+       if ( line.find( "--fg-root=" ) != string::npos ) {
+           fg_root = line.substr( 10 );
+       }
+
+       in >> skipcomment;
+    }
+
+    return FG_OPTIONS_OK;
+}
+
+
 // Parse the command line options
 int fgOPTIONS::parse_command_line( int argc, char **argv ) {
     int i = 1;
@@ -870,7 +985,7 @@ int fgOPTIONS::parse_command_line( int argc, char **argv ) {
        i++;
     }
     
-    return(FG_OPTIONS_OK);
+    return FG_OPTIONS_OK;
 }
 
 
@@ -894,7 +1009,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 );
@@ -962,7 +1077,7 @@ void fgOPTIONS::usage ( void ) {
     cout << "\t--notrim:  Do NOT attempt to trim the model when initializing JSBsim" << endl;
     cout << endl;
     //(UIUC)
-    cout <<"Aircraft model directory" << endl;
+    cout <<"Aircraft model directory:" << endl;
     cout <<"\t--aircraft-dir=<path> path is relative to the path of the executable" << endl;
     cout << endl;
 
@@ -1038,12 +1153,21 @@ void fgOPTIONS::usage ( void ) {
     cout << "\t--start-date-lat=yyyy:mm:dd:hh:mm:ss: specify a starting" << endl
         << "\t\tdate/time. Uses Local Aircraft Time" << endl;
 #ifdef FG_NETWORK_OLK
-    cout << "" << endl;
+    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
+
+    cout << endl;
+    cout << "Route/Way Point Options:" << endl;
+    cout << "\t--wp=ID[@alt]:  specify a waypoint for the GC autopilot" << endl;
+    cout << "\t\tYou can specify multiple waypoints (a route) with multiple"
+        << endl;
+    cout << "\t\tinstances of --wp=" << endl;
 }