// Rendering options
fgSetString("/sim/rendering/fog", "nicest");
fgSetBool("/environment/clouds/status", true);
- fgSetDouble("/environment/clouds/altitude-ft", 5000);
fgSetBool("/sim/startup/fullscreen", false);
fgSetBool("/sim/rendering/shading", true);
fgSetBool("/sim/rendering/skyblend", true);
}
+static bool
+parse_wind (const string &wind, double * min_hdg, double * max_hdg,
+ double * speed, double * gust)
+{
+ unsigned int pos = wind.find('@');
+ 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;
+}
+
// parse a time string ([+/-]%f[:%f[:%f]]) into hours
static double
parse_time(const string& time_in) {
fgSetBool("/environment/clouds/status", false);
} else if ( arg == "--enable-clouds" ) {
fgSetBool("/environment/clouds/status", true);
- } else if ( arg.find( "--clouds-asl=" ) == 0 ) {
- // FIXME: check units
- if ( !strcmp(fgGetString("/sim/startup/units"), "feet") )
- fgSetDouble("/environment/clouds/altitude-ft",
- atof(arg.substr(13)));
- else
- fgSetDouble("/environment/clouds/altitude-ft",
- atof(arg.substr(13)) * SG_METER_TO_FEET);
} else if ( arg.find( "--fov=" ) == 0 ) {
parse_fov( arg.substr(6) );
} else if ( arg == "--disable-fullscreen" ) {
}
FGViewer *pilot_view =
(FGViewer *)globals->get_viewmgr()->get_view( 0 );
- pilot_view->setHeadingOffset_deg( default_view_offset * SGD_RADIANS_TO_DEGREES );
- pilot_view->setGoalHeadingOffset_deg( default_view_offset * SGD_RADIANS_TO_DEGREES );
+ // 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
double visibility = atof(arg.substr(19)) * 5280.0 * SG_FEET_TO_METER;
fgSetDouble("/environment/visibility-m", visibility);
} else if ( arg.find( "--wind=" ) == 0 ) {
+ 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;
+ }
+ 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);
+
string val = arg.substr(7);
unsigned int pos = val.find('@');
if ( pos == string::npos ) {
SG_LOG( SG_GENERAL, SG_ALERT, "bad wind value " << val );
return FG_OPTIONS_ERROR;
}
- double dir = atof(val.substr(0,pos).c_str());
- double speed = atof(val.substr(pos+1).c_str());
- SG_LOG(SG_GENERAL, SG_INFO, "WIND: " << dir << '@' <<
+ SG_LOG(SG_GENERAL, SG_INFO, "WIND: " << min_hdg << '@' <<
speed << " knots" << endl);
- fgSetDouble("/environment/wind-from-heading-deg", dir);
- fgSetDouble("/environment/wind-speed-kt", speed);
#ifdef FG_WEATHERCM
// convert to fps
speed *= SG_NM_TO_METER * SG_METER_TO_FEET * (1.0/3600);
- while (dir > 360)
- dir -= 360;
- while (dir <= 0)
- dir += 360;
- dir *= SGD_DEGREES_TO_RADIANS;
- fgSetDouble("/environment/wind-from-north-fps",
- speed * cos(dir));
- fgSetDouble("/environment/wind-from-east-fps",
- speed * sin(dir));
+ 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
+
} else if ( arg.find( "--wp=" ) == 0 ) {
parse_wp( arg.substr( 5 ) );
} else if ( arg.find( "--flight-plan=") == 0) {
void
fgUsage ()
{
- cout <<
-"Usage: fgfs [ option ... ]\n\
-\n\
-General Options:\n\
- --help, -h Print usage\n\
- --fg-root=path Specify the root data path\n\
- --fg-scenery=path Specify the base scenery path\n\
- Defaults to $FG_ROOT/Scenery\n\
- --disable-game-mode Disable full-screen game mode\n\
- --enable-game-mode Enable full-screen game mode\n\
- --disable-splash-screen Disable splash screen\n\
- --enable-splash-screen Enable splash screen\n\
- --disable-intro-music Disable introduction music\n\
- --enable-intro-music Enable introduction music\n\
- --disable-mouse-pointer Disable extra mouse pointer\n\
- --enable-mouse-pointer Enable extra mouse pointer (i.e. for full-\n\
- screen Voodoo based cards)\n\
- --disable-freeze Start in a running state\n\
- --enable-freeze Start in a frozen state\n\
- --disable-fuel-freeze Fuel is consumed normally\n\
- --enable-fuel-freeze Fuel tank quantity forced to remain constant\n\
- --disable-clock-freeze Clock advances normally\n\
- --enable-clock-freeze Do not advance clock\n\
- --control=mode Primary control mode (joystick, keyboard,\n\
- mouse)\n\
- --enable-auto-coordination Enable auto coordination\n\
- --disable-auto-coordination Disable auto coordination\n\
- --browser-app=path Specify path to your web browser\n\
- --prop:name=value Set property <name> to <value>\n\
- --config=path Load additional properties from path\n\
- --units-feet Use feet for distances\n\
- --units-meters Use meters for distances\n\
-\n\
-Features:\n\
- --disable-hud Disable Heads Up Display (HUD)\n\
- --enable-hud Enable Heads Up Display (HUD)\n\
- --disable-panel Disable instrument panel\n\
- --enable-panel Enable instrument panel\n\
- --disable-sound Disable sound effects\n\
- --enable-sound Enable sound effects\n\
- --disable-anti-alias-hud Disable anti-aliased HUD\n\
- --enable-anti-alias-hud Enable anti-aliased HUD\n\
-\n\
-Aircraft:\n\
- --aircraft=name Select an aircraft profile as defined by a\n\
- top level <name>-set.xml\n\
-\n\
-Flight Model:\n\
- --fdm=name Select the core flight dynamics model\n\
- Can be one of jsb, larcsim, yasim, magic,\n\
- balloon, ada, external, or null\n\
- --aero=name Select aircraft aerodynamics model to load\n\
- --model-hz=n Run the FDM this rate (iterations per\n\
- second)\n\
- --speed=n Run the FDM 'n' times faster than real time\n\
- --notrim Do NOT attempt to trim the model (only with\n\
- fdm=jsbsim)\n\
- --on-ground Start at ground level (default)\n\
- --in-air Start in air (implied when using --altitude)\n\
- --wind=DIR@SPEED Specify wind coming from DIR (degrees) at\n\
- SPEED (knots)\n\
-\n\
-Aircraft model directory (UIUC FDM ONLY):\n\
- --aircraft-dir=path Aircraft directory relative to the path of\n\
- the executable\n\
-\n\
-Initial Position and Orientation:\n\
- --airport-id=ID Specify starting position by airport ID\n\
- --offset-distance=nm Specify distance to threshold\n\
- --offset-azimuth=degrees Specify heading to threshold\n\
- --lon=degrees Starting longitude (west = -)\n\
- --lat=degrees Starting latitude (south = -)\n\
- --altitude=value Starting altitude (in feet unless\n\
- --units-meters specified)\n\
- --heading=degrees Specify heading (yaw) angle (Psi)\n\
- --roll=degrees Specify roll angle (Phi)\n\
- --pitch=degrees Specify pitch angle (Theta)\n\
- --uBody=units_per_sec Specify velocity along the body X axis\n\
- (in feet unless --units-meters specified)\n\
- --vBody=units_per_sec Specify velocity along the body Y axis\n\
- (in feet unless --units-meters specified)\n\
- --wBody=units_per_sec Specify velocity along the body Z axis\n\
- (in feet unless --units-meters specified)\n\
- --vc=knots Specify initial airspeed\n\
- --mach=num Specify initial mach number\n\
- --glideslope=degreees Specify flight path angle (can be positive)\n\
- --roc=fpm Specify initial climb rate (can be negative)\n\
-\n\
-Rendering Options:\n\
- --bpp=depth Specify the bits per pixel\n\
- --fog-disable Disable fog/haze\n\
- --fog-fastest Enable fastest fog/haze\n\
- --fog-nicest Enable nicest fog/haze\n\
- --enable-clouds Enable cloud layers\n\
- --disable-clouds Disable cloud layers\n\
- --clouds-asl=altitude Specify altitude of cloud layer above sea\n\
- level\n\
- --fov=degrees Specify field of view angle\n\
- --disable-fullscreen Disable fullscreen mode\n\
- --enable-fullscreen Enable fullscreen mode\n\
- --shading-flat Enable flat shading\n\
- --shading-smooth Enable smooth shading\n\
- --disable-skyblend Disable sky blending\n\
- --enable-skyblend Enable sky blending\n\
- --disable-textures Disable textures\n\
- --enable-textures Enable textures\n\
- --disable-wireframe Disable wireframe drawing mode\n\
- --enable-wireframe Enable wireframe drawing mode\n\
- --geometry=WxH Specify window geometry (640x480, etc)\n\
- --view-offset=value Specify the default forward view direction\n\
- as an offset from straight ahead. Allowable\n\
- values are LEFT, RIGHT, CENTER, or a specific\n\
- number in degrees\n\
- --visibility=meters Specify initial visibility\n\
- --visibility-miles=miles Specify initial visibility in miles\n\
-\n\
-Hud Options:\n\
- --hud-tris Hud displays number of triangles rendered\n\
- --hud-culled Hud displays percentage of triangles culled\n\
-\n\
-Time Options:\n\
- --time-offset=[+-]hh:mm:ss Add this time offset\n\
- --time-match-real Synchronize time with real-world time\n\
- --time-match-local Synchronize time with local real-world time\n\
- --start-date-sys=yyyy:mm:dd:hh:mm:ss\n\
- Specify a starting date/time with respect to\n\
- system time\n\
- --start-date-gmt=yyyy:mm:dd:hh:mm:ss\n\
- Specify a starting date/time with respect to\n\
- Greenwich Mean Time\n\
- --start-date-lat=yyyy:mm:dd:hh:mm:ss\n\
- Specify a starting date/time with respect to\n\
- Local Aircraft Time\n\
-\n\
-Network Options:\n\
- --httpd=port Enable http server on the specified port\n\
- --telnet=port Enable telnet server on the specified port\n\
-\n"
+ // *** FIXME ***
+ // Began the process of converting output from printf() to
+ // SG_LOG() but this needs to be finished.
+
+ SGPropertyNode options_root;
+ SGPath opath( globals->get_fg_root() );
+ opath.append( "options.xml" );
+
+ try {
+ readProperties(opath.c_str(), &options_root);
+ } catch (const sg_exception &ex) {
+ SG_LOG( SG_GENERAL, SG_ALERT, endl << "Unable to read the help file." );
+ SG_LOG( SG_GENERAL, SG_ALERT, "Make sure the file options.xml is located in the FlightGear base directory." );
+ exit(-1);
+ }
-#ifdef FG_JPEG_SERVER
-"\
- --jpg-httpd=port Enable screen shot http server on the\n\
- specified port\n"
-#endif
-#ifdef FG_NETWORK_OLK
-"\
- --disable-network-olk Disable Multipilot mode (default)\n\
- --enable-network-olk Enable Multipilot mode\n\
- --net-hud Hud displays network info\n\
- --net-id=name Specify your own callsign\n"
-#endif
-"\
-Route/Way Point Options:\n\
- --wp=ID[@alt] Specify a waypoint for the GC autopilot;\n\
- multiple instances can be used to create a\n\
- route\n\
- --flight-plan=file Read all waypoints from a file\n\
-\n\
-IO Options:\n\
- --gamin=params Open connection using the Garmin GPS protocol\n\
- --joyclient=params Open connection to an Agwagon joystick\n\
- --native-ctrls=params Open connection using the FG Native Controls\n\
- protocol\n\
- --native-fdm=params Open connection using the FG Native FDM\n\
- protocol\n\
- --native=params Open connection using the FG Native protocol\n\
- --nmea=params Open connection using the NMEA protocol\n\
- --opengc=params Open connection using the OpenGC protocol\n\
- --props=params Open connection using the interactive\n\
- property manager\n\
- --pve=params Open connection using the PVE protocol\n\
- --ray=params Open connection using the RayWoodworth\n\
- motion chair protocol\n\
- --rul=params Open connection using the RUL protocol\n\
-\n\
- --atc610x Enable atc610x interface.\n\
-\n\
-Debugging Options:\n\
- --trace-read=property Trace the reads for a property; multiple\n\
- instances allowed.\n\
- --trace-write=property Trace the writes for a property; multiple\n\
- instances allowed.\n";
+ SGPropertyNode *options = options_root.getNode("options");
+ if (!options) {
+ SG_LOG( SG_GENERAL, SG_ALERT,
+ "Error reading options.xml: <options> directive not found." );
+ exit(-1);
+ }
+
+ SGPropertyNode *usage = options->getNode("usage");
+ if (usage) {
+ SG_LOG( SG_GENERAL, SG_ALERT, "Usage: " << usage->getStringValue() );
+ }
+
+ vector<SGPropertyNode_ptr>section = options->getChildren("section");
+ for (unsigned int j = 0; j < section.size(); j++) {
+
+ SGPropertyNode *name = section[j]->getNode("name");
+ if (name) {
+ SG_LOG( SG_GENERAL, SG_ALERT, endl << name->getStringValue()
+ << ":" );
+ }
+
+ 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");
+ SGPropertyNode *arg = option[k]->getNode("arg");
+
+ if (name) {
+ string str = name->getStringValue();
+ if (short_name) {
+ str.append(", -");
+ str.append(short_name->getStringValue());
+ }
+ if (arg) {
+ str.append("=");
+ str.append(arg->getStringValue());
+ }
+
+ if (str.size() <= 25) {
+ fprintf(stderr, " --%-27s", str.c_str());
+ } else {
+ fprintf(stderr, "\n --%s\n%32c", str.c_str(), ' ');
+ }
+
+ str.erase();
+ SGPropertyNode *desc = option[k]->getNode("description");
+ if (desc) {
+ SG_LOG( SG_GENERAL, SG_ALERT, desc->getStringValue() );
+
+ for ( int l = 1;
+ (desc = option[k]->getNode("desc", l, false));
+ l++ )
+ {
+ fprintf(stderr, "%32c%s\n", ' ',
+ desc->getStringValue());
+ }
+ } else {
+ SG_LOG( SG_GENERAL, SG_ALERT, "" );
+ }
+ }
+ }
+ }
}