#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"
////////////////////////////////////////////////////////////////////////
+/**
+ * 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.
*
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();
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);
time_t
FGBFI::getTimeGMT ()
{
- // FIXME: inefficient
- return mktime(FGTime::cur_time_params->getGmt());
+ return FGTime::cur_time_params->get_cur_time();
}
FGBFI::setLatitude (double latitude)
{
current_options.set_lat(latitude);
+ current_aircraft.fdm_state->set_Latitude(latitude * DEG_TO_RAD);
needReinit();
}
FGBFI::setLongitude (double longitude)
{
current_options.set_lon(longitude);
+ current_aircraft.fdm_state->set_Longitude(longitude * DEG_TO_RAD);
needReinit();
}
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();
}
}
+/**
+ * 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.
*/
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();
}
{
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();
}
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();
}
FGBFI::setSpeedNorth (double speed)
{
current_options.set_uBody(speed);
+ current_aircraft.fdm_state->set_Velocities_Local(speed,
+ getSpeedEast(),
+ getSpeedDown());
needReinit();
}
FGBFI::setSpeedEast (double speed)
{
current_options.set_vBody(speed);
+ current_aircraft.fdm_state->set_Velocities_Local(getSpeedNorth(),
+ speed,
+ getSpeedDown());
needReinit();
}
FGBFI::setSpeedDown (double speed)
{
current_options.set_wBody(speed);
+ current_aircraft.fdm_state->set_Velocities_Local(getSpeedNorth(),
+ getSpeedEast(),
+ speed);
needReinit();
}
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);
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 ()
{
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 ()
{
void
FGBFI::setClouds (bool clouds)
{
+ cout << "Set clouds to " << clouds << endl;
current_options.set_clouds(clouds);
needReinit();
}