#include <simgear/structure/exception.hxx>
#include <simgear/structure/commands.hxx>
#include <simgear/props/props.hxx>
+#include <simgear/props/props_io.hxx>
#include <simgear/structure/event_mgr.hxx>
#include <simgear/sound/soundmgr_openal.hxx>
#include <simgear/timing/sg_time.hxx>
#include <Cockpit/panel.hxx>
#include <Cockpit/panel_io.hxx>
-#include <Cockpit/hud.hxx>
-#include <Environment/environment.hxx>
#include <FDM/flight.hxx>
#include <GUI/gui.h>
#include <GUI/new_gui.hxx>
#include <GUI/dialog.hxx>
#include <Aircraft/replay.hxx>
-#include <Scenery/tilemgr.hxx>
#include <Scenery/scenery.hxx>
#include <Scripting/NasalSys.hxx>
#include <Sound/sample_queue.hxx>
-#include <Time/sunsolver.hxx>
+#include <Airports/xmlloader.hxx>
+#include <ATC/CommStation.hxx>
+#include <Navaids/navrecord.hxx>
+#include <Navaids/navlist.hxx>
#include "fg_init.hxx"
#include "fg_io.hxx"
#include "viewmgr.hxx"
#include "main.hxx"
#include <Main/viewer.hxx>
+#include <Environment/presets.hxx>
using std::string;
using std::ifstream;
fgSetBool("/sim/signals/exit", true);
if (fgGetBool("/sim/startup/save-on-exit")) {
-#ifdef _WIN32
- char* envp = ::getenv( "APPDATA" );
- if ( envp != NULL ) {
- SGPath config( envp );
- config.append( "flightgear.org" );
-#else
- if ( homedir != NULL ) {
- SGPath config( homedir );
- config.append( ".fgfs" );
-#endif
- config.append( "autosave.xml" );
- config.create_dir( 0700 );
- SG_LOG(SG_IO, SG_INFO, "Saving user settings to " << config.str());
- try {
- writeProperties(config.str(), globals->get_props(), false, SGPropertyNode::USERARCHIVE);
- } catch (const sg_exception &e) {
- guiErrorMessage("Error writing autosave.xml: ", e);
- }
+ SGPath autosaveFile(fgGetString("/sim/fg-home"));
+ autosaveFile.append( "autosave.xml" );
+ autosaveFile.create_dir( 0700 );
+ SG_LOG(SG_IO, SG_INFO, "Saving user settings to " << autosaveFile.str());
+ try {
+ writeProperties(autosaveFile.str(), globals->get_props(), false, SGPropertyNode::USERARCHIVE);
+ } catch (const sg_exception &e) {
+ guiErrorMessage("Error writing autosave.xml: ", e);
+ }
+
+ SG_LOG(SG_INPUT, SG_DEBUG, "Finished Saving user settings");
- SG_LOG(SG_INPUT, SG_DEBUG, "Finished Saving user settings");
- }
}
fgOSExit(arg->getIntValue("status", 0));
static bool
do_reset (const SGPropertyNode * arg)
{
- doSimulatorReset();
+ fgReInitSubsystems();
return true;
}
if (subsystem == 0) {
result = false;
SG_LOG( SG_GENERAL, SG_ALERT,
- "Subsystem " << name << "not found" );
+ "Subsystem " << name << " not found" );
} else {
subsystem->reinit();
}
SGSubsystem * subsystem = globals->get_subsystem(name);
if (subsystem == 0) {
result = false;
- SG_LOG(SG_GENERAL, SG_ALERT, "Subsystem " << name << "not found");
+ SG_LOG(SG_GENERAL, SG_ALERT, "Subsystem " << name << " not found");
} else {
subsystem->suspend();
}
SGSubsystem * subsystem = globals->get_subsystem(name);
if (subsystem == 0) {
result = false;
- SG_LOG(SG_GENERAL, SG_ALERT, "Subsystem " << name << "not found");
+ SG_LOG(SG_GENERAL, SG_ALERT, "Subsystem " << name << " not found");
} else {
subsystem->resume();
}
#endif
+/**
+ * Built-in command: replay the FDR buffer
+ */
+static bool
+do_replay (const SGPropertyNode * arg)
+{
+ FGReplay *r = (FGReplay *)(globals->get_subsystem( "replay" ));
+ return r->start();
+}
+
+/**
+ * Built-in command: pause/unpause the sim
+ */
+static bool
+do_pause (const SGPropertyNode * arg)
+{
+ bool paused = fgGetBool("/sim/freeze/master",true) || fgGetBool("/sim/freeze/clock",true);
+ if (paused && (fgGetInt("/sim/freeze/replay-state",0)>0))
+ {
+ do_replay(NULL);
+ }
+ else
+ {
+ fgSetBool("/sim/freeze/master",!paused);
+ fgSetBool("/sim/freeze/clock",!paused);
+ }
+ return true;
+}
/**
* Built-in command: load flight.
do_panel_load (const SGPropertyNode * arg)
{
string panel_path =
- arg->getStringValue("path",
- fgGetString("/sim/panel/path",
- "Panels/Default/default.xml"));
+ arg->getStringValue("path", fgGetString("/sim/panel/path"));
+ if (panel_path.empty()) {
+ return false;
+ }
+
FGPanel * new_panel = fgReadPanel(panel_path);
if (new_panel == 0) {
SG_LOG(SG_INPUT, SG_ALERT,
return true;
}
-
-static void
-fix_hud_visibility()
-{
- if ( !strcmp(fgGetString("/sim/flight-model"), "ada") ) {
- globals->get_props()->setBoolValue( "/sim/hud/visibility", true );
- if ( globals->get_viewmgr()->get_current() == 1 ) {
- globals->get_props()->setBoolValue( "/sim/hud/visibility", false );
- }
- }
-}
-
static void
do_view_next( bool )
{
globals->get_current_view()->setHeadingOffset_deg(0.0);
globals->get_viewmgr()->next_view();
- fix_hud_visibility();
}
static void
{
globals->get_current_view()->setHeadingOffset_deg(0.0);
globals->get_viewmgr()->prev_view();
- fix_hud_visibility();
}
/**
{
globals->get_current_view()->setHeadingOffset_deg(0.0);
globals->get_viewmgr()->next_view();
- fix_hud_visibility();
return true;
}
return true;
}
+static bool
+do_print_visible_scene_info(const SGPropertyNode*)
+{
+ fgPrintVisibleSceneInfoCommand();
+ return true;
+}
+
/**
* Built-in command: hires capture screen.
*/
if ( !freeze ) {
fgSetBool("/sim/freeze/master", true);
}
- if ( globals->get_tile_mgr()->init() ) {
- // Load the local scenery data
- double visibility_meters = fgGetDouble("/environment/visibility-m");
- globals->get_tile_mgr()->update( visibility_meters );
- } else {
- SG_LOG( SG_GENERAL, SG_ALERT,
- "Error in Tile Manager initialization!" );
- exit(-1);
- }
+
+ globals->get_subsystem("tile-manager")->reinit();
+
if ( !freeze ) {
fgSetBool("/sim/freeze/master", false);
}
}
+#if 0
+These do_set_(some-environment-parameters) are deprecated and no longer
+useful/functional - Torsten Dreyer, January 2011
/**
* Set the sea level outside air temperature and assigning that to all
* boundary and aloft environment layers.
dummy.set_dewpoint_degc( dewpoint_degc );
return do_set_dewpoint_sea_level_degc(dummy.get_dewpoint_sea_level_degc());
}
-
-/**
- * Update the lighting manually.
- */
-static bool
-do_timeofday (const SGPropertyNode * arg)
-{
- const string &offset_type = arg->getStringValue("timeofday", "noon");
-
- static const SGPropertyNode *longitude
- = fgGetNode("/position/longitude-deg");
- static const SGPropertyNode *latitude
- = fgGetNode("/position/latitude-deg");
- static const SGPropertyNode *cur_time_override
- = fgGetNode("/sim/time/cur-time-override", true);
-
- int orig_warp = globals->get_warp();
- SGTime *t = globals->get_time_params();
- time_t cur_time = t->get_cur_time();
- // cout << "cur_time = " << cur_time << endl;
- // cout << "orig_warp = " << orig_warp << endl;
-
- int warp = 0;
- if ( offset_type == "real" ) {
- warp = -orig_warp;
- } else if ( offset_type == "dawn" ) {
- warp = fgTimeSecondsUntilSunAngle( cur_time,
- longitude->getDoubleValue()
- * SGD_DEGREES_TO_RADIANS,
- latitude->getDoubleValue()
- * SGD_DEGREES_TO_RADIANS,
- 90.0, true );
- } else if ( offset_type == "morning" ) {
- warp = fgTimeSecondsUntilSunAngle( cur_time,
- longitude->getDoubleValue()
- * SGD_DEGREES_TO_RADIANS,
- latitude->getDoubleValue()
- * SGD_DEGREES_TO_RADIANS,
- 75.0, true );
- } else if ( offset_type == "noon" ) {
- warp = fgTimeSecondsUntilSunAngle( cur_time,
- longitude->getDoubleValue()
- * SGD_DEGREES_TO_RADIANS,
- latitude->getDoubleValue()
- * SGD_DEGREES_TO_RADIANS,
- 0.0, true );
- } else if ( offset_type == "afternoon" ) {
- warp = fgTimeSecondsUntilSunAngle( cur_time,
- longitude->getDoubleValue()
- * SGD_DEGREES_TO_RADIANS,
- latitude->getDoubleValue()
- * SGD_DEGREES_TO_RADIANS,
- 60.0, false );
- } else if ( offset_type == "dusk" ) {
- warp = fgTimeSecondsUntilSunAngle( cur_time,
- longitude->getDoubleValue()
- * SGD_DEGREES_TO_RADIANS,
- latitude->getDoubleValue()
- * SGD_DEGREES_TO_RADIANS,
- 90.0, false );
- } else if ( offset_type == "evening" ) {
- warp = fgTimeSecondsUntilSunAngle( cur_time,
- longitude->getDoubleValue()
- * SGD_DEGREES_TO_RADIANS,
- latitude->getDoubleValue()
- * SGD_DEGREES_TO_RADIANS,
- 100.0, false );
- } else if ( offset_type == "midnight" ) {
- warp = fgTimeSecondsUntilSunAngle( cur_time,
- longitude->getDoubleValue()
- * SGD_DEGREES_TO_RADIANS,
- latitude->getDoubleValue()
- * SGD_DEGREES_TO_RADIANS,
- 180.0, false );
- }
- // cout << "warp = " << warp << endl;
- globals->set_warp( orig_warp + warp );
-
- t->update( longitude->getDoubleValue() * SGD_DEGREES_TO_RADIANS,
- latitude->getDoubleValue() * SGD_DEGREES_TO_RADIANS,
- cur_time_override->getLongValue(),
- globals->get_warp() );
-
- return true;
-}
-
+#endif
/**
* Built-in command: toggle a bool property value.
do_property_assign (const SGPropertyNode * arg)
{
SGPropertyNode * prop = get_prop(arg);
- const SGPropertyNode * prop2 = get_prop2(arg);
const SGPropertyNode * value = arg->getNode("value");
if (value != 0)
return prop->setUnspecifiedValue(value->getStringValue());
- else if (prop2)
- return prop->setUnspecifiedValue(prop2->getStringValue());
else
- return false;
+ {
+ const SGPropertyNode * prop2 = get_prop2(arg);
+ if (prop2)
+ return prop->setUnspecifiedValue(prop2->getStringValue());
+ else
+ return false;
+ }
}
}
}
+static bool
+do_open_browser (const SGPropertyNode * arg)
+{
+ string path;
+ if (arg->hasValue("path"))
+ path = arg->getStringValue("path");
+ else
+ if (arg->hasValue("url"))
+ path = arg->getStringValue("url");
+ else
+ return false;
+
+ return openBrowser(path);
+}
/**
* Apply a value in the active XML-configured dialog.
do_add_model (const SGPropertyNode * arg)
{
SGPropertyNode * model = fgGetNode("models", true);
- for (int i = 0;; i++) {
- if (i < 0)
- return false;
- if (!model->getChild("model", i, false)) {
- model = model->getChild("model", i, true);
- break;
- }
- }
+ int i;
+ for (i = 0; model->hasChild("model",i); i++);
+ model = model->getChild("model", i, true);
copyProperties(arg, model);
if (model->hasValue("elevation-m"))
model->setDoubleValue("elevation-ft", model->getDoubleValue("elevation-m")
static bool
do_presets_commit (const SGPropertyNode * arg)
{
- // unbind the current fdm state so property changes
- // don't get lost when we subsequently delete this fdm
- // and create a new one.
- globals->get_subsystem("flight")->unbind();
-
- // set position from presets
- fgInitPosition();
-
- fgReInitSubsystems();
-
- globals->get_tile_mgr()->update( fgGetDouble("/environment/visibility-m") );
-
-#if 0
- if ( ! fgGetBool("/sim/presets/onground") ) {
- fgSetBool( "/sim/freeze/master", true );
- fgSetBool( "/sim/freeze/clock", true );
+ if (fgGetBool("/sim/initialized", false)) {
+ fgReInitSubsystems();
+ } else {
+ // Nasal can trigger this during initial init, which confuses
+ // the logic in ReInitSubsystems, since initial state has not been
+ // saved at that time. Short-circuit everything here.
+ fgInitPosition();
}
-#endif
-
+
return true;
}
return true;
}
-/**
- * Built-in command: replay the FDR buffer
- */
-static bool
-do_replay (const SGPropertyNode * arg)
-{
- // freeze the master fdm
- fgSetInt( "/sim/freeze/replay-state", 1 );
-
- FGReplay *r = (FGReplay *)(globals->get_subsystem( "replay" ));
-
- fgSetDouble( "/sim/replay/start-time", r->get_start_time() );
- fgSetDouble( "/sim/replay/end-time", r->get_end_time() );
- double duration = fgGetDouble( "/sim/replay/duration" );
- if( duration && duration < (r->get_end_time() - r->get_start_time()) ) {
- fgSetDouble( "/sim/replay/time", r->get_end_time() - duration );
- } else {
- fgSetDouble( "/sim/replay/time", r->get_start_time() );
- }
-
- // cout << "start = " << r->get_start_time()
- // << " end = " << r->get_end_time() << endl;
-
- return true;
-}
-
-
+/*
static bool
do_decrease_visibility (const SGPropertyNode * arg)
{
- double new_value = fgGetDouble("/environment/visibility-m") * 0.9;
- fgSetDouble("/environment/visibility-m", new_value);
- fgDefaultWeatherValue("visibility-m", new_value);
- globals->get_subsystem("environment")->reinit();
-
+ Environment::Presets::VisibilitySingleton::instance()->adjust( 0.9 );
return true;
}
static bool
do_increase_visibility (const SGPropertyNode * arg)
{
- double new_value = fgGetDouble("/environment/visibility-m") * 1.1;
- fgSetDouble("/environment/visibility-m", new_value);
- fgDefaultWeatherValue("visibility-m", new_value);
- globals->get_subsystem("environment")->reinit();
-
+ Environment::Presets::VisibilitySingleton::instance()->adjust( 1.1 );
return true;
}
-
-static bool
-do_hud_init(const SGPropertyNode *)
-{
- fgHUDInit(); // minimal HUD
- return true;
-}
-
-static bool
-do_hud_init2(const SGPropertyNode *)
-{
- fgHUDInit2(); // normal HUD
- return true;
-}
-
-
+*/
/**
* An fgcommand to allow loading of xml files via nasal,
* the xml file's structure will be made available within
if (file.extension() != "xml")
file.concat(".xml");
-
- if (file.isRelative()) {
- file = globals->resolve_maybe_aircraft_path(file.str());
+
+ std::string icao = arg->getStringValue("icao");
+ if (icao.empty()) {
+ if (file.isRelative()) {
+ SGPath absPath = globals->resolve_maybe_aircraft_path(file.str());
+ if (!absPath.isNull())
+ file = absPath;
+ else
+ {
+ SG_LOG(SG_IO, SG_ALERT, "loadxml: Cannot find XML property file '"
+ << file.str() << "'.");
+ return false;
+ }
+ }
+ } else {
+ if (!XMLLoader::findAirportData(icao, file.str(), file)) {
+ SG_LOG(SG_IO, SG_INFO, "loadxml: failed to find airport data for "
+ << file.str() << " at ICAO:" << icao);
+ return false;
+ }
}
-
+
if (!fgValidatePath(file.c_str(), false)) {
SG_LOG(SG_IO, SG_ALERT, "loadxml: reading '" << file.str() << "' denied "
"(unauthorized access)");
return true;
}
+static SGGeod commandSearchPos(const SGPropertyNode* arg)
+{
+ if (arg->hasChild("longitude-deg") && arg->hasChild("latitude-deg")) {
+ return SGGeod::fromDeg(arg->getDoubleValue("longitude-deg"),
+ arg->getDoubleValue("latitude-deg"));
+ }
+
+ // use current viewer/aircraft position
+ return SGGeod::fromDeg(fgGetDouble("/position/longitude-deg"),
+ fgGetDouble("/position/latitude-deg"));
+}
+
+static bool
+do_comm_search(const SGPropertyNode* arg)
+{
+ SGGeod pos = commandSearchPos(arg);
+ int khz = static_cast<int>(arg->getDoubleValue("frequency-mhz") * 100.0 + 0.25);
+
+ flightgear::CommStation* sta = flightgear::CommStation::findByFreq(khz, pos, NULL);
+ if (!sta) {
+ return true;
+ }
+
+ SGPropertyNode* result = fgGetNode(arg->getStringValue("result"));
+ sta->createBinding(result);
+ return true;
+}
+
+static bool
+do_nav_search(const SGPropertyNode* arg)
+{
+ SGGeod pos = commandSearchPos(arg);
+ double mhz = arg->getDoubleValue("frequency-mhz");
+ FGNavList* navList = globals->get_navlist();
+ string type(arg->getStringValue("type", "vor"));
+ if (type == "dme") {
+ navList = globals->get_dmelist();
+ } else if (type == "tacan") {
+ navList = globals->get_tacanlist();
+ }
+
+ FGNavRecord* nav = navList->findByFreq(mhz, pos);
+ if (!nav && (type == "vor")) {
+ // if we're searching VORs, look for localizers too
+ nav = globals->get_loclist()->findByFreq(mhz, pos);
+ }
+
+ if (!nav) {
+ return true;
+ }
+
+ SGPropertyNode* result = fgGetNode(arg->getStringValue("result"));
+ nav->createBinding(result);
+ return true;
+}
+
////////////////////////////////////////////////////////////////////////
// Command setup.
////////////////////////////////////////////////////////////////////////
{ "reinit", do_reinit },
{ "suspend", do_reinit },
{ "resume", do_reinit },
+ { "pause", do_pause },
{ "load", do_load },
{ "save", do_save },
{ "panel-load", do_panel_load },
{ "screen-capture", do_screen_capture },
{ "hires-screen-capture", do_hires_screen_capture },
{ "tile-cache-reload", do_tile_cache_reload },
+ /*
{ "set-sea-level-air-temp-degc", do_set_sea_level_degc },
{ "set-outside-air-temp-degc", do_set_oat_degc },
{ "set-dewpoint-sea-level-air-temp-degc", do_set_dewpoint_sea_level_degc },
{ "set-dewpoint-temp-degc", do_set_dewpoint_degc },
- { "timeofday", do_timeofday },
+ */
{ "property-toggle", do_property_toggle },
{ "property-assign", do_property_assign },
{ "property-adjust", do_property_adjust },
{ "dialog-close", do_dialog_close },
{ "dialog-update", do_dialog_update },
{ "dialog-apply", do_dialog_apply },
+ { "open-browser", do_open_browser },
{ "gui-redraw", do_gui_redraw },
{ "add-model", do_add_model },
{ "set-cursor", do_set_cursor },
{ "presets-commit", do_presets_commit },
{ "log-level", do_log_level },
{ "replay", do_replay },
+ /*
{ "decrease-visibility", do_decrease_visibility },
{ "increase-visibility", do_increase_visibility },
- { "hud-init", do_hud_init },
- { "hud-init2", do_hud_init2 },
+ */
{ "loadxml", do_load_xml_to_proptree},
{ "savexml", do_save_xml_from_proptree },
{ "press-cockpit-button", do_press_cockpit_button },
{ "release-cockpit-button", do_release_cockpit_button },
{ "dump-scenegraph", do_dump_scene_graph },
{ "dump-terrainbranch", do_dump_terrain_branch },
+ { "print-visible-scene", do_print_visible_scene_info },
{ "reload-shaders", do_reload_shaders },
+
+ { "find-navaid", do_nav_search },
+ { "find-comm", do_comm_search },
+
{ 0, 0 } // zero-terminated
};