#include "fg_props.hxx"
#include "positioninit.hxx"
#include "subsystemFactory.hxx"
+#include "options.hxx"
using namespace flightgear;
simgear::AtomicChangeListener::fireChangeListeners();
}
+static void initTerrasync()
+{
+ if (fgGetBool("/sim/fghome-readonly", false)) {
+ return;
+ }
+
+ // start TerraSync up now, so it can be synchronizing shared models
+ // and airports data in parallel with a nav-cache rebuild.
+ SGPath tsyncCache(globals->get_fg_home());
+ tsyncCache.append("terrasync-cache.xml");
+
+ // wipe the cache file if requested
+ if (flightgear::Options::sharedInstance()->isOptionSet("restore-defaults")) {
+ SG_LOG(SG_GENERAL, SG_INFO, "restore-defaults requested, wiping terrasync update cache at " <<
+ tsyncCache);
+ if (tsyncCache.exists()) {
+ tsyncCache.remove();
+ }
+ }
+
+ fgSetString("/sim/terrasync/cache-path", tsyncCache.c_str());
+
+ simgear::SGTerraSync* terra_sync = new simgear::SGTerraSync();
+ terra_sync->setRoot(globals->get_props());
+ globals->add_subsystem("terrasync", terra_sync);
+
+ terra_sync->bind();
+ terra_sync->init();
+
+ // add the terrasync root as a data path so data can be retrieved from it
+ std::string terraSyncDir(fgGetString("/sim/terrasync/scenery-dir"));
+ globals->append_data_path(terraSyncDir);
+}
static void registerMainLoop()
{
// per pass) and once everything has been initialized fgMainLoop from
// then on.
+static int idle_state = 0;
+
static void fgIdleFunction ( void ) {
// Specify our current idle function state. This is used to run all
// our initializations out of the idle callback so that we can get a
// splash screen up and running right away.
- static int idle_state = 0;
-
+
if ( idle_state == 0 ) {
if (guiInit())
{
}
} else if ( idle_state == 2 ) {
-
- // start TerraSync up now, so it can be synchronizing shared models
- // and airports data in parallel with a nav-cahce rebuild.
- SGPath tsyncCache(globals->get_fg_home());
- tsyncCache.append("terrasync-cache.xml");
- fgSetString("/sim/terrasync/cache-path", tsyncCache.c_str());
-
- simgear::SGTerraSync* terra_sync = new simgear::SGTerraSync(globals->get_props());
- globals->add_subsystem("terrasync", terra_sync);
-
- terra_sync->bind();
- terra_sync->init();
-
+ initTerrasync();
idle_state++;
fgSplashProgress("loading-nav-dat");
}
} else if ( idle_state == 4 ) {
- idle_state+=2;
- // based on the requested presets, calculate the true starting
- // lon, lat
- flightgear::initPosition();
- flightgear::initTowerLocationListener();
+ idle_state++;
TimeManager* t = new TimeManager;
globals->add_subsystem("time", t, SGSubsystemMgr::INIT);
- t->init(); // need to init now, not during initSubsystems
// Do some quick general initializations
if( !fgInitGeneral()) {
- SG_LOG( SG_GENERAL, SG_ALERT,
- "General initialization failed ..." );
- exit(-1);
+ throw sg_exception("General initialization failed");
}
////////////////////////////////////////////////////////////////////
// Initialize the material manager
////////////////////////////////////////////////////////////////////
globals->set_matlib( new SGMaterialLib );
- simgear::SGModelLib::init(globals->get_fg_root(), globals->get_props());
simgear::SGModelLib::setPanelFunc(FGPanelNode::load);
-
+
+ } else if (( idle_state == 5 ) || (idle_state == 2005)) {
+ idle_state+=2;
+ flightgear::initPosition();
+ flightgear::initTowerLocationListener();
+
+ simgear::SGModelLib::init(globals->get_fg_root(), globals->get_props());
+
+ TimeManager* timeManager = (TimeManager*) globals->get_subsystem("time");
+ timeManager->init();
+
////////////////////////////////////////////////////////////////////
// Initialize the TG scenery subsystem.
////////////////////////////////////////////////////////////////////
-
+
globals->set_scenery( new FGScenery );
globals->get_scenery()->init();
globals->get_scenery()->bind();
globals->set_tile_mgr( new FGTileMgr );
-
- fgSplashProgress("loading-aircraft");
-
- } else if ( idle_state == 6 ) {
- idle_state++;
+
fgSplashProgress("creating-subsystems");
-
- } else if ( idle_state == 7 ) {
- idle_state++;
+ } else if (( idle_state == 7 ) || (idle_state == 2007)) {
+ bool isReset = (idle_state == 2007);
+ idle_state = 8; // from the next state on, reset & startup are identical
SGTimeStamp st;
st.stamp();
- fgCreateSubsystems();
+ fgCreateSubsystems(isReset);
SG_LOG(SG_GENERAL, SG_INFO, "Creating subsystems took:" << st.elapsedMSec());
fgSplashProgress("binding-subsystems");
fgSetBool("sim/sceneryloaded", false);
registerMainLoop();
}
+
+ if ( idle_state == 2000 ) {
+ fgStartNewReset();
+ idle_state = 2005;
+ }
+}
+
+void fgResetIdleState()
+{
+ idle_state = 2000;
+ fgRegisterIdleHandler( &fgIdleFunction );
}
+
static void upper_case_property(const char *name)
{
using namespace simgear;
else
assert(t == props::STRING);
}
- p->addChangeListener(new FGMakeUpperCase);
+ SGPropertyChangeListener* muc = new FGMakeUpperCase;
+ globals->addListenerToCleanup(muc);
+ p->addChangeListener(muc);
}
// see http://code.google.com/p/flightgear-bugs/issues/detail?id=385
sglog().setLogLevels( SG_ALL, SG_ALERT );
globals = new FGGlobals;
- fgInitHome();
+ if (!fgInitHome()) {
+ return EXIT_FAILURE;
+ }
- // now home is initialised, we can log to a file inside it
- logToFile();
+ if (!fgGetBool("/sim/fghome-readonly")) {
+ // now home is initialised, we can log to a file inside it
+ logToFile();
+ }
std::string version;
#ifdef FLIGHTGEAR_VERSION
// Load the configuration parameters. (Command line options
// override config file options. Config file options override
// defaults.)
- if ( !fgInitConfig(argc, argv) ) {
- SG_LOG( SG_GENERAL, SG_ALERT, "Config option parsing failed ..." );
- exit(-1);
+ int configResult = fgInitConfig(argc, argv, false);
+ if (configResult == flightgear::FG_OPTIONS_ERROR) {
+ return EXIT_FAILURE;
+ } else if (configResult == flightgear::FG_OPTIONS_EXIT) {
+ return EXIT_SUCCESS;
}
-
+
+ configResult = fgInitAircraft(false);
+ if (configResult == flightgear::FG_OPTIONS_ERROR) {
+ return EXIT_FAILURE;
+ } else if (configResult == flightgear::FG_OPTIONS_EXIT) {
+ return EXIT_SUCCESS;
+ }
+
+ configResult = flightgear::Options::sharedInstance()->processOptions();
+ if (configResult == flightgear::FG_OPTIONS_ERROR) {
+ return EXIT_FAILURE;
+ } else if (configResult == flightgear::FG_OPTIONS_EXIT) {
+ return EXIT_SUCCESS;
+ }
+
// Initialize the Window/Graphics environment.
fgOSInit(&argc, argv);
_bootstrap_OSInit++;
// Clouds3D requires an alpha channel
fgOSOpenWindow(true /* request stencil buffer */);
-
+ fgOSResetProperties();
+
// Initialize the splash screen right away
fntInit();
fgSplashInit();
// pass control off to the master event handler
int result = fgOSMainLoop();
+ frame_signal.clear();
+ fgOSCloseWindow();
// clean up here; ensure we null globals to avoid
// confusing the atexit() handler