]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/bfi.cxx
Moved sky code over to simgear.
[flightgear.git] / src / Main / bfi.cxx
index 229676e772f873fb5019b8644f3406c2fce13215..cdc577cbed52b30e99fdb1f6f6407d299e52f401 100644 (file)
@@ -34,6 +34,7 @@
 #include <simgear/constants.h>
 #include <simgear/debug/logstream.hxx>
 #include <simgear/math/fg_types.hxx>
+#include <simgear/misc/props.hxx>
 
 #include <Aircraft/aircraft.hxx>
 #include <FDM/UIUCModel/uiuc_aircraftdir.h>
 #include <Scenery/scenery.hxx>
 #include <Time/fg_time.hxx>
 #include <Time/light.hxx>
+#include <Time/event.hxx>
+#include <Time/sunpos.hxx>
 #include <Cockpit/radiostack.hxx>
+#include <Ephemeris/ephemeris.hxx>
 #ifndef FG_OLD_WEATHER
 #  include <WeatherCM/FGLocalWeatherDatabase.h>
 #else
 
 FG_USING_NAMESPACE(std);
 
-                               // FIXME: these are not part of the
-                               // published interface!!!
-// extern fgAPDataPtr APDataGlobal;
-// extern void fgAPAltitudeSet (double new_altitude);
-// extern void fgAPHeadingSet (double new_heading);
-
 
 #include "bfi.hxx"
 
@@ -79,6 +77,131 @@ bool FGBFI::_needReinit = false;
 ////////////////////////////////////////////////////////////////////////
 
 
