-//
// 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 )
// 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),
// lon(-73.5),
// lat( 10.0),
- // Test Position
- // lon( 8.5),
- // lat(47.5),
-
// Timms Hill (WI)
// lon(-90.1953055556),
// lat( 45.4511388889),
sound(1),
// Flight Model options
- flight_model(FG_LARCSIM),
+ flight_model(FGState::FG_LARCSIM),
// Rendering options
fog(FG_FOG_NICEST), // nicest
skyblend(1),
textures(1),
wireframe(0),
+ xsize(640),
+ ysize(480),
// Scenery options
tile_diameter(5),
// Time options
time_offset(0)
+
{
// set initial values/defaults
char* envp = ::getenv( "FG_ROOT" );
}
airport_id = ""; // default airport id
+
+ // initialize port config string list
+ port_options_list.erase ( port_options_list.begin(),
+ port_options_list.end() );
}
// 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;
}
}
+// 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
} 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 ) {
} 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" ) {
} 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;
}
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) ) {
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;
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");
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");
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");
// $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.