#include "util.hxx"
#include "viewmgr.hxx"
#include <Main/viewer.hxx>
+
#include <simgear/version.h>
+#include <osg/Version>
using std::string;
using std::sort;
using std::cerr;
using std::endl;
-#ifndef VERSION
-#define VERSION "CVS "__DATE__
+#if defined( HAVE_VERSION_H ) && HAVE_VERSION_H
+# include <Include/version.h>
+#else
+# include <Include/no_version.h>
#endif
#define NEW_DEFAULT_MODEL_HZ 120
// Otherwise, default to Scenery being in $FG_ROOT/Scenery
globals->set_fg_scenery("");
}
+
// Position (deliberately out of range)
fgSetDouble("/position/longitude-deg", 9999.0);
fgSetDouble("/position/latitude-deg", 9999.0);
fgSetString("/sim/multiplay/txhost", "0");
fgSetInt("/sim/multiplay/rxport", 0);
fgSetInt("/sim/multiplay/txport", 0);
+
+ fgSetString("/sim/version/flightgear", FLIGHTGEAR_VERSION);
+ fgSetString("/sim/version/simgear", SG_STRINGIZE(SIMGEAR_VERSION));
+ fgSetString("/sim/version/openscenegraph", osgGetVersion());
+ fgSetString("/sim/version/revision", REVISION);
+ fgSetInt("/sim/version/build-number", HUDSON_BUILD_NUMBER);
+ fgSetString("/sim/version/build-id", HUDSON_BUILD_ID);
}
static bool
static int
fgOptFgRoot( const char *arg )
{
- globals->set_fg_root(arg);
+ // this option is dealt with by fgInitFGRoot
return FG_OPTIONS_OK;
}
return FG_OPTIONS_OK;
}
+static int
+fgOptFgAircraft(const char* arg)
+{
+ // this option is dealt with by fgInitFGAircraft
+ return FG_OPTIONS_OK;
+}
+
static int
fgOptFov( const char *arg )
{
{
double visibility = atof( arg );
fgDefaultWeatherValue("visibility-m", visibility);
+ fgSetDouble("/environment/visibility-m", visibility);
return FG_OPTIONS_OK;
}
{
double visibility = atof( arg ) * 5280.0 * SG_FEET_TO_METER;
fgDefaultWeatherValue("visibility-m", visibility);
+ fgSetDouble("/environment/visibility-m", visibility);
return FG_OPTIONS_OK;
}
static int
fgOptVersion( const char *arg )
{
- cerr << "FlightGear version: " << VERSION << endl;
+ cerr << "FlightGear version: " << FLIGHTGEAR_VERSION << endl;
+ cerr << "Revision: " << REVISION << endl;
+ cerr << "Build-Id: " << HUDSON_BUILD_ID << endl;
cerr << "FG_ROOT=" << globals->get_fg_root() << endl;
cerr << "FG_HOME=" << fgGetString("/sim/fg-home") << endl;
cerr << "FG_SCENERY=";
return FG_OPTIONS_OK;
}
+static int
+fgOptCallSign(const char * arg)
+{
+ int i;
+ char callsign[11];
+ strncpy(callsign,arg,10);
+ callsign[10]=0;
+ for (i=0;callsign[i];i++)
+ {
+ char c = callsign[i];
+ if (c >= 'A' && c <= 'Z') continue;
+ if (c >= 'a' && c <= 'z') continue;
+ if (c >= '0' && c <= '9') continue;
+ if (c == '-' || c == '_') continue;
+ // convert any other illegal characters
+ callsign[i]='-';
+ }
+ fgSetString("sim/multiplay/callsign", callsign );
+ return FG_OPTIONS_OK;
+}
static map<string,size_t> fgOptionMap;
{"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_BOOL, "/environment/realwx/enabled", false, "", 0 },
+ {"enable-real-weather-fetch", false, OPTION_BOOL, "/environment/realwx/enabled", true, "", 0 },
{"metar", true, OPTION_STRING, "/environment/metar/data", false, "", 0 },
{"disable-ai-models", false, OPTION_BOOL, "/sim/ai/enabled", false, "", 0 },
{"enable-ai-models", false, OPTION_BOOL, "/sim/ai/enabled", true, "", 0 },
{"roc", true, OPTION_FUNC, "", false, "", fgOptRoc },
{"fg-root", true, OPTION_FUNC, "", false, "", fgOptFgRoot },
{"fg-scenery", true, OPTION_FUNC, "", false, "", fgOptFgScenery },
+ {"fg-aircraft", true, OPTION_FUNC, "", false, "", fgOptFgAircraft },
{"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 },
{"joyclient", true, OPTION_CHANNEL, "", false, "", 0 },
{"jsclient", true, OPTION_CHANNEL, "", false, "", 0 },
{"proxy", true, OPTION_FUNC, "", false, "", fgSetupProxy },
- {"callsign", true, OPTION_STRING, "sim/multiplay/callsign", false, "", 0 },
+ {"callsign", true, OPTION_FUNC, "", false, "", fgOptCallSign},
{"multiplay", true, OPTION_CHANNEL, "", false, "", 0 },
{"trace-read", true, OPTION_FUNC, "", false, "", fgOptTraceRead },
{"trace-write", true, OPTION_FUNC, "", false, "", fgOptTraceWrite },
SG_LOG( SG_GENERAL, SG_ALERT, "Bad property assignment: " << arg );
return FG_OPTIONS_ERROR;
}
+ } else if ( arg.find("-psn_") == 0) {
+ // on Mac, when launched from the GUI, we are passed the ProcessSerialNumber
+ // as an argument (and no others). Silently ignore the argument here.
+ return FG_OPTIONS_OK;
} else if ( arg.find( "--" ) == 0 ) {
size_t pos = arg.find( '=' );
string arg_name, arg_value;
bool verbose = false;
bool help = false;
- SG_LOG(SG_GENERAL, SG_INFO, "Processing command line arguments");
+ SG_LOG(SG_GENERAL, SG_ALERT, "Processing command line arguments");
for (int i = 1; i < argc; i++) {
string arg = argv[i];
fgOptLogLevel( "alert" );
SGPath path( globals->get_fg_root() );
path.append("Aircraft");
- fgShowAircraft(path, true);
+ fgShowAircraft(path);
exit(0);
} else if (result == FG_OPTIONS_SHOW_SOUND_DEVICES) {
cin.get();
#endif
}
-
-// A simple function to return an integer depending on the position
-// of the status string within the array in order to determine the hierarchy.
-unsigned int getNumMaturity(const char * str)
-{
- // changes should also be reflected in $FG_ROOT/data/options.xml &
- // $FG_ROOT/data/Translations/string-default.xml
- const char* levels[] = {"alpha","beta","early-production","production"};
-
- if (!strcmp(str, "all")) {
- return 0;
- }
-
- for (size_t i=0; i<(sizeof(levels)/sizeof(levels[0]));i++)
- if (strcmp(str,levels[i])==0)
- return i;
-
- return 0;
-};
-
-
-static void fgSearchAircraft(const SGPath &path, string_list &aircraft,
- bool recursive)
-{
- if (!path.exists()) {
- SG_LOG(SG_GENERAL, SG_WARN, "fgSearchAircraft: no such path:" << path.str());
- return;
- }
-
- int requiredStatus = getNumMaturity(fgGetString("/sim/aircraft-min-status", "all"));
-
- simgear::Dir dir(path);
- simgear::PathList setFiles(dir.children(simgear::Dir::TYPE_FILE, "-set.xml"));
- simgear::PathList::iterator p;
- for (p = setFiles.begin(); p != setFiles.end(); ++p) {
- // check file name ends with -set.xml
-
- SGPropertyNode root;
- try {
- readProperties(p->str(), &root);
- } catch (sg_exception& e) {
- continue;
- }
-
- int maturity = 0;
- string descStr(" ");
- descStr += path.file();
-
- SGPropertyNode *node = root.getNode("sim");
- if (node) {
- SGPropertyNode* desc = node->getNode("description");
- // if a status tag is found, read it in
- if (node->hasValue("status")) {
- maturity = getNumMaturity(node->getStringValue("status"));
- }
-
- if (desc) {
- if (descStr.size() <= 27+3) {
- descStr.append(29+3-descStr.size(), ' ');
- } else {
- descStr += '\n';
- descStr.append( 32, ' ');
- }
- descStr += desc->getStringValue();
- }
- } // of have 'sim' node
-
- if (maturity < requiredStatus) {
- continue;
- }
-
- // if we found a -set.xml at this level, don't recurse any deeper
- recursive = false;
-
- aircraft.push_back(descStr);
- } // of -set.xml iteration
-
- // recurse down if requested
- if (recursive) {
- simgear::PathList subdirs(dir.children(simgear::Dir::TYPE_DIR | simgear::Dir::NO_DOT_OR_DOTDOT));
- for (p = subdirs.begin(); p != subdirs.end(); ++p) {
- if (p->file() == "CVS") {
- continue;
- }
-
- fgSearchAircraft(*p, aircraft, recursive);
- }
- } // of recursive case
-}
-
-/*
- * Search in the current directory, and in on directory deeper
- * for <aircraft>-set.xml configuration files and show the aircaft name
- * and the contents of the<description> tag in a sorted manner.
- *
- * @parampath the directory to search for configuration files
- * @param recursive defines whether the directory should be searched recursively
- */
-void fgShowAircraft(const SGPath &path, bool recursive) {
- string_list aircraft;
-
- fgSearchAircraft( path, aircraft, recursive );
-
- sort(aircraft.begin(), aircraft.end());
- SG_LOG( SG_GENERAL, SG_ALERT, "" ); // To popup the console on Windows
- cout << "Available aircraft:" << endl;
- for ( unsigned int i = 0; i < aircraft.size(); i++ ) {
- cout << aircraft[i] << endl;
- }
-#ifdef _MSC_VER
- cout << "Hit a key to continue..." << endl;
- cin.get();
-#endif
-}