+/**
+ * Initialize the BFI by binding its functions to properties.
+ *
+ * TODO: perhaps these should migrate into the individual modules
+ * (i.e. they should register themselves).
+ */
+void
+FGBFI::init ()
+{
+  FG_LOG(FG_GENERAL, FG_INFO, "Starting BFI init");
+                               // Simulation
+  current_properties.tieInt("/sim/flight-model",
+                           getFlightModel, setFlightModel);
+//   current_properties.tieString("/sim/aircraft",
+//                            getAircraft, setAircraft);
+  // TODO: timeGMT
+  current_properties.tieBool("/sim/hud/visibility",
+                            getHUDVisible, setHUDVisible);
+  current_properties.tieBool("/sim/panel/visibility",
+                            getPanelVisible, setPanelVisible);
+
+                               // Position
+  current_properties.tieDouble("/position/latitude",
+                               getLatitude, setLatitude);
+  current_properties.tieDouble("/position/longitude",
+                              getLongitude, setLongitude);
+  current_properties.tieDouble("/position/altitude",
+                              getAltitude, setAltitude);
+  current_properties.tieDouble("/position/altitude-agl",
+                              getAGL, 0);
+
+                               // Orientation
+  current_properties.tieDouble("/orientation/heading",
+                              getHeading, setHeading);
+  current_properties.tieDouble("/orientation/heading-magnetic",
+                              getHeadingMag, 0);
+  current_properties.tieDouble("/orientation/pitch",
+                              getPitch, setPitch);
+  current_properties.tieDouble("/orientation/roll",
+                              getRoll, setRoll);
+
+                               // Velocities
+  current_properties.tieDouble("/velocities/airspeed",
+                              getAirspeed, 0);
+  current_properties.tieDouble("/velocities/side-slip",
+                              getSideSlip, 0);
+  current_properties.tieDouble("/velocities/vertical-speed",
+                              getVerticalSpeed, 0);
+  current_properties.tieDouble("/velocities/speed-north",
+                              getSpeedNorth, setSpeedNorth);
+  current_properties.tieDouble("/velocities/speed-east",
+                              getSpeedEast, setSpeedEast);
+  current_properties.tieDouble("/velocities/speed-down",
+                              getSpeedDown, setSpeedDown);
+
+                               // Controls
+  current_properties.tieDouble("/controls/throttle",
+                              getThrottle, setThrottle);
+  current_properties.tieDouble("/controls/flaps",
+                              getFlaps, setFlaps);
+  current_properties.tieDouble("/controls/aileron",
+                              getAileron, setAileron);
+  current_properties.tieDouble("/controls/rudder",
+                              getRudder, setRudder);
+  current_properties.tieDouble("/controls/elevator",
+                              getElevator, setElevator);
+  current_properties.tieDouble("/controls/elevator-trim",
+                              getElevatorTrim, setElevatorTrim);
+  current_properties.tieDouble("/controls/brake",
+                              getBrake, setBrake);
+
+                               // Autopilot
+  current_properties.tieBool("/autopilot/locks/altitude",
+                            getAPAltitudeLock, setAPAltitudeLock);
+  current_properties.tieDouble("/autopilot/settings/altitude",
+                              getAPAltitude, setAPAltitude);
+  current_properties.tieBool("/autopilot/locks/heading",
+                            getAPHeadingLock, setAPHeadingLock);
+  current_properties.tieDouble("/autopilot/settings/heading-magnetic",
+                              getAPHeadingMag, setAPHeadingMag);
+  current_properties.tieBool("/autopilot/locks/nav1",
+                            getAPNAV1Lock, setAPNAV1Lock);
+
+                               // Radio navigation
+  current_properties.tieDouble("/radios/nav1/frequencies/selected",
+                              getNAV1Freq, setNAV1Freq);
+  current_properties.tieDouble("/radios/nav1/frequencies/standby",
+                              getNAV1AltFreq, setNAV1AltFreq);
+  current_properties.tieDouble("/radios/nav1/radials/actual",
+                              getNAV1Radial, 0);
+  current_properties.tieDouble("/radios/nav1/radials/selected",
+                              getNAV1SelRadial, setNAV1SelRadial);
+  current_properties.tieDouble("/radios/nav1/dme/distance",
+                              getNAV1DistDME, 0);
+  current_properties.tieBool("/radios/nav1/in-range",
+                            getNAV1InRange, 0);
+  current_properties.tieBool("/radios/nav1/dme/in-range",
+                            getNAV1DMEInRange, 0);
+                              
+  current_properties.tieDouble("/radios/nav2/frequencies/selected",
+                              getNAV2Freq, setNAV2Freq);
+  current_properties.tieDouble("/radios/nav2/frequencies/standby",
+                              getNAV2AltFreq, setNAV2AltFreq);
+  current_properties.tieDouble("/radios/nav2/radials/actual",
+                              getNAV2Radial, 0);
+  current_properties.tieDouble("/radios/nav2/radials/selected",
+                              getNAV2SelRadial, setNAV2SelRadial);
+  current_properties.tieDouble("/radios/nav2/dme/distance",
+                              getNAV2DistDME, 0);
+  current_properties.tieBool("/radios/nav2/in-range",
+                            getNAV2InRange, 0);
+  current_properties.tieBool("/radios/nav2/dme/in-range",
+                            getNAV2DMEInRange, 0);
+
+  current_properties.tieDouble("/radios/adf/frequencies/selected",
+                              getADFFreq, setADFFreq);
+  current_properties.tieDouble("/radios/adf/frequencies/standby",
+                              getADFAltFreq, setADFAltFreq);
+  current_properties.tieDouble("/radios/adf/rotation",
+                              getADFRotation, setADFRotation);
+
+  FG_LOG(FG_GENERAL, FG_INFO, "Ending BFI init");
+}
+
+
 /**
  * Reinitialize FGFS if required.
  *
@@ -108,6 +231,16 @@ FGBFI::reinit ()
 
   cout << "BFI: start reinit\n";
 
+  setHeading(getHeading());
+  setPitch(getPitch());
+  setRoll(getRoll());
+  setSpeedNorth(getSpeedNorth());
+  setSpeedEast(getSpeedEast());
+  setSpeedDown(getSpeedDown());
+  setLatitude(getLatitude());
+  setLongitude(getLongitude());
+  setAltitude(getAltitude());
+
                                // TODO: add more AP stuff
   double elevator = getElevator();
   double aileron = getAileron();
@@ -125,9 +258,21 @@ FGBFI::reinit ()
   double gpsLatitude = getGPSTargetLatitude();
   double gpsLongitude = getGPSTargetLongitude();
 
+  setTargetAirport("");
+  cout << "Target airport is " << current_options.get_airport_id() << endl;
+
   fgReInitSubsystems();
-  // solarSystemRebuild();
+
+                               // FIXME: this is wrong.
+                               // All of these are scheduled events,
+                               // and it should be possible to force
+                               // them all to run once.
+  fgUpdateSunPos();
+  fgUpdateMoonPos();
   cur_light_params.Update();
+  FGTime::cur_time_params->updateLocal();
+  fgUpdateWeatherDatabase();
+  fgRadioSearch();
 
                                // Restore all of the old states.
   setElevator(elevator);
@@ -231,8 +376,7 @@ FGBFI::setAircraftDir (const string &dir)
 time_t
 FGBFI::getTimeGMT ()
 {
-                               // FIXME: inefficient
-  return mktime(FGTime::cur_time_params->getGmt());
+  return FGTime::cur_time_params->get_cur_time();
 }
 
 
@@ -321,6 +465,7 @@ void
 FGBFI::setLatitude (double latitude)
 {
   current_options.set_lat(latitude);
+  current_aircraft.fdm_state->set_Latitude(latitude * DEG_TO_RAD);
   needReinit();
 }
 
@@ -342,6 +487,7 @@ void
 FGBFI::setLongitude (double longitude)
 {
   current_options.set_lon(longitude);
+  current_aircraft.fdm_state->set_Longitude(longitude * DEG_TO_RAD);
   needReinit();
 }
 
@@ -374,8 +520,10 @@ FGBFI::getAGL ()
 void
 FGBFI::setAltitude (double altitude)
 {
-  current_options.set_altitude(altitude * FEET_TO_METER);
-  needReinit();
+  fgFDMForceAltitude(getFlightModel(), altitude * FEET_TO_METER);
+//   current_options.set_altitude(altitude * FEET_TO_METER);
+//   current_aircraft.fdm_state->set_Altitude(altitude);
+//   needReinit();
 }
 
 
@@ -395,6 +543,16 @@ FGBFI::getHeading ()
 }
 
 
+/**
+ * Return the current heading in degrees.
+ */
+double
+FGBFI::getHeadingMag ()
+{
+  return current_aircraft.fdm_state->get_Psi() * RAD_TO_DEG - getMagVar();
+}
+
+
 /**
  * Set the current heading in degrees.
  */
