#include <string.h> // strcmp()
#include <simgear/compiler.h>
-#include <simgear/misc/exception.hxx>
#include STL_STRING
#include STL_FSTREAM
-#include <simgear/debug/logstream.hxx>
-#include <simgear/misc/commands.hxx>
-#include <simgear/misc/props.hxx>
#include <simgear/sg_inlines.h>
+#include <simgear/debug/logstream.hxx>
+#include <simgear/math/sg_random.h>
+#include <simgear/structure/exception.hxx>
+#include <simgear/structure/commands.hxx>
+#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/sunsolver.hxx>
#include <Time/tmp.hxx>
#include "fg_init.hxx"
#include "fg_commands.hxx"
+#include "fg_props.hxx"
SG_USING_STD(string);
SG_USING_STD(ifstream);
bool result = true;
vector<SGPropertyNode_ptr> subsystems = arg->getChildren("subsystem");
- if (subsystems.size() == 0)
+ if (subsystems.size() == 0) {
globals->get_subsystem_mgr()->reinit();
- else for (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();
+ } else {
+ for ( unsigned int i = 0; i < subsystems.size(); i++ ) {
+ const char * name = subsystems[i]->getStringValue();
+ SGSubsystem * subsystem = globals->get_subsystem(name);
+ if (subsystem == 0) {
+ result = false;
+ SG_LOG( SG_GENERAL, SG_ALERT,
+ "Subsystem " << name << "not found" );
+ } else {
+ subsystem->reinit();
+ }
}
}
+
+ globals->get_event_mgr()->reinit();
+
return result;
}
-
/**
* Built-in command: suspend one or more subsystems.
*
bool result = true;
vector<SGPropertyNode_ptr> subsystems = arg->getChildren("subsystem");
- for (int i = 0; i < subsystems.size(); i++) {
+ for ( unsigned int i = 0; i < subsystems.size(); i++ ) {
const char * name = subsystems[i]->getStringValue();
- FGSubsystem * subsystem = globals->get_subsystem(name);
+ SGSubsystem * subsystem = globals->get_subsystem(name);
if (subsystem == 0) {
result = false;
SG_LOG(SG_GENERAL, SG_ALERT, "Subsystem " << name << "not found");
bool result = true;
vector<SGPropertyNode_ptr> subsystems = arg->getChildren("subsystem");
- for (int i = 0; i < subsystems.size(); i++) {
+ for ( unsigned int i = 0; i < subsystems.size(); i++ ) {
const char * name = subsystems[i]->getStringValue();
- FGSubsystem * subsystem = globals->get_subsystem(name);
+ SGSubsystem * subsystem = globals->get_subsystem(name);
if (subsystem == 0) {
result = false;
SG_LOG(SG_GENERAL, SG_ALERT, "Subsystem " << name << "not found");
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"),
* Update the lighting manually.
*/
static bool
-do_lighting_update (const SGPropertyNode * arg)
+do_timeofday (const SGPropertyNode * arg)
{
- fgUpdateSkyAndLightingParams();
- return true;
+ 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;
}
}
+/**
+ * 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.
*
do_dialog_close (const SGPropertyNode * arg)
{
NewGUI * gui = (NewGUI *)globals->get_subsystem("gui");
- gui->closeActiveDialog();
+ return gui->closeActiveDialog();
}
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;
}
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() );
+ 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();
+
+ 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();
+
+ return true;
+}
-\f
////////////////////////////////////////////////////////////////////////
// Command setup.
////////////////////////////////////////////////////////////////////////
{ "view-cycle", do_view_cycle },
{ "screen-capture", do_screen_capture },
{ "tile-cache-reload", do_tile_cache_reload },
- { "lighting-update", do_lighting_update },
+ { "timeofday", do_timeofday },
{ "property-toggle", do_property_toggle },
{ "property-assign", do_property_assign },
{ "property-adjust", do_property_adjust },
{ "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-apply", do_dialog_apply },
{ "presets-commit", do_presets_commit },
{ "log-level", do_log_level },
+ { "replay", do_replay },
+ { "decrease-visibility", do_decrease_visibility },
+ { "increase-visibility", do_increase_visibility },
{ 0, 0 } // zero-terminated
};