X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Ffg_init.cxx;h=f7c591d397dc3e17d66307259293b54a2bc4cf66;hb=a704a6208131cad4f12123a72acdb1fb3dc6658f;hp=b7cf36058a05f58c9362974a2c65ff7950d86660;hpb=ffbb0a0e5d8915df208dc8042fd3338f04b01dfe;p=flightgear.git diff --git a/src/Main/fg_init.cxx b/src/Main/fg_init.cxx index b7cf36058..f7c591d39 100644 --- a/src/Main/fg_init.cxx +++ b/src/Main/fg_init.cxx @@ -34,12 +34,6 @@ # define isatty _isatty #endif -// work around a stdc++ lib bug in some versions of linux, but doesn't -// seem to hurt to have this here for all versions of Linux. -#ifdef linux -# define _G_NO_EXTERN_TEMPLATES -#endif - #include #include @@ -63,7 +57,6 @@ #include #include -#include #include #include #include @@ -90,9 +83,6 @@ #include #include #include -#include -#include -#include #include #include #include @@ -107,6 +97,9 @@ #include #include #include +#include +#include +#include #include "fg_init.hxx" #include "fg_io.hxx" @@ -422,25 +415,30 @@ bool fgInitConfig ( int argc, char **argv ) home->setStringValue(dataPath.c_str()); home->setAttribute(SGPropertyNode::WRITE, false); - flightgear::Options::sharedInstance()->init(argc, argv, dataPath); + flightgear::Options* options = flightgear::Options::sharedInstance(); + options->init(argc, argv, dataPath); + bool loadDefaults = flightgear::Options::sharedInstance()->shouldLoadDefaultConfig(); + if (loadDefaults) { + // Read global preferences from $FG_ROOT/preferences.xml + SG_LOG(SG_INPUT, SG_INFO, "Reading global preferences"); + fgLoadProps("preferences.xml", globals->get_props()); + SG_LOG(SG_INPUT, SG_INFO, "Finished Reading global preferences"); + + // do not load user settings when reset to default is requested + if (flightgear::Options::sharedInstance()->isOptionSet("restore-defaults")) + { + SG_LOG(SG_ALL, SG_ALERT, "Ignoring user settings. Restoring defaults."); + } + else + { + globals->loadUserSettings(dataPath); + } + } else { + SG_LOG(SG_GENERAL, SG_INFO, "not reading default configuration files"); + }// of no-default-config selected - // Read global preferences from $FG_ROOT/preferences.xml - SG_LOG(SG_INPUT, SG_INFO, "Reading global preferences"); - fgLoadProps("preferences.xml", globals->get_props()); - SG_LOG(SG_INPUT, SG_INFO, "Finished Reading global preferences"); - - // do not load user settings when reset to default is requested - if (flightgear::Options::sharedInstance()->isOptionSet("restore-defaults")) - { - SG_LOG(SG_ALL, SG_ALERT, "Ignoring user settings. Restoring defaults."); - } - else - { - globals->loadUserSettings(dataPath); - } - // Scan user config files and command line for a specified aircraft. - flightgear::Options::sharedInstance()->initAircraft(); + options->initAircraft(); FindAndCacheAircraft f(globals->get_props()); if (!f.loadAircraft()) { @@ -449,57 +447,41 @@ bool fgInitConfig ( int argc, char **argv ) // parse options after loading aircraft to ensure any user // overrides of defaults are honored. - flightgear::Options::sharedInstance()->processOptions(); + options->processOptions(); return true; } + + /** * Initialize vor/ndb/ils/fix list management and query systems (as * well as simple airport db list) + * This is called multiple times in the case of a cache rebuild, + * to allow length caching to take place in the background, without + * blocking the main/UI thread. */ bool fgInitNav () { - SG_LOG(SG_GENERAL, SG_INFO, "Loading Airport Database ..."); - - SGPath aptdb( globals->get_fg_root() ); - aptdb.append( "Airports/apt.dat" ); - - SGPath p_metar( globals->get_fg_root() ); - p_metar.append( "Airports/metar.dat" ); - - fgAirportDBLoad( aptdb.str(), p_metar.str() ); + flightgear::NavDataCache* cache = flightgear::NavDataCache::instance(); + static bool doingRebuild = false; + if (doingRebuild || cache->isRebuildRequired()) { + doingRebuild = true; + bool finished = cache->rebuild(); + if (!finished) { + // sleep to give the rebuild thread more time + SGTimeStamp::sleepForMSec(50); + return false; + } + } - FGNavList *navlist = new FGNavList; - FGNavList *loclist = new FGNavList; - FGNavList *gslist = new FGNavList; - FGNavList *dmelist = new FGNavList; - FGNavList *tacanlist = new FGNavList; - FGNavList *carrierlist = new FGNavList; FGTACANList *channellist = new FGTACANList; - - globals->set_navlist( navlist ); - globals->set_loclist( loclist ); - globals->set_gslist( gslist ); - globals->set_dmelist( dmelist ); - globals->set_tacanlist( tacanlist ); - globals->set_carrierlist( carrierlist ); globals->set_channellist( channellist ); - if ( !fgNavDBInit(navlist, loclist, gslist, dmelist, tacanlist, carrierlist, channellist) ) { - SG_LOG( SG_GENERAL, SG_ALERT, - "Problems loading one or more navigational database" ); - } - - SG_LOG(SG_GENERAL, SG_INFO, " Fixes"); - SGPath p_fix( globals->get_fg_root() ); - p_fix.append( "Navaids/fix.dat" ); - FGFixList fixlist; - fixlist.init( p_fix ); // adds fixes to the DB in positioned.cxx - - SG_LOG(SG_GENERAL, SG_INFO, " Airways"); - flightgear::Airway::load(); + SGPath path(globals->get_fg_root()); + path.append( "Navaids/TACAN_freq.dat" ); + flightgear::loadTacan(path, channellist); return true; } @@ -623,9 +605,11 @@ void fgCreateSubsystems() { // autopilot.) //////////////////////////////////////////////////////////////////// - globals->add_subsystem("instrumentation", new FGInstrumentMgr, SGSubsystemMgr::FDM); globals->add_subsystem("systems", new FGSystemMgr, SGSubsystemMgr::FDM); - + globals->add_subsystem("instrumentation", new FGInstrumentMgr, SGSubsystemMgr::FDM); + globals->add_subsystem("hud", new HUD, SGSubsystemMgr::DISPLAY); + globals->add_subsystem("cockpit-displays", new flightgear::CockpitDisplayManager, SGSubsystemMgr::DISPLAY); + //////////////////////////////////////////////////////////////////// // Initialize the XML Autopilot subsystem. //////////////////////////////////////////////////////////////////// @@ -708,16 +692,14 @@ void fgCreateSubsystems() { //////////////////////////////////////////////////////////////////// // Initialize the controls subsystem. //////////////////////////////////////////////////////////////////// - - globals->get_controls()->init(); - globals->get_controls()->bind(); - + + globals->add_subsystem("controls", new FGControls, SGSubsystemMgr::GENERAL); //////////////////////////////////////////////////////////////////// // Initialize the input subsystem. //////////////////////////////////////////////////////////////////// - globals->add_subsystem("input", new FGInput); + globals->add_subsystem("input", new FGInput, SGSubsystemMgr::GENERAL); //////////////////////////////////////////////////////////////////// @@ -740,14 +722,9 @@ void fgCreateSubsystems() { // ordering here is important : Nasal (via events), then models, then views globals->add_subsystem("events", globals->get_event_mgr(), SGSubsystemMgr::DISPLAY); - - FGAircraftModel* acm = new FGAircraftModel; - globals->set_aircraft_model(acm); - globals->add_subsystem("aircraft-model", acm, SGSubsystemMgr::DISPLAY); - FGModelMgr* mm = new FGModelMgr; - globals->set_model_mgr(mm); - globals->add_subsystem("model-manager", mm, SGSubsystemMgr::DISPLAY); + globals->add_subsystem("aircraft-model", new FGAircraftModel, SGSubsystemMgr::DISPLAY); + globals->add_subsystem("model-manager", new FGModelMgr, SGSubsystemMgr::DISPLAY); FGViewMgr *viewmgr = new FGViewMgr; globals->set_viewmgr( viewmgr ); @@ -783,7 +760,7 @@ void fgPostInitSubsystems() /* Scenarios require Nasal, so FGAIManager loads the scenarios, * including its models such as a/c carriers, in its 'postinit', * which is the very last thing we do. - * fgInitPosition is called very early in main.cxx/fgIdleFunction, + * flightgear::initPosition is called very early in main.cxx/fgIdleFunction, * one of the first things we do, long before scenarios/carriers are * loaded. => When requested "initial preset position" relates to a * carrier, recalculate the 'initial' position here (how have things @@ -860,6 +837,12 @@ void fgReInitSubsystems() // need to bind FDMshell again, since we manually unbound it above... globals->get_subsystem("flight")->bind(); + // need to reset aircraft (systems/instruments) so they can adapt to current environment + globals->get_subsystem("systems")->reinit(); + globals->get_subsystem("instrumentation")->reinit(); + + globals->get_subsystem("ATIS")->reinit(); + // setup state to end re-init fgSetBool("/sim/signals/reinit", false); if ( !freeze ) {