# define _G_NO_EXTERN_TEMPLATES
#endif
-#include <string.h>
+#include <string>
#include <Include/fg_constants.h>
#include <Include/general.h>
-#include <Aircraft/aircraft.h>
+#include <Aircraft/aircraft.hxx>
#include <Airports/simple.hxx>
-#include <Astro/moon.hxx>
-#include <Astro/planets.hxx>
#include <Astro/sky.hxx>
#include <Astro/stars.hxx>
-#include <Astro/sun.hxx>
-#include <Autopilot/autopilot.h>
+#include <Astro/solarsystem.hxx>
+#include <Autopilot/autopilot.hxx>
#include <Cockpit/cockpit.hxx>
-#include <Debug/fg_debug.h>
-#include <Joystick/joystick.h>
-#include <Math/fg_geodesy.h>
+// #include <Debug/fg_debug.h>
+#include <Debug/logstream.hxx>
+#include <Joystick/joystick.hxx>
+#include <Math/fg_geodesy.hxx>
#include <Math/fg_random.h>
+#include <Math/point3d.hxx>
#include <Math/polar3d.hxx>
#include <Scenery/scenery.hxx>
#include <Scenery/tilemgr.hxx>
#include <Time/fg_time.hxx>
#include <Time/light.hxx>
#include <Time/sunpos.hxx>
-#include <Weather/weather.h>
+#include <Weather/weather.hxx>
#include "fg_init.hxx"
#include "options.hxx"
// Set initial position and orientation
int fgInitPosition( void ) {
- char id[5];
- fgFLIGHT *f;
+ string id;
+ FGState *f;
- f = current_aircraft.flight;
+ f = current_aircraft.fdm_state;
- current_options.get_airport_id(id);
- if ( strlen(id) ) {
+ id = current_options.get_airport_id();
+ if ( id.length() ) {
// set initial position from airport id
fgAIRPORTS airports;
fgAIRPORT a;
- fgPrintf( FG_GENERAL, FG_INFO,
- "Attempting to set starting position from airport code %s.\n",
- id);
-
- airports.load("Airports");
- a = airports.search(id);
- if ( (fabs(a.longitude) < FG_EPSILON) &&
- (fabs(a.latitude) < FG_EPSILON) &&
- (fabs(a.elevation) < FG_EPSILON) ) {
- fgPrintf( FG_GENERAL, FG_EXIT,
- "Failed to find %s in database.\n", id);
+ FG_LOG( FG_GENERAL, FG_INFO,
+ "Attempting to set starting position from airport code "
+ << id );
+
+ airports.load("apt_simple");
+ if ( ! airports.search( id, &a ) ) {
+ FG_LOG( FG_GENERAL, FG_ALERT,
+ "Failed to find " << id << " in database." );
+ exit(-1);
} else {
- FG_Longitude = ( a.longitude ) * DEG_TO_RAD;
- FG_Latitude = ( a.latitude ) * DEG_TO_RAD;
+ f->set_Longitude( a.longitude * DEG_TO_RAD );
+ f->set_Latitude( a.latitude * DEG_TO_RAD );
}
} else {
// set initial position from default or command line coordinates
- FG_Longitude = current_options.get_lon() * DEG_TO_RAD;
- FG_Latitude = current_options.get_lat() * DEG_TO_RAD;
+ f->set_Longitude( current_options.get_lon() * DEG_TO_RAD );
+ f->set_Latitude( current_options.get_lat() * DEG_TO_RAD );
}
-
- printf("starting altitude is = %.2f\n", current_options.get_altitude());
+ FG_LOG( FG_GENERAL, FG_INFO,
+ "starting altitude is = " << current_options.get_altitude() );
- FG_Altitude = current_options.get_altitude() * METER_TO_FEET;
- FG_Runway_altitude = FG_Altitude - 3.758099;
+ f->set_Altitude( current_options.get_altitude() * METER_TO_FEET );
+ f->set_Runway_altitude( f->get_Altitude() - 3.758099 );
- fgPrintf( FG_GENERAL, FG_INFO,
- "Initial position is: (%.4f, %.4f, %.2f)\n",
- FG_Longitude * RAD_TO_DEG, FG_Latitude * RAD_TO_DEG,
- FG_Altitude * FEET_TO_METER);
+ FG_LOG( FG_GENERAL, FG_INFO,
+ "Initial position is: ("
+ << (f->get_Longitude() * RAD_TO_DEG) << ", "
+ << (f->get_Latitude() * RAD_TO_DEG) << ", "
+ << (f->get_Altitude() * FEET_TO_METER) << ")" );
return(1);
}
// General house keeping initializations
int fgInitGeneral( void ) {
- fgGENERAL *g;
- char root[256];
+ string root;
int i;
- g = &general;
-
- fgPrintf( FG_GENERAL, FG_INFO, "General Initialization\n" );
- fgPrintf( FG_GENERAL, FG_INFO, "======= ==============\n" );
+ FG_LOG( FG_GENERAL, FG_INFO, "General Initialization" );
+ FG_LOG( FG_GENERAL, FG_INFO, "======= ==============" );
- g->glVendor = (char *)glGetString ( GL_VENDOR );
- g->glRenderer = (char *)glGetString ( GL_RENDERER );
- g->glVersion = (char *)glGetString ( GL_VERSION );
-
- current_options.get_fg_root(root);
- if ( !strlen(root) ) {
+ root = current_options.get_fg_root();
+ if ( ! root.length() ) {
// No root path set? Then bail ...
- fgPrintf( FG_GENERAL, FG_EXIT, "%s %s\n",
- "Cannot continue without environment variable FG_ROOT",
- "being defined.");
+ FG_LOG( FG_GENERAL, FG_ALERT,
+ "Cannot continue without environment variable FG_ROOT"
+ << "being defined." );
+ exit(-1);
}
- fgPrintf( FG_GENERAL, FG_INFO, "FG_ROOT = %s\n\n", root);
+ FG_LOG( FG_GENERAL, FG_INFO, "FG_ROOT = " << root << endl );
// prime the frame rate counter pump
for ( i = 0; i < FG_FRAME_RATE_HISTORY; i++ ) {
- g->frames[i] = 0.0;
+ general.frames[i] = 0.0;
}
return ( 1 );
}
-// convert a geodetic point lon(radians), lat(radians), elev(meter) to
-// a cartesian point
-fgPoint3d geod_to_cart(double geod[3]) {
- fgPoint3d cp;
- fgPoint3d pp;
- double gc_lon, gc_lat, sl_radius;
-
- // printf("A geodetic point is (%.2f, %.2f, %.2f)\n",
- // geod[0], geod[1], geod[2]);
-
- gc_lon = geod[0];
- fgGeodToGeoc(geod[1], geod[2], &sl_radius, &gc_lat);
-
- // printf("A geocentric point is (%.2f, %.2f, %.2f)\n", gc_lon,
- // gc_lat, sl_radius+geod[2]);
-
- pp.lon = gc_lon;
- pp.lat = gc_lat;
- pp.radius = sl_radius + geod[2];
- cp = fgPolarToCart3d(pp);
-
- // printf("A cart point is (%.8f, %.8f, %.8f)\n", cp.x, cp.y, cp.z);
-
- return(cp);
-}
-
-
// 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.
// Returns non-zero if a problem encountered.
-int fgInitSubsystems( void ) {
- fgFLIGHT *f;
+int fgInitSubsystems( void )
+{
+ FGState *f;
fgLIGHT *l;
fgTIME *t;
fgVIEW *v;
- double geod_pos[3];
- fgPoint3d abs_view_pos;
+ Point3D geod_pos, abs_view_pos;
l = &cur_light_params;
t = &cur_time_params;
v = ¤t_view;
- fgPrintf( FG_GENERAL, FG_INFO, "Initialize Subsystems\n");
- fgPrintf( FG_GENERAL, FG_INFO, "========== ==========\n");
+ FG_LOG( FG_GENERAL, FG_INFO, "Initialize Subsystems");
+ FG_LOG( FG_GENERAL, FG_INFO, "========== ==========");
// seed the random number generater
fg_srandom();
// 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.
- f = current_aircraft.flight;
+ f = current_aircraft.fdm_state;
// set the initial position
fgInitPosition();
if ( fgSceneryInit() ) {
// Scenery initialized ok.
} else {
- fgPrintf( FG_GENERAL, FG_EXIT, "Error in Scenery initialization!\n" );
+ FG_LOG( FG_GENERAL, FG_ALERT, "Error in Scenery initialization!" );
+ exit(-1);
}
if( fgTileMgrInit() ) {
// Load the local scenery data
fgTileMgrUpdate();
} else {
- fgPrintf( FG_GENERAL, FG_EXIT,
- "Error in Tile Manager initialization!\n" );
+ FG_LOG( FG_GENERAL, FG_ALERT, "Error in Tile Manager initialization!" );
+ exit(-1);
}
+ // Calculate ground elevation at starting point (we didn't have
+ // abs_view_pos calculated when fgTileMgrUpdate() was called above
+
// calculalate a cartesian point somewhere along the line between
- // the center of the earth and our view position
- geod_pos[0] = FG_Longitude;
- geod_pos[1] = FG_Latitude;
- // doesn't have to be the exact elevation (this is good because we
- // don't know it yet :-)
- geod_pos[2] = 0;
- abs_view_pos = geod_to_cart(geod_pos);
-
- // Calculate ground elevation at starting point
+ // the center of the earth and our view position. Doesn't have to
+ // be the exact elevation (this is good because we don't know it
+ // yet :-)
+ geod_pos = Point3D( f->get_Longitude(), f->get_Latitude(), 0.0);
+ abs_view_pos = fgGeodToCart(geod_pos);
+
+ FG_LOG( FG_GENERAL, FG_DEBUG,
+ "Altitude before update " << scenery.cur_elev );
scenery.cur_elev =
- fgTileMgrCurElev( FG_Longitude, FG_Latitude, &abs_view_pos );
- FG_Runway_altitude = scenery.cur_elev * METER_TO_FEET;
+ fgTileMgrCurElevOLD( f->get_Longitude(),
+ f->get_Latitude(),
+ abs_view_pos );
+ FG_LOG( FG_GENERAL, FG_DEBUG,
+ "Altitude after update " << scenery.cur_elev );
+ f->set_Runway_altitude( scenery.cur_elev * METER_TO_FEET );
// Reset our altitude if we are below ground
- if ( FG_Altitude < FG_Runway_altitude + 3.758099) {
- FG_Altitude = FG_Runway_altitude + 3.758099;
+ if ( f->get_Altitude() < f->get_Runway_altitude() + 3.758099) {
+ f->set_Altitude( f->get_Runway_altitude() + 3.758099 );
}
- fgPrintf( FG_GENERAL, FG_INFO,
- "Updated position (after elevation adj): (%.4f, %.4f, %.2f)\n",
- FG_Latitude * RAD_TO_DEG, FG_Longitude * RAD_TO_DEG,
- FG_Altitude * FEET_TO_METER);
+ FG_LOG( FG_GENERAL, FG_INFO,
+ "Updated position (after elevation adj): ("
+ << (f->get_Latitude() * RAD_TO_DEG) << ", "
+ << (f->get_Longitude() * RAD_TO_DEG) << ", "
+ << (f->get_Altitude() * FEET_TO_METER) << ")" );
// end of thing that I just stuck in that I should probably move
// The following section sets up the flight model EOM parameters
// and should really be read in from one or more files.
// Initial Velocity
- FG_V_north = 0.0; // 7.287719E+00
- FG_V_east = 0.0; // 1.521770E+03
- FG_V_down = 0.0; // -1.265722E-05
+ f->set_Velocities_Local( 0.0, 0.0, 0.0 );
// Initial Orientation
- FG_Phi = current_options.get_roll() * DEG_TO_RAD;
- FG_Theta = current_options.get_pitch() * DEG_TO_RAD;
- FG_Psi = current_options.get_heading() * DEG_TO_RAD;
+ f->set_Euler_Angles( current_options.get_roll() * DEG_TO_RAD,
+ current_options.get_pitch() * DEG_TO_RAD,
+ current_options.get_heading() * DEG_TO_RAD );
- // Initial Angular B rates
- FG_P_body = 7.206685E-05;
- FG_Q_body = 0.000000E+00;
- FG_R_body = 9.492658E-05;
+ // Initial Angular Body rates
+ f->set_Omega_Body( 7.206685E-05, 0.0, 9.492658E-05 );
- FG_Earth_position_angle = 0.000000E+00;
+ f->set_Earth_position_angle( 0.0 );
// Mass properties and geometry values
- FG_Mass = 8.547270E+01;
- FG_I_xx = 1.048000E+03;
- FG_I_yy = 3.000000E+03;
- FG_I_zz = 3.530000E+03;
- FG_I_xz = 0.000000E+00;
+ f->set_Inertias( 8.547270E+01,
+ 1.048000E+03, 3.000000E+03, 3.530000E+03, 0.000000E+00 );
// CG position w.r.t. ref. point
- FG_Dx_cg = 0.000000E+00;
- FG_Dy_cg = 0.000000E+00;
- FG_Dz_cg = 0.000000E+00;
+ f->set_CG_Position( 0.0, 0.0, 0.0 );
// Initialize the event manager
global_events.Init();
// Output event stats every 60 seconds
- global_events.Register( "fgEventPrintStats()", fgEventPrintStats,
- FG_EVENT_READY, 60000 );
+ global_events.Register( "fgEVENT_MGR::PrintStats()",
+ fgMethodCallback<fgEVENT_MGR>( &global_events,
+ &fgEVENT_MGR::PrintStats),
+ fgEVENT::FG_EVENT_READY, 60000 );
// Initialize the time dependent variables
fgTimeInit(t);
fgTimeUpdate(f, t);
// Initialize view parameters
+ FG_LOG( FG_GENERAL, FG_DEBUG, "Before v->init()");
v->Init();
+ FG_LOG( FG_GENERAL, FG_DEBUG, "After v->init()");
v->UpdateViewMath(f);
+ FG_LOG( FG_GENERAL, FG_DEBUG, " abs_view_pos = " << v->abs_view_pos );
v->UpdateWorldToEye(f);
- // Initialize the orbital elements of sun, moon and mayor planets
- fgSolarSystemInit(*t);
+ // Build the solar system
+ //fgSolarSystemInit(*t);
+ FG_LOG(FG_GENERAL, FG_INFO, "Building SolarSystem");
+ SolarSystem::theSolarSystem = new SolarSystem(t);
// Initialize the Stars subsystem
if( fgStarsInit() ) {
// Stars initialized ok.
} else {
- fgPrintf( FG_GENERAL, FG_EXIT, "Error in Stars initialization!\n" );
+ FG_LOG( FG_GENERAL, FG_ALERT, "Error in Stars initialization!" );
+ exit(-1);
}
// Initialize the planetary subsystem
- global_events.Register( "fgPlanetsInit()", fgPlanetsInit,
- FG_EVENT_READY, 600000);
+ // global_events.Register( "fgPlanetsInit()", fgPlanetsInit,
+ // fgEVENT::FG_EVENT_READY, 600000);
// Initialize the sun's position
- global_events.Register( "fgSunInit()", fgSunInit,
- FG_EVENT_READY, 30000 );
+ // global_events.Register( "fgSunInit()", fgSunInit,
+ // fgEVENT::FG_EVENT_READY, 30000 );
// Intialize the moon's position
- global_events.Register( "fgMoonInit()", fgMoonInit,
- FG_EVENT_READY, 600000 );
+ // global_events.Register( "fgMoonInit()", fgMoonInit,
+ // fgEVENT::FG_EVENT_READY, 600000 );
+ // register the periodic update of Sun, moon, and planets
+ global_events.Register( "ssolsysUpdate", solarSystemRebuild,
+ fgEVENT::FG_EVENT_READY, 600000);
+
// fgUpdateSunPos() needs a few position and view parameters set
// so it can calculate local relative sun angle and a few other
// things for correctly orienting the sky.
fgUpdateSunPos();
+ global_events.Register( "fgUpdateSunPos()", fgUpdateSunPos,
+ fgEVENT::FG_EVENT_READY, 60000);
// Initialize Lighting interpolation tables
l->Init();
// update the lighting parameters (based on sun angle)
- global_events.Register( "fgLightUpdate()", fgLightUpdate,
- FG_EVENT_READY, 30000 );
+ global_events.Register( "fgLight::Update()",
+ fgMethodCallback<fgLIGHT>( &cur_light_params,
+ &fgLIGHT::Update),
+ fgEVENT::FG_EVENT_READY, 30000 );
// Initialize the weather modeling subsystem
fgWeatherInit();
- // update the weather for our current position
- global_events.Register( "fgWeatherUpdate()", fgWeatherUpdate,
- FG_EVENT_READY, 120000 );
-
// Initialize the Cockpit subsystem
if( fgCockpitInit( ¤t_aircraft )) {
// Cockpit initialized ok.
} else {
- fgPrintf( FG_GENERAL, FG_EXIT, "Error in Cockpit initialization!\n" );
+ FG_LOG( FG_GENERAL, FG_ALERT, "Error in Cockpit initialization!" );
+ exit(-1);
}
// Initialize the "sky"
// Initialize the flight model subsystem data structures base on
// above values
- fgFlightModelInit( current_options.get_flight_model(), f,
+ fgFlightModelInit( current_options.get_flight_model(), cur_fdm_state,
1.0 / DEFAULT_MODEL_HZ );
// I'm just sticking this here for now, it should probably move
// eventually
- scenery.cur_elev = FG_Runway_altitude * FEET_TO_METER;
+ scenery.cur_elev = f->get_Runway_altitude() * FEET_TO_METER;
- if ( FG_Altitude < FG_Runway_altitude + 3.758099) {
- FG_Altitude = FG_Runway_altitude + 3.758099;
+ if ( f->get_Altitude() < f->get_Runway_altitude() + 3.758099) {
+ f->set_Altitude( f->get_Runway_altitude() + 3.758099 );
}
- fgPrintf( FG_GENERAL, FG_INFO,
- "Updated position (after elevation adj): (%.4f, %.4f, %.2f)\n",
- FG_Latitude * RAD_TO_DEG, FG_Longitude * RAD_TO_DEG,
- FG_Altitude * FEET_TO_METER);
+ FG_LOG( FG_GENERAL, FG_INFO,
+ "Updated position (after elevation adj): ("
+ << (f->get_Latitude() * RAD_TO_DEG) << ", "
+ << (f->get_Longitude() * RAD_TO_DEG) << ", "
+ << (f->get_Altitude() * FEET_TO_METER) << ")" );
// end of thing that I just stuck in that I should probably move
// Joystick support
- if (fgJoystickInit(0) ) {
+ if ( fgJoystickInit() ) {
// Joystick initialized ok.
} else {
- fgPrintf( FG_GENERAL, FG_EXIT, "Error in Joystick initialization!\n" );
+ FG_LOG( FG_GENERAL, FG_ALERT, "Error in Joystick initialization!" );
}
// Autopilot init added here, by Jeff Goeke-Smith
fgAPInit(¤t_aircraft);
-
- fgPrintf(FG_GENERAL, FG_INFO,"\n");
+
+ // Initialize serial ports
+ fgSerialInit();
+
+ FG_LOG( FG_GENERAL, FG_INFO, endl);
return(1);
}
// $Log$
+// Revision 1.55 1998/12/05 15:54:20 curt
+// Renamed class fgFLIGHT to class FGState as per request by JSB.
+//
+// Revision 1.54 1998/12/05 14:19:53 curt
+// Looking into a problem with cur_view_params.abs_view_pos initialization.
+//
+// Revision 1.53 1998/12/03 04:25:05 curt
+// Working on fixing up new fgFLIGHT class.
+//
+// Revision 1.52 1998/12/03 01:17:17 curt
+// Converted fgFLIGHT to a class.
+//
+// Revision 1.51 1998/11/20 01:02:37 curt
+// Try to detect Mesa/Glide/Voodoo and chose the appropriate resolution.
+//
+// Revision 1.50 1998/11/16 14:00:01 curt
+// Added pow() macro bug work around.
+// Added support for starting FGFS at various resolutions.
+// Added some initial serial port support.
+// Specify default log levels in main().
+//
+// Revision 1.49 1998/11/11 00:24:02 curt
+// Added Michael Johnson's audio patches for testing.
+// Also did a few tweaks to avoid numerical problems when starting at a place
+// with no (or bogus) scenery.
+//
+// Revision 1.48 1998/11/07 19:07:10 curt
+// Enable release builds using the --without-logging option to the configure
+// script. Also a couple log message cleanups, plus some C to C++ comment
+// conversion.
+//
+// Revision 1.47 1998/11/06 21:18:10 curt
+// Converted to new logstream debugging facility. This allows release
+// builds with no messages at all (and no performance impact) by using
+// the -DFG_NDEBUG flag.
+//
+// Revision 1.46 1998/10/27 02:14:38 curt
+// Changes to support GLUT joystick routines as fall back.
+//
+// Revision 1.45 1998/10/25 10:57:21 curt
+// Changes to use the new joystick library if it is available.
+//
+// Revision 1.44 1998/10/18 01:17:17 curt
+// Point3D tweaks.
+//
+// Revision 1.43 1998/10/17 01:34:22 curt
+// C++ ifying ...
+//
+// Revision 1.42 1998/10/16 23:27:54 curt
+// C++-ifying.
+//
+// Revision 1.41 1998/10/16 00:54:01 curt
+// Converted to Point3D class.
+//
+// Revision 1.40 1998/10/02 12:46:49 curt
+// Added an "auto throttle"
+//
+// Revision 1.39 1998/09/29 02:03:39 curt
+// Autopilot mods.
+//
+// Revision 1.38 1998/09/15 04:27:30 curt
+// Changes for new Astro code.
+//
+// Revision 1.37 1998/09/15 02:09:26 curt
+// Include/fg_callback.hxx
+// Moved code inline to stop g++ 2.7 from complaining.
+//
+// Simulator/Time/event.[ch]xx
+// Changed return type of fgEVENT::printStat(). void caused g++ 2.7 to
+// complain bitterly.
+//
+// Minor bugfix and changes.
+//
+// Simulator/Main/GLUTmain.cxx
+// Added missing type to idle_state definition - eliminates a warning.
+//
+// Simulator/Main/fg_init.cxx
+// Changes to airport lookup.
+//
+// Simulator/Main/options.cxx
+// Uses fg_gzifstream when loading config file.
+//
+// Revision 1.36 1998/09/08 21:40:08 curt
+// Fixes by Charlie Hotchkiss.
+//
+// Revision 1.35 1998/08/29 13:09:26 curt
+// Changes to event manager from Bernie Bright.
+//
+// Revision 1.34 1998/08/27 17:02:06 curt
+// Contributions from Bernie Bright <bbright@c031.aone.net.au>
+// - use strings for fg_root and airport_id and added methods to return
+// them as strings,
+// - inlined all access methods,
+// - made the parsing functions private methods,
+// - deleted some unused functions.
+// - propogated some of these changes out a bit further.
+//
+// Revision 1.33 1998/08/25 20:53:32 curt
+// Shuffled $FG_ROOT file layout.
+//
// Revision 1.32 1998/08/25 16:59:09 curt
// Directory reshuffling.
//