X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Ffg_init.cxx;h=d77a81a415e8746bfa7dd237adebc449725575a5;hb=38226af24ec01e8f0a20d7fd73ef838a69f6ef25;hp=36c5a17ffa23ef425c4769b3909a0e2d6a6b84b7;hpb=50eb95dcadaf39d892212f2c5c6fe2459b190719;p=flightgear.git diff --git a/src/Main/fg_init.cxx b/src/Main/fg_init.cxx index 36c5a17ff..d77a81a41 100644 --- a/src/Main/fg_init.cxx +++ b/src/Main/fg_init.cxx @@ -58,6 +58,8 @@ #include #include #include +#include + #include #include #include @@ -72,33 +74,28 @@ #include -#if ENABLE_ATCDCL -# include -# include -# include "ATCDCL/commlist.hxx" -#else -# include "ATC/atis.hxx" -# include "ATC/atcutils.hxx" -#endif +#include +#include +#include #include #include -#include #include #include #include -#include #include #include #include +#include #include #include #include #include #include #include +#include #include #include #include @@ -110,7 +107,6 @@ #include #include -#include #include "fg_init.hxx" #include "fg_io.hxx" @@ -142,9 +138,10 @@ static string fgScanForOption( const string& option, int argc, char **argv ) { if (hostname == NULL) { char _hostname[256]; - gethostname(_hostname, 256); - hostname = strdup(_hostname); - free_hostname = true; + if( gethostname(_hostname, 256) >= 0 ) { + hostname = strdup(_hostname); + free_hostname = true; + } } SG_LOG(SG_GENERAL, SG_INFO, "Scanning command line for: " << option ); @@ -203,10 +200,10 @@ static string fgScanForOption( const string& option, const string& path ) { static string fgScanForOption( const string& option ) { string arg(""); -#if defined( unix ) || defined( __CYGWIN__ ) +#if defined( unix ) || defined( __CYGWIN__ ) || defined(_MSC_VER) // Next check home directory for .fgfsrc.hostname file if ( arg.empty() ) { - if ( homedir != NULL ) { + if ( homedir != NULL && hostname != NULL && strlen(hostname) > 0) { SGPath config( homedir ); config.append( ".fgfsrc" ); config.concat( "." ); @@ -489,10 +486,12 @@ do_options (int argc, char ** argv) config.append( "system.fgfsrc" ); fgParseOptions(config.str()); -#if defined( unix ) || defined( __CYGWIN__ ) - config.concat( "." ); - config.concat( hostname ); - fgParseOptions(config.str()); +#if defined( unix ) || defined( __CYGWIN__ ) || defined(_MSC_VER) + if( hostname != NULL && strlen(hostname) > 0 ) { + config.concat( "." ); + config.concat( hostname ); + fgParseOptions(config.str()); + } #endif // Check for ~/.fgfsrc @@ -502,11 +501,13 @@ do_options (int argc, char ** argv) fgParseOptions(config.str()); } -#if defined( unix ) || defined( __CYGWIN__ ) - // Check for ~/.fgfsrc.hostname - config.concat( "." ); - config.concat( hostname ); - fgParseOptions(config.str()); +#if defined( unix ) || defined( __CYGWIN__ ) || defined(_MSC_VER) + if( hostname != NULL && strlen(hostname) > 0 ) { + // Check for ~/.fgfsrc.hostname + config.concat( "." ); + config.concat( hostname ); + fgParseOptions(config.str()); + } #endif // Parse remaining command line options @@ -584,7 +585,7 @@ public: bool loadAircraft() { - std::string aircraft = fgGetString( "/sim/aircraft", ""); + std::string aircraft = fgGetString( "/sim/aircraft", ""); if (aircraft.empty()) { SG_LOG(SG_GENERAL, SG_ALERT, "no aircraft specified"); return false; @@ -596,6 +597,9 @@ public: SGPropertyNode *n = _cache->getNode("fg-root", true); n->setStringValue(globals->get_fg_root().c_str()); n->setAttribute(SGPropertyNode::USERARCHIVE, true); + n = _cache->getNode("fg-aircraft", true); + n->setStringValue(getAircraftPaths().c_str()); + n->setAttribute(SGPropertyNode::USERARCHIVE, true); _cache->removeChildren("aircraft"); fgFindAircraft(this, &FindAndCacheAircraft::checkAircraft); @@ -624,11 +628,29 @@ public: } private: + SGPath getAircraftPaths() { + string_list pathList = globals->get_aircraft_paths(); + SGPath aircraftPaths; + string_list::const_iterator it = pathList.begin(); + if (it != pathList.end()) { + aircraftPaths.set(*it); + it++; + } + for (; it != pathList.end(); ++it) { + aircraftPaths.add(*it); + } + return aircraftPaths; + } + bool checkCache() { if (globals->get_fg_root() != _cache->getStringValue("fg-root", "")) { return false; // cache mismatch } + + if (getAircraftPaths().str() != _cache->getStringValue("fg-aircraft", "")) { + return false; // cache mismatch + } vector cache = _cache->getChildren("aircraft"); for (unsigned int i = 0; i < cache.size(); i++) { @@ -815,7 +837,7 @@ static void fgApplyStartOffset(const SGGeod& aStartPos, double aHeading, double } // Set current_options lon/lat given an airport id and heading (degrees) -static bool fgSetPosFromAirportIDandHdg( const string& id, double tgt_hdg ) { +bool fgSetPosFromAirportIDandHdg( const string& id, double tgt_hdg ) { if ( id.empty() ) return false; @@ -1069,15 +1091,8 @@ fgInitNav () fixlist.init( p_fix ); // adds fixes to the DB in positioned.cxx SG_LOG(SG_GENERAL, SG_INFO, " Airways"); - SGPath p_awy( globals->get_fg_root() ); - p_awy.append( "Navaids/awy.dat" ); - FGAirwayNetwork *awyNet = new FGAirwayNetwork; - //cerr << "Loading Airways" << endl; - awyNet->load (p_awy ); - awyNet->init(); - //cerr << "initializing airways" << endl; - globals->set_airwaynet( awyNet ); - + flightgear::Airway::load(); + return true; } @@ -1255,19 +1270,11 @@ bool fgInitGeneral() { curr->setStringValue(cwd ? cwd : ""); curr->setAttribute(SGPropertyNode::WRITE, false); - fgSetBool("/sim/startup/stdout-to-terminal", isatty(1)); - fgSetBool("/sim/startup/stderr-to-terminal", isatty(2)); + fgSetBool("/sim/startup/stdout-to-terminal", isatty(1) != 0 ); + fgSetBool("/sim/startup/stderr-to-terminal", isatty(2) != 0 ); return true; } -// Initialize view parameters -void fgInitView() { - // force update of model so that viewer can get some data... - globals->get_aircraft_model()->update(0); - // run update for current view so that data is current... - globals->get_viewmgr()->update(0); -} - // This is the top level init routine which calls all the other // initialization routines. If you are adding a subsystem to flight // gear, its initialization call should located in this routine. @@ -1319,15 +1326,6 @@ bool fgInitSubsystems() { // Initialize the scenery management subsystem. //////////////////////////////////////////////////////////////////// - if ( globals->get_tile_mgr()->init() ) { - // Load the local scenery data - double visibility_meters = fgGetDouble("/environment/visibility-m"); - globals->get_tile_mgr()->update( visibility_meters ); - } else { - SG_LOG( SG_GENERAL, SG_ALERT, "Error in Tile Manager initialization!" ); - exit(-1); - } - globals->get_scenery()->get_scene_graph() ->addChild(simgear::Particles::getCommonRoot()); simgear::GlobalParticleCallback::setSwitch(fgGetNode("/sim/rendering/particles", true)); @@ -1345,13 +1343,6 @@ bool fgInitSubsystems() { // Initialize the weather modeling subsystem globals->add_subsystem("environment", new FGEnvironmentMgr); - //////////////////////////////////////////////////////////////////// - // Initialize the ridge lift simulation. - //////////////////////////////////////////////////////////////////// - - // Initialize the ridgelift subsystem - globals->add_subsystem("ridgelift", new FGRidgeLift); - //////////////////////////////////////////////////////////////////// // Initialize the aircraft systems and instrumentation (before the // autopilot.) @@ -1364,14 +1355,8 @@ bool fgInitSubsystems() { // Initialize the XML Autopilot subsystem. //////////////////////////////////////////////////////////////////// - globals->add_subsystem( "xml-autopilot", new FGXMLAutopilotGroup, SGSubsystemMgr::FDM ); + globals->add_subsystem( "xml-autopilot", FGXMLAutopilotGroup::createInstance(), SGSubsystemMgr::FDM ); globals->add_subsystem( "route-manager", new FGRouteMgr ); - - //////////////////////////////////////////////////////////////////// - // Initialize the view manager subsystem. - //////////////////////////////////////////////////////////////////// - - fgInitView(); //////////////////////////////////////////////////////////////////// // Initialize the Input-Output subsystem @@ -1390,46 +1375,33 @@ bool fgInitSubsystems() { globals->add_subsystem("gui", new NewGUI, SGSubsystemMgr::INIT); - //////////////////////////////////////////////////////////////////// - // Initialize the lighting subsystem. - //////////////////////////////////////////////////////////////////// - - globals->add_subsystem("lighting", new FGLight, SGSubsystemMgr::DISPLAY); - ////////////////////////////////////////////////////////////////////// // Initialize the 2D cloud subsystem. //////////////////////////////////////////////////////////////////// fgGetBool("/sim/rendering/bump-mapping", false); -#ifdef ENABLE_AUDIO_SUPPORT - //////////////////////////////////////////////////////////////////// - // Initialize the sound-effects subsystem. - //////////////////////////////////////////////////////////////////// - globals->add_subsystem("voice", new FGVoiceMgr, SGSubsystemMgr::DISPLAY); -#endif + //////////////////////////////////////////////////////////////////// - // Initialise the ATC Manager + // Initialise the ATC Manager //////////////////////////////////////////////////////////////////// -#if ENABLE_ATCDCL SG_LOG(SG_GENERAL, SG_INFO, " ATC Manager"); globals->set_ATC_mgr(new FGATCMgr); globals->get_ATC_mgr()->init(); //////////////////////////////////////////////////////////////////// - // Initialise the AI Manager + // Initialise the ATIS Manager //////////////////////////////////////////////////////////////////// + globals->add_subsystem("atis", new FGAtisManager, SGSubsystemMgr::POST_FDM); + - SG_LOG(SG_GENERAL, SG_INFO, " AI Manager"); - globals->set_AI_mgr(new FGAIMgr); - globals->get_AI_mgr()->init(); -#else //////////////////////////////////////////////////////////////////// - // Initialise the ATIS Manager + // Initialize multiplayer subsystem //////////////////////////////////////////////////////////////////// - globals->add_subsystem("atis", new FGAtisManager, SGSubsystemMgr::POST_FDM); -#endif + + globals->add_subsystem("mp", new FGMultiplayMgr, SGSubsystemMgr::POST_FDM); + //////////////////////////////////////////////////////////////////// // Initialise the AI Model Manager //////////////////////////////////////////////////////////////////// @@ -1443,33 +1415,24 @@ bool fgInitSubsystems() { // AI Traffic manager globals->add_subsystem("Traffic Manager", new FGTrafficManager, SGSubsystemMgr::POST_FDM); - - if( fgCockpitInit()) { - // Cockpit initialized ok. - } else { - SG_LOG( SG_GENERAL, SG_ALERT, "Error in Cockpit initialization!" ); - exit(-1); - } - - //////////////////////////////////////////////////////////////////// // Add a new 2D panel. //////////////////////////////////////////////////////////////////// - string panel_path = fgGetString("/sim/panel/path", - "Panels/Default/default.xml"); - - globals->set_current_panel( fgReadPanel(panel_path) ); - if (globals->get_current_panel() == 0) { + string panel_path(fgGetString("/sim/panel/path")); + if (!panel_path.empty()) { + FGPanel* p = fgReadPanel(panel_path); + if (p) { + globals->set_current_panel(p); + p->init(); + p->bind(); + SG_LOG( SG_INPUT, SG_INFO, "Loaded new panel from " << panel_path ); + } else { SG_LOG( SG_INPUT, SG_ALERT, "Error reading new panel from " << panel_path ); - } else { - SG_LOG( SG_INPUT, SG_INFO, "Loaded new panel from " << panel_path ); - globals->get_current_panel()->init(); - globals->get_current_panel()->bind(); + } } - //////////////////////////////////////////////////////////////////// // Initialize the controls subsystem. //////////////////////////////////////////////////////////////////// @@ -1490,20 +1453,43 @@ bool fgInitSubsystems() { //////////////////////////////////////////////////////////////////// globals->add_subsystem("replay", new FGReplay); +#ifdef ENABLE_AUDIO_SUPPORT + //////////////////////////////////////////////////////////////////// + // Initialize the sound-effects subsystem. + //////////////////////////////////////////////////////////////////// + globals->add_subsystem("voice", new FGVoiceMgr, SGSubsystemMgr::DISPLAY); +#endif //////////////////////////////////////////////////////////////////// - // Bind and initialize subsystems. + // Initialize the lighting subsystem. //////////////////////////////////////////////////////////////////// - globals->get_subsystem_mgr()->bind(); - globals->get_subsystem_mgr()->init(); + globals->add_subsystem("lighting", new FGLight, SGSubsystemMgr::DISPLAY); + + // 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); + FGViewMgr *viewmgr = new FGViewMgr; + globals->set_viewmgr( viewmgr ); + globals->add_subsystem("view-manager", viewmgr, SGSubsystemMgr::DISPLAY); + + globals->add_subsystem("tile-manager", globals->get_tile_mgr(), + SGSubsystemMgr::DISPLAY); + //////////////////////////////////////////////////////////////////// - // Initialize multiplayer subsystem + // Bind and initialize subsystems. //////////////////////////////////////////////////////////////////// - globals->set_multiplayer_mgr(new FGMultiplayMgr); - globals->get_multiplayer_mgr()->init(); + globals->get_subsystem_mgr()->bind(); + globals->get_subsystem_mgr()->init(); //////////////////////////////////////////////////////////////////////// // Initialize the Nasal interpreter. @@ -1520,6 +1506,8 @@ bool fgInitSubsystems() { // End of subsystem initialization. //////////////////////////////////////////////////////////////////// + fgSetBool("/sim/initialized", true); + SG_LOG( SG_GENERAL, SG_INFO, endl); // Save the initial state for future @@ -1529,28 +1517,35 @@ bool fgInitSubsystems() { return true; } - +// Reset: this is what the 'reset' command (and hence, GUI) is attached to void fgReInitSubsystems() { - // static const SGPropertyNode *longitude - // = fgGetNode("/sim/presets/longitude-deg"); - // static const SGPropertyNode *latitude - // = fgGetNode("/sim/presets/latitude-deg"); - static const SGPropertyNode *altitude - = fgGetNode("/sim/presets/altitude-ft"); static const SGPropertyNode *master_freeze = fgGetNode("/sim/freeze/master"); - SG_LOG( SG_GENERAL, SG_INFO, - "fgReInitSubsystems(): /position/altitude = " - << altitude->getDoubleValue() ); + SG_LOG( SG_GENERAL, SG_INFO, "fgReInitSubsystems()"); +// setup state to begin re-init bool freeze = master_freeze->getBoolValue(); if ( !freeze ) { fgSetBool("/sim/freeze/master", true); } + + fgSetBool("/sim/signals/reinit", true); fgSetBool("/sim/crashed", false); +// do actual re-init steps + globals->get_subsystem("flight")->unbind(); + + // reset control state, before restoring initial state; -set or config files + // may specify values for flaps, trim tabs, magnetos, etc + globals->get_controls()->reset_all(); + + globals->restoreInitialState(); + + // update our position based on current presets + fgInitPosition(); + // Force reupdating the positions of the ai 3d models. They are used for // initializing ground level for the FDM. globals->get_subsystem("ai_model")->reinit(); @@ -1558,15 +1553,16 @@ void fgReInitSubsystems() // Initialize the FDM globals->get_subsystem("flight")->reinit(); + // reset replay buffers + globals->get_subsystem("replay")->reinit(); + // reload offsets from config defaults globals->get_viewmgr()->reinit(); - fgInitView(); - - globals->get_controls()->reset_all(); - globals->get_subsystem("time")->reinit(); +// setup state to end re-init + fgSetBool("/sim/signals/reinit", false); if ( !freeze ) { fgSetBool("/sim/freeze/master", false); } @@ -1574,32 +1570,6 @@ void fgReInitSubsystems() } -void doSimulatorReset(void) // from gui_local.cxx -- TODO merge with fgReInitSubsystems() -{ - static SGPropertyNode_ptr master_freeze = fgGetNode("/sim/freeze/master", true); - - bool freeze = master_freeze->getBoolValue(); - if (!freeze) - master_freeze->setBoolValue(true); - - fgSetBool("/sim/signals/reinit", true); - - globals->get_subsystem("flight")->unbind(); - - globals->restoreInitialState(); - - // update our position based on current presets - fgInitPosition(); - - fgReInitSubsystems(); - - globals->get_tile_mgr()->update(fgGetDouble("/environment/visibility-m")); - fgSetBool("/sim/signals/reinit", false); - - if (!freeze) - master_freeze->setBoolValue(false); -} - /////////////////////////////////////////////////////////////////////////////// // helper object to implement the --show-aircraft command. // resides here so we can share the fgFindAircraftInDir template above, @@ -1632,7 +1602,7 @@ private: SGPropertyNode root; try { readProperties(path.str(), &root); - } catch (sg_exception& e) { + } catch (sg_exception& ) { return false; }