X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Foptions.cxx;h=a896859d1a1ce038be66f5d3e39c22cf3c6c1ebb;hb=18d1593c42c2df60d7fb44ace722ca3e8a7fd82c;hp=3ac4f869ff7934776ea01ffdf9ada8f556e67232;hpb=158e3ebdb4723e85854d7b35b0609006a766f65b;p=flightgear.git diff --git a/src/Main/options.cxx b/src/Main/options.cxx index 3ac4f869f..a896859d1 100644 --- a/src/Main/options.cxx +++ b/src/Main/options.cxx @@ -35,13 +35,16 @@ #include // strcmp() #include -#include STL_STRING +#include +#include #include #include +#include #include #include +#include // #include // #include @@ -59,10 +62,15 @@ #include "viewmgr.hxx" -SG_USING_STD(string); -SG_USING_STD(sort); -SG_USING_NAMESPACE(std); +using std::string; +using std::sort; +using std::cout; +using std::cerr; +using std::endl; +#ifndef VERSION +#define VERSION "CVS "__DATE__ +#endif #define NEW_DEFAULT_MODEL_HZ 120 @@ -71,34 +79,23 @@ enum FG_OPTIONS_OK = 0, FG_OPTIONS_HELP = 1, FG_OPTIONS_ERROR = 2, - FG_OPTIONS_VERBOSE_HELP = 3, - FG_OPTIONS_SHOW_AIRCRAFT = 4 + FG_OPTIONS_EXIT = 3, + FG_OPTIONS_VERBOSE_HELP = 4, + FG_OPTIONS_SHOW_AIRCRAFT = 5 }; static double atof( const string& str ) { - -#ifdef __MWERKS__ - // -dw- if ::atof is called, then we get an infinite loop - return std::atof( str.c_str() ); -#else return ::atof( str.c_str() ); -#endif } static int atoi( const string& str ) { -#ifdef __MWERKS__ - // -dw- if ::atoi is called, then we get an infinite loop - return std::atoi( str.c_str() ); -#else return ::atoi( str.c_str() ); -#endif } - /** * Set a few fail-safe default property values. * @@ -126,8 +123,8 @@ fgSetDefaults () fgSetDouble("/position/altitude-ft", -9999.0); // Orientation - fgSetDouble("/orientation/heading-deg", 270); - fgSetDouble("/orientation/roll-deg", 0); + fgSetDouble("/orientation/heading-deg", 9999.0); + fgSetDouble("/orientation/roll-deg", 0.0); fgSetDouble("/orientation/pitch-deg", 0.424); // Velocities @@ -145,8 +142,8 @@ fgSetDefaults () 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/heading-deg", 9999.0); + fgSetDouble("/sim/presets/roll-deg", 0.0); fgSetDouble("/sim/presets/pitch-deg", 0.424); fgSetString("/sim/presets/speed-set", "knots"); @@ -204,6 +201,8 @@ fgSetDefaults () fgSetBool("/sim/rendering/shading", true); fgSetBool("/sim/rendering/skyblend", true); fgSetBool("/sim/rendering/textures", true); + fgTie( "/sim/rendering/filtering", SGGetTextureFilter, SGSetTextureFilter, false); + fgSetInt("/sim/rendering/filtering", 1); fgSetBool("/sim/rendering/wireframe", false); fgSetBool("/sim/rendering/horizon-effect", false); fgSetBool("/sim/rendering/enhanced-lighting", false); @@ -492,7 +491,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/current-view/field-of-view", fov); + fgSetDouble("/sim/view[0]/config/default-field-of-view-deg", fov); // printf("parse_fov(): result = %.4f\n", fov); @@ -527,13 +526,6 @@ parse_fov( const string& arg ) { static bool add_channel( const string& type, const string& channel_str ) { - if (type == "props") - SG_LOG(SG_GENERAL, SG_ALERT, "\n" - "****************************************************************\n" - "* The --props option is obsolete and will be removed in future *\n" - "* releases. Please use --telnet instead with the same syntax. *\n" - "****************************************************************"); - SG_LOG(SG_GENERAL, SG_INFO, "Channel string = " << channel_str ); globals->get_channel_options_list()->push_back( type + "," + channel_str ); return true; @@ -572,12 +564,8 @@ parse_flightplan(const string& arg) while ( true ) { string line; - -#if defined( macintosh ) - getline( in, line, '\r' ); -#else getline( in, line, '\n' ); -#endif + // catch extraneous (DOS) line ending character if ( line[line.length() - 1] < 32 ) line = line.substr( 0, line.length()-1 ); @@ -598,6 +586,15 @@ fgOptLanguage( const char *arg ) return FG_OPTIONS_OK; } +static int +fgOptWeather( const char *arg ) +{ + if (arg[0]) + fgSetString("/environment/weather-scenario", arg); + fgSetBool("/environment/params/real-world-weather-fetch", !strcmp(arg, "METAR")); + return FG_OPTIONS_OK; +} + static void clearLocation () { @@ -1194,6 +1191,24 @@ fgOptRunway( const char *arg ) return FG_OPTIONS_OK; } +static int +fgOptParking( const char *arg ) +{ + cerr << "Processing argument " << arg << endl; + fgSetString("/sim/presets/parking", arg ); + fgSetBool ("/sim/presets/parking-requested", true ); + return FG_OPTIONS_OK; +} + +static int +fgOptVersion( const char *arg ) +{ + cerr << VERSION << endl; + cerr << "FG_ROOT=" << globals->get_fg_root() << endl; + cerr << "FG_HOME=" << fgGetString("/sim/fg-home") << endl; + return FG_OPTIONS_EXIT; +} + static map fgOptionMap; /* @@ -1214,7 +1229,7 @@ where: value set to the property if has_param is false func : function called if type==OPTION_FUNC. if has_param is true, the value is passed to the function as a string, otherwise, - 0 is passed. + s_param is passed. For OPTION_DOUBLE and OPTION_INT, the parameter value is converted into a double or an integer and set to the property. @@ -1225,12 +1240,12 @@ where: enum OptionType { OPTION_BOOL, OPTION_STRING, OPTION_DOUBLE, OPTION_INT, OPTION_CHANNEL, OPTION_FUNC }; struct OptionDesc { - char *option; + const char *option; bool has_param; enum OptionType type; - char *property; + const char *property; bool b_param; - char *s_param; + const char *s_param; int (*func)( const char * ); } fgOptionArray[] = { @@ -1245,8 +1260,8 @@ struct OptionDesc { {"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-real-weather-fetch", false, OPTION_BOOL, "/environment/params/real-world-weather-fetch", false, "", 0 }, - {"enable-real-weather-fetch", false, OPTION_BOOL, "/environment/params/real-world-weather-fetch", true, "", 0 }, + {"disable-real-weather-fetch", false, OPTION_FUNC, "", false, "", fgOptWeather }, + {"enable-real-weather-fetch", false, OPTION_FUNC, "", false, "METAR", fgOptWeather }, {"disable-ai-models", false, OPTION_BOOL, "/sim/ai/enabled", false, "", 0 }, {"enable-ai-models", false, OPTION_BOOL, "/sim/ai/enabled", true, "", 0 }, {"disable-freeze", false, OPTION_BOOL, "/sim/freeze/master", false, "", 0 }, @@ -1270,15 +1285,14 @@ struct OptionDesc { {"disable-sound", false, OPTION_BOOL, "/sim/sound/pause", true, "", 0 }, {"enable-sound", false, OPTION_BOOL, "/sim/sound/pause", false, "", 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_FUNC, "", false, "", fgOptRunway }, {"vor", true, OPTION_FUNC, "", false, "", fgOptVOR }, {"ndb", true, OPTION_FUNC, "", false, "", fgOptNDB }, {"carrier", true, OPTION_FUNC, "", false, "", fgOptCarrier }, {"parkpos", true, OPTION_FUNC, "", false, "", fgOptParkpos }, {"fix", true, OPTION_FUNC, "", false, "", fgOptFIX }, - {"offset-distance", true, OPTION_DOUBLE, "/sim/presets/offset-distance", false, "", 0 }, - {"offset-azimuth", true, OPTION_DOUBLE, "/sim/presets/offset-azimuth", false, "", 0 }, + {"offset-distance", true, OPTION_DOUBLE, "/sim/presets/offset-distance-nm", false, "", 0 }, + {"offset-azimuth", true, OPTION_DOUBLE, "/sim/presets/offset-azimuth-deg", false, "", 0 }, {"lon", true, OPTION_FUNC, "", false, "", fgOptLon }, {"lat", true, OPTION_FUNC, "", false, "", fgOptLat }, {"altitude", true, OPTION_FUNC, "", false, "", fgOptAltitude }, @@ -1333,6 +1347,7 @@ struct OptionDesc { {"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 }, + {"texture-filtering", false, OPTION_INT, "/sim/rendering/filtering", 1, "", 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 }, @@ -1388,6 +1403,7 @@ struct OptionDesc { {"flight-plan", true, OPTION_FUNC, "", false, "", fgOptFlightPlan }, {"config", true, OPTION_FUNC, "", false, "", fgOptConfig }, {"aircraft", true, OPTION_STRING, "/sim/aircraft", false, "", 0 }, + {"vehicle", true, OPTION_STRING, "/sim/aircraft", false, "", 0 }, {"failure", true, OPTION_FUNC, "", false, "", fgOptFailure }, {"com1", true, OPTION_DOUBLE, "/instrumentation/comm[0]/frequencies/selected-mhz", false, "", 0 }, {"com2", true, OPTION_DOUBLE, "/instrumentation/comm[1]/frequencies/selected-mhz", false, "", 0 }, @@ -1398,10 +1414,59 @@ struct OptionDesc { {"min-status", true, OPTION_STRING, "/sim/aircraft-min-status", false, "all", 0 }, {"livery", true, OPTION_FUNC, "", false, "", fgOptLivery }, {"ai-scenario", true, OPTION_FUNC, "", false, "", fgOptScenario }, + {"parking-id", true, OPTION_FUNC, "", false, "", fgOptParking }, + {"version", false, OPTION_FUNC, "", false, "", fgOptVersion }, {0} }; +// Set a property for the --prop: option. Syntax: --prop:[:]= +// can be "double" etc. but also only the first letter "d". +// Examples: --prop:alpha=1 --prop:bool:beta=true --prop:d:gamma=0.123 +static bool +set_property(const string& arg) +{ + string::size_type pos = arg.find('='); + if (pos == arg.npos || pos == 0 || pos + 1 == arg.size()) + return false; + + string name = arg.substr(0, pos); + string value = arg.substr(pos + 1); + string type; + pos = name.find(':'); + + if (pos != name.npos && pos != 0 && pos + 1 != name.size()) { + type = name.substr(0, pos); + name = name.substr(pos + 1); + } + SGPropertyNode *n = fgGetNode(name.c_str(), true); + + bool writable = n->getAttribute(SGPropertyNode::WRITE); + if (!writable) + n->setAttribute(SGPropertyNode::WRITE, true); + + bool ret = false; + if (type.empty()) + ret = n->setUnspecifiedValue(value.c_str()); + else if (type == "s" || type == "string") + ret = n->setStringValue(value.c_str()); + else if (type == "d" || type == "double") + ret = n->setDoubleValue(strtod(value.c_str(), 0)); + else if (type == "f" || type == "float") + ret = n->setFloatValue(atof(value.c_str())); + else if (type == "l" || type == "long") + ret = n->setLongValue(strtol(value.c_str(), 0, 0)); + else if (type == "i" || type == "int") + ret = n->setIntValue(atoi(value.c_str())); + else if (type == "b" || type == "bool") + ret = n->setBoolValue(value == "true" || atoi(value.c_str()) != 0); + + if (!writable) + n->setAttribute(SGPropertyNode::WRITE, false); + return ret; +} + + // Parse a single option static int parse_option (const string& arg) @@ -1426,23 +1491,18 @@ parse_option (const string& arg) } 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 || pos + 1 == assign.size() ) { - SG_LOG( SG_GENERAL, SG_ALERT, "Bad property assignment: " << arg ); + if (!set_property(arg.substr(7))) { + SG_LOG( SG_GENERAL, SG_ALERT, "Bad property assignment: " << arg ); return FG_OPTIONS_ERROR; - } else { - string name = assign.substr(0, pos); - string value = assign.substr(pos + 1); - fgSetString(name.c_str(), value.c_str()); } } else if ( arg.find( "--" ) == 0 ) { size_t pos = arg.find( '=' ); - string arg_name; + string arg_name, arg_value; if ( pos == string::npos ) { arg_name = arg.substr( 2 ); } else { arg_name = arg.substr( 2, pos - 2 ); + arg_value = arg.substr( pos + 1); } map::iterator it = fgOptionMap.find( arg_name ); if ( it != fgOptionMap.end() ) { @@ -1452,9 +1512,9 @@ parse_option (const string& arg) fgSetBool( pt->property, pt->b_param ); break; case OPTION_STRING: - if ( pt->has_param && pos != string::npos && pos + 1 < arg.size() ) { - fgSetString( pt->property, arg.substr( pos + 1 ).c_str() ); - } else if ( !pt->has_param && pos == string::npos ) { + if ( pt->has_param && !arg_value.empty() ) { + fgSetString( pt->property, arg_value.c_str() ); + } else if ( !pt->has_param && arg_value.empty() ) { fgSetString( pt->property, pt->s_param ); } else if ( pt->has_param ) { SG_LOG( SG_GENERAL, SG_ALERT, "Option '" << arg << "' needs a parameter" ); @@ -1465,25 +1525,25 @@ parse_option (const string& arg) } break; case OPTION_DOUBLE: - if ( pos != string::npos && pos + 1 < arg.size() ) { - fgSetDouble( pt->property, atof( arg.substr( pos + 1 ) ) ); + if ( !arg_value.empty() ) { + fgSetDouble( pt->property, atof( arg_value ) ); } else { SG_LOG( SG_GENERAL, SG_ALERT, "Option '" << arg << "' needs a parameter" ); return FG_OPTIONS_ERROR; } break; case OPTION_INT: - if ( pos != string::npos && pos + 1 < arg.size() ) { - fgSetInt( pt->property, atoi( arg.substr( pos + 1 ) ) ); + if ( !arg_value.empty() ) { + fgSetInt( pt->property, atoi( arg_value ) ); } 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 && pos + 1 < arg.size() ) { - add_channel( pt->option, arg.substr( pos + 1 ) ); - } else if ( !pt->has_param && pos == string::npos ) { + if ( pt->has_param && !arg_value.empty() ) { + add_channel( pt->option, arg_value ); + } else if ( !pt->has_param && arg_value.empty() ) { add_channel( pt->option, pt->s_param ); } else if ( pt->has_param ) { SG_LOG( SG_GENERAL, SG_ALERT, "Option '" << arg << "' needs a parameter" ); @@ -1494,10 +1554,10 @@ parse_option (const string& arg) } break; case OPTION_FUNC: - if ( pt->has_param && pos != string::npos && pos + 1 < arg.size() ) { - return pt->func( arg.substr( pos + 1 ).c_str() ); - } else if ( !pt->has_param && pos == string::npos ) { - return pt->func( 0 ); + if ( pt->has_param && !arg_value.empty() ) { + return pt->func( arg_value.c_str() ); + } else if ( !pt->has_param && arg_value.empty() ) { + return pt->func( pt->s_param ); } else if ( pt->has_param ) { SG_LOG( SG_GENERAL, SG_ALERT, "Option '" << arg << "' needs a parameter" ); return FG_OPTIONS_ERROR; @@ -1551,6 +1611,9 @@ fgParseArgs (int argc, char **argv) fgShowAircraft(path, true); exit(0); } + + else if (result == FG_OPTIONS_EXIT) + exit(0); } } else { in_options = false; @@ -1581,20 +1644,9 @@ fgParseOptions (const string& path) { SG_LOG( SG_GENERAL, SG_INFO, "Processing config file: " << path ); in >> skipcomment; -#ifndef __MWERKS__ while ( ! in.eof() ) { -#else - char c = '\0'; - while ( in.get(c) && c != '\0' ) { - in.putback(c); -#endif string line; - -#if defined( macintosh ) - getline( in, line, '\r' ); -#else getline( in, line, '\n' ); -#endif // catch extraneous (DOS) line ending character int i;