# include <config.h>
#endif
-#include <simgear/math/point3d.hxx>
#include <simgear/route/waypoint.hxx>
#include <Main/fg_props.hxx>
#include <Main/globals.hxx>
#include <Main/viewer.hxx>
#include <Scenery/scenery.hxx>
#include <Scenery/tilemgr.hxx>
+#include <Airports/dynamics.hxx>
#include <string>
#include <math.h>
#include <time.h>
+
#ifdef _MSC_VER
# include <float.h>
# define finite _finite
# include <ieeefp.h>
#endif
-SG_USING_STD(string);
+using std::string;
#include "AIAircraft.hxx"
#include "performancedata.hxx"
alt_lock = false;
roll = 0;
headingChangeRate = 0.0;
+ headingError = 0;
holdPos = false;
_performance = 0; //TODO initialize to JET_TRANSPORT from PerformanceDB
-
+ dt = 0;
}
props->tie("controls/gear/gear-down",
SGRawValueMethods<FGAIAircraft,bool>(*this,
&FGAIAircraft::_getGearDown));
+ props->tie("transponder-id",
+ SGRawValueMethods<FGAIAircraft,const char*>(*this,
+ &FGAIAircraft::_getTransponderCode));
}
FGAIBase::unbind();
props->untie("controls/gear/gear-down");
+ props->untie("transponder-id");
}
updateSecondaryTargetValues(); // target roll, vertical speed, pitch
updateActualState();
UpdateRadar(manager);
+ checkVisibility();
}
+void FGAIAircraft::checkVisibility()
+{
+ double visibility_meters = fgGetDouble("/environment/visibility-m");
+ FGViewer* vw = globals->get_current_view();
+ invisible = (SGGeodesy::distanceM(vw->getPosition(), pos) > visibility_meters);
+}
+
void FGAIAircraft::AccelTo(double speed) {
}
//TODO let the fp handle this (loading of next leg)
- fp->IncrementWaypoint((bool) trafficRef);
- if (!(fp->getNextWaypoint()) && trafficRef)
- loadNextLeg();
+ fp->IncrementWaypoint( trafficRef != 0 );
+ if (!(fp->getNextWaypoint()) && trafficRef != 0)
+ if (!loadNextLeg()) {
+ setDie(true);
+ return;
+ }
prev = fp->getPreviousWaypoint();
curr = fp->getCurrentWaypoint();
}
-void FGAIAircraft::loadNextLeg() {
+const char * FGAIAircraft::_getTransponderCode() const {
+ return transponderCode.c_str();
+}
+
+
+bool FGAIAircraft::loadNextLeg() {
int leg;
if ((leg = fp->getLeg()) == 10) {
- trafficRef->next();
+ if (!trafficRef->next()) {
+ return false;
+ }
setCallSign(trafficRef->getCallSign());
- //props->setStringValue("callsign", callsign.c_str());
leg = 1;
fp->setLeg(leg);
}
} else {
double cruiseAlt = trafficRef->getCruiseAlt() * 100;
- fp->create (dep,
+ fp->create (this,
+ dep,
arr,
leg,
- cruiseAlt, //(trafficRef->getCruiseAlt() * 100), // convert from FL to feet
+ cruiseAlt,
trafficRef->getSpeed(),
_getLatitude(),
_getLongitude(),
trafficRef->getFlightType(),
acType,
company);
+ //cerr << "created leg " << leg << " for " << trafficRef->getCallSign() << endl;
}
+ return true;
}
// Only do the proper hitlist stuff if we are within visible range of the viewer.
if (!invisible) {
double visibility_meters = fgGetDouble("/environment/visibility-m");
-
FGViewer* vw = globals->get_current_view();
- double course, distance;
-
- SGWayPoint current(pos.getLongitudeDeg(), pos.getLatitudeDeg(), 0);
- SGWayPoint view (vw->getLongitude_deg(), vw->getLatitude_deg(), 0);
- view.CourseAndDistance(current, &course, &distance);
- if (distance > visibility_meters) {
- //aip.getSGLocation()->set_cur_elev_m(aptElev);
+
+ if (SGGeodesy::distanceM(vw->getPosition(), pos) > visibility_meters) {
return;
}
- // FIXME: make sure the pos.lat/pos.lon values are in degrees ...
double range = 500.0;
- if (!globals->get_tile_mgr()->scenery_available(pos.getLatitudeDeg(), pos.getLongitudeDeg(), range)) {
+ if (!globals->get_tile_mgr()->scenery_available(pos, range)) {
// Try to shedule tiles for that position.
- globals->get_tile_mgr()->update( aip.getSGLocation(), range );
+ globals->get_tile_mgr()->update( pos, range );
}
- // FIXME: make sure the pos.lat/pos.lon values are in degrees ...
double alt;
- if (globals->get_scenery()->get_elevation_m(pos.getLatitudeDeg(), pos.getLongitudeDeg(), 20000.0, alt, 0))
+ if (getGroundElevationM(SGGeod::fromGeodM(pos, 20000), alt, 0))
tgt_altitude_ft = alt * SG_METER_TO_FEET;
}
}
case 4: //Take off tower controller
if (trafficRef->getDepartureAirport()->getDynamics()) {
controller = trafficRef->getDepartureAirport()->getDynamics()->getTowerController();
- //if (trafficRef->getDepartureAirport()->getId() == "EHAM") {
- //string trns = trafficRef->getCallSign() + " at runway " + fp->getRunway() +
- // ". Ready for departure. " + trafficRef->getFlightType() + " to " +
- // trafficRef->getArrivalAirport()->getId();
- //fgSetString("/sim/messages/atc", trns.c_str());
- // if (controller == 0) {
- //cerr << "Error in assigning controller at " << trafficRef->getDepartureAirport()->getId() << endl;
- //}
- //}
} else {
cerr << "Error: Could not find Dynamics at airport : " << trafficRef->getDepartureAirport()->getId() << endl;
}
//TODO fp should handle this
fp->IncrementWaypoint(eraseWaypoints);
if (!(fp->getNextWaypoint()) && trafficRef)
- loadNextLeg();
+ if (!loadNextLeg()) {
+ setDie(true);
+ return;
+ }
prev = fp->getPreviousWaypoint(); //first waypoint
curr = fp->getCurrentWaypoint(); //second waypoint
//prev_dist_to_go = dist_to_go;
//if (dist_to_go < lead_dist)
- // cerr << trafficRef->getCallSign() << " Distance : " << dist_to_go << ": Lead distance " << lead_dist << " " << curr->name << endl;
+ // cerr << trafficRef->getCallSign() << " Distance : "
+ // << dist_to_go << ": Lead distance "
+ // << lead_dist << " " << curr->name
+ // << " Ground target speed " << groundTargetSpeed << endl;
+
return dist_to_go < lead_dist;
}
bool FGAIAircraft::aiTrafficVisible() {
- double userLatitude = fgGetDouble("/position/latitude-deg");
- double userLongitude = fgGetDouble("/position/longitude-deg");
- double course, distance;
-
- SGWayPoint current(pos.getLongitudeDeg(), pos.getLatitudeDeg(), 0);
- SGWayPoint user (userLongitude, userLatitude, 0);
-
- user.CourseAndDistance(current, &course, &distance);
-
- return ((distance * SG_METER_TO_NM) <= TRAFFICTOAIDIST);
+ SGGeod userPos(SGGeod::fromDeg(fgGetDouble("/position/longitude-deg"),
+ fgGetDouble("/position/latitude-deg")));
+
+ return (SGGeodesy::distanceNm(userPos, pos) <= TRAFFICTOAIDISTTODIE);
}
// This waypoint marks the fact that the aircraft has passed the initial taxi
// departure waypoint, so it can release the parking.
+ //cerr << trafficRef->getCallSign() << " has passed waypoint " << prev->name << " at speed " << speed << endl;
if (prev->name == "PushBackPoint") {
dep->getDynamics()->releaseParking(fp->getGate());
time_t holdUntil = now + 120;