1998-04-24 00:49:17 +00:00
|
|
|
// options.cxx -- class to handle command line options
|
|
|
|
//
|
|
|
|
// Written by Curtis Olson, started April 1998.
|
|
|
|
//
|
|
|
|
// Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu
|
|
|
|
//
|
|
|
|
// This program is free software; you can redistribute it and/or
|
|
|
|
// modify it under the terms of the GNU General Public License as
|
|
|
|
// published by the Free Software Foundation; either version 2 of the
|
|
|
|
// License, or (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This program is distributed in the hope that it will be useful, but
|
|
|
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
// General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with this program; if not, write to the Free Software
|
|
|
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
//
|
|
|
|
// $Id$
|
|
|
|
|
|
|
|
|
1998-04-26 05:01:19 +00:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include <config.h>
|
|
|
|
#endif
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
#include <simgear/compiler.h>
|
2001-07-19 04:53:13 +00:00
|
|
|
#include <simgear/misc/exception.hxx>
|
1999-03-02 01:02:31 +00:00
|
|
|
|
2002-03-20 22:15:22 +00:00
|
|
|
#include <math.h> // rint()
|
1998-04-24 00:49:17 +00:00
|
|
|
#include <stdio.h>
|
2002-03-20 22:15:22 +00:00
|
|
|
#include <stdlib.h> // atof(), atoi()
|
|
|
|
#include <string.h> // strcmp()
|
2003-02-11 21:17:36 +00:00
|
|
|
#include <algorithm>
|
1999-03-02 01:02:31 +00:00
|
|
|
|
|
|
|
#include STL_STRING
|
1998-04-24 00:49:17 +00:00
|
|
|
|
2002-08-28 16:59:40 +00:00
|
|
|
#include <plib/ul.h>
|
|
|
|
|
2002-07-26 02:49:14 +00:00
|
|
|
#include <simgear/math/sg_random.h>
|
2001-03-25 14:20:12 +00:00
|
|
|
#include <simgear/misc/sgstream.hxx>
|
2002-03-16 00:18:38 +00:00
|
|
|
#include <simgear/misc/sg_path.hxx>
|
|
|
|
#include <simgear/route/route.hxx>
|
|
|
|
#include <simgear/route/waypoint.hxx>
|
2001-01-13 22:06:39 +00:00
|
|
|
|
|
|
|
// #include <Include/general.hxx>
|
|
|
|
// #include <Airports/simple.hxx>
|
|
|
|
// #include <Cockpit/cockpit.hxx>
|
|
|
|
// #include <FDM/flight.hxx>
|
|
|
|
// #include <FDM/UIUCModel/uiuc_aircraftdir.h>
|
1999-06-30 20:21:04 +00:00
|
|
|
#ifdef FG_NETWORK_OLK
|
2000-01-12 18:09:35 +00:00
|
|
|
# include <NetworkOLK/network.h>
|
1999-06-30 20:21:04 +00:00
|
|
|
#endif
|
1998-04-24 00:49:17 +00:00
|
|
|
|
2001-07-19 04:53:13 +00:00
|
|
|
#include <GUI/gui.h>
|
|
|
|
|
2000-07-07 20:28:51 +00:00
|
|
|
#include "globals.hxx"
|
2001-01-13 22:06:39 +00:00
|
|
|
#include "fg_init.hxx"
|
|
|
|
#include "fg_props.hxx"
|
1999-05-06 22:16:12 +00:00
|
|
|
#include "options.hxx"
|
2001-07-22 19:51:16 +00:00
|
|
|
#include "viewmgr.hxx"
|
1998-11-16 13:59:58 +00:00
|
|
|
|
2002-10-04 15:19:07 +00:00
|
|
|
|
2001-03-23 22:59:18 +00:00
|
|
|
SG_USING_STD(string);
|
2003-02-11 21:17:36 +00:00
|
|
|
SG_USING_STD(sort);
|
2001-03-23 22:59:18 +00:00
|
|
|
SG_USING_NAMESPACE(std);
|
1999-03-02 01:02:31 +00:00
|
|
|
|
1998-11-16 13:59:58 +00:00
|
|
|
|
2001-01-13 22:06:39 +00:00
|
|
|
#define NEW_DEFAULT_MODEL_HZ 120
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
FG_OPTIONS_OK = 0,
|
|
|
|
FG_OPTIONS_HELP = 1,
|
2002-08-25 22:38:20 +00:00
|
|
|
FG_OPTIONS_ERROR = 2,
|
2002-08-28 16:59:40 +00:00
|
|
|
FG_OPTIONS_VERBOSE_HELP = 3,
|
|
|
|
FG_OPTIONS_SHOW_AIRCRAFT = 4
|
2001-01-13 22:06:39 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
static double
|
1998-08-27 17:01:55 +00:00
|
|
|
atof( const string& str )
|
|
|
|
{
|
1999-04-27 19:27:45 +00:00
|
|
|
|
2003-03-19 20:45:09 +00:00
|
|
|
#ifdef __MWERKS__
|
1999-04-27 19:27:45 +00:00
|
|
|
// -dw- if ::atof is called, then we get an infinite loop
|
|
|
|
return std::atof( str.c_str() );
|
|
|
|
#else
|
1998-08-27 17:01:55 +00:00
|
|
|
return ::atof( str.c_str() );
|
1999-04-27 19:27:45 +00:00
|
|
|
#endif
|
1998-08-27 17:01:55 +00:00
|
|
|
}
|
|
|
|
|
2001-01-13 22:06:39 +00:00
|
|
|
static int
|
1998-08-27 17:01:55 +00:00
|
|
|
atoi( const string& str )
|
|
|
|
{
|
2003-03-19 20:45:09 +00:00
|
|
|
#ifdef __MWERKS__
|
1999-04-27 19:27:45 +00:00
|
|
|
// -dw- if ::atoi is called, then we get an infinite loop
|
|
|
|
return std::atoi( str.c_str() );
|
|
|
|
#else
|
1998-08-27 17:01:55 +00:00
|
|
|
return ::atoi( str.c_str() );
|
1999-04-27 19:27:45 +00:00
|
|
|
#endif
|
1998-08-27 17:01:55 +00:00
|
|
|
}
|
1998-04-24 00:49:17 +00:00
|
|
|
|
2000-02-29 17:13:02 +00:00
|
|
|
|
2001-01-13 22:06:39 +00:00
|
|
|
/**
|
|
|
|
* Set a few fail-safe default property values.
|
|
|
|
*
|
|
|
|
* These should all be set in $FG_ROOT/preferences.xml, but just
|
2003-03-19 20:45:09 +00:00
|
|
|
* in case, we provide some initial sane values here. This method
|
2001-01-13 22:06:39 +00:00
|
|
|
* should be invoked *before* reading any init files.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
fgSetDefaults ()
|
1998-08-27 17:01:55 +00:00
|
|
|
{
|
2000-07-14 16:57:55 +00:00
|
|
|
// set a possibly independent location for scenery data
|
2001-01-13 22:06:39 +00:00
|
|
|
char *envp = ::getenv( "FG_SCENERY" );
|
2000-07-14 16:57:55 +00:00
|
|
|
|
|
|
|
if ( envp != NULL ) {
|
|
|
|
// fg_root could be anywhere, so default to environmental
|
|
|
|
// variable $FG_ROOT if it is set.
|
2001-01-12 15:37:40 +00:00
|
|
|
globals->set_fg_scenery(envp);
|
2000-07-14 16:57:55 +00:00
|
|
|
} else {
|
|
|
|
// Otherwise, default to Scenery being in $FG_ROOT/Scenery
|
2001-01-12 15:37:40 +00:00
|
|
|
globals->set_fg_scenery("");
|
2000-07-14 16:57:55 +00:00
|
|
|
}
|
2002-05-01 23:13:36 +00:00
|
|
|
// Position (deliberately out of range)
|
|
|
|
fgSetDouble("/position/longitude-deg", 9999.0);
|
|
|
|
fgSetDouble("/position/latitude-deg", 9999.0);
|
2001-07-02 22:27:24 +00:00
|
|
|
fgSetDouble("/position/altitude-ft", -9999.0);
|
2001-01-12 15:37:40 +00:00
|
|
|
|
|
|
|
// Orientation
|
2001-07-02 22:27:24 +00:00
|
|
|
fgSetDouble("/orientation/heading-deg", 270);
|
|
|
|
fgSetDouble("/orientation/roll-deg", 0);
|
|
|
|
fgSetDouble("/orientation/pitch-deg", 0.424);
|
2001-01-12 15:37:40 +00:00
|
|
|
|
|
|
|
// Velocities
|
2001-07-02 22:27:24 +00:00
|
|
|
fgSetDouble("/velocities/uBody-fps", 0.0);
|
|
|
|
fgSetDouble("/velocities/vBody-fps", 0.0);
|
|
|
|
fgSetDouble("/velocities/wBody-fps", 0.0);
|
|
|
|
fgSetDouble("/velocities/speed-north-fps", 0.0);
|
|
|
|
fgSetDouble("/velocities/speed-east-fps", 0.0);
|
|
|
|
fgSetDouble("/velocities/speed-down-fps", 0.0);
|
|
|
|
fgSetDouble("/velocities/airspeed-kt", 0.0);
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetDouble("/velocities/mach", 0.0);
|
2001-01-12 15:37:40 +00:00
|
|
|
|
2002-11-15 21:13:29 +00:00
|
|
|
// Presets
|
|
|
|
fgSetDouble("/sim/presets/longitude-deg", 9999.0);
|
|
|
|
fgSetDouble("/sim/presets/latitude-deg", 9999.0);
|
|
|
|
fgSetDouble("/sim/presets/altitude-ft", -9999.0);
|
|
|
|
|
|
|
|
fgSetDouble("/sim/presets/heading-deg", 270);
|
|
|
|
fgSetDouble("/sim/presets/roll-deg", 0);
|
|
|
|
fgSetDouble("/sim/presets/pitch-deg", 0.424);
|
|
|
|
|
|
|
|
fgSetString("/sim/presets/speed-set", "knots");
|
|
|
|
fgSetDouble("/sim/presets/airspeed-kt", 0.0);
|
|
|
|
fgSetDouble("/sim/presets/mach", 0.0);
|
|
|
|
fgSetDouble("/sim/presets/uBody-fps", 0.0);
|
|
|
|
fgSetDouble("/sim/presets/vBody-fps", 0.0);
|
|
|
|
fgSetDouble("/sim/presets/wBody-fps", 0.0);
|
|
|
|
fgSetDouble("/sim/presets/speed-north-fps", 0.0);
|
|
|
|
fgSetDouble("/sim/presets/speed-east-fps", 0.0);
|
|
|
|
fgSetDouble("/sim/presets/speed-down-fps", 0.0);
|
|
|
|
|
|
|
|
fgSetBool("/sim/presets/onground", true);
|
|
|
|
fgSetBool("/sim/presets/trim", false);
|
|
|
|
|
2001-01-12 15:37:40 +00:00
|
|
|
// Miscellaneous
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/startup/game-mode", false);
|
|
|
|
fgSetBool("/sim/startup/splash-screen", true);
|
|
|
|
fgSetBool("/sim/startup/intro-music", true);
|
2001-02-26 13:58:33 +00:00
|
|
|
// we want mouse-pointer to have an undefined value if nothing is
|
|
|
|
// specified so we can do the right thing for voodoo-1/2 cards.
|
|
|
|
// fgSetString("/sim/startup/mouse-pointer", "disabled");
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetString("/sim/control-mode", "joystick");
|
|
|
|
fgSetBool("/sim/auto-coordination", false);
|
2001-07-08 23:30:17 +00:00
|
|
|
#if !defined(WIN32)
|
|
|
|
fgSetString("/sim/startup/browser-app", "netscape");
|
|
|
|
#else
|
|
|
|
fgSetString("/sim/startup/browser-app", "webrun.bat");
|
|
|
|
#endif
|
2001-01-12 15:37:40 +00:00
|
|
|
// Features
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/hud/visibility", false);
|
|
|
|
fgSetBool("/sim/panel/visibility", true);
|
2002-02-27 15:13:58 +00:00
|
|
|
fgSetBool("/sim/sound/audible", true);
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/hud/antialiased", false);
|
2001-01-12 15:37:40 +00:00
|
|
|
|
|
|
|
// Flight Model options
|
2001-07-24 01:02:59 +00:00
|
|
|
fgSetString("/sim/flight-model", "jsb");
|
2001-12-06 23:10:50 +00:00
|
|
|
fgSetString("/sim/aero", "c172");
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetInt("/sim/model-hz", NEW_DEFAULT_MODEL_HZ);
|
|
|
|
fgSetInt("/sim/speed-up", 1);
|
2001-01-12 15:37:40 +00:00
|
|
|
|
|
|
|
// Rendering options
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetString("/sim/rendering/fog", "nicest");
|
|
|
|
fgSetBool("/environment/clouds/status", true);
|
|
|
|
fgSetBool("/sim/startup/fullscreen", false);
|
|
|
|
fgSetBool("/sim/rendering/shading", true);
|
|
|
|
fgSetBool("/sim/rendering/skyblend", true);
|
|
|
|
fgSetBool("/sim/rendering/textures", true);
|
|
|
|
fgSetBool("/sim/rendering/wireframe", false);
|
2002-12-30 21:49:56 +00:00
|
|
|
fgSetBool("/sim/rendering/distance-attenuation", false);
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetInt("/sim/startup/xsize", 800);
|
|
|
|
fgSetInt("/sim/startup/ysize", 600);
|
|
|
|
fgSetInt("/sim/rendering/bits-per-pixel", 16);
|
|
|
|
fgSetString("/sim/view-mode", "pilot");
|
2002-04-18 16:51:47 +00:00
|
|
|
fgSetDouble("/sim/current-view/heading-offset-deg", 0);
|
2001-07-02 22:27:24 +00:00
|
|
|
fgSetDouble("/environment/visibility-m", 20000);
|
2001-01-12 15:37:40 +00:00
|
|
|
|
|
|
|
// HUD options
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetString("/sim/startup/units", "feet");
|
|
|
|
fgSetString("/sim/hud/frame-stat-type", "tris");
|
2001-01-12 15:37:40 +00:00
|
|
|
|
|
|
|
// Time options
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetInt("/sim/startup/time-offset", 0);
|
|
|
|
fgSetString("/sim/startup/time-offset-type", "system-offset");
|
2002-02-10 04:27:56 +00:00
|
|
|
fgSetLong("/sim/time/cur-time-override", 0);
|
1998-11-25 01:33:58 +00:00
|
|
|
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/networking/network-olk", false);
|
|
|
|
fgSetString("/sim/networking/call-sign", "Johnny");
|
2002-01-20 03:52:36 +00:00
|
|
|
|
|
|
|
// Freeze options
|
|
|
|
fgSetBool("/sim/freeze/master", false);
|
|
|
|
fgSetBool("/sim/freeze/position", false);
|
2002-02-13 02:37:44 +00:00
|
|
|
fgSetBool("/sim/freeze/clock", false);
|
2002-01-22 15:39:51 +00:00
|
|
|
fgSetBool("/sim/freeze/fuel", false);
|
2003-03-19 20:45:09 +00:00
|
|
|
|
|
|
|
#ifdef FG_MPLAYER_AS
|
|
|
|
fgSetString("/sim/multiplay/callsign", "callsign");
|
|
|
|
fgSetString("/sim/multiplay/rxhost", "0");
|
|
|
|
fgSetString("/sim/multiplay/txhost", "0");
|
|
|
|
fgSetInt("/sim/multiplay/rxport", 0);
|
|
|
|
fgSetInt("/sim/multiplay/txport", 0);
|
|
|
|
#endif
|
|
|
|
|
1998-05-13 18:29:56 +00:00
|
|
|
}
|
|
|
|
|
2001-03-17 21:06:43 +00:00
|
|
|
|
2002-06-09 21:28:17 +00:00
|
|
|
static bool
|
|
|
|
parse_wind (const string &wind, double * min_hdg, double * max_hdg,
|
|
|
|
double * speed, double * gust)
|
|
|
|
{
|
2002-07-02 20:45:02 +00:00
|
|
|
string::size_type pos = wind.find('@');
|
2002-06-09 21:28:17 +00:00
|
|
|
if (pos == string::npos)
|
|
|
|
return false;
|
|
|
|
string dir = wind.substr(0, pos);
|
|
|
|
string spd = wind.substr(pos+1);
|
|
|
|
pos = dir.find(':');
|
|
|
|
if (pos == string::npos) {
|
|
|
|
*min_hdg = *max_hdg = atof(dir.c_str());
|
|
|
|
} else {
|
|
|
|
*min_hdg = atof(dir.substr(0,pos).c_str());
|
|
|
|
*max_hdg = atof(dir.substr(pos+1).c_str());
|
|
|
|
}
|
|
|
|
pos = spd.find(':');
|
|
|
|
if (pos == string::npos) {
|
|
|
|
*speed = *gust = atof(spd.c_str());
|
|
|
|
} else {
|
|
|
|
*speed = atof(spd.substr(0,pos).c_str());
|
|
|
|
*gust = atof(spd.substr(pos+1).c_str());
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2001-03-17 21:06:43 +00:00
|
|
|
// parse a time string ([+/-]%f[:%f[:%f]]) into hours
|
2001-01-13 22:06:39 +00:00
|
|
|
static double
|
|
|
|
parse_time(const string& time_in) {
|
1998-08-27 17:01:55 +00:00
|
|
|
char *time_str, num[256];
|
1998-04-24 00:49:17 +00:00
|
|
|
double hours, minutes, seconds;
|
|
|
|
double result = 0.0;
|
|
|
|
int sign = 1;
|
|
|
|
int i;
|
|
|
|
|
1998-08-27 17:01:55 +00:00
|
|
|
time_str = (char *)time_in.c_str();
|
|
|
|
|
1998-04-24 00:49:17 +00:00
|
|
|
// printf("parse_time(): %s\n", time_str);
|
|
|
|
|
|
|
|
// check for sign
|
|
|
|
if ( strlen(time_str) ) {
|
|
|
|
if ( time_str[0] == '+' ) {
|
|
|
|
sign = 1;
|
|
|
|
time_str++;
|
|
|
|
} else if ( time_str[0] == '-' ) {
|
|
|
|
sign = -1;
|
|
|
|
time_str++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// printf("sign = %d\n", sign);
|
|
|
|
|
|
|
|
// get hours
|
|
|
|
if ( strlen(time_str) ) {
|
|
|
|
i = 0;
|
|
|
|
while ( (time_str[0] != ':') && (time_str[0] != '\0') ) {
|
|
|
|
num[i] = time_str[0];
|
|
|
|
time_str++;
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
if ( time_str[0] == ':' ) {
|
|
|
|
time_str++;
|
|
|
|
}
|
|
|
|
num[i] = '\0';
|
|
|
|
hours = atof(num);
|
|
|
|
// printf("hours = %.2lf\n", hours);
|
|
|
|
|
1998-07-30 23:48:24 +00:00
|
|
|
result += hours;
|
1998-04-24 00:49:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// get minutes
|
|
|
|
if ( strlen(time_str) ) {
|
|
|
|
i = 0;
|
|
|
|
while ( (time_str[0] != ':') && (time_str[0] != '\0') ) {
|
|
|
|
num[i] = time_str[0];
|
|
|
|
time_str++;
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
if ( time_str[0] == ':' ) {
|
|
|
|
time_str++;
|
|
|
|
}
|
|
|
|
num[i] = '\0';
|
|
|
|
minutes = atof(num);
|
|
|
|
// printf("minutes = %.2lf\n", minutes);
|
|
|
|
|
1998-07-30 23:48:24 +00:00
|
|
|
result += minutes / 60.0;
|
1998-04-24 00:49:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// get seconds
|
|
|
|
if ( strlen(time_str) ) {
|
|
|
|
i = 0;
|
|
|
|
while ( (time_str[0] != ':') && (time_str[0] != '\0') ) {
|
|
|
|
num[i] = time_str[0];
|
|
|
|
time_str++;
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
num[i] = '\0';
|
|
|
|
seconds = atof(num);
|
|
|
|
// printf("seconds = %.2lf\n", seconds);
|
|
|
|
|
1998-07-30 23:48:24 +00:00
|
|
|
result += seconds / 3600.0;
|
1998-04-24 00:49:17 +00:00
|
|
|
}
|
|
|
|
|
2002-11-16 20:17:11 +00:00
|
|
|
cout << " parse_time() = " << sign * result << endl;
|
|
|
|
|
1998-04-24 00:49:17 +00:00
|
|
|
return(sign * result);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-03-17 21:06:43 +00:00
|
|
|
// parse a date string (yyyy:mm:dd:hh:mm:ss) into a time_t (seconds)
|
2001-01-13 22:06:39 +00:00
|
|
|
static long int
|
|
|
|
parse_date( const string& date)
|
1999-04-11 13:19:29 +00:00
|
|
|
{
|
1999-05-12 02:07:21 +00:00
|
|
|
struct tm gmt;
|
|
|
|
char * date_str, num[256];
|
|
|
|
int i;
|
|
|
|
// initialize to zero
|
|
|
|
gmt.tm_sec = 0;
|
|
|
|
gmt.tm_min = 0;
|
|
|
|
gmt.tm_hour = 0;
|
|
|
|
gmt.tm_mday = 0;
|
|
|
|
gmt.tm_mon = 0;
|
|
|
|
gmt.tm_year = 0;
|
1999-09-07 23:09:43 +00:00
|
|
|
gmt.tm_isdst = 0; // ignore daylight savings time for the moment
|
1999-05-12 02:07:21 +00:00
|
|
|
date_str = (char *)date.c_str();
|
|
|
|
// get year
|
1999-04-11 13:19:29 +00:00
|
|
|
if ( strlen(date_str) ) {
|
|
|
|
i = 0;
|
|
|
|
while ( (date_str[0] != ':') && (date_str[0] != '\0') ) {
|
|
|
|
num[i] = date_str[0];
|
|
|
|
date_str++;
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
if ( date_str[0] == ':' ) {
|
|
|
|
date_str++;
|
|
|
|
}
|
|
|
|
num[i] = '\0';
|
|
|
|
gmt.tm_year = atoi(num) - 1900;
|
|
|
|
}
|
1999-05-12 02:07:21 +00:00
|
|
|
// get month
|
1999-04-11 13:19:29 +00:00
|
|
|
if ( strlen(date_str) ) {
|
|
|
|
i = 0;
|
|
|
|
while ( (date_str[0] != ':') && (date_str[0] != '\0') ) {
|
|
|
|
num[i] = date_str[0];
|
|
|
|
date_str++;
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
if ( date_str[0] == ':' ) {
|
|
|
|
date_str++;
|
|
|
|
}
|
|
|
|
num[i] = '\0';
|
|
|
|
gmt.tm_mon = atoi(num) -1;
|
|
|
|
}
|
|
|
|
// get day
|
|
|
|
if ( strlen(date_str) ) {
|
|
|
|
i = 0;
|
|
|
|
while ( (date_str[0] != ':') && (date_str[0] != '\0') ) {
|
|
|
|
num[i] = date_str[0];
|
|
|
|
date_str++;
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
if ( date_str[0] == ':' ) {
|
|
|
|
date_str++;
|
|
|
|
}
|
|
|
|
num[i] = '\0';
|
|
|
|
gmt.tm_mday = atoi(num);
|
|
|
|
}
|
|
|
|
// get hour
|
|
|
|
if ( strlen(date_str) ) {
|
|
|
|
i = 0;
|
|
|
|
while ( (date_str[0] != ':') && (date_str[0] != '\0') ) {
|
|
|
|
num[i] = date_str[0];
|
|
|
|
date_str++;
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
if ( date_str[0] == ':' ) {
|
|
|
|
date_str++;
|
|
|
|
}
|
|
|
|
num[i] = '\0';
|
|
|
|
gmt.tm_hour = atoi(num);
|
|
|
|
}
|
|
|
|
// get minute
|
|
|
|
if ( strlen(date_str) ) {
|
|
|
|
i = 0;
|
|
|
|
while ( (date_str[0] != ':') && (date_str[0] != '\0') ) {
|
|
|
|
num[i] = date_str[0];
|
|
|
|
date_str++;
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
if ( date_str[0] == ':' ) {
|
|
|
|
date_str++;
|
|
|
|
}
|
|
|
|
num[i] = '\0';
|
|
|
|
gmt.tm_min = atoi(num);
|
|
|
|
}
|
|
|
|
// get second
|
|
|
|
if ( strlen(date_str) ) {
|
|
|
|
i = 0;
|
|
|
|
while ( (date_str[0] != ':') && (date_str[0] != '\0') ) {
|
|
|
|
num[i] = date_str[0];
|
|
|
|
date_str++;
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
if ( date_str[0] == ':' ) {
|
|
|
|
date_str++;
|
|
|
|
}
|
|
|
|
num[i] = '\0';
|
|
|
|
gmt.tm_sec = atoi(num);
|
|
|
|
}
|
2000-07-07 23:56:43 +00:00
|
|
|
time_t theTime = sgTimeGetGMT( gmt.tm_year, gmt.tm_mon, gmt.tm_mday,
|
|
|
|
gmt.tm_hour, gmt.tm_min, gmt.tm_sec );
|
1999-04-11 13:19:29 +00:00
|
|
|
//printf ("Date is %s\n", ctime(&theTime));
|
|
|
|
//printf ("in seconds that is %d\n", theTime);
|
|
|
|
//exit(1);
|
|
|
|
return (theTime);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-03-17 21:06:43 +00:00
|
|
|
// parse angle in the form of [+/-]ddd:mm:ss into degrees
|
2001-01-13 22:06:39 +00:00
|
|
|
static double
|
|
|
|
parse_degree( const string& degree_str) {
|
1998-08-27 17:01:55 +00:00
|
|
|
double result = parse_time( degree_str );
|
1998-07-30 23:48:24 +00:00
|
|
|
|
|
|
|
// printf("Degree = %.4f\n", result);
|
|
|
|
|
|
|
|
return(result);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-03-17 21:06:43 +00:00
|
|
|
// parse time offset string into seconds
|
2001-01-13 22:06:39 +00:00
|
|
|
static int
|
|
|
|
parse_time_offset( const string& time_str) {
|
1998-04-24 00:49:17 +00:00
|
|
|
int result;
|
|
|
|
|
|
|
|
// printf("time offset = %s\n", time_str);
|
|
|
|
|
1998-04-26 05:01:19 +00:00
|
|
|
#ifdef HAVE_RINT
|
1998-07-30 23:48:24 +00:00
|
|
|
result = (int)rint(parse_time(time_str) * 3600.0);
|
1998-04-26 05:01:19 +00:00
|
|
|
#else
|
1998-07-30 23:48:24 +00:00
|
|
|
result = (int)(parse_time(time_str) * 3600.0);
|
1998-04-26 05:01:19 +00:00
|
|
|
#endif
|
1998-04-24 00:49:17 +00:00
|
|
|
|
1998-07-30 23:48:24 +00:00
|
|
|
// printf("parse_time_offset(): %d\n", result);
|
1998-04-24 00:49:17 +00:00
|
|
|
|
|
|
|
return( result );
|
1998-05-06 03:16:23 +00:00
|
|
|
}
|
|
|
|
|
1998-04-24 00:49:17 +00:00
|
|
|
|
1998-05-13 18:29:56 +00:00
|
|
|
// Parse --fov=x.xx type option
|
2001-01-13 22:06:39 +00:00
|
|
|
static double
|
|
|
|
parse_fov( const string& arg ) {
|
1998-08-27 17:01:55 +00:00
|
|
|
double fov = atof(arg);
|
1998-05-13 18:29:56 +00:00
|
|
|
|
|
|
|
if ( fov < FG_FOV_MIN ) { fov = FG_FOV_MIN; }
|
|
|
|
if ( fov > FG_FOV_MAX ) { fov = FG_FOV_MAX; }
|
|
|
|
|
2002-04-18 16:51:47 +00:00
|
|
|
fgSetDouble("/sim/current-view/field-of-view", fov);
|
2000-11-01 23:27:32 +00:00
|
|
|
|
1998-07-30 23:48:24 +00:00
|
|
|
// printf("parse_fov(): result = %.4f\n", fov);
|
1998-05-13 18:29:56 +00:00
|
|
|
|
2000-11-01 23:27:32 +00:00
|
|
|
return fov;
|
1998-05-13 18:29:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
1999-11-19 02:10:24 +00:00
|
|
|
// Parse I/O channel option
|
1998-11-16 13:59:58 +00:00
|
|
|
//
|
1999-11-19 02:10:24 +00:00
|
|
|
// Format is "--protocol=medium,direction,hz,medium_options,..."
|
|
|
|
//
|
1999-11-23 05:51:14 +00:00
|
|
|
// protocol = { native, nmea, garmin, fgfs, rul, pve, etc. }
|
1999-11-19 02:10:24 +00:00
|
|
|
// medium = { serial, socket, file, etc. }
|
|
|
|
// direction = { in, out, bi }
|
|
|
|
// hz = number of times to process channel per second (floating
|
|
|
|
// point values are ok.
|
|
|
|
//
|
|
|
|
// Serial example "--nmea=serial,dir,hz,device,baud" where
|
1998-11-16 13:59:58 +00:00
|
|
|
//
|
1999-11-19 02:10:24 +00:00
|
|
|
// device = OS device name of serial line to be open()'ed
|
1998-11-16 13:59:58 +00:00
|
|
|
// baud = {300, 1200, 2400, ..., 230400}
|
1999-11-19 02:10:24 +00:00
|
|
|
//
|
2000-07-14 00:50:56 +00:00
|
|
|
// Socket exacmple "--native=socket,dir,hz,machine,port,style" where
|
2003-03-19 20:45:09 +00:00
|
|
|
//
|
1999-11-20 15:40:15 +00:00
|
|
|
// machine = machine name or ip address if client (leave empty if server)
|
1999-11-19 02:10:24 +00:00
|
|
|
// port = port, leave empty to let system choose
|
2000-07-14 00:50:56 +00:00
|
|
|
// style = tcp or udp
|
1999-11-19 02:10:24 +00:00
|
|
|
//
|
|
|
|
// File example "--garmin=file,dir,hz,filename" where
|
2003-03-19 20:45:09 +00:00
|
|
|
//
|
1999-11-19 02:10:24 +00:00
|
|
|
// filename = file system file name
|
1998-11-25 01:33:58 +00:00
|
|
|
|
2003-03-19 20:45:09 +00:00
|
|
|
static bool
|
2001-08-21 21:13:55 +00:00
|
|
|
add_channel( const string& type, const string& channel_str ) {
|
2003-03-19 20:45:09 +00:00
|
|
|
cout << "Channel string = " << channel_str << endl;
|
1999-11-19 02:10:24 +00:00
|
|
|
|
2001-01-26 00:21:36 +00:00
|
|
|
globals->get_channel_options_list()->push_back( type + "," + channel_str );
|
2003-03-19 20:45:09 +00:00
|
|
|
|
|
|
|
cout << "here" << endl;
|
1998-11-16 13:59:58 +00:00
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-07-26 02:49:14 +00:00
|
|
|
static void
|
|
|
|
setup_wind (double min_hdg, double max_hdg, double speed, double gust)
|
|
|
|
{
|
|
|
|
fgSetDouble("/environment/wind-from-heading-deg", min_hdg);
|
|
|
|
fgSetDouble("/environment/params/min-wind-from-heading-deg", min_hdg);
|
|
|
|
fgSetDouble("/environment/params/max-wind-from-heading-deg", max_hdg);
|
|
|
|
fgSetDouble("/environment/wind-speed-kt", speed);
|
|
|
|
fgSetDouble("/environment/params/base-wind-speed-kt", speed);
|
|
|
|
fgSetDouble("/environment/params/gust-wind-speed-kt", gust);
|
|
|
|
|
|
|
|
SG_LOG(SG_GENERAL, SG_INFO, "WIND: " << min_hdg << '@' <<
|
|
|
|
speed << " knots" << endl);
|
|
|
|
|
|
|
|
#ifdef FG_WEATHERCM
|
|
|
|
// convert to fps
|
|
|
|
speed *= SG_NM_TO_METER * SG_METER_TO_FEET * (1.0/3600);
|
|
|
|
while (min_hdg > 360)
|
|
|
|
min_hdg -= 360;
|
|
|
|
while (min_hdg <= 0)
|
|
|
|
min_hdg += 360;
|
|
|
|
min_hdg *= SGD_DEGREES_TO_RADIANS;
|
|
|
|
fgSetDouble("/environment/wind-from-north-fps", speed * cos(dir));
|
|
|
|
fgSetDouble("/environment/wind-from-east-fps", speed * sin(dir));
|
|
|
|
#endif // FG_WEATHERCM
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-03-17 21:06:43 +00:00
|
|
|
// Parse --wp=ID[@alt]
|
2001-01-13 22:06:39 +00:00
|
|
|
static bool
|
|
|
|
parse_wp( const string& arg ) {
|
2000-10-12 01:08:09 +00:00
|
|
|
string id, alt_str;
|
|
|
|
double alt = 0.0;
|
|
|
|
|
2002-07-02 20:45:02 +00:00
|
|
|
string::size_type pos = arg.find( "@" );
|
2000-10-12 01:08:09 +00:00
|
|
|
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() );
|
2002-03-26 02:38:11 +00:00
|
|
|
if ( !strcmp(fgGetString("/sim/startup/units"), "feet") ) {
|
2001-03-24 04:56:46 +00:00
|
|
|
alt *= SG_FEET_TO_METER;
|
2000-10-12 01:08:09 +00:00
|
|
|
}
|
|
|
|
} 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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-11-28 23:38:24 +00:00
|
|
|
// Parse --flight-plan=[file]
|
2001-01-13 22:06:39 +00:00
|
|
|
static bool
|
|
|
|
parse_flightplan(const string& arg)
|
2000-11-28 23:38:24 +00:00
|
|
|
{
|
2001-05-18 16:09:39 +00:00
|
|
|
sg_gzifstream in(arg.c_str());
|
|
|
|
if ( !in.is_open() ) {
|
2000-11-28 23:38:24 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
while ( true ) {
|
|
|
|
string line;
|
2001-05-18 16:09:39 +00:00
|
|
|
|
|
|
|
#if defined( macintosh )
|
|
|
|
getline( in, line, '\r' );
|
2000-11-28 23:38:24 +00:00
|
|
|
#else
|
2001-05-18 16:09:39 +00:00
|
|
|
getline( in, line, '\n' );
|
2000-11-28 23:38:24 +00:00
|
|
|
#endif
|
2001-05-18 16:09:39 +00:00
|
|
|
|
|
|
|
// catch extraneous (DOS) line ending character
|
|
|
|
if ( line[line.length() - 1] < 32 ) {
|
|
|
|
line = line.substr( 0, line.length()-1 );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( in.eof() ) {
|
2000-11-28 23:38:24 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
parse_wp(line);
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2003-01-19 23:02:51 +00:00
|
|
|
#define NEW_OPTION_PARSING 1
|
|
|
|
#ifdef NEW_OPTION_PARSING
|
|
|
|
static int
|
|
|
|
fgOptLanguage( const char *arg )
|
|
|
|
{
|
|
|
|
globals->set_locale( fgInitLocale( arg ) );
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
2003-02-21 02:46:44 +00:00
|
|
|
static void
|
|
|
|
clearLocation ()
|
|
|
|
{
|
|
|
|
fgSetString("/sim/presets/airport-id", "");
|
|
|
|
fgSetString("/sim/presets/vor-id", "");
|
|
|
|
fgSetString("/sim/presets/ndb-id", "");
|
|
|
|
fgSetString("/sim/presets/fix", "");
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptVOR( const char * arg )
|
|
|
|
{
|
|
|
|
clearLocation();
|
|
|
|
fgSetString("/sim/presets/vor-id", arg);
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptNDB( const char * arg )
|
|
|
|
{
|
|
|
|
clearLocation();
|
|
|
|
fgSetString("/sim/presets/ndb-id", arg);
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptFIX( const char * arg )
|
|
|
|
{
|
|
|
|
clearLocation();
|
|
|
|
fgSetString("/sim/presets/fix", arg);
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
2003-01-19 23:02:51 +00:00
|
|
|
static int
|
|
|
|
fgOptLon( const char *arg )
|
|
|
|
{
|
2003-02-21 02:46:44 +00:00
|
|
|
clearLocation();
|
2003-01-19 23:02:51 +00:00
|
|
|
fgSetDouble("/sim/presets/longitude-deg", parse_degree( arg ));
|
|
|
|
fgSetDouble("/position/longitude-deg", parse_degree( arg ));
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptLat( const char *arg )
|
|
|
|
{
|
2003-02-21 02:46:44 +00:00
|
|
|
clearLocation();
|
2003-01-19 23:02:51 +00:00
|
|
|
fgSetDouble("/sim/presets/latitude-deg", parse_degree( arg ));
|
|
|
|
fgSetDouble("/position/latitude-deg", parse_degree( arg ));
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptAltitude( const char *arg )
|
|
|
|
{
|
|
|
|
fgSetBool("/sim/presets/onground", false);
|
|
|
|
if ( !strcmp(fgGetString("/sim/startup/units"), "feet") )
|
|
|
|
fgSetDouble("/sim/presets/altitude-ft", atof( arg ));
|
|
|
|
else
|
|
|
|
fgSetDouble("/sim/presets/altitude-ft",
|
|
|
|
atof( arg ) * SG_METER_TO_FEET);
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptUBody( const char *arg )
|
|
|
|
{
|
|
|
|
fgSetString("/sim/presets/speed-set", "UVW");
|
|
|
|
if ( !strcmp(fgGetString("/sim/startup/units"), "feet") )
|
|
|
|
fgSetDouble("/sim/presets/uBody-fps", atof( arg ));
|
|
|
|
else
|
|
|
|
fgSetDouble("/sim/presets/uBody-fps",
|
|
|
|
atof( arg ) * SG_METER_TO_FEET);
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptVBody( const char *arg )
|
|
|
|
{
|
|
|
|
fgSetString("/sim/presets/speed-set", "UVW");
|
|
|
|
if ( !strcmp(fgGetString("/sim/startup/units"), "feet") )
|
|
|
|
fgSetDouble("/sim/presets/vBody-fps", atof( arg ));
|
|
|
|
else
|
|
|
|
fgSetDouble("/sim/presets/vBody-fps",
|
|
|
|
atof( arg ) * SG_METER_TO_FEET);
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptWBody( const char *arg )
|
|
|
|
{
|
|
|
|
fgSetString("/sim/presets/speed-set", "UVW");
|
|
|
|
if ( !strcmp(fgGetString("/sim/startup/units"), "feet") )
|
|
|
|
fgSetDouble("/sim/presets/wBody-fps", atof(arg));
|
|
|
|
else
|
|
|
|
fgSetDouble("/sim/presets/wBody-fps",
|
|
|
|
atof(arg) * SG_METER_TO_FEET);
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptVNorth( const char *arg )
|
|
|
|
{
|
|
|
|
fgSetString("/sim/presets/speed-set", "NED");
|
|
|
|
if ( !strcmp(fgGetString("/sim/startup/units"), "feet") )
|
|
|
|
fgSetDouble("/sim/presets/speed-north-fps", atof( arg ));
|
|
|
|
else
|
|
|
|
fgSetDouble("/sim/presets/speed-north-fps",
|
|
|
|
atof( arg ) * SG_METER_TO_FEET);
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptVEast( const char *arg )
|
|
|
|
{
|
|
|
|
fgSetString("/sim/presets/speed-set", "NED");
|
|
|
|
if ( !strcmp(fgGetString("/sim/startup/units"), "feet") )
|
|
|
|
fgSetDouble("/sim/presets/speed-east-fps", atof(arg));
|
|
|
|
else
|
|
|
|
fgSetDouble("/sim/presets/speed-east-fps",
|
|
|
|
atof(arg) * SG_METER_TO_FEET);
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptVDown( const char *arg )
|
|
|
|
{
|
|
|
|
fgSetString("/sim/presets/speed-set", "NED");
|
|
|
|
if ( !strcmp(fgGetString("/sim/startup/units"), "feet") )
|
|
|
|
fgSetDouble("/sim/presets/speed-down-fps", atof(arg));
|
|
|
|
else
|
|
|
|
fgSetDouble("/sim/presets/speed-down-fps",
|
|
|
|
atof(arg) * SG_METER_TO_FEET);
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptVc( const char *arg )
|
|
|
|
{
|
|
|
|
// fgSetString("/sim/presets/speed-set", "knots");
|
|
|
|
// fgSetDouble("/velocities/airspeed-kt", atof(arg.substr(5)));
|
|
|
|
fgSetString("/sim/presets/speed-set", "knots");
|
|
|
|
fgSetDouble("/sim/presets/airspeed-kt", atof(arg));
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptMach( const char *arg )
|
|
|
|
{
|
|
|
|
fgSetString("/sim/presets/speed-set", "mach");
|
|
|
|
fgSetDouble("/sim/presets/mach", atof(arg));
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptRoc( const char *arg )
|
|
|
|
{
|
|
|
|
fgSetDouble("/velocities/vertical-speed-fps", atof(arg)/60);
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptFgRoot( const char *arg )
|
|
|
|
{
|
|
|
|
globals->set_fg_root(arg);
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptFgScenery( const char *arg )
|
|
|
|
{
|
|
|
|
globals->set_fg_scenery(arg);
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptFov( const char *arg )
|
|
|
|
{
|
|
|
|
parse_fov( arg );
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptGeometry( const char *arg )
|
|
|
|
{
|
|
|
|
bool geometry_ok = true;
|
|
|
|
int xsize = 0, ysize = 0;
|
|
|
|
string geometry = arg;
|
|
|
|
string::size_type i = geometry.find('x');
|
|
|
|
|
|
|
|
if (i != string::npos) {
|
|
|
|
xsize = atoi(geometry.substr(0, i));
|
|
|
|
ysize = atoi(geometry.substr(i+1));
|
|
|
|
} else {
|
|
|
|
geometry_ok = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( xsize <= 0 || ysize <= 0 ) {
|
|
|
|
xsize = 640;
|
|
|
|
ysize = 480;
|
|
|
|
geometry_ok = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !geometry_ok ) {
|
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT, "Unknown geometry: " << geometry );
|
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT,
|
|
|
|
"Setting geometry to " << xsize << 'x' << ysize << '\n');
|
|
|
|
} else {
|
|
|
|
SG_LOG( SG_GENERAL, SG_INFO,
|
|
|
|
"Setting geometry to " << xsize << 'x' << ysize << '\n');
|
|
|
|
fgSetInt("/sim/startup/xsize", xsize);
|
|
|
|
fgSetInt("/sim/startup/ysize", ysize);
|
|
|
|
}
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptBpp( const char *arg )
|
|
|
|
{
|
|
|
|
string bits_per_pix = arg;
|
|
|
|
if ( bits_per_pix == "16" ) {
|
|
|
|
fgSetInt("/sim/rendering/bits-per-pixel", 16);
|
|
|
|
} else if ( bits_per_pix == "24" ) {
|
|
|
|
fgSetInt("/sim/rendering/bits-per-pixel", 24);
|
|
|
|
} else if ( bits_per_pix == "32" ) {
|
|
|
|
fgSetInt("/sim/rendering/bits-per-pixel", 32);
|
|
|
|
} else {
|
|
|
|
SG_LOG(SG_GENERAL, SG_ALERT, "Unsupported bpp " << bits_per_pix);
|
|
|
|
}
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptTimeOffset( const char *arg )
|
|
|
|
{
|
|
|
|
fgSetInt("/sim/startup/time-offset",
|
|
|
|
parse_time_offset( arg ));
|
|
|
|
fgSetString("/sim/startup/time-offset-type", "system-offset");
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptStartDateSys( const char *arg )
|
|
|
|
{
|
|
|
|
fgSetInt("/sim/startup/time-offset", parse_date( arg ) );
|
|
|
|
fgSetString("/sim/startup/time-offset-type", "system");
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptStartDateLat( const char *arg )
|
|
|
|
{
|
|
|
|
fgSetInt("/sim/startup/time-offset", parse_date( arg ) );
|
|
|
|
fgSetString("/sim/startup/time-offset-type", "latitude");
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptStartDateGmt( const char *arg )
|
|
|
|
{
|
|
|
|
fgSetInt("/sim/startup/time-offset", parse_date( arg ) );
|
|
|
|
fgSetString("/sim/startup/time-offset-type", "gmt");
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef FG_NETWORK_OLK
|
|
|
|
static int
|
|
|
|
fgOptNetHud( const char *arg )
|
|
|
|
{
|
|
|
|
fgSetBool("/sim/hud/net-display", true);
|
|
|
|
net_hud_display = 1; // FIXME
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptTraceRead( const char *arg )
|
|
|
|
{
|
|
|
|
string name = arg;
|
|
|
|
SG_LOG(SG_GENERAL, SG_INFO, "Tracing reads for property " << name);
|
|
|
|
fgGetNode(name.c_str(), true)
|
|
|
|
->setAttribute(SGPropertyNode::TRACE_READ, true);
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptTraceWrite( const char *arg )
|
|
|
|
{
|
|
|
|
string name = arg;
|
|
|
|
SG_LOG(SG_GENERAL, SG_INFO, "Tracing writes for property " << name);
|
|
|
|
fgGetNode(name.c_str(), true)
|
|
|
|
->setAttribute(SGPropertyNode::TRACE_WRITE, true);
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptViewOffset( const char *arg )
|
|
|
|
{
|
|
|
|
// $$$ begin - added VS Renganathan, 14 Oct 2K
|
|
|
|
// for multi-window outside window imagery
|
|
|
|
string woffset = arg;
|
|
|
|
double default_view_offset = 0.0;
|
|
|
|
if ( woffset == "LEFT" ) {
|
|
|
|
default_view_offset = SGD_PI * 0.25;
|
|
|
|
} else if ( woffset == "RIGHT" ) {
|
|
|
|
default_view_offset = SGD_PI * 1.75;
|
|
|
|
} else if ( woffset == "CENTER" ) {
|
|
|
|
default_view_offset = 0.00;
|
|
|
|
} else {
|
|
|
|
default_view_offset = atof( woffset.c_str() ) * SGD_DEGREES_TO_RADIANS;
|
|
|
|
}
|
|
|
|
/* apparently not used (CLO, 11 Jun 2002)
|
|
|
|
FGViewer *pilot_view =
|
|
|
|
(FGViewer *)globals->get_viewmgr()->get_view( 0 ); */
|
|
|
|
// this will work without calls to the viewer...
|
|
|
|
fgSetDouble( "/sim/current-view/heading-offset-deg",
|
|
|
|
default_view_offset * SGD_RADIANS_TO_DEGREES );
|
|
|
|
// $$$ end - added VS Renganathan, 14 Oct 2K
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptVisibilityMiles( const char *arg )
|
|
|
|
{
|
|
|
|
double visibility = atof( arg ) * 5280.0 * SG_FEET_TO_METER;
|
|
|
|
fgSetDouble("/environment/visibility-m", visibility);
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptRandomWind( const char *arg )
|
|
|
|
{
|
|
|
|
double min_hdg = sg_random() * 360.0;
|
|
|
|
double max_hdg = min_hdg + (20 - sqrt(sg_random() * 400));
|
|
|
|
double speed = 40 - sqrt(sg_random() * 1600.0);
|
|
|
|
double gust = speed + (10 - sqrt(sg_random() * 100));
|
|
|
|
setup_wind(min_hdg, max_hdg, speed, gust);
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptWind( const char *arg )
|
|
|
|
{
|
|
|
|
double min_hdg, max_hdg, speed, gust;
|
|
|
|
if (!parse_wind( arg, &min_hdg, &max_hdg, &speed, &gust)) {
|
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT, "bad wind value " << arg );
|
|
|
|
return FG_OPTIONS_ERROR;
|
|
|
|
}
|
|
|
|
setup_wind(min_hdg, max_hdg, speed, gust);
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptWp( const char *arg )
|
|
|
|
{
|
|
|
|
parse_wp( arg );
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptFlightPlan( const char *arg )
|
|
|
|
{
|
|
|
|
parse_flightplan ( arg );
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
fgOptConfig( const char *arg )
|
|
|
|
{
|
|
|
|
string file = arg;
|
|
|
|
try {
|
|
|
|
readProperties(file, globals->get_props());
|
|
|
|
} catch (const sg_exception &e) {
|
|
|
|
string message = "Error loading config file: ";
|
|
|
|
message += e.getFormattedMessage();
|
|
|
|
SG_LOG(SG_INPUT, SG_ALERT, message);
|
|
|
|
exit(2);
|
|
|
|
}
|
|
|
|
return FG_OPTIONS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static map<string,size_t> fgOptionMap;
|
|
|
|
|
|
|
|
enum OptionType { OPTION_BOOL, OPTION_STRING, OPTION_DOUBLE, OPTION_INT, OPTION_CHANNEL, OPTION_FUNC };
|
|
|
|
struct OptionDesc {
|
|
|
|
char *option;
|
|
|
|
bool has_param;
|
|
|
|
enum OptionType type;
|
|
|
|
char *property;
|
|
|
|
bool b_param;
|
|
|
|
char *s_param;
|
|
|
|
int (*func)( const char * );
|
|
|
|
} fgOptionArray[] = {
|
|
|
|
|
|
|
|
{"language", true, OPTION_FUNC, "", false, "", fgOptLanguage },
|
|
|
|
{"disable-game-mode", false, OPTION_BOOL, "/sim/startup/game-mode", false, "", 0 },
|
|
|
|
{"enable-game-mode", false, OPTION_BOOL, "/sim/startup/game-mode", true, "", 0 },
|
|
|
|
{"disable-splash-screen", false, OPTION_BOOL, "/sim/startup/splash-screen", false, "", 0 },
|
|
|
|
{"enable-splash-screen", false, OPTION_BOOL, "/sim/startup/splash-screen", true, "", 0 },
|
|
|
|
{"disable-intro-music", false, OPTION_BOOL, "/sim/startup/intro-music", false, "", 0 },
|
|
|
|
{"enable-intro-music", false, OPTION_BOOL, "/sim/startup/intro-music", true, "", 0 },
|
|
|
|
{"disable-mouse-pointer", false, OPTION_STRING, "/sim/startup/mouse-pointer", false, "disabled", 0 },
|
|
|
|
{"enable-mouse-pointer", false, OPTION_STRING, "/sim/startup/mouse-pointer", false, "enabled", 0 },
|
|
|
|
{"disable-random-objects", false, OPTION_BOOL, "/sim/rendering/random-objects", false, "", 0 },
|
|
|
|
{"enable-random-objects", false, OPTION_BOOL, "/sim/rendering/random-objects", true, "", 0 },
|
|
|
|
{"disable-freeze", false, OPTION_BOOL, "/sim/freeze/master", false, "", 0 },
|
|
|
|
{"enable-freeze", false, OPTION_BOOL, "/sim/freeze/master", true, "", 0 },
|
|
|
|
{"disable-fuel-freeze", false, OPTION_BOOL, "/sim/freeze/fuel", false, "", 0 },
|
|
|
|
{"enable-fuel-freeze", false, OPTION_BOOL, "/sim/freeze/fuel", true, "", 0 },
|
|
|
|
{"disable-clock-freeze", false, OPTION_BOOL, "/sim/freeze/clock", false, "", 0 },
|
|
|
|
{"enable-clock-freeze", false, OPTION_BOOL, "/sim/freeze/clock", true, "", 0 },
|
|
|
|
{"disable-anti-alias-hud", false, OPTION_BOOL, "/sim/hud/antialiased", false, "", 0 },
|
|
|
|
{"enable-anti-alias-hud", false, OPTION_BOOL, "/sim/hud/antialiased", true, "", 0 },
|
|
|
|
{"control", true, OPTION_STRING, "/sim/control-mode", false, "", 0 },
|
|
|
|
{"disable-auto-coordination", false, OPTION_BOOL, "/sim/auto-coordination", false, "", 0 },
|
|
|
|
{"enable-auto-coordination", false, OPTION_BOOL, "/sim/auto-coordination", true, "", 0 },
|
|
|
|
{"browser-app", true, OPTION_STRING, "/sim/startup/browser-app", false, "", 0 },
|
|
|
|
{"disable-hud", false, OPTION_BOOL, "/sim/hud/visibility", false, "", 0 },
|
|
|
|
{"enable-hud", false, OPTION_BOOL, "/sim/hud/visibility", true, "", 0 },
|
|
|
|
{"disable-panel", false, OPTION_BOOL, "/sim/panel/visibility", false, "", 0 },
|
|
|
|
{"enable-panel", false, OPTION_BOOL, "/sim/panel/visibility", true, "", 0 },
|
|
|
|
{"disable-sound", false, OPTION_BOOL, "/sim/sound/audible", false, "", 0 },
|
|
|
|
{"enable-sound", false, OPTION_BOOL, "/sim/sound/audible", true, "", 0 },
|
|
|
|
{"airport", true, OPTION_STRING, "/sim/presets/airport-id", false, "", 0 },
|
|
|
|
{"airport-id", true, OPTION_STRING, "/sim/presets/airport-id", false, "", 0 },
|
|
|
|
{"runway", true, OPTION_STRING, "/sim/presets/runway", false, "", 0 },
|
2003-02-21 02:46:44 +00:00
|
|
|
{"vor", true, OPTION_FUNC, "", false, "", fgOptVOR },
|
|
|
|
{"ndb", true, OPTION_FUNC, "", false, "", fgOptNDB },
|
|
|
|
{"fix", true, OPTION_FUNC, "", false, "", fgOptFIX },
|
2003-01-19 23:02:51 +00:00
|
|
|
{"offset-distance", true, OPTION_DOUBLE, "/sim/presets/offset-distance", false, "", 0 },
|
|
|
|
{"offset-azimuth", true, OPTION_DOUBLE, "/sim/presets/offset-azimuth", false, "", 0 },
|
|
|
|
{"lon", true, OPTION_FUNC, "", false, "", fgOptLon },
|
|
|
|
{"lat", true, OPTION_FUNC, "", false, "", fgOptLat },
|
|
|
|
{"altitude", true, OPTION_FUNC, "", false, "", fgOptAltitude },
|
|
|
|
{"uBody", true, OPTION_FUNC, "", false, "", fgOptUBody },
|
|
|
|
{"vBody", true, OPTION_FUNC, "", false, "", fgOptVBody },
|
|
|
|
{"wBody", true, OPTION_FUNC, "", false, "", fgOptWBody },
|
|
|
|
{"vNorth", true, OPTION_FUNC, "", false, "", fgOptVNorth },
|
|
|
|
{"vEast", true, OPTION_FUNC, "", false, "", fgOptVEast },
|
|
|
|
{"vDown", true, OPTION_FUNC, "", false, "", fgOptVDown },
|
|
|
|
{"vc", true, OPTION_FUNC, "", false, "", fgOptVc },
|
|
|
|
{"mach", true, OPTION_FUNC, "", false, "", fgOptMach },
|
|
|
|
{"heading", true, OPTION_DOUBLE, "/sim/presets/heading-deg", false, "", 0 },
|
|
|
|
{"roll", true, OPTION_DOUBLE, "/sim/presets/roll-deg", false, "", 0 },
|
|
|
|
{"pitch", true, OPTION_DOUBLE, "/sim/presets/pitch-deg", false, "", 0 },
|
|
|
|
{"glideslope", true, OPTION_DOUBLE, "/sim/presets/glideslope-deg", false, "", 0 },
|
|
|
|
{"roc", true, OPTION_FUNC, "", false, "", fgOptRoc },
|
|
|
|
{"fg-root", true, OPTION_FUNC, "", false, "", fgOptFgRoot },
|
|
|
|
{"fg-scenery", true, OPTION_FUNC, "", false, "", fgOptFgScenery },
|
|
|
|
{"fdm", true, OPTION_STRING, "/sim/flight-model", false, "", 0 },
|
|
|
|
{"aero", true, OPTION_STRING, "/sim/aero", false, "", 0 },
|
|
|
|
{"aircraft-dir", true, OPTION_STRING, "/sim/aircraft-dir", false, "", 0 },
|
|
|
|
{"model-hz", true, OPTION_INT, "/sim/model-hz", false, "", 0 },
|
|
|
|
{"speed", true, OPTION_INT, "/sim/speed-up", false, "", 0 },
|
|
|
|
{"trim", false, OPTION_BOOL, "/sim/presets/trim", true, "", 0 },
|
|
|
|
{"notrim", false, OPTION_BOOL, "/sim/presets/trim", false, "", 0 },
|
|
|
|
{"on-ground", false, OPTION_BOOL, "/sim/presets/onground", true, "", 0 },
|
|
|
|
{"in-air", false, OPTION_BOOL, "/sim/presets/onground", false, "", 0 },
|
|
|
|
{"fog-disable", false, OPTION_STRING, "/sim/rendering/fog", false, "disabled", 0 },
|
|
|
|
{"fog-fastest", false, OPTION_STRING, "/sim/rendering/fog", false, "fastest", 0 },
|
|
|
|
{"fog-nicest", false, OPTION_STRING, "/sim/fog", false, "nicest", 0 },
|
|
|
|
{"disable-distance-attenuation", false, OPTION_BOOL, "/environment/distance-attenuation", false, "", 0 },
|
|
|
|
{"enable-distance-attenuation", false, OPTION_BOOL, "/environment/distance-attenuation", true, "", 0 },
|
|
|
|
{"disable-clouds", false, OPTION_BOOL, "/environment/clouds/status", false, "", 0 },
|
|
|
|
{"enable-clouds", false, OPTION_BOOL, "/environment/clouds/status", true, "", 0 },
|
|
|
|
#ifdef FG_USE_CLOUDS_3D
|
|
|
|
{"disable-clouds3d", false, OPTION_BOOL, "/sim/rendering/clouds3d", false, "", 0 },
|
|
|
|
{"enable-clouds3d", false, OPTION_BOOL, "/sim/rendering/clouds3d", true, "", 0 },
|
|
|
|
#endif
|
|
|
|
{"fov", true, OPTION_FUNC, "", false, "", fgOptFov },
|
|
|
|
{"disable-fullscreen", false, OPTION_BOOL, "/sim/startup/fullscreen", false, "", 0 },
|
|
|
|
{"enable-fullscreen", false, OPTION_BOOL, "/sim/startup/fullscreen", true, "", 0 },
|
|
|
|
{"shading-flat", false, OPTION_BOOL, "/sim/rendering/shading", false, "", 0 },
|
|
|
|
{"shading-smooth", false, OPTION_BOOL, "/sim/rendering/shading", true, "", 0 },
|
|
|
|
{"disable-skyblend", false, OPTION_BOOL, "/sim/rendering/skyblend", false, "", 0 },
|
|
|
|
{"enable-skyblend", false, OPTION_BOOL, "/sim/rendering/skyblend", true, "", 0 },
|
|
|
|
{"disable-textures", false, OPTION_BOOL, "/sim/rendering/textures", false, "", 0 },
|
|
|
|
{"enable-textures", false, OPTION_BOOL, "/sim/rendering/textures", true, "", 0 },
|
|
|
|
{"disable-wireframe", false, OPTION_BOOL, "/sim/rendering/wireframe", false, "", 0 },
|
|
|
|
{"enable-wireframe", false, OPTION_BOOL, "/sim/rendering/wireframe", true, "", 0 },
|
|
|
|
{"geometry", true, OPTION_FUNC, "", false, "", fgOptGeometry },
|
|
|
|
{"bpp", true, OPTION_FUNC, "", false, "", fgOptBpp },
|
|
|
|
{"units-feet", false, OPTION_STRING, "/sim/startup/units", false, "feet", 0 },
|
|
|
|
{"units-meters", false, OPTION_STRING, "/sim/startup/units", false, "meters", 0 },
|
|
|
|
{"time-offset", true, OPTION_FUNC, "", false, "", fgOptTimeOffset },
|
|
|
|
{"time-match-real", false, OPTION_STRING, "/sim/startup/time-offset-type", false, "system-offset", 0 },
|
|
|
|
{"time-match-local", false, OPTION_STRING, "/sim/startup/time-offset-type", false, "latitude-offset", 0 },
|
|
|
|
{"start-date-sys", true, OPTION_FUNC, "", false, "", fgOptStartDateSys },
|
|
|
|
{"start-date-lat", true, OPTION_FUNC, "", false, "", fgOptStartDateLat },
|
|
|
|
{"start-date-gmt", true, OPTION_FUNC, "", false, "", fgOptStartDateGmt },
|
|
|
|
{"hud-tris", false, OPTION_STRING, "/sim/hud/frame-stat-type", false, "tris", 0 },
|
|
|
|
{"hud-culled", false, OPTION_STRING, "/sim/hud/frame-stat-type", false, "culled", 0 },
|
|
|
|
{"atc610x", false, OPTION_CHANNEL, "", false, "dummy", 0 },
|
|
|
|
{"atlas", true, OPTION_CHANNEL, "", false, "", 0 },
|
|
|
|
{"httpd", true, OPTION_CHANNEL, "", false, "", 0 },
|
|
|
|
#ifdef FG_JPEG_SERVER
|
|
|
|
{"jpg-httpd", true, OPTION_CHANNEL, "", false, "", 0 },
|
|
|
|
#endif
|
|
|
|
{"native", true, OPTION_CHANNEL, "", false, "", 0 },
|
|
|
|
{"native-ctrls", true, OPTION_CHANNEL, "", false, "", 0 },
|
|
|
|
{"native-fdm", true, OPTION_CHANNEL, "", false, "", 0 },
|
|
|
|
{"native-gui", true, OPTION_CHANNEL, "", false, "", 0 },
|
|
|
|
{"opengc", true, OPTION_CHANNEL, "", false, "", 0 },
|
|
|
|
{"garmin", true, OPTION_CHANNEL, "", false, "", 0 },
|
|
|
|
{"nmea", true, OPTION_CHANNEL, "", false, "", 0 },
|
|
|
|
{"props", true, OPTION_CHANNEL, "", false, "", 0 },
|
|
|
|
{"telnet", true, OPTION_CHANNEL, "", false, "", 0 },
|
|
|
|
{"pve", true, OPTION_CHANNEL, "", false, "", 0 },
|
|
|
|
{"ray", true, OPTION_CHANNEL, "", false, "", 0 },
|
|
|
|
{"rul", true, OPTION_CHANNEL, "", false, "", 0 },
|
|
|
|
{"joyclient", true, OPTION_CHANNEL, "", false, "", 0 },
|
|
|
|
#ifdef FG_NETWORK_OLK
|
|
|
|
{"disable-network-olk", false, OPTION_BOOL, "/sim/networking/olk", false, "", 0 },
|
|
|
|
{"enable-network-olk", false, OPTION_BOOL, "/sim/networking/olk", true, "", 0 },
|
|
|
|
{"net-hud", false, OPTION_FUNC, "", false, "", fgOptNetHud },
|
|
|
|
{"net-id", true, OPTION_STRING, "sim/networking/call-sign", false, "", 0 },
|
|
|
|
#endif
|
|
|
|
{"trace-read", true, OPTION_FUNC, "", false, "", fgOptTraceRead },
|
|
|
|
{"trace-write", true, OPTION_FUNC, "", false, "", fgOptTraceWrite },
|
|
|
|
{"view-offset", true, OPTION_FUNC, "", false, "", fgOptViewOffset },
|
|
|
|
{"visibility", true, OPTION_DOUBLE, "/environment/visibility-m", false, "", 0 },
|
|
|
|
{"visibility-miles", true, OPTION_FUNC, "", false, "", fgOptVisibilityMiles },
|
|
|
|
{"random-wind", false, OPTION_FUNC, "", false, "", fgOptRandomWind },
|
|
|
|
{"wind", true, OPTION_FUNC, "", false, "", fgOptWind },
|
2003-02-21 02:46:44 +00:00
|
|
|
{"turbulence", true, OPTION_DOUBLE, "/environment/turbulence-norm", false, "", 0 },
|
2003-01-19 23:02:51 +00:00
|
|
|
{"wp", true, OPTION_FUNC, "", false, "", fgOptWp },
|
|
|
|
{"flight-plan", true, OPTION_FUNC, "", false, "", fgOptFlightPlan },
|
|
|
|
{"config", true, OPTION_FUNC, "", false, "", fgOptConfig },
|
|
|
|
{"aircraft", true, OPTION_STRING, "/sim/aircraft", false, "", 0 },
|
|
|
|
{0}
|
|
|
|
};
|
|
|
|
#endif
|
2000-11-28 23:38:24 +00:00
|
|
|
|
1998-05-13 18:29:56 +00:00
|
|
|
// Parse a single option
|
2003-03-19 20:45:09 +00:00
|
|
|
static int
|
|
|
|
parse_option (const string& arg)
|
2001-01-13 22:06:39 +00:00
|
|
|
{
|
2003-01-19 23:02:51 +00:00
|
|
|
#ifdef NEW_OPTION_PARSING
|
|
|
|
if ( fgOptionMap.size() == 0 ) {
|
|
|
|
size_t i = 0;
|
|
|
|
OptionDesc *pt = &fgOptionArray[ 0 ];
|
|
|
|
while ( pt->option != 0 ) {
|
|
|
|
fgOptionMap[ pt->option ] = i;
|
|
|
|
i += 1;
|
|
|
|
pt += 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// General Options
|
|
|
|
if ( (arg == "--help") || (arg == "-h") ) {
|
|
|
|
// help/usage request
|
|
|
|
return(FG_OPTIONS_HELP);
|
|
|
|
} else if ( (arg == "--verbose") || (arg == "-v") ) {
|
|
|
|
// verbose help/usage request
|
|
|
|
return(FG_OPTIONS_VERBOSE_HELP);
|
|
|
|
} else if ( arg.find( "--show-aircraft") == 0) {
|
|
|
|
return(FG_OPTIONS_SHOW_AIRCRAFT);
|
|
|
|
} else if ( arg.find( "--prop:" ) == 0 ) {
|
|
|
|
string assign = arg.substr(7);
|
|
|
|
string::size_type pos = assign.find('=');
|
|
|
|
if ( pos == arg.npos || pos == 0 ) {
|
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT, "Bad property assignment: " << arg );
|
|
|
|
return FG_OPTIONS_ERROR;
|
|
|
|
}
|
|
|
|
string name = assign.substr(0, pos);
|
|
|
|
string value = assign.substr(pos + 1);
|
|
|
|
fgSetString(name.c_str(), value.c_str());
|
|
|
|
// SG_LOG(SG_GENERAL, SG_INFO, "Setting default value of property "
|
|
|
|
// << name << " to \"" << value << '"');
|
|
|
|
} else if ( arg.find( "--" ) == 0 ) {
|
|
|
|
size_t pos = arg.find( '=' );
|
|
|
|
string arg_name;
|
|
|
|
if ( pos == string::npos ) {
|
|
|
|
arg_name = arg.substr( 2 );
|
|
|
|
} else {
|
|
|
|
arg_name = arg.substr( 2, pos - 2 );
|
|
|
|
}
|
|
|
|
map<string,size_t>::iterator it = fgOptionMap.find( arg_name );
|
|
|
|
if ( it != fgOptionMap.end() ) {
|
|
|
|
OptionDesc *pt = &fgOptionArray[ it->second ];
|
|
|
|
switch ( pt->type ) {
|
|
|
|
case OPTION_BOOL:
|
|
|
|
fgSetBool( pt->property, pt->b_param );
|
|
|
|
break;
|
|
|
|
case OPTION_STRING:
|
|
|
|
if ( pt->has_param && pos != string::npos ) {
|
|
|
|
fgSetString( pt->property, arg.substr( pos + 1 ).c_str() );
|
|
|
|
} else if ( !pt->has_param && pos == string::npos ) {
|
|
|
|
fgSetString( pt->property, pt->s_param );
|
|
|
|
} else if ( pt->has_param ) {
|
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT, "Option '" << arg << "' needs a parameter" );
|
|
|
|
return FG_OPTIONS_ERROR;
|
|
|
|
} else {
|
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT, "Option '" << arg << "' does not have a parameter" );
|
|
|
|
return FG_OPTIONS_ERROR;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case OPTION_DOUBLE:
|
|
|
|
if ( pos != string::npos ) {
|
|
|
|
fgSetDouble( pt->property, atof( arg.substr( pos + 1 ) ) );
|
|
|
|
} else {
|
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT, "Option '" << arg << "' needs a parameter" );
|
|
|
|
return FG_OPTIONS_ERROR;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case OPTION_INT:
|
|
|
|
if ( pos != string::npos ) {
|
|
|
|
fgSetInt( pt->property, atoi( arg.substr( pos + 1 ) ) );
|
|
|
|
} else {
|
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT, "Option '" << arg << "' needs a parameter" );
|
|
|
|
return FG_OPTIONS_ERROR;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case OPTION_CHANNEL:
|
|
|
|
if ( pt->has_param && pos != string::npos ) {
|
|
|
|
add_channel( pt->option, arg.substr( pos + 1 ) );
|
|
|
|
} else if ( !pt->has_param && pos == string::npos ) {
|
|
|
|
add_channel( pt->option, pt->s_param );
|
|
|
|
} else if ( pt->has_param ) {
|
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT, "Option '" << arg << "' needs a parameter" );
|
|
|
|
return FG_OPTIONS_ERROR;
|
|
|
|
} else {
|
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT, "Option '" << arg << "' does not have a parameter" );
|
|
|
|
return FG_OPTIONS_ERROR;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case OPTION_FUNC:
|
|
|
|
if ( pt->has_param && pos != string::npos ) {
|
|
|
|
pt->func( arg.substr( pos + 1 ).c_str() );
|
|
|
|
} else if ( !pt->has_param && pos == string::npos ) {
|
|
|
|
pt->func( 0 );
|
|
|
|
} else if ( pt->has_param ) {
|
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT, "Option '" << arg << "' needs a parameter" );
|
|
|
|
return FG_OPTIONS_ERROR;
|
|
|
|
} else {
|
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT, "Option '" << arg << "' does not have a parameter" );
|
|
|
|
return FG_OPTIONS_ERROR;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT, "Unknown option '" << arg << "'" );
|
|
|
|
return FG_OPTIONS_ERROR;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT, "Unknown option '" << arg << "'" );
|
|
|
|
return FG_OPTIONS_ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
1998-05-13 18:29:56 +00:00
|
|
|
// General Options
|
1998-08-27 17:01:55 +00:00
|
|
|
if ( (arg == "--help") || (arg == "-h") ) {
|
1998-05-13 18:29:56 +00:00
|
|
|
// help/usage request
|
|
|
|
return(FG_OPTIONS_HELP);
|
2002-08-25 22:38:20 +00:00
|
|
|
} else if ( (arg == "--verbose") || (arg == "-v") ) {
|
|
|
|
// verbose help/usage request
|
|
|
|
return(FG_OPTIONS_VERBOSE_HELP);
|
2002-10-04 15:19:07 +00:00
|
|
|
} else if ( arg.find( "--language=") == 0 ) {
|
|
|
|
globals->set_locale( fgInitLocale( arg.substr( 11 ).c_str() ) );
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--disable-game-mode") {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/startup/game-mode", false);
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--enable-game-mode" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/startup/game-mode", true);
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--disable-splash-screen" ) {
|
2003-03-19 20:45:09 +00:00
|
|
|
fgSetBool("/sim/startup/splash-screen", false);
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--enable-splash-screen" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/startup/splash-screen", true);
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--disable-intro-music" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/startup/intro-music", false);
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--enable-intro-music" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/startup/intro-music", true);
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--disable-mouse-pointer" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetString("/sim/startup/mouse-pointer", "disabled");
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--enable-mouse-pointer" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetString("/sim/startup/mouse-pointer", "enabled");
|
2002-07-20 23:10:16 +00:00
|
|
|
} else if ( arg == "--disable-random-objects" ) {
|
|
|
|
fgSetBool("/sim/rendering/random-objects", false);
|
|
|
|
} else if ( arg == "--enable-random-objects" ) {
|
|
|
|
fgSetBool("/sim/rendering/random-objects", true);
|
2000-07-08 06:29:19 +00:00
|
|
|
} else if ( arg == "--disable-freeze" ) {
|
2002-01-20 03:52:36 +00:00
|
|
|
fgSetBool("/sim/freeze/master", false);
|
2000-07-08 06:29:19 +00:00
|
|
|
} else if ( arg == "--enable-freeze" ) {
|
2002-01-20 03:52:36 +00:00
|
|
|
fgSetBool("/sim/freeze/master", true);
|
2002-01-20 05:59:28 +00:00
|
|
|
} else if ( arg == "--disable-fuel-freeze" ) {
|
|
|
|
fgSetBool("/sim/freeze/fuel", false);
|
|
|
|
} else if ( arg == "--enable-fuel-freeze" ) {
|
|
|
|
fgSetBool("/sim/freeze/fuel", true);
|
2002-02-13 02:37:44 +00:00
|
|
|
} else if ( arg == "--disable-clock-freeze" ) {
|
|
|
|
fgSetBool("/sim/freeze/clock", false);
|
|
|
|
} else if ( arg == "--enable-clock-freeze" ) {
|
|
|
|
fgSetBool("/sim/freeze/clock", true);
|
2000-05-13 00:02:43 +00:00
|
|
|
} else if ( arg == "--disable-anti-alias-hud" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/hud/antialiased", false);
|
2000-05-13 00:02:43 +00:00
|
|
|
} else if ( arg == "--enable-anti-alias-hud" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/hud/antialiased", true);
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--control=") == 0 ) {
|
2002-03-19 17:12:13 +00:00
|
|
|
fgSetString("/sim/control-mode", arg.substr(10).c_str());
|
1999-10-06 20:58:57 +00:00
|
|
|
} else if ( arg == "--disable-auto-coordination" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/auto-coordination", false);
|
1999-10-06 20:58:57 +00:00
|
|
|
} else if ( arg == "--enable-auto-coordination" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/auto-coordination", true);
|
2001-07-08 23:30:17 +00:00
|
|
|
} else if ( arg.find( "--browser-app=") == 0 ) {
|
2002-03-19 17:12:13 +00:00
|
|
|
fgSetString("/sim/startup/browser-app", arg.substr(14).c_str());
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--disable-hud" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/hud/visibility", false);
|
2001-01-05 16:45:14 +00:00
|
|
|
} else if ( arg == "--enable-hud" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/hud/visibility", true);
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--disable-panel" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/panel/visibility", false);
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--enable-panel" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/panel/visibility", true);
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--disable-sound" ) {
|
2002-02-27 15:13:58 +00:00
|
|
|
fgSetBool("/sim/sound/audible", false);
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--enable-sound" ) {
|
2002-02-27 15:13:58 +00:00
|
|
|
fgSetBool("/sim/sound/audible", true);
|
2002-11-17 04:04:21 +00:00
|
|
|
} else if ( arg.find( "--airport=") == 0 ) {
|
|
|
|
fgSetString("/sim/presets/airport-id", arg.substr(10).c_str());
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--airport-id=") == 0 ) {
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetString("/sim/presets/airport-id", arg.substr(13).c_str());
|
2002-11-17 04:04:21 +00:00
|
|
|
} else if ( arg.find( "--runway=") == 0 ) {
|
|
|
|
fgSetString("/sim/presets/runway", arg.substr(9).c_str());
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--offset-distance=") == 0 ) {
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetDouble("/sim/presets/offset-distance", atof(arg.substr(18)));
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--offset-azimuth=") == 0 ) {
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetDouble("/sim/presets/offset-azimuth", atof(arg.substr(17)));
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--lon=" ) == 0 ) {
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetDouble("/sim/presets/longitude-deg", parse_degree(arg.substr(6)));
|
|
|
|
fgSetDouble("/position/longitude-deg", parse_degree(arg.substr(6)));
|
|
|
|
fgSetString("/sim/presets/airport-id", "");
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--lat=" ) == 0 ) {
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetDouble("/sim/presets/latitude-deg", parse_degree(arg.substr(6)));
|
|
|
|
fgSetDouble("/position/latitude-deg", parse_degree(arg.substr(6)));
|
|
|
|
fgSetString("/sim/presets/airport-id", "");
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--altitude=" ) == 0 ) {
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetBool("/sim/presets/onground", false);
|
2002-03-26 02:38:11 +00:00
|
|
|
if ( !strcmp(fgGetString("/sim/startup/units"), "feet") )
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetDouble("/sim/presets/altitude-ft", atof(arg.substr(11)));
|
2001-01-12 15:37:40 +00:00
|
|
|
else
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetDouble("/sim/presets/altitude-ft",
|
2001-03-24 04:56:46 +00:00
|
|
|
atof(arg.substr(11)) * SG_METER_TO_FEET);
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--uBody=" ) == 0 ) {
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetString("/sim/presets/speed-set", "UVW");
|
2002-03-26 02:38:11 +00:00
|
|
|
if ( !strcmp(fgGetString("/sim/startup/units"), "feet") )
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetDouble("/sim/presets/uBody-fps", atof(arg.substr(8)));
|
2001-01-12 15:37:40 +00:00
|
|
|
else
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetDouble("/sim/presets/uBody-fps",
|
|
|
|
atof(arg.substr(8)) * SG_METER_TO_FEET);
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--vBody=" ) == 0 ) {
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetString("/sim/presets/speed-set", "UVW");
|
2002-03-26 02:38:11 +00:00
|
|
|
if ( !strcmp(fgGetString("/sim/startup/units"), "feet") )
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetDouble("/sim/presets/vBody-fps", atof(arg.substr(8)));
|
2001-01-12 15:37:40 +00:00
|
|
|
else
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetDouble("/sim/presets/vBody-fps",
|
2001-03-24 04:56:46 +00:00
|
|
|
atof(arg.substr(8)) * SG_METER_TO_FEET);
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--wBody=" ) == 0 ) {
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetString("/sim/presets/speed-set", "UVW");
|
2002-03-26 02:38:11 +00:00
|
|
|
if ( !strcmp(fgGetString("/sim/startup/units"), "feet") )
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetDouble("/sim/presets/wBody-fps", atof(arg.substr(8)));
|
2001-01-12 15:37:40 +00:00
|
|
|
else
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetDouble("/sim/presets/wBody-fps",
|
2001-03-24 04:56:46 +00:00
|
|
|
atof(arg.substr(8)) * SG_METER_TO_FEET);
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--vNorth=" ) == 0 ) {
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetString("/sim/presets/speed-set", "NED");
|
2002-03-26 02:38:11 +00:00
|
|
|
if ( !strcmp(fgGetString("/sim/startup/units"), "feet") )
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetDouble("/sim/presets/speed-north-fps", atof(arg.substr(9)));
|
2001-01-12 15:37:40 +00:00
|
|
|
else
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetDouble("/sim/presets/speed-north-fps",
|
2001-03-24 04:56:46 +00:00
|
|
|
atof(arg.substr(9)) * SG_METER_TO_FEET);
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--vEast=" ) == 0 ) {
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetString("/sim/presets/speed-set", "NED");
|
2002-03-26 02:38:11 +00:00
|
|
|
if ( !strcmp(fgGetString("/sim/startup/units"), "feet") )
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetDouble("/sim/presets/speed-east-fps", atof(arg.substr(8)));
|
2001-01-12 15:37:40 +00:00
|
|
|
else
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetDouble("/sim/presets/speed-east-fps",
|
2001-07-02 22:27:24 +00:00
|
|
|
atof(arg.substr(8)) * SG_METER_TO_FEET);
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--vDown=" ) == 0 ) {
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetString("/sim/presets/speed-set", "NED");
|
2002-03-26 02:38:11 +00:00
|
|
|
if ( !strcmp(fgGetString("/sim/startup/units"), "feet") )
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetDouble("/sim/presets/speed-down-fps", atof(arg.substr(8)));
|
2001-01-12 15:37:40 +00:00
|
|
|
else
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetDouble("/sim/presets/speed-down-fps",
|
2001-03-24 04:56:46 +00:00
|
|
|
atof(arg.substr(8)) * SG_METER_TO_FEET);
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--vc=" ) == 0) {
|
2002-11-15 21:13:29 +00:00
|
|
|
// fgSetString("/sim/presets/speed-set", "knots");
|
|
|
|
// fgSetDouble("/velocities/airspeed-kt", atof(arg.substr(5)));
|
|
|
|
fgSetString("/sim/presets/speed-set", "knots");
|
|
|
|
fgSetDouble("/sim/presets/airspeed-kt", atof(arg.substr(5)));
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--mach=" ) == 0) {
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetString("/sim/presets/speed-set", "mach");
|
|
|
|
fgSetDouble("/sim/presets/mach", atof(arg.substr(7)));
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--heading=" ) == 0 ) {
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetDouble("/sim/presets/heading-deg", atof(arg.substr(10)));
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--roll=" ) == 0 ) {
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetDouble("/sim/presets/roll-deg", atof(arg.substr(7)));
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--pitch=" ) == 0 ) {
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetDouble("/sim/presets/pitch-deg", atof(arg.substr(8)));
|
2002-02-18 19:18:51 +00:00
|
|
|
} else if ( arg.find( "--glideslope=" ) == 0 ) {
|
2002-11-18 21:31:33 +00:00
|
|
|
fgSetDouble("/sim/presets/glideslope-deg",
|
|
|
|
atof(arg.substr(13)));
|
2002-02-18 19:18:51 +00:00
|
|
|
} else if ( arg.find( "--roc=" ) == 0 ) {
|
|
|
|
fgSetDouble("/velocities/vertical-speed-fps", atof(arg.substr(6))/60);
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--fg-root=" ) == 0 ) {
|
2001-01-12 15:37:40 +00:00
|
|
|
globals->set_fg_root(arg.substr( 10 ));
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--fg-scenery=" ) == 0 ) {
|
2001-01-12 15:37:40 +00:00
|
|
|
globals->set_fg_scenery(arg.substr( 13 ));
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--fdm=" ) == 0 ) {
|
2002-03-19 17:12:13 +00:00
|
|
|
fgSetString("/sim/flight-model", arg.substr(6).c_str());
|
2001-12-06 23:10:50 +00:00
|
|
|
} else if ( arg.find( "--aero=" ) == 0 ) {
|
2002-03-19 17:12:13 +00:00
|
|
|
fgSetString("/sim/aero", arg.substr(7).c_str());
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--aircraft-dir=" ) == 0 ) {
|
2002-03-19 17:12:13 +00:00
|
|
|
fgSetString("/sim/aircraft-dir", arg.substr(15).c_str());
|
2002-08-28 16:59:40 +00:00
|
|
|
} else if ( arg.find( "--show-aircraft") == 0) {
|
|
|
|
return(FG_OPTIONS_SHOW_AIRCRAFT);
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--model-hz=" ) == 0 ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetInt("/sim/model-hz", atoi(arg.substr(11)));
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--speed=" ) == 0 ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetInt("/sim/speed-up", atoi(arg.substr(8)));
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--trim") == 0) {
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetBool("/sim/presets/trim", true);
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--notrim") == 0) {
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetBool("/sim/presets/trim", false);
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--on-ground") == 0) {
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetBool("/sim/presets/onground", true);
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--in-air") == 0) {
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetBool("/sim/presets/onground", false);
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--fog-disable" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetString("/sim/rendering/fog", "disabled");
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--fog-fastest" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetString("/sim/rendering/fog", "fastest");
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--fog-nicest" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetString("/sim/fog", "nicest");
|
2002-12-30 21:49:56 +00:00
|
|
|
} else if ( arg == "--disable-distance-attenuation" ) {
|
|
|
|
fgSetBool("/environment/distance-attenuation", false);
|
|
|
|
} else if ( arg == "--enable-distance-attenuation" ) {
|
|
|
|
fgSetBool("/environment/distance-attenuation", true);
|
1999-10-22 00:27:49 +00:00
|
|
|
} else if ( arg == "--disable-clouds" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/environment/clouds/status", false);
|
1999-10-22 00:27:49 +00:00
|
|
|
} else if ( arg == "--enable-clouds" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/environment/clouds/status", true);
|
2002-12-10 19:25:12 +00:00
|
|
|
#ifdef FG_USE_CLOUDS_3D
|
2002-09-16 02:46:23 +00:00
|
|
|
} else if ( arg == "--disable-clouds3d" ) {
|
|
|
|
fgSetBool("/sim/rendering/clouds3d", false);
|
|
|
|
} else if ( arg == "--enable-clouds3d" ) {
|
|
|
|
fgSetBool("/sim/rendering/clouds3d", true);
|
2002-12-10 19:25:12 +00:00
|
|
|
#endif
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--fov=" ) == 0 ) {
|
2000-11-01 23:27:32 +00:00
|
|
|
parse_fov( arg.substr(6) );
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--disable-fullscreen" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/startup/fullscreen", false);
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg== "--enable-fullscreen") {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/startup/fullscreen", true);
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--shading-flat") {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/rendering/shading", false);
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--shading-smooth") {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/rendering/shading", true);
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--disable-skyblend") {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/rendering/skyblend", false);
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg== "--enable-skyblend" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/rendering/skyblend", true);
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--disable-textures" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/rendering/textures", false);
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--enable-textures" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/rendering/textures", true);
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--disable-wireframe" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/rendering/wireframe", false);
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--enable-wireframe" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/rendering/wireframe", true);
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--geometry=" ) == 0 ) {
|
1999-08-31 23:22:05 +00:00
|
|
|
bool geometry_ok = true;
|
2001-01-12 15:37:40 +00:00
|
|
|
int xsize = 0, ysize = 0;
|
1998-11-16 13:59:58 +00:00
|
|
|
string geometry = arg.substr( 11 );
|
1999-08-31 23:22:05 +00:00
|
|
|
string::size_type i = geometry.find('x');
|
|
|
|
|
|
|
|
if (i != string::npos) {
|
|
|
|
xsize = atoi(geometry.substr(0, i));
|
|
|
|
ysize = atoi(geometry.substr(i+1));
|
|
|
|
} else {
|
|
|
|
geometry_ok = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( xsize <= 0 || ysize <= 0 ) {
|
1998-11-16 13:59:58 +00:00
|
|
|
xsize = 640;
|
|
|
|
ysize = 480;
|
1999-08-31 23:22:05 +00:00
|
|
|
geometry_ok = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !geometry_ok ) {
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT, "Unknown geometry: " << geometry );
|
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT,
|
1999-08-31 23:22:05 +00:00
|
|
|
"Setting geometry to " << xsize << 'x' << ysize << '\n');
|
2001-01-12 15:37:40 +00:00
|
|
|
} else {
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG( SG_GENERAL, SG_INFO,
|
2001-01-12 15:37:40 +00:00
|
|
|
"Setting geometry to " << xsize << 'x' << ysize << '\n');
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetInt("/sim/startup/xsize", xsize);
|
|
|
|
fgSetInt("/sim/startup/ysize", ysize);
|
2001-01-12 15:37:40 +00:00
|
|
|
}
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--bpp=" ) == 0 ) {
|
2000-05-13 00:02:43 +00:00
|
|
|
string bits_per_pix = arg.substr( 6 );
|
|
|
|
if ( bits_per_pix == "16" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetInt("/sim/rendering/bits-per-pixel", 16);
|
2000-05-13 00:02:43 +00:00
|
|
|
} else if ( bits_per_pix == "24" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetInt("/sim/rendering/bits-per-pixel", 24);
|
2000-05-13 00:02:43 +00:00
|
|
|
} else if ( bits_per_pix == "32" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetInt("/sim/rendering/bits-per-pixel", 32);
|
2001-01-12 15:37:40 +00:00
|
|
|
} else {
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG(SG_GENERAL, SG_ALERT, "Unsupported bpp " << bits_per_pix);
|
2000-05-13 00:02:43 +00:00
|
|
|
}
|
1998-11-02 23:04:02 +00:00
|
|
|
} else if ( arg == "--units-feet" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetString("/sim/startup/units", "feet");
|
1998-11-02 23:04:02 +00:00
|
|
|
} else if ( arg == "--units-meters" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetString("/sim/startup/units", "meters");
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--time-offset" ) == 0 ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetInt("/sim/startup/time-offset",
|
2002-02-13 19:41:05 +00:00
|
|
|
parse_time_offset( (arg.substr(14)) ));
|
|
|
|
fgSetString("/sim/startup/time-offset-type", "system-offset");
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--time-match-real") == 0 ) {
|
2002-02-13 19:41:05 +00:00
|
|
|
fgSetString("/sim/startup/time-offset-type", "system-offset");
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--time-match-local") == 0 ) {
|
2002-02-13 19:41:05 +00:00
|
|
|
fgSetString("/sim/startup/time-offset-type", "latitude-offset");
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--start-date-sys=") == 0 ) {
|
2002-02-13 19:41:05 +00:00
|
|
|
fgSetInt("/sim/startup/time-offset", parse_date((arg.substr(17))));
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetString("/sim/startup/time-offset-type", "system");
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--start-date-lat=") == 0 ) {
|
2002-02-13 19:41:05 +00:00
|
|
|
fgSetInt("/sim/startup/time-offset", parse_date((arg.substr(17))));
|
|
|
|
fgSetString("/sim/startup/time-offset-type", "latitude");
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--start-date-gmt=") == 0 ) {
|
2002-02-13 19:41:05 +00:00
|
|
|
fgSetInt("/sim/startup/time-offset", parse_date((arg.substr(17))));
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetString("/sim/startup/time-offset-type", "gmt");
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--hud-tris" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetString("/sim/hud/frame-stat-type", "tris");
|
1998-08-27 17:01:55 +00:00
|
|
|
} else if ( arg == "--hud-culled" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetString("/sim/hud/frame-stat-type", "culled");
|
2002-02-05 04:42:39 +00:00
|
|
|
} else if ( arg.find( "--atc610x" ) == 0 ) {
|
|
|
|
add_channel( "atc610x", "dummy" );
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--atlas=" ) == 0 ) {
|
2001-08-21 21:13:55 +00:00
|
|
|
add_channel( "atlas", arg.substr(8) );
|
2003-03-19 20:45:09 +00:00
|
|
|
|
|
|
|
} else if ( arg.find( "--multiplay=" ) == 0 ) {
|
|
|
|
add_channel( "multiplay", arg.substr(12) );
|
|
|
|
|
2001-08-21 21:13:55 +00:00
|
|
|
} else if ( arg.find( "--httpd=" ) == 0 ) {
|
|
|
|
add_channel( "httpd", arg.substr(8) );
|
2002-01-16 23:02:52 +00:00
|
|
|
#ifdef FG_JPEG_SERVER
|
|
|
|
} else if ( arg.find( "--jpg-httpd=" ) == 0 ) {
|
|
|
|
add_channel( "jpg-httpd", arg.substr(12) );
|
|
|
|
#endif
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--native=" ) == 0 ) {
|
2001-08-21 21:13:55 +00:00
|
|
|
add_channel( "native", arg.substr(9) );
|
2001-07-27 14:23:01 +00:00
|
|
|
} else if ( arg.find( "--native-ctrls=" ) == 0 ) {
|
2001-08-21 21:13:55 +00:00
|
|
|
add_channel( "native_ctrls", arg.substr(15) );
|
2001-09-04 14:38:15 +00:00
|
|
|
} else if ( arg.find( "--native-fdm=" ) == 0 ) {
|
|
|
|
add_channel( "native_fdm", arg.substr(13) );
|
2003-01-15 02:09:10 +00:00
|
|
|
} else if ( arg.find( "--native-gui=" ) == 0 ) {
|
|
|
|
add_channel( "native_gui", arg.substr(13) );
|
2001-11-30 23:56:28 +00:00
|
|
|
} else if ( arg.find( "--opengc=" ) == 0 ) {
|
|
|
|
// char stop;
|
|
|
|
// cout << "Adding channel for OpenGC Display" << endl; cin >> stop;
|
2001-12-05 04:54:54 +00:00
|
|
|
add_channel( "opengc", arg.substr(9) );
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--garmin=" ) == 0 ) {
|
2001-08-21 21:13:55 +00:00
|
|
|
add_channel( "garmin", arg.substr(9) );
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--nmea=" ) == 0 ) {
|
2001-08-21 21:13:55 +00:00
|
|
|
add_channel( "nmea", arg.substr(7) );
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--props=" ) == 0 ) {
|
2001-08-21 21:13:55 +00:00
|
|
|
add_channel( "props", arg.substr(8) );
|
2002-05-16 06:02:31 +00:00
|
|
|
} else if ( arg.find( "--telnet=" ) == 0 ) {
|
|
|
|
add_channel( "telnet", arg.substr(9) );
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--pve=" ) == 0 ) {
|
2001-08-21 21:13:55 +00:00
|
|
|
add_channel( "pve", arg.substr(6) );
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--ray=" ) == 0 ) {
|
2001-08-21 21:13:55 +00:00
|
|
|
add_channel( "ray", arg.substr(6) );
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--rul=" ) == 0 ) {
|
2001-08-21 21:13:55 +00:00
|
|
|
add_channel( "rul", arg.substr(6) );
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--joyclient=" ) == 0 ) {
|
2001-08-21 21:13:55 +00:00
|
|
|
add_channel( "joyclient", arg.substr(12) );
|
1999-06-30 20:21:04 +00:00
|
|
|
#ifdef FG_NETWORK_OLK
|
2000-02-28 04:16:12 +00:00
|
|
|
} else if ( arg == "--disable-network-olk" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/networking/olk", false);
|
2000-02-28 04:16:12 +00:00
|
|
|
} else if ( arg== "--enable-network-olk") {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/networking/olk", true);
|
1999-06-30 20:21:04 +00:00
|
|
|
} else if ( arg == "--net-hud" ) {
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetBool("/sim/hud/net-display", true);
|
2001-01-12 15:37:40 +00:00
|
|
|
net_hud_display = 1; // FIXME
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--net-id=") == 0 ) {
|
2002-03-19 17:12:13 +00:00
|
|
|
fgSetString("sim/networking/call-sign", arg.substr(9).c_str());
|
1999-06-30 20:21:04 +00:00
|
|
|
#endif
|
2003-03-19 20:45:09 +00:00
|
|
|
|
|
|
|
#ifdef FG_MPLAYER_AS
|
|
|
|
} else if ( arg.find( "--callsign=") == 0 ) {
|
|
|
|
fgSetString("sim/multiplay/callsign", arg.substr(11).c_str());
|
|
|
|
#endif
|
|
|
|
|
2000-07-03 20:09:56 +00:00
|
|
|
} else if ( arg.find( "--prop:" ) == 0 ) {
|
|
|
|
string assign = arg.substr(7);
|
2002-07-02 20:45:02 +00:00
|
|
|
string::size_type pos = assign.find('=');
|
2001-05-18 16:09:39 +00:00
|
|
|
if ( pos == arg.npos || pos == 0 ) {
|
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT, "Bad property assignment: " << arg );
|
2000-07-03 20:09:56 +00:00
|
|
|
return FG_OPTIONS_ERROR;
|
|
|
|
}
|
|
|
|
string name = assign.substr(0, pos);
|
|
|
|
string value = assign.substr(pos + 1);
|
2002-03-19 17:12:13 +00:00
|
|
|
fgSetString(name.c_str(), value.c_str());
|
2001-03-24 06:03:11 +00:00
|
|
|
// SG_LOG(SG_GENERAL, SG_INFO, "Setting default value of property "
|
2001-01-31 15:59:16 +00:00
|
|
|
// << name << " to \"" << value << '"');
|
2001-12-12 03:49:48 +00:00
|
|
|
} else if ( arg.find("--trace-read=") == 0) {
|
|
|
|
string name = arg.substr(13);
|
|
|
|
SG_LOG(SG_GENERAL, SG_INFO, "Tracing reads for property " << name);
|
2002-03-19 17:12:13 +00:00
|
|
|
fgGetNode(name.c_str(), true)
|
|
|
|
->setAttribute(SGPropertyNode::TRACE_READ, true);
|
2001-12-12 03:49:48 +00:00
|
|
|
} else if ( arg.find("--trace-write=") == 0) {
|
|
|
|
string name = arg.substr(14);
|
|
|
|
SG_LOG(SG_GENERAL, SG_INFO, "Tracing writes for property " << name);
|
2002-03-19 17:12:13 +00:00
|
|
|
fgGetNode(name.c_str(), true)
|
|
|
|
->setAttribute(SGPropertyNode::TRACE_WRITE, true);
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--view-offset=" ) == 0 ) {
|
2001-12-12 03:49:48 +00:00
|
|
|
// $$$ begin - added VS Renganathan, 14 Oct 2K
|
|
|
|
// for multi-window outside window imagery
|
The following changes were made to flightgear-0.7.5 code to implement the follow
ing features:
a) ADA Flight model - ADA.cxx, ADA.hxx, flight.hxx
b) Fighter a/c HUD - flight.hxx, hud.hxx, hud.cxx, cockpit.cxx, hud_ladr.c
xx, hud_card.cxx
c) 3-window display - options.hxx, options.cxx, viewer.cxx
d) Moving objects (ship) - main.cxx
e) Patches - main.cxx
ADA.cxx, ADA.hxx
--------------------------
Interface to the external ADA flight dynamics package.
flight.hxx
----------
Included prototypes for accepting additional data fron the External flight
model for fighter aircraft HUD
Hud.hxx
-------
Included prototypes for accepting additional data for fighter HUD from Exernal F
light model.
Defined FIGHTER_HUD pre-processor directive to enable compilation of fighter hud
code.
hud.cxx, cockpit.cxx, hud_ladr.cxx, hud_card.cxx
---------------------------------------
Included code to initialise additional reticles/text for fighter HUD which is co
nditionally
compiled if FIGHTER_HUD is defined.
options.hxx
-----------
Added window_offset, and function to retrieve its value for 3 windows
options.cxx
-----------
Changed few options to suit ADA/CEF projection system/screens and checks for win
dow offset.
views.cxx
---------
Added code to retrieve view offset for window.
Main.cxx
--------
Added code to load and move an aircraft carrier.
Patch to enable clouds from command line until Curtis fixes it. By default cloud
s are disabled.
2000-10-19 19:46:13 +00:00
|
|
|
string woffset = arg.substr( 14 );
|
2001-01-12 15:37:40 +00:00
|
|
|
double default_view_offset = 0.0;
|
The following changes were made to flightgear-0.7.5 code to implement the follow
ing features:
a) ADA Flight model - ADA.cxx, ADA.hxx, flight.hxx
b) Fighter a/c HUD - flight.hxx, hud.hxx, hud.cxx, cockpit.cxx, hud_ladr.c
xx, hud_card.cxx
c) 3-window display - options.hxx, options.cxx, viewer.cxx
d) Moving objects (ship) - main.cxx
e) Patches - main.cxx
ADA.cxx, ADA.hxx
--------------------------
Interface to the external ADA flight dynamics package.
flight.hxx
----------
Included prototypes for accepting additional data fron the External flight
model for fighter aircraft HUD
Hud.hxx
-------
Included prototypes for accepting additional data for fighter HUD from Exernal F
light model.
Defined FIGHTER_HUD pre-processor directive to enable compilation of fighter hud
code.
hud.cxx, cockpit.cxx, hud_ladr.cxx, hud_card.cxx
---------------------------------------
Included code to initialise additional reticles/text for fighter HUD which is co
nditionally
compiled if FIGHTER_HUD is defined.
options.hxx
-----------
Added window_offset, and function to retrieve its value for 3 windows
options.cxx
-----------
Changed few options to suit ADA/CEF projection system/screens and checks for win
dow offset.
views.cxx
---------
Added code to retrieve view offset for window.
Main.cxx
--------
Added code to load and move an aircraft carrier.
Patch to enable clouds from command line until Curtis fixes it. By default cloud
s are disabled.
2000-10-19 19:46:13 +00:00
|
|
|
if ( woffset == "LEFT" ) {
|
2001-03-24 02:36:45 +00:00
|
|
|
default_view_offset = SGD_PI * 0.25;
|
The following changes were made to flightgear-0.7.5 code to implement the follow
ing features:
a) ADA Flight model - ADA.cxx, ADA.hxx, flight.hxx
b) Fighter a/c HUD - flight.hxx, hud.hxx, hud.cxx, cockpit.cxx, hud_ladr.c
xx, hud_card.cxx
c) 3-window display - options.hxx, options.cxx, viewer.cxx
d) Moving objects (ship) - main.cxx
e) Patches - main.cxx
ADA.cxx, ADA.hxx
--------------------------
Interface to the external ADA flight dynamics package.
flight.hxx
----------
Included prototypes for accepting additional data fron the External flight
model for fighter aircraft HUD
Hud.hxx
-------
Included prototypes for accepting additional data for fighter HUD from Exernal F
light model.
Defined FIGHTER_HUD pre-processor directive to enable compilation of fighter hud
code.
hud.cxx, cockpit.cxx, hud_ladr.cxx, hud_card.cxx
---------------------------------------
Included code to initialise additional reticles/text for fighter HUD which is co
nditionally
compiled if FIGHTER_HUD is defined.
options.hxx
-----------
Added window_offset, and function to retrieve its value for 3 windows
options.cxx
-----------
Changed few options to suit ADA/CEF projection system/screens and checks for win
dow offset.
views.cxx
---------
Added code to retrieve view offset for window.
Main.cxx
--------
Added code to load and move an aircraft carrier.
Patch to enable clouds from command line until Curtis fixes it. By default cloud
s are disabled.
2000-10-19 19:46:13 +00:00
|
|
|
} else if ( woffset == "RIGHT" ) {
|
2001-03-24 02:36:45 +00:00
|
|
|
default_view_offset = SGD_PI * 1.75;
|
The following changes were made to flightgear-0.7.5 code to implement the follow
ing features:
a) ADA Flight model - ADA.cxx, ADA.hxx, flight.hxx
b) Fighter a/c HUD - flight.hxx, hud.hxx, hud.cxx, cockpit.cxx, hud_ladr.c
xx, hud_card.cxx
c) 3-window display - options.hxx, options.cxx, viewer.cxx
d) Moving objects (ship) - main.cxx
e) Patches - main.cxx
ADA.cxx, ADA.hxx
--------------------------
Interface to the external ADA flight dynamics package.
flight.hxx
----------
Included prototypes for accepting additional data fron the External flight
model for fighter aircraft HUD
Hud.hxx
-------
Included prototypes for accepting additional data for fighter HUD from Exernal F
light model.
Defined FIGHTER_HUD pre-processor directive to enable compilation of fighter hud
code.
hud.cxx, cockpit.cxx, hud_ladr.cxx, hud_card.cxx
---------------------------------------
Included code to initialise additional reticles/text for fighter HUD which is co
nditionally
compiled if FIGHTER_HUD is defined.
options.hxx
-----------
Added window_offset, and function to retrieve its value for 3 windows
options.cxx
-----------
Changed few options to suit ADA/CEF projection system/screens and checks for win
dow offset.
views.cxx
---------
Added code to retrieve view offset for window.
Main.cxx
--------
Added code to load and move an aircraft carrier.
Patch to enable clouds from command line until Curtis fixes it. By default cloud
s are disabled.
2000-10-19 19:46:13 +00:00
|
|
|
} else if ( woffset == "CENTER" ) {
|
|
|
|
default_view_offset = 0.00;
|
|
|
|
} else {
|
2001-03-24 04:48:44 +00:00
|
|
|
default_view_offset = atof( woffset.c_str() ) * SGD_DEGREES_TO_RADIANS;
|
The following changes were made to flightgear-0.7.5 code to implement the follow
ing features:
a) ADA Flight model - ADA.cxx, ADA.hxx, flight.hxx
b) Fighter a/c HUD - flight.hxx, hud.hxx, hud.cxx, cockpit.cxx, hud_ladr.c
xx, hud_card.cxx
c) 3-window display - options.hxx, options.cxx, viewer.cxx
d) Moving objects (ship) - main.cxx
e) Patches - main.cxx
ADA.cxx, ADA.hxx
--------------------------
Interface to the external ADA flight dynamics package.
flight.hxx
----------
Included prototypes for accepting additional data fron the External flight
model for fighter aircraft HUD
Hud.hxx
-------
Included prototypes for accepting additional data for fighter HUD from Exernal F
light model.
Defined FIGHTER_HUD pre-processor directive to enable compilation of fighter hud
code.
hud.cxx, cockpit.cxx, hud_ladr.cxx, hud_card.cxx
---------------------------------------
Included code to initialise additional reticles/text for fighter HUD which is co
nditionally
compiled if FIGHTER_HUD is defined.
options.hxx
-----------
Added window_offset, and function to retrieve its value for 3 windows
options.cxx
-----------
Changed few options to suit ADA/CEF projection system/screens and checks for win
dow offset.
views.cxx
---------
Added code to retrieve view offset for window.
Main.cxx
--------
Added code to load and move an aircraft carrier.
Patch to enable clouds from command line until Curtis fixes it. By default cloud
s are disabled.
2000-10-19 19:46:13 +00:00
|
|
|
}
|
2003-03-19 20:45:09 +00:00
|
|
|
/* apparently not used (CLO, 11 Jun 2002)
|
2002-06-11 17:06:46 +00:00
|
|
|
FGViewer *pilot_view =
|
|
|
|
(FGViewer *)globals->get_viewmgr()->get_view( 0 ); */
|
From: "Jim Wilson" <jimw@kelcomaine.com>
This is a new improved patch for the previous tile manager fixes.
Rather than building dependencies between FGlocation or the viewer or fdm with
tilemgr what I ended up doing was linking the pieces together in the Mainloop
in main.cxx. You'll see what I mean...it's been commented fairly well. More
than likely we should move that chunk somewhere...just not sure where yet.
The changes seem clean now. As I get more ideas there could be some further
improvement in organizing the update in tilemgr. You'll note that I left an
override in there for the tilemgr::update() function to preserve earlier
functionality if someone needs it (e.g. usage independent of an fdm or
viewer), not to mention there are a few places in flightgear that call it
directly that have not been changed to the new interface (and may not need to be).
The code has been optimized to avoid duplicate traversals and seems to run
generally quite well. Note that there can be a short delay reloading tiles
that have been dropped from static views. We could call the tile scheduler on
a view switch, but it's not a big deal and at the moment I'd like to get this
in so people can try it and comment on it as it is.
Everything has been resycned with CVS tonight and I've included the
description submitted earlier (below).
Best,
Jim
Changes synced with CVS approx 20:30EDT 2002-05-09 (after this evenings updates).
Files:
http://www.spiderbark.com/fgfs/viewer-update-20020516.tar.gz
or
http://www.spiderbark.com/fgfs/viewer-update-20020516.diffs.gz
Description:
In a nutshell, these patches begin to take what was one value for ground
elevation and calculate ground elevation values seperately for the FDM and the
viewer (eye position). Several outstanding view related bugs have been fixed.
With the introduction of the new viewer code a lot of that Flight Gear code
broke related to use of a global variable called "scenery.cur_elev".
Therefore the ground_elevation and other associated items (like the current
tile bucket) is maintained per FDM instance and per View. Each of these has a
"point" or location that can be identified. See changes to FGLocation class
and main.cxx.
Most of the problems related to the new viewer in terms of sky, ground and
runway lights, and tower views are fixed.
There are four minor problems remaining. 1) The sun/moon spins when you pan
the "lookat" tower view only (view #3). 2) Under stress (esp. magic carpet
full speed with max visibility), there is a memory leak in the tile caching
that was not introduced with these changes. 3) I have not tested these
changes or made corrections to the ADA or External FDM interfaces. 4) The
change view function doesn't call the time/light update (not a problem unless
a tower is very far away).
Details:
FDM/flight.cxx, flight.hxx - FGInterface ties to FGAircraftModel so that it's
location data can be accessed for runway (ground elevation under aircraft)
elevation.
FDM/larsim.cxx, larcsim.hxx - gets runway elevation from FGInterface now.
Commented out function that is causing a namespace conflict, hasn't been
called with recent code anyway.
FDM/JSBSim/JSBSim.cxx, YASim/YASim.cxx - gets runway elevation from
FGInterface now.
Scenery/newcache.cxx, newcache.hxx - changed caching scheme to time based
(oldest tiles discard).
Scenery/tileentry.cxx, tileentry.hxx - added place to record time, changed
rendering to reference viewer altitude in order to fix a problem with ground
and runway lights.
Scenery/tilemgr.cxx, tilemgr.hxx - Modified update() to accept values for
multiple locations. Refresh function added in order to periodically make
the tiles current for a non-moving view (like a tower).
Main/fg_init.cxx - register event for making tiles current in a non-moving
view (like a tower).
Main/location.hxx - added support for current ground elevation data.
Main/main.cxx - added second tilemgr call for fdm, fixed places where viewer
position data was required for correct sky rendering.
Main/options.cxx - fixed segfault reported by Curtis when using --view-offset
command line parameter.
Main/viewer.cxx, viewer.hxx - removed fudging of view position. Fixed numerous
bugs that were causing eye and target values to get mixed up.
2002-05-17 17:25:28 +00:00
|
|
|
// this will work without calls to the viewer...
|
2002-04-18 16:51:47 +00:00
|
|
|
fgSetDouble( "/sim/current-view/heading-offset-deg",
|
|
|
|
default_view_offset * SGD_RADIANS_TO_DEGREES );
|
The following changes were made to flightgear-0.7.5 code to implement the follow
ing features:
a) ADA Flight model - ADA.cxx, ADA.hxx, flight.hxx
b) Fighter a/c HUD - flight.hxx, hud.hxx, hud.cxx, cockpit.cxx, hud_ladr.c
xx, hud_card.cxx
c) 3-window display - options.hxx, options.cxx, viewer.cxx
d) Moving objects (ship) - main.cxx
e) Patches - main.cxx
ADA.cxx, ADA.hxx
--------------------------
Interface to the external ADA flight dynamics package.
flight.hxx
----------
Included prototypes for accepting additional data fron the External flight
model for fighter aircraft HUD
Hud.hxx
-------
Included prototypes for accepting additional data for fighter HUD from Exernal F
light model.
Defined FIGHTER_HUD pre-processor directive to enable compilation of fighter hud
code.
hud.cxx, cockpit.cxx, hud_ladr.cxx, hud_card.cxx
---------------------------------------
Included code to initialise additional reticles/text for fighter HUD which is co
nditionally
compiled if FIGHTER_HUD is defined.
options.hxx
-----------
Added window_offset, and function to retrieve its value for 3 windows
options.cxx
-----------
Changed few options to suit ADA/CEF projection system/screens and checks for win
dow offset.
views.cxx
---------
Added code to retrieve view offset for window.
Main.cxx
--------
Added code to load and move an aircraft carrier.
Patch to enable clouds from command line until Curtis fixes it. By default cloud
s are disabled.
2000-10-19 19:46:13 +00:00
|
|
|
// $$$ end - added VS Renganathan, 14 Oct 2K
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--visibility=" ) == 0 ) {
|
2001-07-02 22:27:24 +00:00
|
|
|
fgSetDouble("/environment/visibility-m", atof(arg.substr(13)));
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--visibility-miles=" ) == 0 ) {
|
2001-03-24 04:56:46 +00:00
|
|
|
double visibility = atof(arg.substr(19)) * 5280.0 * SG_FEET_TO_METER;
|
2001-07-02 22:27:24 +00:00
|
|
|
fgSetDouble("/environment/visibility-m", visibility);
|
2002-07-26 02:49:14 +00:00
|
|
|
} else if ( arg.find( "--random-wind" ) == 0 ) {
|
|
|
|
double min_hdg = sg_random() * 360.0;
|
|
|
|
double max_hdg = min_hdg + (20 - sqrt(sg_random() * 400));
|
|
|
|
double speed = 40 - sqrt(sg_random() * 1600.0);
|
|
|
|
double gust = speed + (10 - sqrt(sg_random() * 100));
|
|
|
|
setup_wind(min_hdg, max_hdg, speed, gust);
|
2001-01-08 17:59:54 +00:00
|
|
|
} else if ( arg.find( "--wind=" ) == 0 ) {
|
2002-06-09 21:28:17 +00:00
|
|
|
double min_hdg, max_hdg, speed, gust;
|
|
|
|
if (!parse_wind(arg.substr(7), &min_hdg, &max_hdg, &speed, &gust)) {
|
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT, "bad wind value " << arg.substr(7) );
|
|
|
|
return FG_OPTIONS_ERROR;
|
|
|
|
}
|
2002-07-26 02:49:14 +00:00
|
|
|
setup_wind(min_hdg, max_hdg, speed, gust);
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--wp=" ) == 0 ) {
|
2000-10-12 01:08:09 +00:00
|
|
|
parse_wp( arg.substr( 5 ) );
|
2001-03-06 19:11:28 +00:00
|
|
|
} else if ( arg.find( "--flight-plan=") == 0) {
|
2000-11-28 23:38:24 +00:00
|
|
|
parse_flightplan ( arg.substr (14) );
|
2001-03-09 02:41:04 +00:00
|
|
|
} else if ( arg.find( "--config=" ) == 0 ) {
|
|
|
|
string file = arg.substr(9);
|
2001-07-19 04:53:13 +00:00
|
|
|
try {
|
|
|
|
readProperties(file, globals->get_props());
|
2001-07-24 23:51:36 +00:00
|
|
|
} catch (const sg_exception &e) {
|
2001-07-19 04:53:13 +00:00
|
|
|
string message = "Error loading config file: ";
|
2001-07-24 23:51:36 +00:00
|
|
|
message += e.getFormattedMessage();
|
2001-07-19 04:53:13 +00:00
|
|
|
SG_LOG(SG_INPUT, SG_ALERT, message);
|
|
|
|
exit(2);
|
2001-03-06 19:11:28 +00:00
|
|
|
}
|
2001-12-07 17:37:15 +00:00
|
|
|
} else if ( arg.find( "--aircraft=" ) == 0 ) {
|
2002-10-10 18:39:52 +00:00
|
|
|
fgSetString("/sim/aircraft", arg.substr(11).c_str());
|
1998-05-13 18:29:56 +00:00
|
|
|
} else {
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT, "Unknown option '" << arg << "'" );
|
1998-11-06 21:17:31 +00:00
|
|
|
return FG_OPTIONS_ERROR;
|
1998-05-13 18:29:56 +00:00
|
|
|
}
|
2003-01-19 23:02:51 +00:00
|
|
|
#endif
|
1998-05-13 18:29:56 +00:00
|
|
|
|
1998-11-06 21:17:31 +00:00
|
|
|
return FG_OPTIONS_OK;
|
1998-04-24 00:49:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Parse the command line options
|
2001-01-13 22:06:39 +00:00
|
|
|
void
|
2002-01-04 20:58:48 +00:00
|
|
|
fgParseArgs (int argc, char **argv)
|
|
|
|
{
|
|
|
|
bool in_options = true;
|
2002-08-25 22:38:20 +00:00
|
|
|
bool verbose = false;
|
|
|
|
bool help = false;
|
1998-04-24 00:49:17 +00:00
|
|
|
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG(SG_GENERAL, SG_INFO, "Processing command line arguments");
|
1998-04-24 00:49:17 +00:00
|
|
|
|
2002-01-04 20:58:48 +00:00
|
|
|
for (int i = 1; i < argc; i++) {
|
|
|
|
string arg = argv[i];
|
|
|
|
|
|
|
|
if (in_options && (arg.find('-') == 0)) {
|
|
|
|
if (arg == "--") {
|
|
|
|
in_options = false;
|
|
|
|
} else {
|
|
|
|
int result = parse_option(arg);
|
2002-08-25 22:38:20 +00:00
|
|
|
if ((result == FG_OPTIONS_HELP) || (result == FG_OPTIONS_ERROR))
|
|
|
|
help = true;
|
|
|
|
|
|
|
|
else if (result == FG_OPTIONS_VERBOSE_HELP)
|
|
|
|
verbose = true;
|
2002-08-28 16:59:40 +00:00
|
|
|
|
|
|
|
else if (result == FG_OPTIONS_SHOW_AIRCRAFT) {
|
|
|
|
fgShowAircraft();
|
|
|
|
exit(0);
|
|
|
|
}
|
2002-01-04 20:58:48 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
in_options = false;
|
|
|
|
SG_LOG(SG_GENERAL, SG_INFO,
|
|
|
|
"Reading command-line property file " << arg);
|
|
|
|
readProperties(arg, globals->get_props());
|
1998-04-24 00:49:17 +00:00
|
|
|
}
|
|
|
|
}
|
2002-01-04 20:58:48 +00:00
|
|
|
|
2002-08-25 22:38:20 +00:00
|
|
|
if (help) {
|
|
|
|
fgUsage(verbose);
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
|
2002-01-04 20:58:48 +00:00
|
|
|
SG_LOG(SG_GENERAL, SG_INFO, "Finished command line arguments");
|
1998-04-24 00:49:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
1998-08-27 17:01:55 +00:00
|
|
|
// Parse config file options
|
2001-01-13 22:06:39 +00:00
|
|
|
void
|
|
|
|
fgParseOptions (const string& path) {
|
2001-03-25 14:20:12 +00:00
|
|
|
sg_gzifstream in( path );
|
2001-05-18 16:09:39 +00:00
|
|
|
if ( !in.is_open() ) {
|
|
|
|
return;
|
|
|
|
}
|
1998-05-13 18:29:56 +00:00
|
|
|
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG( SG_GENERAL, SG_INFO, "Processing config file: " << path );
|
1998-05-13 18:29:56 +00:00
|
|
|
|
1998-11-06 14:46:59 +00:00
|
|
|
in >> skipcomment;
|
1999-08-07 18:24:23 +00:00
|
|
|
#ifndef __MWERKS__
|
|
|
|
while ( ! in.eof() ) {
|
|
|
|
#else
|
|
|
|
char c = '\0';
|
|
|
|
while ( in.get(c) && c != '\0' ) {
|
|
|
|
in.putback(c);
|
|
|
|
#endif
|
1998-09-15 02:09:24 +00:00
|
|
|
string line;
|
1999-05-06 19:38:28 +00:00
|
|
|
|
2001-05-18 16:09:39 +00:00
|
|
|
#if defined( macintosh )
|
|
|
|
getline( in, line, '\r' );
|
1999-05-06 19:38:28 +00:00
|
|
|
#else
|
2001-05-18 16:09:39 +00:00
|
|
|
getline( in, line, '\n' );
|
1999-05-06 19:38:28 +00:00
|
|
|
#endif
|
1998-07-22 01:27:03 +00:00
|
|
|
|
2001-05-18 16:09:39 +00:00
|
|
|
// catch extraneous (DOS) line ending character
|
|
|
|
if ( line[line.length() - 1] < 32 ) {
|
|
|
|
line = line.substr( 0, line.length()-1 );
|
|
|
|
}
|
|
|
|
|
1998-09-15 02:09:24 +00:00
|
|
|
if ( parse_option( line ) == FG_OPTIONS_ERROR ) {
|
2002-10-04 15:19:07 +00:00
|
|
|
cerr << endl << "Config file parse error: " << path << " '"
|
2002-09-18 16:13:08 +00:00
|
|
|
<< line << "'" << endl;
|
2001-01-13 22:06:39 +00:00
|
|
|
fgUsage();
|
1998-11-06 21:17:31 +00:00
|
|
|
exit(-1);
|
1998-05-13 18:29:56 +00:00
|
|
|
}
|
1998-11-06 14:46:59 +00:00
|
|
|
in >> skipcomment;
|
1998-05-13 18:29:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
1998-04-24 00:49:17 +00:00
|
|
|
// Print usage message
|
2001-01-13 22:06:39 +00:00
|
|
|
void
|
2002-08-25 22:38:20 +00:00
|
|
|
fgUsage (bool verbose)
|
2001-01-13 22:06:39 +00:00
|
|
|
{
|
2002-10-10 15:02:50 +00:00
|
|
|
SGPropertyNode *locale = globals->get_locale();
|
|
|
|
|
2002-06-10 23:30:23 +00:00
|
|
|
SGPropertyNode options_root;
|
|
|
|
|
2002-06-12 16:38:46 +00:00
|
|
|
cout << "" << endl;
|
2002-06-11 17:06:46 +00:00
|
|
|
|
2002-06-10 23:30:23 +00:00
|
|
|
try {
|
2002-11-06 18:57:31 +00:00
|
|
|
fgLoadProps("options.xml", &options_root);
|
2002-06-10 23:30:23 +00:00
|
|
|
} catch (const sg_exception &ex) {
|
2002-06-12 16:38:46 +00:00
|
|
|
cout << "Unable to read the help file." << endl;
|
|
|
|
cout << "Make sure the file options.xml is located in the FlightGear base directory," << endl;
|
2002-08-27 23:52:15 +00:00
|
|
|
cout << "and the location of the base directory is specified by setting $FG_ROOT or" << endl;
|
2002-06-12 16:38:46 +00:00
|
|
|
cout << "by adding --fg-root=path as a program argument." << endl;
|
|
|
|
|
2002-06-10 23:30:23 +00:00
|
|
|
exit(-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
SGPropertyNode *options = options_root.getNode("options");
|
|
|
|
if (!options) {
|
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT,
|
|
|
|
"Error reading options.xml: <options> directive not found." );
|
|
|
|
exit(-1);
|
|
|
|
}
|
|
|
|
|
2002-10-10 15:02:50 +00:00
|
|
|
SGPropertyNode *usage = locale->getNode(options->getStringValue("usage"));
|
2002-06-10 23:30:23 +00:00
|
|
|
if (usage) {
|
2002-06-12 16:38:46 +00:00
|
|
|
cout << "Usage: " << usage->getStringValue() << endl;
|
2002-06-10 23:30:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
vector<SGPropertyNode_ptr>section = options->getChildren("section");
|
|
|
|
for (unsigned int j = 0; j < section.size(); j++) {
|
2002-08-25 22:38:20 +00:00
|
|
|
string msg = "";
|
2002-06-10 23:30:23 +00:00
|
|
|
|
|
|
|
vector<SGPropertyNode_ptr>option = section[j]->getChildren("option");
|
|
|
|
for (unsigned int k = 0; k < option.size(); k++) {
|
|
|
|
|
|
|
|
SGPropertyNode *name = option[k]->getNode("name");
|
|
|
|
SGPropertyNode *short_name = option[k]->getNode("short");
|
2002-06-12 16:38:46 +00:00
|
|
|
SGPropertyNode *key = option[k]->getNode("key");
|
2002-06-10 23:30:23 +00:00
|
|
|
SGPropertyNode *arg = option[k]->getNode("arg");
|
2002-08-25 22:38:20 +00:00
|
|
|
bool brief = option[k]->getNode("brief");
|
2002-06-10 23:30:23 +00:00
|
|
|
|
2002-08-25 22:38:20 +00:00
|
|
|
if ((brief || verbose) && name) {
|
2002-06-11 17:06:46 +00:00
|
|
|
string tmp = name->getStringValue();
|
|
|
|
|
2002-06-12 16:38:46 +00:00
|
|
|
if (key){
|
|
|
|
tmp.append(":");
|
|
|
|
tmp.append(key->getStringValue());
|
2002-06-10 23:30:23 +00:00
|
|
|
}
|
|
|
|
if (arg) {
|
2002-06-11 17:06:46 +00:00
|
|
|
tmp.append("=");
|
|
|
|
tmp.append(arg->getStringValue());
|
2002-06-10 23:30:23 +00:00
|
|
|
}
|
2002-06-12 16:38:46 +00:00
|
|
|
if (short_name) {
|
|
|
|
tmp.append(", -");
|
|
|
|
tmp.append(short_name->getStringValue());
|
|
|
|
}
|
2002-06-10 23:30:23 +00:00
|
|
|
|
2002-06-12 16:38:46 +00:00
|
|
|
char cstr[96];
|
2002-06-11 17:06:46 +00:00
|
|
|
if (tmp.size() <= 25) {
|
2002-06-12 16:38:46 +00:00
|
|
|
snprintf(cstr, 96, " --%-27s", tmp.c_str());
|
2002-06-10 23:30:23 +00:00
|
|
|
} else {
|
2002-06-12 16:38:46 +00:00
|
|
|
snprintf(cstr, 96, "\n --%s\n%32c", tmp.c_str(), ' ');
|
2002-06-10 23:30:23 +00:00
|
|
|
}
|
|
|
|
|
2002-10-10 15:02:50 +00:00
|
|
|
// There may be more than one <description> tag assosiated
|
|
|
|
// with one option
|
|
|
|
|
2002-08-25 22:38:20 +00:00
|
|
|
msg += cstr;
|
2002-10-10 15:02:50 +00:00
|
|
|
vector<SGPropertyNode_ptr>desc =
|
|
|
|
option[k]->getChildren("description");
|
|
|
|
|
|
|
|
if (desc.size() > 0) {
|
|
|
|
for ( unsigned int l = 0; l < desc.size(); l++) {
|
|
|
|
|
|
|
|
// There may be more than one translation line.
|
|
|
|
|
|
|
|
string t = desc[l]->getStringValue();
|
|
|
|
SGPropertyNode *n = locale->getNode("strings");
|
|
|
|
vector<SGPropertyNode_ptr>trans_desc =
|
|
|
|
n->getChildren(t.substr(8).c_str());
|
|
|
|
|
|
|
|
for ( unsigned int m = 0; m < trans_desc.size(); m++ ) {
|
|
|
|
string t_str = trans_desc[m]->getStringValue();
|
|
|
|
|
|
|
|
if ((m > 0) || ((l > 0) && m == 0)) {
|
|
|
|
snprintf(cstr, 96, "%32c", ' ');
|
|
|
|
msg += cstr;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// If the string is too large to fit on the screen,
|
|
|
|
// then split it up in several pieces.
|
|
|
|
|
|
|
|
while ( t_str.size() > 47 ) {
|
|
|
|
|
|
|
|
unsigned int m = t_str.rfind(' ', 47);
|
|
|
|
msg += t_str.substr(0, m);
|
|
|
|
snprintf(cstr, 96, "\n%32c", ' ');
|
|
|
|
msg += cstr;
|
|
|
|
|
|
|
|
t_str.erase(t_str.begin(), t_str.begin() + m + 1);
|
|
|
|
}
|
|
|
|
msg += t_str + '\n';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2002-06-10 23:30:23 +00:00
|
|
|
}
|
|
|
|
}
|
2002-08-25 22:38:20 +00:00
|
|
|
|
2002-10-10 15:02:50 +00:00
|
|
|
SGPropertyNode *name =
|
|
|
|
locale->getNode(section[j]->getStringValue("name"));
|
|
|
|
|
2002-08-25 22:38:20 +00:00
|
|
|
if (!msg.empty() && name) {
|
|
|
|
cout << endl << name->getStringValue() << ":" << endl;
|
|
|
|
cout << msg;
|
|
|
|
msg.erase();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !verbose ) {
|
|
|
|
cout << endl;
|
|
|
|
cout << "For a complete list of options use --help --verbose" << endl;
|
2002-06-10 23:30:23 +00:00
|
|
|
}
|
1998-04-24 00:49:17 +00:00
|
|
|
}
|
2002-08-28 16:59:40 +00:00
|
|
|
|
|
|
|
// Show available aircraft types
|
|
|
|
void fgShowAircraft(void) {
|
2003-02-11 21:17:36 +00:00
|
|
|
vector<string> aircraft;
|
|
|
|
|
2002-08-28 16:59:40 +00:00
|
|
|
SGPath path( globals->get_fg_root() );
|
|
|
|
path.append("Aircraft");
|
|
|
|
|
|
|
|
ulDirEnt* dire;
|
|
|
|
ulDir *dirp;
|
|
|
|
|
|
|
|
dirp = ulOpenDir(path.c_str());
|
|
|
|
if (dirp == NULL) {
|
2002-10-04 15:19:07 +00:00
|
|
|
cerr << "Unable to open aircraft directory." << endl;
|
2002-08-28 16:59:40 +00:00
|
|
|
exit(-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
while ((dire = ulReadDir(dirp)) != NULL) {
|
|
|
|
char *ptr;
|
|
|
|
|
2002-08-28 17:53:52 +00:00
|
|
|
if ((ptr = strstr(dire->d_name, "-set.xml")) && ptr[8] == '\0' ) {
|
2002-08-28 16:59:40 +00:00
|
|
|
SGPath afile = path;
|
|
|
|
afile.append(dire->d_name);
|
|
|
|
|
|
|
|
*ptr = '\0';
|
|
|
|
|
|
|
|
SGPropertyNode root;
|
|
|
|
try {
|
|
|
|
readProperties(afile.str(), &root);
|
|
|
|
} catch (...) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2002-11-15 21:13:29 +00:00
|
|
|
SGPropertyNode *desc = NULL;
|
|
|
|
SGPropertyNode *node = root.getNode("sim");
|
|
|
|
if (node) {
|
2002-08-28 16:59:40 +00:00
|
|
|
desc = node->getNode("description");
|
2002-11-15 21:13:29 +00:00
|
|
|
}
|
2002-08-28 16:59:40 +00:00
|
|
|
|
|
|
|
char cstr[96];
|
|
|
|
if (strlen(dire->d_name) <= 27)
|
|
|
|
snprintf(cstr, 96, " %-27s %s", dire->d_name,
|
|
|
|
(desc) ? desc->getStringValue() : "" );
|
|
|
|
|
|
|
|
else
|
|
|
|
snprintf(cstr, 96, " %-27s\n%32c%s", dire->d_name, ' ',
|
|
|
|
(desc) ? desc->getStringValue() : "" );
|
|
|
|
|
2003-02-11 21:17:36 +00:00
|
|
|
aircraft.push_back(cstr);
|
2002-08-28 16:59:40 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-02-11 21:17:36 +00:00
|
|
|
sort(aircraft.begin(), aircraft.end());
|
|
|
|
cout << "Available aircraft:" << endl;
|
2003-03-03 04:34:27 +00:00
|
|
|
for ( unsigned int i = 0; i < aircraft.size(); i++ ) {
|
|
|
|
cout << aircraft[i] << endl;
|
|
|
|
}
|
2003-02-11 21:17:36 +00:00
|
|
|
|
|
|
|
aircraft.clear();
|
2002-08-28 16:59:40 +00:00
|
|
|
ulCloseDir(dirp);
|
|
|
|
}
|