@@ -402,6 +560,9 @@ void
 FGBFI::setHeading (double heading)
 {
   current_options.set_heading(heading);
+  current_aircraft.fdm_state->set_Euler_Angles(getRoll() * DEG_TO_RAD,
+                                              getPitch() * DEG_TO_RAD,
+                                              heading * DEG_TO_RAD);
   needReinit();
 }
 
@@ -424,6 +585,9 @@ FGBFI::setPitch (double pitch)
 {
 
   current_options.set_pitch(pitch);
+  current_aircraft.fdm_state->set_Euler_Angles(getRoll() * DEG_TO_RAD,
+                                              pitch * DEG_TO_RAD,
+                                              getHeading() * DEG_TO_RAD);
   needReinit();
 }
 
@@ -445,6 +609,9 @@ void
 FGBFI::setRoll (double roll)
 {
   current_options.set_roll(roll);
+  current_aircraft.fdm_state->set_Euler_Angles(roll * DEG_TO_RAD,
+                                              getPitch() * DEG_TO_RAD,
+                                              getHeading() * DEG_TO_RAD);
   needReinit();
 }
 
@@ -504,6 +671,9 @@ void
 FGBFI::setSpeedNorth (double speed)
 {
   current_options.set_uBody(speed);
+  current_aircraft.fdm_state->set_Velocities_Local(speed,
+                                                  getSpeedEast(),
+                                                  getSpeedDown());
   needReinit();
 }
 
@@ -525,6 +695,9 @@ void
 FGBFI::setSpeedEast (double speed)
 {
   current_options.set_vBody(speed);
+  current_aircraft.fdm_state->set_Velocities_Local(getSpeedNorth(),
+                                                  speed,
+                                                  getSpeedDown());
   needReinit();
 }
 
@@ -546,6 +719,9 @@ void
 FGBFI::setSpeedDown (double speed)
 {
   current_options.set_wBody(speed);
+  current_aircraft.fdm_state->set_Velocities_Local(getSpeedNorth(),
+                                                  getSpeedEast(),
+                                                  speed);
   needReinit();
 }
 
@@ -773,8 +949,14 @@ void
 FGBFI::setAPHeadingLock (bool lock)
 {
   if (lock) {
+                               // We need to do this so that
+                               // it's possible to lock onto a
+                               // heading other than the current
+                               // heading.
+    double heading = getAPHeadingMag();
     current_autopilot->set_HeadingMode(FGAutopilot::FG_HEADING_LOCK);
     current_autopilot->set_HeadingEnabled(true);
+    setAPHeadingMag(heading);
   } else if (current_autopilot->get_HeadingMode() ==
             FGAutopilot::FG_HEADING_LOCK) {
     current_autopilot->set_HeadingEnabled(false);
@@ -865,6 +1047,19 @@ FGBFI::getNAV1DistDME ()
   return current_radiostack->get_nav1_dme_dist();
 }
 
+bool
+FGBFI::getNAV1InRange ()
+{
+  return current_radiostack->get_nav1_inrange();
+}
+
+bool
+FGBFI::getNAV1DMEInRange ()
+{
+  return (current_radiostack->get_nav1_inrange() &&
+         current_radiostack->get_nav1_has_dme());
+}
+
 double
 FGBFI::getNAV2Freq ()
 {
@@ -895,6 +1090,19 @@ FGBFI::getNAV2DistDME ()
   return current_radiostack->get_nav2_dme_dist();
 }
 
+bool
+FGBFI::getNAV2InRange ()
+{
+  return current_radiostack->get_nav2_inrange();
+}
+
+bool
+FGBFI::getNAV2DMEInRange ()
+{
+  return (current_radiostack->get_nav2_inrange() &&
+         current_radiostack->get_nav2_has_dme());
+}
+
 double
 FGBFI::getADFFreq ()
 {
@@ -1122,6 +1330,7 @@ FGBFI::setVisibility (double visibility)
 void
 FGBFI::setClouds (bool clouds)
 {
+  cout << "Set clouds to " << clouds << endl;
   current_options.set_clouds(clouds);
   needReinit();
 }