X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Foptions.cxx;h=4cf73e7779ffa3a3b40efa08c8736502376c4751;hb=5018278831a8340f3abbc27965b763931159cbf3;hp=f8bc50070dcaeec1d46a41be25c3f72da787d967;hpb=342554fadb990680ac23eb04b8dbffe36b5e2d73;p=flightgear.git diff --git a/src/Main/options.cxx b/src/Main/options.cxx index f8bc50070..4cf73e777 100644 --- a/src/Main/options.cxx +++ b/src/Main/options.cxx @@ -45,6 +45,7 @@ bool global_fullscreen = true; #include #include +#include #include #include #include @@ -52,6 +53,7 @@ bool global_fullscreen = true; # include #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), @@ -208,20 +210,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 = "KPAO"; // default airport id net_id = "Johnney"; // default pilot's name // initialize port config string list @@ -245,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() ); @@ -554,10 +571,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 // @@ -573,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 @@ -620,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 ) { @@ -645,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 ) { @@ -652,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 ) { @@ -659,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) ); @@ -668,14 +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 { @@ -683,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 ) { @@ -798,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 ) { @@ -828,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; @@ -837,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; @@ -855,7 +985,7 @@ int fgOPTIONS::parse_command_line( int argc, char **argv ) { i++; } - return(FG_OPTIONS_OK); + return FG_OPTIONS_OK; } @@ -879,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 ); @@ -907,6 +1037,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; @@ -944,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 is relative to the path of the executable" << endl; cout << endl; @@ -1020,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; }