]> git.mxchange.org Git - flightgear.git/blobdiff - Main/options.cxx
Renamed FlightGear/Simulator/Flight to FlightGear/Simulator/FDM since
[flightgear.git] / Main / options.cxx
index 1cdd667a684f86e53cf3602e577c08343d92c671..d889c7bbf92b894ad92a987839a46da90b1d48c7 100644 (file)
@@ -1,4 +1,3 @@
-//
 // options.cxx -- class to handle command line options
 //
 // Written by Curtis Olson, started April 1998.
 #include <string.h>
 #include <string>
 
-#include <Debug/fg_debug.h>
-#include <Flight/flight.hxx>
+#include <Debug/logstream.hxx>
+#include <FDM/flight.hxx>
 #include <Include/fg_constants.h>
+#include <Main/options.hxx>
 #include <Misc/fgstream.hxx>
 
-#include "options.hxx"
+#include "fg_serial.hxx"
 
-const int fgOPTIONS::FG_RADIUS_MIN;
-const int fgOPTIONS::FG_RADIUS_MAX;
 
 inline double
 atof( const string& str )
@@ -92,10 +90,6 @@ fgOPTIONS::fgOPTIONS() :
     // lon(-111.7884614 + 0.01),
     // lat(  34.8486289 - 0.015),
 
-    // Somewhere near the Grand Canyon
-    // lon(-112.5),
-    // lat(  36.5),
-
     // Jim Brennon's Kingmont Observatory
     // lon(-121.1131667),
     // lat(  38.8293917),
@@ -108,10 +102,6 @@ fgOPTIONS::fgOPTIONS() :
     // lon(-73.5),
     // lat( 10.0),
 
-    // Test Position
-    // lon( 8.5),
-    // lat(47.5),
-
     // Timms Hill (WI)
     // lon(-90.1953055556),
     // lat( 45.4511388889),
@@ -138,7 +128,7 @@ fgOPTIONS::fgOPTIONS() :
     sound(1),
 
     // Flight Model options
-    flight_model(FG_LARCSIM),
+    flight_model(FGState::FG_LARCSIM),
 
     // Rendering options
     fog(FG_FOG_NICEST),  // nicest
@@ -148,15 +138,19 @@ fgOPTIONS::fgOPTIONS() :
     skyblend(1),
     textures(1),
     wireframe(0),
+    xsize(640),
+    ysize(480),
 
     // Scenery options
     tile_diameter(5),
 
     // HUD options
+    units(FG_UNITS_FEET),
     tris_or_culled(0),
        
     // Time options
     time_offset(0)
+
 {
     // set initial values/defaults
     char* envp = ::getenv( "FG_ROOT" );
@@ -178,6 +172,10 @@ fgOPTIONS::fgOPTIONS() :
     }
 
     airport_id = "";  // default airport id
+
+    // initialize port config string list
+    port_options_list.erase ( port_options_list.begin(), 
+                             port_options_list.end() );
 }
 
 
@@ -311,16 +309,18 @@ fgOPTIONS::parse_flight_model( const string& fm ) {
     // printf("flight model = %s\n", fm);
 
     if ( fm == "slew" ) {
-       return(FG_SLEW);
+       return FGState::FG_SLEW;
     } else if ( (fm == "larcsim") || (fm == "LaRCsim") ) {
-       return(FG_LARCSIM);
+       return FGState::FG_LARCSIM;
+    } else if ( fm == "external" ) {
+       return FGState::FG_EXTERNAL;
     } else {
-       fgPrintf( FG_GENERAL, FG_EXIT, "Unknown flight model = %s\n",
-                 fm.c_str());
+       FG_LOG( FG_GENERAL, FG_ALERT, "Unknown flight model = " << fm );
+       exit(-1);
     }
 
     // we'll never get here, but it makes the compiler happy.
-    return(-1);
+    return -1;
 }
 
 
@@ -338,6 +338,36 @@ fgOPTIONS::parse_fov( const string& arg ) {
 }
 
 
