// fg_commands.cxx - internal FGFS commands.
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
#include <string.h> // strcmp()
#include <simgear/compiler.h>
#include <GUI/gui.h>
#include <GUI/new_gui.hxx>
#include <GUI/dialog.hxx>
-#include <Replay/replay.hxx>
+#include <Aircraft/replay.hxx>
#include <Scenery/tilemgr.hxx>
#if defined(HAVE_PLIB_PSL)
# include <Scripting/scriptmgr.hxx>
#endif
#include <Scripting/NasalSys.hxx>
+#include <Sound/fg_fx.hxx>
#include <Time/sunsolver.hxx>
#include <Time/tmp.hxx>
#include "logger.hxx"
#include "util.hxx"
#include "viewmgr.hxx"
+#include "main.hxx"
SG_USING_STD(string);
SG_USING_STD(ifstream);
static bool
do_exit (const SGPropertyNode * arg)
{
- SG_LOG(SG_INPUT, SG_INFO, "Program exit requested.");
- fgExit(arg->getIntValue("status", 0));
- return true;
+ SG_LOG(SG_INPUT, SG_INFO, "Program exit requested.");
+ fgSetBool("/sim/signals/exit", true);
+
+ if (fgGetBool("/sim/startup/save-on-exit")) {
+#ifdef _MSC_VER
+ 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 autosave.xml");
+ try {
+ writeProperties(config.str(), globals->get_props(), false, SGPropertyNode::USERARCHIVE);
+ } catch (const sg_exception &e) {
+ guiErrorMessage("Error writing autosave.xml: ", e);
+ }
+
+ SG_LOG(SG_INPUT, SG_BULK, "Finished Saving user settings");
+ }
+ }
+ fgExit(arg->getIntValue("status", 0));
+ return true;
}
dummy.set_temperature_degc( atof( temp_str.c_str() ) );
double temp_sea_level_degc = dummy.get_temperature_sea_level_degc();
- cout << "Altitude = " << altitude_ft->getDoubleValue() << endl;
- cout << "Temp at alt (C) = " << atof( temp_str.c_str() ) << endl;
- cout << "Temp sea level (C) = " << temp_sea_level_degc << endl;
+ //cout << "Altitude = " << altitude_ft->getDoubleValue() << endl;
+ //cout << "Temp at alt (C) = " << atof( temp_str.c_str() ) << endl;
+ //cout << "Temp sea level (C) = " << temp_sea_level_degc << endl;
SGPropertyNode *node, *child;
dummy.set_dewpoint_degc( atof( dewpoint_str.c_str() ) );
double dewpoint_sea_level_degc = dummy.get_dewpoint_sea_level_degc();
- cout << "Altitude = " << altitude_ft->getDoubleValue() << endl;
- cout << "Dewpoint at alt (C) = " << atof( dewpoint_str.c_str() ) << endl;
- cout << "Dewpoint at sea level (C) = " << dewpoint_sea_level_degc << endl;
+ //cout << "Altitude = " << altitude_ft->getDoubleValue() << endl;
+ //cout << "Dewpoint at alt (C) = " << atof( dewpoint_str.c_str() ) << endl;
+ //cout << "Dewpoint at sea level (C) = " << dewpoint_sea_level_degc << endl;
SGPropertyNode *node, *child;
return true;
}
-
-static bool
-do_menu_reload (const SGPropertyNode *)
-{
- globals->get_subsystem("gui")->reinit();
- return true;
-}
-
-
/**
* Built-in command: Add a dialog to the GUI system. Does *not*
* display the dialog. The property node should have the same format
}
+/**
+ * Redraw GUI (applying new widget colors). Doesn't reload the dialogs,
+ * unlike reinit().
+ */
+static bool
+do_gui_redraw (const SGPropertyNode * arg)
+{
+ NewGUI * gui = (NewGUI *)globals->get_subsystem("gui");
+ gui->redraw();
+ return true;
+}
+
+/**
+ * Built-in command: play an audio message (i.e. a wav file) This is
+ * fire and forget. Call this once per message and it will get dumped
+ * into a queue. Messages are played sequentially so they do not
+ * overlap.
+ */
+static bool
+do_play_audio_message (const SGPropertyNode * arg)
+{
+ FGFX *fx = (FGFX *)globals->get_subsystem("fx");
+ string path = arg->getStringValue("path");
+ string file = arg->getStringValue("file");
+ // cout << "playing " << path << " / " << file << endl;
+ fx->play_message( path, file );
+
+ return true;
+}
+
/**
* Built-in command: commit presets (read from in /sim/presets/)
*/
fgSetDouble( "/sim/replay/time", r->get_start_time() );
}
- cout << "start = " << r->get_start_time()
- << " end = " << r->get_end_time() << endl;
+ // cout << "start = " << r->get_start_time()
+ // << " end = " << r->get_end_time() << endl;
return true;
}
{ "property-cycle", do_property_cycle },
{ "property-randomize", do_property_randomize },
{ "data-logging-commit", do_data_logging_commit },
- { "menu-reload", do_menu_reload },
{ "dialog-new", do_dialog_new },
{ "dialog-show", do_dialog_show },
{ "dialog-close", do_dialog_close },
{ "dialog-update", do_dialog_update },
{ "dialog-apply", do_dialog_apply },
+ { "gui-redraw", do_gui_redraw },
+ { "play-audio-message", do_play_audio_message },
{ "presets-commit", do_presets_commit },
{ "log-level", do_log_level },
{ "replay", do_replay },