#include <Main/fg_props.hxx>
#include <Main/globals.hxx>
-#include <Viewer/viewer.hxx>
#include <Scenery/scenery.hxx>
#include <Scenery/tilemgr.hxx>
#include <Airports/dynamics.hxx>
FGAIBase::readFromScenario(scFileNode);
- setPerformance(scFileNode->getStringValue("class", "jet_transport"));
+ setPerformance("", scFileNode->getStringValue("class", "jet_transport"));
setFlightPlan(scFileNode->getStringValue("flightplan"),
scFileNode->getBoolValue("repeat", false));
setCallSign(scFileNode->getStringValue("callsign"));
Transform();
}
-void FGAIAircraft::setPerformance(const std::string& acclass) {
- static PerformanceDB perfdb; //TODO make it a global service
- setPerformance(perfdb.getDataFor(acclass));
- }
-
+void FGAIAircraft::setPerformance(const std::string& acType, const std::string& acclass)
+{
+ static PerformanceDB perfdb; //TODO make it a global service
+ _performance = perfdb.getDataFor(acType, acclass);
+}
+#if 0
void FGAIAircraft::setPerformance(PerformanceData *ps) {
_performance = ps;
}
-
+#endif
void FGAIAircraft::Run(double dt) {
FGAIAircraft::dt = dt;
void FGAIAircraft::checkVisibility()
{
double visibility_meters = fgGetDouble("/environment/visibility-m");
- FGViewer* vw = globals->get_current_view();
- invisible = (SGGeodesy::distanceM(vw->getPosition(), pos) > visibility_meters);
+ invisible = (SGGeodesy::distanceM(globals->get_view_position(), pos) > visibility_meters);
}
// 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();
-
- if (SGGeodesy::distanceM(vw->getPosition(), pos) > visibility_meters) {
+ double visibility_meters = fgGetDouble("/environment/visibility-m");
+ if (SGGeodesy::distanceM(globals->get_view_position(), pos) > visibility_meters) {
return;
}
setAltitude(prev->getAltitude());
if (prev->getSpeed() > 0.0)
- setHeading(fp->getBearing(prev->getLatitude(), prev->getLongitude(), curr));
+ setHeading(fp->getBearing(prev, curr));
else
- setHeading(fp->getBearing(curr->getLatitude(), curr->getLongitude(), prev));
+ setHeading(fp->getBearing(curr, prev));
// If next doesn't exist, as in incrementally created flightplans for
// AI/Trafficmanager created plans,
// << " Ground target speed " << groundTargetSpeed << endl;
double bearing = 0;
// don't do bearing calculations for ground traffic
- bearing = getBearing(fp->getBearing(pos.getLatitudeDeg(), pos.getLongitudeDeg(), curr));
+ bearing = getBearing(fp->getBearing(pos, curr));
if (bearing < minBearing) {
minBearing = bearing;
if (minBearing < 10) {
SGVec3d cartPos = SGVec3d::fromGeod(pos);
const double d2 = (TRAFFICTOAIDISTTODIE * SG_NM_TO_METER) *
(TRAFFICTOAIDISTTODIE * SG_NM_TO_METER);
- return (distSqr(cartPos, globals->get_aircraft_positon_cart()) < d2);
+ return (distSqr(cartPos, globals->get_aircraft_position_cart()) < d2);
}
//cerr << trafficRef->getCallSign() << " has passed waypoint " << prev->name << " at speed " << speed << endl;
//cerr << "Passing waypoint : " << prev->getName() << endl;
if (prev->contains("PushBackPoint")) {
- dep->getDynamics()->releaseParking(fp->getGate());
+ // clearing the parking assignment will release the gate
+ fp->setGate(ParkingAssignment());
AccelTo(0.0);
//setTaxiClearanceRequest(true);
}
* @param curr
*/
void FGAIAircraft::controlHeading(FGAIWaypoint* curr) {
- double calc_bearing = fp->getBearing(pos.getLatitudeDeg(), pos.getLongitudeDeg(), curr);
+ double calc_bearing = fp->getBearing(pos, curr);
//cerr << "Bearing = " << calc_bearing << endl;
if (speed < 0) {
calc_bearing +=180;
- if (calc_bearing > 360)
- calc_bearing -= 360;
+ SG_NORMALIZE_RANGE(calc_bearing, 0.0, 360.0);
}
if (finite(calc_bearing)) {
}
}
-void FGAIAircraft::updatePosition() {
- // convert speed to degrees per second
- double speed_north_deg_sec = cos( hdg * SGD_DEGREES_TO_RADIANS )
- * speed * 1.686 / ft_per_deg_lat;
- double speed_east_deg_sec = sin( hdg * SGD_DEGREES_TO_RADIANS )
- * speed * 1.686 / ft_per_deg_lon;
-
- // set new position
- pos.setLatitudeDeg( pos.getLatitudeDeg() + speed_north_deg_sec * dt);
- pos.setLongitudeDeg( pos.getLongitudeDeg() + speed_east_deg_sec * dt);
-}
-
-
void FGAIAircraft::updateHeading() {
// adjust heading based on current bank angle
if (roll == 0.0)
// find target vertical speed
if (use_perf_vs) {
if (altitude_ft < tgt_altitude_ft) {
- tgt_vs = tgt_altitude_ft - altitude_ft;
- if (tgt_vs > _performance->climbRate())
- tgt_vs = _performance->climbRate();
+ tgt_vs = std::min(tgt_altitude_ft - altitude_ft, _performance->climbRate());
} else {
- tgt_vs = tgt_altitude_ft - altitude_ft;
- if (tgt_vs < (-_performance->descentRate()))
- tgt_vs = -_performance->descentRate();
+ tgt_vs = std::max(tgt_altitude_ft - altitude_ft, -_performance->descentRate());
}
} else {
double vert_dist_ft = fp->getCurrentWaypoint()->getCrossat() - altitude_ft;
}
}
-string FGAIAircraft::atGate() {
- string tmp("");
- if (fp->getLeg() < 3) {
- if (trafficRef) {
- if (fp->getGate() > 0) {
- FGParking *park =
- trafficRef->getDepartureAirport()->getDynamics()->getParking(fp->getGate());
- tmp = park->getName();
- }
- }
+string FGAIAircraft::atGate()
+{
+ if ((fp->getLeg() < 3) && trafficRef) {
+ if (fp->getParkingGate()) {
+ return fp->getParkingGate()->ident();
+ }
}
- return tmp;
+
+ return string();
}
void FGAIAircraft::handleATCRequests() {
void FGAIAircraft::updateActualState() {
//update current state
//TODO have a single tgt_speed and check speed limit on ground on setting tgt_speed
- updatePosition();
+ double distance = speed * SG_KT_TO_MPS * dt;
+ pos = SGGeodesy::direct(pos, hdg, distance);
+
if (onGround())
speed = _performance->actualSpeed(this, groundTargetSpeed, dt, holdPos);