#include STL_STRING
#include STL_FSTREAM
+#include <simgear/sg_inlines.h>
#include <simgear/debug/logstream.hxx>
+#include <simgear/math/sg_random.h>
#include <simgear/misc/commands.hxx>
-#include <simgear/misc/props.hxx>
-#include <simgear/sg_inlines.h>
+#include <simgear/props/props.hxx>
#include <Cockpit/panel.hxx>
#include <Cockpit/panel_io.hxx>
#include <GUI/gui.h>
#include <GUI/new_gui.hxx>
#include <GUI/dialog.hxx>
+#include <Replay/replay.hxx>
#include <Scenery/tilemgr.hxx>
#if defined(HAVE_PLIB_PSL)
-#include <Scripting/scriptmgr.hxx>
+# include <Scripting/scriptmgr.hxx>
#endif
#include <Time/tmp.hxx>
#include "fg_props.hxx"
#include "fg_io.hxx"
#include "globals.hxx"
+#include "util.hxx"
#include "viewmgr.hxx"
#if defined(HAVE_PLIB_PSL)
/**
* Built-in command: run a PSL script.
+ *
+ * script: the PSL script to execute
*/
static bool
do_script (const SGPropertyNode * arg)
{
- FGScriptMgr * mgr = (FGScriptMgr *)globals->get_subsystem_mgr()
- ->get_group(FGSubsystemMgr::GENERAL)->get_subsystem("scripting");
-
+ FGScriptMgr * mgr = (FGScriptMgr *)globals->get_subsystem("scripting");
return mgr->run(arg->getStringValue("script"));
}
#endif // HAVE_PLIB_PSL
/**
* Built-in command: exit FlightGear.
*
- * TODO: show a confirm dialog.
+ * status: the exit status to return to the operating system (defaults to 0)
*/
static bool
do_exit (const SGPropertyNode * arg)
{
- SG_LOG(SG_INPUT, SG_ALERT, "Program exit requested.");
- ConfirmExitDialog();
+ SG_LOG(SG_INPUT, SG_INFO, "Program exit requested.");
+ fgExit(arg->getIntValue("status", 0));
return true;
}
+/**
+ * Built-in command: reinitialize one or more subsystems.
+ *
+ * subsystem[*]: the name(s) of the subsystem(s) to reinitialize; if
+ * none is specified, reinitialize all of them.
+ */
+static bool
+do_reinit (const SGPropertyNode * arg)
+{
+ bool result = true;
+
+ vector<SGPropertyNode_ptr> subsystems = arg->getChildren("subsystem");
+ if (subsystems.size() == 0) {
+ globals->get_subsystem_mgr()->reinit();
+ } else {
+ for ( unsigned int i = 0; i < subsystems.size(); i++ ) {
+ const char * name = subsystems[i]->getStringValue();
+ FGSubsystem * subsystem = globals->get_subsystem(name);
+ if (subsystem == 0) {
+ result = false;
+ SG_LOG( SG_GENERAL, SG_ALERT,
+ "Subsystem " << name << "not found" );
+ } else {
+ subsystem->reinit();
+ }
+ }
+ }
+
+ return result;
+}
+
+/**
+ * Built-in command: suspend one or more subsystems.
+ *
+ * subsystem[*] - the name(s) of the subsystem(s) to suspend.
+ */
+static bool
+do_suspend (const SGPropertyNode * arg)
+{
+ bool result = true;
+
+ vector<SGPropertyNode_ptr> subsystems = arg->getChildren("subsystem");
+ for ( unsigned int i = 0; i < subsystems.size(); i++ ) {
+ const char * name = subsystems[i]->getStringValue();
+ FGSubsystem * subsystem = globals->get_subsystem(name);
+ if (subsystem == 0) {
+ result = false;
+ SG_LOG(SG_GENERAL, SG_ALERT, "Subsystem " << name << "not found");
+ } else {
+ subsystem->suspend();
+ }
+ }
+ return result;
+}
+
+/**
+ * Built-in command: suspend one or more subsystems.
+ *
+ * subsystem[*] - the name(s) of the subsystem(s) to suspend.
+ */
+static bool
+do_resume (const SGPropertyNode * arg)
+{
+ bool result = true;
+
+ vector<SGPropertyNode_ptr> subsystems = arg->getChildren("subsystem");
+ for ( unsigned int i = 0; i < subsystems.size(); i++ ) {
+ const char * name = subsystems[i]->getStringValue();
+ FGSubsystem * subsystem = globals->get_subsystem(name);
+ if (subsystem == 0) {
+ result = false;
+ SG_LOG(SG_GENERAL, SG_ALERT, "Subsystem " << name << "not found");
+ } else {
+ subsystem->resume();
+ }
+ }
+ return result;
+}
+
+
/**
* Built-in command: load flight.
*
* file (optional): the name of the file to load (relative to current
- * directory). Defaults to "fgfs.sav".
+ * directory). Defaults to "fgfs.sav"
*/
static bool
do_load (const SGPropertyNode * arg)
return false;
}
SG_LOG(SG_INPUT, SG_INFO, "Loaded new panel from " << panel_path);
- current_panel->unbind();
- delete current_panel;
- current_panel = new_panel;
- current_panel->bind();
+ globals->get_current_panel()->unbind();
+ delete globals->get_current_panel();
+ globals->set_current_panel( new_panel );
+ globals->get_current_panel()->bind();
return true;
}
static bool
do_panel_mouse_click (const SGPropertyNode * arg)
{
- if (current_panel != 0)
- return current_panel
+ if (globals->get_current_panel() != 0)
+ return globals->get_current_panel()
->doMouseAction(arg->getIntValue("button"),
arg->getBoolValue("is-down") ? PU_DOWN : PU_UP,
arg->getIntValue("x-pos"),
double offset = arg->getDoubleValue("offset", 0.0);
double factor = arg->getDoubleValue("factor", 1.0);
bool squared = arg->getBoolValue("squared", false);
-
- if (squared)
- setting = (setting < 0 ? -1 : 1) * setting * setting;
+ int power = arg->getIntValue("power", (squared ? 2 : 1));
+
+ int sign = (setting < 0 ? -1 : 1);
+
+ switch (power) {
+ case 1:
+ break;
+ case 2:
+ setting = setting * setting * sign;
+ break;
+ case 3:
+ setting = setting * setting * setting;
+ break;
+ case 4:
+ setting = setting * setting * setting * setting * sign;
+ break;
+ default:
+ setting = pow(setting, power);
+ if ((power % 2) == 0)
+ setting *= sign;
+ break;
+ }
return prop->setDoubleValue((setting + offset) * factor);
}
}
+/**
+ * Built-in command: randomize a numeric property value.
+ *
+ * property: the name of the property value to randomize.
+ * min: the minimum allowed value.
+ * max: the maximum allowed value.
+ */
+static bool
+do_property_randomize (const SGPropertyNode * arg)
+{
+ SGPropertyNode * prop = get_prop(arg);
+ double min = arg->getDoubleValue("min", DBL_MIN);
+ double max = arg->getDoubleValue("max", DBL_MAX);
+ prop->setDoubleValue(sg_random() * (max - min) + min);
+ return true;
+}
+
+
/**
* Built-in command: Show an XML-configured dialog.
*
static bool
do_dialog_show (const SGPropertyNode * arg)
{
- NewGUI * gui = (NewGUI *)globals->get_subsystem_mgr()
- ->get_group(FGSubsystemMgr::INIT)->get_subsystem("gui");
- gui->display(arg->getStringValue("dialog-name"));
+ NewGUI * gui = (NewGUI *)globals->get_subsystem("gui");
+ gui->showDialog(arg->getStringValue("dialog-name"));
return true;
}
static bool
do_dialog_close (const SGPropertyNode * arg)
{
- NewGUI * gui = (NewGUI *)globals->get_subsystem_mgr()
- ->get_group(FGSubsystemMgr::INIT)->get_subsystem("gui");
- FGDialog * widget = gui->getCurrentWidget();
- if (widget != 0) {
- delete widget;
- gui->setCurrentWidget(0);
- return true;
- } else {
- return false;
- }
+ NewGUI * gui = (NewGUI *)globals->get_subsystem("gui");
+ return gui->closeActiveDialog();
}
static bool
do_dialog_update (const SGPropertyNode * arg)
{
- NewGUI * gui = (NewGUI *)globals->get_subsystem_mgr()
- ->get_group(FGSubsystemMgr::INIT)->get_subsystem("gui");
- FGDialog * widget = gui->getCurrentWidget();
- if (widget != 0) {
+ NewGUI * gui = (NewGUI *)globals->get_subsystem("gui");
+ FGDialog * dialog = gui->getActiveDialog();
+ if (dialog != 0) {
if (arg->hasValue("object-name")) {
- gui->getCurrentWidget()
- ->updateValue(arg->getStringValue("object-name"));
+ dialog->updateValue(arg->getStringValue("object-name"));
} else {
- gui->getCurrentWidget()->updateValues();
+ dialog->updateValues();
}
return true;
} else {
static bool
do_dialog_apply (const SGPropertyNode * arg)
{
- NewGUI * gui = (NewGUI *)globals->get_subsystem_mgr()
- ->get_group(FGSubsystemMgr::INIT)->get_subsystem("gui");
- FGDialog * widget = gui->getCurrentWidget();
- if (widget != 0) {
+ NewGUI * gui = (NewGUI *)globals->get_subsystem("gui");
+ FGDialog * dialog = gui->getActiveDialog();
+ if (dialog != 0) {
if (arg->hasValue("object-name")) {
const char * name = arg->getStringValue("object-name");
- gui->getCurrentWidget()->applyValue(name);
- gui->getCurrentWidget()->updateValue(name);
+ dialog->applyValue(name);
+ dialog->updateValue(name);
} else {
- gui->getCurrentWidget()->applyValues();
- gui->getCurrentWidget()->updateValues();
+ dialog->applyValues();
+ dialog->updateValues();
}
return true;
} else {
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 );
}
+#endif
return true;
}
+/**
+ * Built-in command: set log level (0 ... 7)
+ */
+static bool
+do_log_level (const SGPropertyNode * arg)
+{
+ sglog().setLogLevels( SG_ALL, (sgDebugPriority)arg->getIntValue() );
+
+ return true;
+}
+
+/**
+ * Built-in command: replay the FDR buffer
+ */
+static bool
+do_replay (const SGPropertyNode * arg)
+{
+ // freeze the master fdm
+ fgSetBool( "/sim/freeze/replay", true );
+
+ 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() );
+ fgSetDouble( "/sim/replay/time", r->get_start_time() );
+
+ cout << "start = " << r->get_start_time()
+ << " end = " << r->get_end_time() << endl;
+
+ return true;
+}
+
+
\f
////////////////////////////////////////////////////////////////////////
{ "script", do_script },
#endif // HAVE_PLIB_PSL
{ "exit", do_exit },
+ { "reinit", do_reinit },
+ { "suspend", do_reinit },
+ { "resume", do_reinit },
{ "load", do_load },
{ "save", do_save },
{ "panel-load", do_panel_load },
{ "property-swap", do_property_swap },
{ "property-scale", do_property_scale },
{ "property-cycle", do_property_cycle },
+ { "property-randomize", do_property_randomize },
{ "dialog-show", do_dialog_show },
{ "dialog-close", do_dialog_close },
{ "dialog-show", do_dialog_show },
{ "dialog-update", do_dialog_update },
{ "dialog-apply", do_dialog_apply },
{ "presets-commit", do_presets_commit },
+ { "log-level", do_log_level },
+ { "replay", do_replay },
{ 0, 0 } // zero-terminated
};