#endif
#include <simgear/compiler.h>
-#include <simgear/misc/exception.hxx>
+#include <simgear/structure/exception.hxx>
#include <simgear/debug/logstream.hxx>
#include <math.h> // rint()
#include <simgear/math/sg_random.h>
#include <simgear/misc/sgstream.hxx>
#include <simgear/misc/sg_path.hxx>
-#include <simgear/route/route.hxx>
-#include <simgear/route/waypoint.hxx>
// #include <Include/general.hxx>
// #include <Airports/simple.hxx>
// #include <Cockpit/cockpit.hxx>
// #include <FDM/flight.hxx>
// #include <FDM/UIUCModel/uiuc_aircraftdir.h>
-#ifdef FG_NETWORK_OLK
-# include <NetworkOLK/network.h>
-#endif
+#include <Autopilot/route_mgr.hxx>
#include <GUI/gui.h>
#include "globals.hxx"
#else
fgSetString("/sim/startup/browser-app", "webrun.bat");
#endif
- fgSetInt("/sim/log-level", SG_WARN);
+ fgSetString("/sim/logging/priority", "alert");
// Features
fgSetBool("/sim/hud/antialiased", false);
fgSetBool("/sim/hud/enable3d", true);
fgSetBool("/sim/hud/visibility", false);
fgSetBool("/sim/panel/visibility", true);
- fgSetBool("/sim/sound/audible", true);
+ fgSetBool("/sim/sound/pause", false);
// Flight Model options
fgSetString("/sim/flight-model", "jsb");
fgSetString("/sim/startup/time-offset-type", "system-offset");
fgSetLong("/sim/time/cur-time-override", 0);
- fgSetBool("/sim/networking/network-olk", false);
- fgSetString("/sim/networking/call-sign", "Johnny");
-
// Freeze options
fgSetBool("/sim/freeze/master", false);
fgSetBool("/sim/freeze/position", false);
return true;
}
-
-static void
-setup_wind (double min_hdg, double max_hdg, double speed, double gust)
-{
- // Initialize to a reasonable state
- fgDefaultWeatherValue("wind-from-heading-deg", min_hdg);
- fgDefaultWeatherValue("wind-speed-kt", speed);
-
- SG_LOG(SG_GENERAL, SG_INFO, "WIND: " << min_hdg << '@' <<
- speed << " knots" << endl);
-
- // Now, add some variety to the layers
- min_hdg += 10;
- if (min_hdg > 360)
- min_hdg -= 360;
- speed *= 1.2;
- fgSetDouble("/environment/config/boundary/entry[1]/wind-from-heading-deg",
- min_hdg);
- fgSetDouble("/environment/config/boundary/entry[1]/wind-speed-kt",
- speed);
-
- min_hdg += 20;
- if (min_hdg > 360)
- min_hdg -= 360;
- speed *= 1.5;
- fgSetDouble("/environment/config/aloft/entry[0]/wind-from-heading-deg",
- min_hdg);
- fgSetDouble("/environment/config/aloft/entry[0]/wind-speed-kt",
- speed);
-
- min_hdg += 10;
- if (min_hdg > 360)
- min_hdg -= 360;
- speed *= 1.2;
- fgSetDouble("/environment/config/aloft/entry[1]/wind-from-heading-deg",
- min_hdg);
- fgSetDouble("/environment/config/aloft/entry[1]/wind-speed-kt",
- speed);
-
- min_hdg += 10;
- if (min_hdg > 360)
- min_hdg -= 360;
- speed *= 1.2;
- fgSetDouble("/environment/config/aloft/entry[2]/wind-from-heading-deg",
- min_hdg);
- fgSetDouble("/environment/config/aloft/entry[2]/wind-speed-kt",
- speed);
-
-#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
-}
-
+// The parse wp and parse flight-plan options don't work anymore, because
+// the route manager and the airport subsystems have not yet been initialized
+// at this stage.
// Parse --wp=ID[@alt]
-static bool
+static void
parse_wp( const string& arg ) {
- string id, alt_str;
- double alt = 0.0;
-
- string::size_type pos = arg.find( "@" );
- 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() );
- if ( !strcmp(fgGetString("/sim/startup/units"), "feet") ) {
- alt *= SG_FEET_TO_METER;
- }
- } 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;
+ string_list *waypoints = globals->get_initial_waypoints();
+ if (!waypoints) {
+ waypoints = new string_list;
}
+ waypoints->push_back(arg);
+ globals->set_initial_waypoints(waypoints);
}
static bool
parse_flightplan(const string& arg)
{
- sg_gzifstream in(arg.c_str());
- if ( !in.is_open() ) {
- return false;
- }
- while ( true ) {
- string line;
-
+ string_list *waypoints = globals->get_initial_waypoints();
+ if (!waypoints)
+ waypoints = new string_list;
+ sg_gzifstream in(arg.c_str());
+ if ( !in.is_open() ) {
+ return false;
+ }
+ while ( true ) {
+ string line;
+
#if defined( macintosh )
- getline( in, line, '\r' );
+ getline( in, line, '\r' );
#else
- getline( in, line, '\n' );
+ getline( in, line, '\n' );
#endif
-
- // catch extraneous (DOS) line ending character
- if ( line[line.length() - 1] < 32 ) {
- line = line.substr( 0, line.length()-1 );
- }
-
- if ( in.eof() ) {
- break;
- }
- parse_wp(line);
+
+ // catch extraneous (DOS) line ending character
+ if ( line[line.length() - 1] < 32 ) {
+ line = line.substr( 0, line.length()-1 );
}
-
- return true;
+
+ if ( in.eof() ) {
+ break;
+ }
+ waypoints->push_back(line);
+ }
+ globals->set_initial_waypoints(waypoints);
+ return true;
}
static int
return FG_OPTIONS_OK;
}
-#ifdef FG_NETWORK_OLK
static int
-fgOptNetHud( const char *arg )
+fgSetupProxy( const char *arg )
{
- fgSetBool("/sim/hud/net-display", true);
- net_hud_display = 1; // FIXME
+ string options = arg;
+ string host, port, auth;
+ unsigned int pos;
+
+ host = port = auth = "";
+ if ((pos = options.find("@")) != string::npos)
+ auth = options.substr(0, pos++);
+ else
+ pos = 0;
+
+ host = options.substr(pos, options.size());
+ if ((pos = host.find(":")) != string::npos) {
+ port = host.substr(++pos, host.size());
+ host.erase(--pos, host.size());
+ }
+
+ fgSetString("/sim/presets/proxy/host", host.c_str());
+ fgSetString("/sim/presets/proxy/port", port.c_str());
+ fgSetString("/sim/presets/proxy/authentication", auth.c_str());
+
return FG_OPTIONS_OK;
}
-#endif
static int
fgOptTraceRead( const char *arg )
return FG_OPTIONS_OK;
}
+static int
+fgOptLogLevel( const char *arg )
+{
+ fgSetString("/sim/logging/classes", "all");
+ fgSetString("/sim/logging/priority", arg);
+
+ string priority = arg;
+ logbuf::set_log_classes(SG_ALL);
+ if (priority == "bulk") {
+ logbuf::set_log_priority(SG_BULK);
+ } else if (priority == "debug") {
+ logbuf::set_log_priority(SG_DEBUG);
+ } else if (priority == "info") {
+ logbuf::set_log_priority(SG_INFO);
+ } else if (priority == "warn") {
+ logbuf::set_log_priority(SG_WARN);
+ } else if (priority == "alert") {
+ logbuf::set_log_priority(SG_ALERT);
+ } else {
+ SG_LOG(SG_GENERAL, SG_WARN, "Unknown logging priority " << priority);
+ }
+ SG_LOG(SG_GENERAL, SG_DEBUG, "Logging priority is " << priority);
+
+ return FG_OPTIONS_OK;
+}
+
+
static int
fgOptTraceWrite( 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 speed = sg_random() * sg_random() * 40;
double gust = speed + (10 - sqrt(sg_random() * 100));
- setup_wind(min_hdg, max_hdg, speed, gust);
+ fgSetupWind(min_hdg, max_hdg, speed, gust);
return FG_OPTIONS_OK;
}
SG_LOG( SG_GENERAL, SG_ALERT, "bad wind value " << arg );
return FG_OPTIONS_ERROR;
}
- setup_wind(min_hdg, max_hdg, speed, gust);
+ fgSetupWind(min_hdg, max_hdg, speed, gust);
return FG_OPTIONS_OK;
}
{
double rot, freq;
if (parse_colon(arg, &rot, &freq))
- fgSetDouble("/radios/kr-87/inputs/rotation-deg", rot);
- fgSetDouble("/radios/kr-87/outputs/selected-khz", freq);
+ fgSetDouble("/instrumentation/adf/rotation-deg", rot);
+ fgSetDouble("/instrumentation/adf/frequencies/selected-khz", freq);
return FG_OPTIONS_OK;
}
{"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-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 },
{"enable-freeze", false, OPTION_BOOL, "/sim/freeze/master", true, "", 0 },
{"disable-fuel-freeze", false, OPTION_BOOL, "/sim/freeze/fuel", 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 },
+ {"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_STRING, "/sim/presets/runway", 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
+ {"jsclient", true, OPTION_CHANNEL, "", false, "", 0 },
+ {"proxy", true, OPTION_FUNC, "", false, "", fgSetupProxy },
#ifdef FG_MPLAYER_AS
{"callsign", true, OPTION_STRING, "sim/multiplay/callsign", false, "", 0 },
{"multiplay", true, OPTION_CHANNEL, "", false, "", 0 },
#endif
{"trace-read", true, OPTION_FUNC, "", false, "", fgOptTraceRead },
{"trace-write", true, OPTION_FUNC, "", false, "", fgOptTraceWrite },
- {"log-level", true, OPTION_INT, "/sim/log-level", false, "", 0 },
+ {"log-level", true, OPTION_FUNC, "", false, "", fgOptLogLevel },
{"view-offset", true, OPTION_FUNC, "", false, "", fgOptViewOffset },
{"visibility", true, OPTION_FUNC, "", false, "", fgOptVisibilityMeters },
{"visibility-miles", true, OPTION_FUNC, "", false, "", fgOptVisibilityMiles },
verbose = true;
else if (result == FG_OPTIONS_SHOW_AIRCRAFT) {
+ fgOptLogLevel( "alert" );
SGPath path( globals->get_fg_root() );
path.append("Aircraft");
- fgShowAircraft(path);
+ fgShowAircraft(path, true);
exit(0);
}
}
}
if (help) {
+ fgOptLogLevel( "alert" );
fgUsage(verbose);
exit(0);
}
SGPropertyNode options_root;
+ SG_LOG( SG_GENERAL, SG_ALERT, "" ); // To popup the console on Windows
cout << endl;
try {
cout << endl;
cout << "For a complete list of options use --help --verbose" << endl;
}
+#ifdef _MSC_VER
+ cout << "Hit a key to continue..." << endl;
+ cin.get();
+#endif
}
-/*
- * 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) {
- static vector<string> aircraft;
-
+static void fgSearchAircraft(const SGPath &path, string_list &aircraft,
+ bool recursive)
+{
ulDirEnt* dire;
ulDir *dirp = ulOpenDir(path.str().c_str());
if (dirp == NULL) {
SGPath next = path;
next.append(dire->d_name);
- fgShowAircraft(next, false);
+ fgSearchAircraft(next, aircraft, true);
}
} else if ((ptr = strstr(dire->d_name, "-set.xml")) && (ptr[8] == '\0')) {
}
}
- if (recursive) {
- sort(aircraft.begin(), aircraft.end());
- cout << "Available aircraft:" << endl;
- for ( unsigned int i = 0; i < aircraft.size(); i++ ) {
- cout << aircraft[i] << endl;
- }
+ ulCloseDir(dirp);
+}
+
+
+/*
+ * 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 );
- aircraft.clear();
+ 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;
}
- ulCloseDir(dirp);
+#ifdef _MSC_VER
+ cout << "Hit a key to continue..." << endl;
+ cin.get();
+#endif
}