// fg_commands.cxx - internal FGFS commands.
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
#include <string.h> // strcmp()
#include <simgear/compiler.h>
# 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;
}
+/**
+ * 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;
}
{ "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 },