+// Parse serial port option --serial=/dev/ttyS1,nmea,4800,out
+//
+// Format is "--serial=device,format,baud,direction" where
+// 
+//  device = OS device name to be open()'ed
+//  format = {nmea, fgfs}
+//  baud = {300, 1200, 2400, ..., 230400}
+//  direction = {in, out, bi}
+
+bool 
+fgOPTIONS::parse_serial( const string& serial_str ) {
+    string::size_type pos;
+
+    // cout << "Serial string = " << serial_str << endl;
+
+    // a flailing attempt to see if the port config string has a
+    // chance at being valid
+    pos = serial_str.find(",");
+    if ( pos == string::npos ) {
+       FG_LOG( FG_GENERAL, FG_ALERT, 
+               "Malformed serial port configure string" );
+       return false;
+    }
+    
+    port_options_list.push_back( serial_str );
+
+    return true;
+}
+
+
 // Parse a single option
 int fgOPTIONS::parse_option( const string& arg ) {
     // General Options
@@ -383,7 +413,11 @@ int fgOPTIONS::parse_option( const string& arg ) {
     } else if ( arg.find( "--lat=" ) != string::npos ) {
        lat = parse_degree( arg.substr(6) );
     } else if ( arg.find( "--altitude=" ) != string::npos ) {
-       altitude = atof( arg.substr(11) );
+       if ( units == FG_UNITS_FEET ) {
+           altitude = atof( arg.substr(11) ) * FEET_TO_METER;
+       } else {
+           altitude = atof( arg.substr(11) );
+       }
     } else if ( arg.find( "--heading=" ) != string::npos ) {
        heading = atof( arg.substr(10) );
     } else if ( arg.find( "--roll=" ) != string::npos ) {
@@ -417,11 +451,30 @@ int fgOPTIONS::parse_option( const string& arg ) {
     } else if ( arg == "--disable-textures" ) {
        textures = false;       
     } else if ( arg == "--enable-textures" ) {
-       textures = true;        
+       textures = true;
     } else if ( arg == "--disable-wireframe" ) {
        wireframe = false;      
     } else if ( arg == "--enable-wireframe" ) {
-       wireframe = true;       
+       wireframe = true;
+    } else if ( arg.find( "--geometry=" ) != string::npos ) {
+       string geometry = arg.substr( 11 );
+       if ( geometry == "640x480" ) {
+           xsize = 640;
+           ysize = 480;
+       } else if ( geometry == "800x600" ) {
+           xsize = 800;
+           ysize = 600;
+       } else if ( geometry == "1024x768" ) {
+           xsize = 1024;
+           ysize = 768;
+       } else {
+           FG_LOG( FG_GENERAL, FG_ALERT, "Unknown geometry: " << geometry );
+           exit(-1);
+       }
+    } else if ( arg == "--units-feet" ) {
+       units = FG_UNITS_FEET;  
+    } else if ( arg == "--units-meters" ) {
+       units = FG_UNITS_METERS;        
     } else if ( arg.find( "--tile-radius=" ) != string::npos ) {
        tile_radius = parse_tile_radius( arg.substr(14) );
        tile_diameter = tile_radius * 2 + 1;
@@ -430,14 +483,15 @@ int fgOPTIONS::parse_option( const string& arg ) {
     } else if ( arg == "--hud-tris" ) {
        tris_or_culled = 0;     
     } else if ( arg == "--hud-culled" ) {
-       tris_or_culled = 1;     
+       tris_or_culled = 1;
+    } else if ( arg.find( "--serial=" ) != string::npos ) {
+       parse_serial( arg.substr(9) );
     } else {
-       fgPrintf( FG_GENERAL, FG_EXIT, "Unknown option '%s'\n",
-                 arg.c_str() );
-       return(FG_OPTIONS_ERROR);
+       FG_LOG( FG_GENERAL, FG_ALERT, "Unknown option '" << arg << "'" );
+       return FG_OPTIONS_ERROR;
     }
     
-    return(FG_OPTIONS_OK);
+    return FG_OPTIONS_OK;
 }
 
 
@@ -446,10 +500,10 @@ int fgOPTIONS::parse_command_line( int argc, char **argv ) {
     int i = 1;
     int result;
 
-    fgPrintf(FG_GENERAL, FG_INFO, "Processing command line arguments\n");
+    FG_LOG(FG_GENERAL, FG_INFO, "Processing command line arguments");
 
     while ( i < argc ) {
-       fgPrintf(FG_GENERAL, FG_DEBUG, "argv[%d] = %s\n", i, argv[i]);
+       FG_LOG( FG_GENERAL, FG_DEBUG, "argv[" << i << "] = " << argv[i] );
 
        result = parse_option(argv[i]);
        if ( (result == FG_OPTIONS_HELP) || (result == FG_OPTIONS_ERROR) ) {
@@ -469,21 +523,21 @@ int fgOPTIONS::parse_config_file( const string& path ) {
     if ( !in )
        return(FG_OPTIONS_ERROR);
 
-    fgPrintf( FG_GENERAL, FG_INFO, "Processing config file: %s\n",
-             path.c_str() );
+    FG_LOG( FG_GENERAL, FG_INFO, "Processing config file: " << path );
 
-    in.eat_comments();
+    in >> skipcomment;
     while ( !in.eof() )
     {
        string line;
-       getline( in.stream(), line );
+       getline( in, line );
 
        if ( parse_option( line ) == FG_OPTIONS_ERROR ) {
-           fgPrintf( FG_GENERAL, FG_EXIT, 
-                     "Config file parse error: %s '%s'\n",
-                     path.c_str(), line.c_str() );
+           FG_LOG( FG_GENERAL, FG_ALERT, 
+                   "Config file parse error: " << path << " '" 
+                   << line << "'" );
+           exit(-1);
        }
-       in.eat_comments();
+       in >> skipcomment;
     }
 
     return FG_OPTIONS_OK;
@@ -520,11 +574,16 @@ void fgOPTIONS::usage ( void ) {
     printf("\t--enable-sound:  enable sound effects\n");
     printf("\n");
  
+    printf("Flight Model:\n");
+    printf("\t--flight-mode=abcd:  one of slew, larcsim, or external\n");
+    printf("\n");
+
     printf("Initial Position and Orientation:\n");
     printf("\t--airport-id=ABCD:  specify starting postion by airport id\n");
     printf("\t--lon=degrees:  starting longitude in degrees (west = -)\n");
     printf("\t--lat=degrees:  starting latitude in degrees (south = -)\n");
-    printf("\t--altitude=meters:  starting altitude in meters\n");
+    printf("\t--altitude=feet:  starting altitude in feet\n");
+    printf("\t\t(unless --units-meters specified\n");
     printf("\t--heading=degrees:  heading (yaw) angle in degress (Psi)\n");
     printf("\t--roll=degrees:  roll angle in degrees (Phi)\n");
     printf("\t--pitch=degrees:  pitch angle in degrees (Theta)\n");
@@ -545,6 +604,7 @@ void fgOPTIONS::usage ( void ) {
     printf("\t--enable-textures:  enable textures\n");
     printf("\t--disable-wireframe:  disable wireframe drawing mode\n");
     printf("\t--enable-wireframe:  enable wireframe drawing mode\n");
+    printf("\t--geometry=WWWxHHH:  window geometry: 640x480, 800x600, etc.\n");
     printf("\n");
 
     printf("Scenery Options:\n");
@@ -552,8 +612,11 @@ void fgOPTIONS::usage ( void ) {
     printf("\n");
 
     printf("Hud Options:\n");
+    printf("\t--units-feet:  Hud displays units in feet\n");
+    printf("\t--units-meters:  Hud displays units in meters\n");
     printf("\t--hud-tris:  Hud displays number of triangles rendered\n");
     printf("\t--hud-culled:  Hud displays percentage of triangles culled\n");
+    printf("\n");
        
     printf("Time Options:\n");
     printf("\t--time-offset=[+-]hh:mm:ss:  offset local time by this amount\n");
@@ -566,6 +629,54 @@ fgOPTIONS::~fgOPTIONS( void ) {
 
 
 // $Log$
+// Revision 1.38  1999/02/01 21:33:35  curt
+// Renamed FlightGear/Simulator/Flight to FlightGear/Simulator/FDM since
+// Jon accepted my offer to do this and thought it was a good idea.
+//
+// Revision 1.37  1999/01/19 20:57:05  curt
+// MacOS portability changes contributed by "Robert Puyol" <puyol@abvent.fr>
+//
+// Revision 1.36  1999/01/07 20:25:10  curt
+// Updated struct fgGENERAL to class FGGeneral.
+//
+// Revision 1.35  1998/12/06 14:52:57  curt
+// Fixed a problem with the initial starting altitude.  "v->abs_view_pos" wasn't
+// being calculated correctly at the beginning causing the first terrain
+// intersection to fail, returning a ground altitude of zero, causing the plane
+// to free fall for one frame, until the ground altitude was corrected, but now
+// being under the ground we got a big bounce and the plane always ended up
+// upside down.
+//
+// Revision 1.34  1998/12/05 15:54:22  curt
+// Renamed class fgFLIGHT to class FGState as per request by JSB.
+//
+// Revision 1.33  1998/12/04 01:30:44  curt
+// Added support for the External flight model.
+//
+// Revision 1.32  1998/11/25 01:34:00  curt
+// Support for an arbitrary number of serial ports.
+//
+// Revision 1.31  1998/11/23 21:49:04  curt
+// Borland portability tweaks.
+//
+// Revision 1.30  1998/11/16 14:00:02  curt
+// Added pow() macro bug work around.
+// Added support for starting FGFS at various resolutions.
+// Added some initial serial port support.
+// Specify default log levels in main().
+//
+// Revision 1.29  1998/11/06 21:18:12  curt
+// Converted to new logstream debugging facility.  This allows release
+// builds with no messages at all (and no performance impact) by using
+// the -DFG_NDEBUG flag.
+//
+// Revision 1.28  1998/11/06 14:47:03  curt
+// Changes to track Bernie's updates to fgstream.
+//
+// Revision 1.27  1998/11/02 23:04:04  curt
+// HUD units now display in feet by default with meters being a command line
+// option.
+//
 // Revision 1.26  1998/10/17 01:34:24  curt
 // C++ ifying ...
 //