X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Foptions.cxx;h=6cb98fc5adb464704f089c1220e489e3b0f54893;hb=a4e81f4ff075e6a3c0c2ea1b5a29c0bcdfdbc671;hp=1b3e3241472313bfea7a0aae67660593b55fda78;hpb=825320e8bfaf7b0e668a7bf4210ec400f54e6c0b;p=flightgear.git diff --git a/src/Main/options.cxx b/src/Main/options.cxx index 1b3e32414..6cb98fc5a 100644 --- a/src/Main/options.cxx +++ b/src/Main/options.cxx @@ -115,9 +115,9 @@ fgSetDefaults () // Otherwise, default to Scenery being in $FG_ROOT/Scenery globals->set_fg_scenery(""); } - // Position (Globe, AZ) - fgSetDouble("/position/longitude-deg", -110.6642444); - fgSetDouble("/position/latitude-deg", 33.3528917); + // Position (deliberately out of range) + fgSetDouble("/position/longitude-deg", 9999.0); + fgSetDouble("/position/latitude-deg", 9999.0); fgSetDouble("/position/altitude-ft", -9999.0); // Orientation @@ -167,7 +167,6 @@ fgSetDefaults () // 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); @@ -177,7 +176,7 @@ fgSetDefaults () fgSetInt("/sim/startup/ysize", 600); fgSetInt("/sim/rendering/bits-per-pixel", 16); fgSetString("/sim/view-mode", "pilot"); - fgSetDouble("/sim/view/offset-deg", 0); + fgSetDouble("/sim/current-view/heading-offset-deg", 0); fgSetDouble("/environment/visibility-m", 20000); // HUD options @@ -200,6 +199,32 @@ fgSetDefaults () } +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) { @@ -427,7 +452,7 @@ parse_fov( const string& arg ) { if ( fov < FG_FOV_MIN ) { fov = FG_FOV_MIN; } if ( fov > FG_FOV_MAX ) { fov = FG_FOV_MAX; } - fgSetDouble("/sim/field-of-view", fov); + fgSetDouble("/sim/current-view/field-of-view", fov); // printf("parse_fov(): result = %.4f\n", fov); @@ -482,7 +507,7 @@ parse_wp( const string& arg ) { alt_str = arg.substr( pos + 1 ); // cout << "id str = " << id << " alt str = " << alt_str << endl; alt = atof( alt_str.c_str() ); - if ( !strcmp("/sim/startup/units", "feet") ) { + if ( !strcmp(fgGetString("/sim/startup/units"), "feet") ) { alt *= SG_FEET_TO_METER; } } else { @@ -610,49 +635,49 @@ parse_option (const string& arg) fgSetString("/sim/startup/airport-id", ""); } else if ( arg.find( "--altitude=" ) == 0 ) { fgSetBool("/sim/startup/onground", false); - if ( !strcmp("/sim/startup/units", "feet") ) + if ( !strcmp(fgGetString("/sim/startup/units"), "feet") ) fgSetDouble("/position/altitude-ft", atof(arg.substr(11))); else fgSetDouble("/position/altitude-ft", atof(arg.substr(11)) * SG_METER_TO_FEET); } else if ( arg.find( "--uBody=" ) == 0 ) { fgSetString("/sim/startup/speed-set", "UVW"); - if ( !strcmp("/sim/startup/units", "feet") ) + if ( !strcmp(fgGetString("/sim/startup/units"), "feet") ) fgSetDouble("/velocities/uBody-fps", atof(arg.substr(8))); else fgSetDouble("/velocities/uBody-fps", atof(arg.substr(8)) * SG_METER_TO_FEET); } else if ( arg.find( "--vBody=" ) == 0 ) { fgSetString("/sim/startup/speed-set", "UVW"); - if ( !strcmp("/sim/startup/units", "feet") ) + if ( !strcmp(fgGetString("/sim/startup/units"), "feet") ) fgSetDouble("/velocities/vBody-fps", atof(arg.substr(8))); else fgSetDouble("/velocities/vBody-fps", atof(arg.substr(8)) * SG_METER_TO_FEET); } else if ( arg.find( "--wBody=" ) == 0 ) { fgSetString("/sim/startup/speed-set", "UVW"); - if ( !strcmp("/sim/startup/units", "feet") ) + if ( !strcmp(fgGetString("/sim/startup/units"), "feet") ) fgSetDouble("/velocities/wBody-fps", atof(arg.substr(8))); else fgSetDouble("/velocities/wBody-fps", atof(arg.substr(8)) * SG_METER_TO_FEET); } else if ( arg.find( "--vNorth=" ) == 0 ) { fgSetString("/sim/startup/speed-set", "NED"); - if ( !strcmp("/sim/startup/units", "feet") ) + if ( !strcmp(fgGetString("/sim/startup/units"), "feet") ) fgSetDouble("/velocities/speed-north-fps", atof(arg.substr(9))); else fgSetDouble("/velocities/speed-north-fps", atof(arg.substr(9)) * SG_METER_TO_FEET); } else if ( arg.find( "--vEast=" ) == 0 ) { fgSetString("/sim/startup/speed-set", "NED"); - if ( !strcmp("/sim/startup/units", "feet") ) + if ( !strcmp(fgGetString("/sim/startup/units"), "feet") ) fgSetDouble("/velocities/speed-east-fps", atof(arg.substr(8))); else fgSetDouble("/velocities/speed-east-fps", atof(arg.substr(8)) * SG_METER_TO_FEET); } else if ( arg.find( "--vDown=" ) == 0 ) { fgSetString("/sim/startup/speed-set", "NED"); - if ( !strcmp("/sim/startup/units", "feet") ) + if ( !strcmp(fgGetString("/sim/startup/units"), "feet") ) fgSetDouble("/velocities/speed-down-fps", atof(arg.substr(8))); else fgSetDouble("/velocities/speed-down-fps", @@ -706,14 +731,6 @@ parse_option (const string& arg) 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("/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" ) { @@ -827,6 +844,8 @@ parse_option (const string& arg) add_channel( "nmea", arg.substr(7) ); } else if ( arg.find( "--props=" ) == 0 ) { add_channel( "props", arg.substr(8) ); + } else if ( arg.find( "--telnet=" ) == 0 ) { + add_channel( "telnet", arg.substr(9) ); } else if ( arg.find( "--pve=" ) == 0 ) { add_channel( "pve", arg.substr(6) ); } else if ( arg.find( "--ray=" ) == 0 ) { @@ -884,9 +903,9 @@ parse_option (const string& arg) } 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 ); - fgSetDouble("/sim/view/offset-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 } else if ( arg.find( "--visibility=" ) == 0 ) { fgSetDouble("/environment/visibility-m", atof(arg.substr(13))); @@ -894,32 +913,39 @@ parse_option (const string& arg) 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); -#if !defined (FG_NEW_ENVIRONMENT) +#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)); -#endif // FG_NEW_ENVIRONMENT + 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) { @@ -942,14 +968,7 @@ parse_option (const string& arg) apath.concat( "-set.xml" ); SG_LOG(SG_INPUT, SG_INFO, "Reading aircraft: " << arg.substr(11) << " from " << apath.str()); - try { - readProperties( apath.str(), globals->get_props() ); - } catch (const sg_exception &e) { - string message = "Error loading aircraft file: "; - message += e.getFormattedMessage(); - SG_LOG(SG_INPUT, SG_ALERT, message); - exit(2); - } + readProperties( apath.str(), globals->get_props() ); } else { SG_LOG( SG_GENERAL, SG_ALERT, "Unknown option '" << arg << "'" ); return FG_OPTIONS_ERROR; @@ -1106,197 +1125,83 @@ fgParseOptions (const string& path) { void fgUsage () { - cout << "Usage: fgfs [ option ... ]" << endl - << endl - - << "General Options:" << endl - << " --help, -h Print usage" << endl - << " --fg-root=path Specify the root data path" << endl - << " --fg-scenery=path Specify the base scenery path;" << endl - << " Defaults to $FG_ROOT/Scenery" << endl - << " --disable-game-mode Disable full-screen game mode" << endl - << " --enable-game-mode Enable full-screen game mode" << endl - << " --disable-splash-screen Disable splash screen" << endl - << " --enable-splash-screen Enable splash screen" << endl - << " --disable-intro-music Disable introduction music" << endl - << " --enable-intro-music Enable introduction music" << endl - << " --disable-mouse-pointer Disable extra mouse pointer" << endl - << " --enable-mouse-pointer Enable extra mouse pointer (i.e. for full-" << endl - << " screen Voodoo based cards)" << endl - << " --disable-freeze Start in a running state" << endl - << " --enable-freeze Start in a frozen state" << endl - << " --disable-fuel-freeze Fuel is consumed normally" << endl - << " --enable-fuel-freeze Fuel tank quantity forced to remain constant" << endl - << " --disable-clock-freeze Clock advances normally" << endl - << " --enable-clock-freeze Do not advance clock" << endl - << " --control=mode Primary control mode (joystick, keyboard," << endl - << " mouse)" << endl - << " --enable-auto-coordination Enable auto coordination" << endl - << " --disable-auto-coordination Disable auto coordination" << endl - << " --browser-app=path Specify path to your web browser" << endl - << " --prop:name=value Set property to " << endl - << " --config=path Load additional properties from path" << endl - << " --units-feet Use feet for distances" << endl - << " --units-meters Use meters for distances" << endl - << endl - - << "Features:" << endl - << " --disable-hud Disable Heads Up Display (HUD)" << endl - << " --enable-hud Enable Heads Up Display (HUD)" << endl - << " --disable-panel Disable instrument panel" << endl - << " --enable-panel Enable instrument panel" << endl - << " --disable-sound Disable sound effects" << endl - << " --enable-sound Enable sound effects" << endl - << " --disable-anti-alias-hud Disable anti-aliased HUD" << endl - << " --enable-anti-alias-hud Enable anti-aliased HUD" << endl - << endl - - << "Aircraft:" <-set.xml" << endl - << endl - - << "Flight Model:" << endl - << " --fdm=name Select the core flight dynamics model" << endl - << " Can be one of jsb, larcsim, yasim, magic," << endl - << " balloon, ada, external, or null" << endl - << " --aero=name Select aircraft aerodynamics model to load" << endl - << " --model-hz=n Run the FDM this rate (iterations per" << endl - << " second)" << endl - << " --speed=n Run the FDM 'n' times faster than real time" << endl - << " --notrim Do NOT attempt to trim the model (only with" << endl - << " fdm=jsbsim)" << endl - << " --on-ground Start at ground level (default)" << endl - << " --in-air Start in air (implied when using --altitude)" << endl - << " --wind=DIR@SPEED Specify wind coming from DIR (degrees) at" << endl - << " SPEED (knots)" << endl - << endl - - << "Aircraft model directory (UIUC FDM ONLY):" << endl - << " --aircraft-dir=path Aircraft directory relative to the path of" << endl - << " the executable" << endl - << endl - - << "Initial Position and Orientation:" << endl - << " --airport-id=ID Specify starting position by airport ID" << endl - << " --offset-distance=nm Specify distance to threshold" << endl - << " --offset-azimuth=degrees Specify heading to threshold" << endl - << " --lon=degrees Starting longitude (west = -)" << endl - << " --lat=degrees Starting latitude (south = -)" << endl - << " --altitude=value Starting altitude (in feet unless" << endl - << " --units-meters specified)" << endl - << " --heading=degrees Specify heading (yaw) angle (Psi)" << endl - << " --roll=degrees Specify roll angle (Phi)" << endl - << " --pitch=degrees Specify pitch angle (Theta)" << endl - << " --uBody=units_per_sec Specify velocity along the body X axis" << endl - << " (in feet unless --units-meters specified)" << endl - << " --vBody=units_per_sec Specify velocity along the body Y axis" << endl - << " (in feet unless --units-meters specified)" << endl - << " --wBody=units_per_sec Specify velocity along the body Z axis" << endl - << " (in feet unless --units-meters specified)" << endl - << " --vc=knots Specify initial airspeed" << endl - << " --mach=num Specify initial mach number" << endl - << " --glideslope=degreees Specify flight path angle (can be positive)" << endl - << " --roc=fpm Specify initial climb rate (can be negative)" << endl - << endl - - << "Rendering Options:" << endl - << " --bpp=depth Specify the bits per pixel" << endl - << " --fog-disable Disable fog/haze" << endl - << " --fog-fastest Enable fastest fog/haze" << endl - << " --fog-nicest Enable nicest fog/haze" << endl - << " --enable-clouds Enable cloud layers" << endl - << " --disable-clouds Disable cloud layers" << endl - << " --clouds-asl=altitude Specify altitude of cloud layer above sea" << endl - << " level" << endl - << " --fov=degrees Specify field of view angle" << endl - << " --disable-fullscreen Disable fullscreen mode" << endl - << " --enable-fullscreen Enable fullscreen mode" << endl - << " --shading-flat Enable flat shading" << endl - << " --shading-smooth Enable smooth shading" << endl - << " --disable-skyblend Disable sky blending" << endl - << " --enable-skyblend Enable sky blending" << endl - << " --disable-textures Disable textures" << endl - << " --enable-textures Enable textures" << endl - << " --disable-wireframe Disable wireframe drawing mode" << endl - << " --enable-wireframe Enable wireframe drawing mode" << endl - << " --geometry=WxH Specify window geometry (640x480, etc)" << endl - << " --view-offset=value Specify the default forward view direction" << endl - << " as an offset from straight ahead. Allowable" << endl - << " values are LEFT, RIGHT, CENTER, or a specific" << endl - << " number in degrees" << endl - << " --visibility=meters Specify initial visibility" << endl - << " --visibility-miles=miles Specify initial visibility in miles" << endl - << endl - - << "Hud Options:" << endl - << " --hud-tris Hud displays number of triangles rendered" << endl - << " --hud-culled Hud displays percentage of triangles culled" << endl - << endl - - << "Time Options:" << endl - << " --time-offset=[+-]hh:mm:ss Add this time offset" << endl - << " --time-match-real Synchronize time with real-world time" << endl - << " --time-match-local Synchronize time with local real-world time" << endl - << " --start-date-sys=yyyy:mm:dd:hh:mm:ss" << endl - << " Specify a starting date/time with respect to" << endl - << " system time" << endl - << " --start-date-gmt=yyyy:mm:dd:hh:mm:ss" << endl - << " Specify a starting date/time with respect to" << endl - << " Greenwich Mean Time" << endl - << " --start-date-lat=yyyy:mm:dd:hh:mm:ss" << endl - << " Specify a starting date/time with respect to" << endl - << " Local Aircraft Time" << endl - << endl - - << "Network Options:" << endl - << " --httpd=port Enable http server on the specified port" << endl -#ifdef FG_JPEG_SERVER - << " --jpg-httpd=port Enable screen shot http server on the" << endl - << " specified port" << endl -#endif -#ifdef FG_NETWORK_OLK - << " --disable-network-olk Disable Multipilot mode (default)" << endl - << " --enable-network-olk Enable Multipilot mode" << endl - << " --net-hud Hud displays network info" << endl - << " --net-id=name Specify your own callsign" << endl -#endif - << endl - - << "Route/Way Point Options:" << endl - << " --wp=ID[@alt] Specify a waypoint for the GC autopilot;" << endl - << " multiple instances can be used to create a" << endl - << " route" << endl - << " --flight-plan=file Read all waypoints from a file" << endl - << endl - - << "IO Options:" << endl - << " --gamin=params Open connection using the Garmin GPS protocol" << endl - << " --joyclient=params Open connection to an Agwagon joystick" << endl - << " --native-ctrls=params Open connection using the FG Native Controls" << endl - << " protocol" << endl - << " --native-fdm=params Open connection using the FG Native FDM" << endl - << " protocol" << endl - << " --native=params Open connection using the FG Native protocol" << endl - << " --nmea=params Open connection using the NMEA protocol" << endl - << " --opengc=params Open connection using the OpenGC protocol" << endl - << " --props=params Open connection using the interactive" << endl - << " property manager" << endl - << " --pve=params Open connection using the PVE protocol" << endl - << " --ray=params Open connection using the RayWoodworth" << endl - << " motion chair protocol" << endl - << " --rul=params Open connection using the RUL protocol" << endl - << endl - << " --atc610x Enable atc610x interface." << endl - << endl - - << "Debugging Options:" << endl - << " --trace-read=property Trace the reads for a property; multiple" << endl - << " instances allowed." << endl - << " --trace-write=property Trace the writes for a property; multiple" << endl - << " instances allowed." << endl - << endl; -} + // *** 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); + } + SGPropertyNode *options = options_root.getNode("options"); + if (!options) { + SG_LOG( SG_GENERAL, SG_ALERT, + "Error reading options.xml: directive not found." ); + exit(-1); + } + SGPropertyNode *usage = options->getNode("usage"); + if (usage) { + SG_LOG( SG_GENERAL, SG_ALERT, "Usage: " << usage->getStringValue() ); + } + vectorsection = 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() + << ":" ); + } + + vectoroption = 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, "" ); + } + } + } + } +}