#include <simgear/math/sg_geodesy.hxx>
#include <simgear/misc/sg_path.hxx>
#include <simgear/timing/sg_time.hxx>
+#include <simgear/timing/lowleveltime.h>
#include <Aircraft/aircraft.hxx>
#include <FDM/UIUCModel/uiuc_aircraftdir.h>
#include <Airports/runways.hxx>
#include <Airports/simple.hxx>
#include <ATC/ATCdisplay.hxx>
+#include <ATC/ATCmgr.hxx>
+#include <ATC/atislist.hxx>
#include <Autopilot/auto_gui.hxx>
#include <Autopilot/newauto.hxx>
#include <Cockpit/cockpit.hxx>
#include <FDM/ADA.hxx>
#include <FDM/Balloon.h>
#include <FDM/External.hxx>
-#include <FDM/JSBSim.hxx>
+#include <FDM/JSBSim/JSBSim.hxx>
#include <FDM/LaRCsim.hxx>
#include <FDM/MagicCarpet.hxx>
#include <FDM/NullFDM.hxx>
#include <Time/moonpos.hxx>
#include <Time/tmp.hxx>
-#ifndef FG_OLD_WEATHER
+#ifndef FG_NEW_ENVIRONMENT
# include <WeatherCM/FGLocalWeatherDatabase.h>
#else
-# include <Weather/weather.hxx>
+# include <Environment/environment_mgr.hxx>
#endif
#include "fg_init.hxx"
return true;
}
+void fgSetPosFromGlideSlope(void) {
+ double gs = fgGetDouble("/velocities/glideslope");
+ double od = fgGetDouble("/sim/startup/offset-distance");
+ double alt = fgGetDouble("/position/altitude-ft");
+
+ //if glideslope and offset-distance are set and altitude is
+ //not, calculate the initial altitude
+ if( fabs(gs) > 0.01 && fabs(od) > 0.1 && alt < -9990 ) {
+ od *= SG_NM_TO_METER * SG_METER_TO_FEET;
+ alt = fabs(od*tan(gs));
+ fgSetDouble("/position/altitude-ft",alt);
+ fgSetBool("/sim/startup/onground", false);
+ SG_LOG(SG_GENERAL,SG_INFO, "Calculated altitude as: " << alt << " ft");
+ } else if( fabs(gs) > 0.01 && alt > 0 && fabs(od) < 0.1) {
+ od = alt/tan(gs);
+ od *= -1*SG_FEET_TO_METER * SG_METER_TO_NM;
+ fgSetDouble("/sim/startup/offset-distance",od);
+ SG_LOG(SG_GENERAL,SG_INFO, "Calculated offset distance as: "
+ << od << " nm");
+ } else if( fabs(gs) > 0.01 ) {
+ SG_LOG(SG_GENERAL,SG_ALERT, "Glideslope given but not altitude"
+ << " or offset-distance. Resetting"
+ << " glideslope to zero" );
+ fgSetDouble("/velocities/glideslope",0);
+ }
+
+}
// General house keeping initializations
bool fgInitGeneral( void ) {
}
+SGTime *fgInitTime() {
+ // Initialize time
+ 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);
+
+ SGPath zone( globals->get_fg_root() );
+ zone.append( "Timezone" );
+ SGTime *t = new SGTime( longitude->getDoubleValue()
+ * SGD_DEGREES_TO_RADIANS,
+ latitude->getDoubleValue()
+ * SGD_DEGREES_TO_RADIANS,
+ zone.str(),
+ cur_time_override->getLongValue() );
+
+ // Handle potential user specified time offsets
+ time_t cur_time = t->get_cur_time();
+ time_t currGMT = sgTimeGetGMT( gmtime(&cur_time) );
+ time_t systemLocalTime = sgTimeGetGMT( localtime(&cur_time) );
+ time_t aircraftLocalTime =
+ sgTimeGetGMT( fgLocaltime(&cur_time, t->get_zonename() ) );
+
+ // Okay, we now have six possible scenarios
+ int offset = fgGetInt("/sim/startup/time-offset");
+ const string &offset_type = fgGetString("/sim/startup/time-offset-type");
+ if (offset_type == "system-offset") {
+ globals->set_warp( offset );
+ } else if (offset_type == "gmt-offset") {
+ globals->set_warp( offset - (currGMT - systemLocalTime) );
+ } else if (offset_type == "latitude-offset") {
+ globals->set_warp( offset - (aircraftLocalTime - systemLocalTime) );
+ } else if (offset_type == "system") {
+ globals->set_warp( offset - cur_time );
+ } else if (offset_type == "gmt") {
+ globals->set_warp( offset - currGMT );
+ } else if (offset_type == "latitude") {
+ globals->set_warp( offset - (aircraftLocalTime - systemLocalTime) -
+ cur_time );
+ } else {
+ SG_LOG( SG_GENERAL, SG_ALERT,
+ "FG_TIME::Unsupported offset type " << offset_type );
+ exit( -1 );
+ }
+
+ SG_LOG( SG_GENERAL, SG_INFO, "After time init, warp = "
+ << globals->get_warp() );
+
+ globals->set_warp_delta( 0 );
+
+ t->update( 0.0, 0.0,
+ cur_time_override->getLongValue(),
+ globals->get_warp() );
+
+ return t;
+}
+
+
// 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.
if ( global_tile_mgr.init() ) {
// Load the local scenery data
- global_tile_mgr.update( fgGetDouble("/position/longitude-deg"),
- fgGetDouble("/position/latitude-deg") );
+ global_tile_mgr.update( longitude->getDoubleValue(),
+ latitude->getDoubleValue() );
} else {
SG_LOG( SG_GENERAL, SG_ALERT, "Error in Tile Manager initialization!" );
exit(-1);
////////////////////////////////////////////////////////////////////
// Initialize the weather modeling subsystem
-#ifndef FG_OLD_WEATHER
+#ifndef FG_NEW_ENVIRONMENT
// Initialize the WeatherDatabase
SG_LOG(SG_GENERAL, SG_INFO, "Creating LocalWeatherDatabase");
sgVec3 position;
global_events.Register( "weather update", fgUpdateWeatherDatabase,
fgEVENT::FG_EVENT_READY, 30000);
#else
- current_weather.Init();
+ globals->get_environment_mgr()->init();
+ globals->get_environment_mgr()->bind();
#endif
////////////////////////////////////////////////////////////////////
// Initialize ATC list management and query systems
////////////////////////////////////////////////////////////////////
- //DCL
SG_LOG(SG_GENERAL, SG_INFO, " ATIS");
current_atislist = new FGATISList;
SGPath p_atis( globals->get_fg_root() );
// Initialise ATC display system
////////////////////////////////////////////////////////////////////
- //DCL
SG_LOG(SG_GENERAL, SG_INFO, " ATC Display");
- current_atcdisplay = new FGATCDisplay;
- current_atcdisplay->init();
+ globals->set_ATC_display(new FGATCDisplay);
+ globals->get_ATC_display()->init();
+
+ ////////////////////////////////////////////////////////////////////
+ // Initialise the ATC Manager
+ ////////////////////////////////////////////////////////////////////
+
+ SG_LOG(SG_GENERAL, SG_INFO, " ATC Manager");
+ globals->set_ATC_mgr(new FGATCMgr);
+ globals->get_ATC_mgr()->init();
////////////////////////////////////////////////////////////////////
// Initialize the built-in commands.
#endif
fgInitFDM();
+
+ // allocates structures so must happen before any of the flight
+ // model or control parameters are set
+ fgAircraftInit(); // In the future this might not be the case.
fgInitView();