# include <config.h>
#endif
-#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>
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"));
void FGAIAircraft::bind() {
FGAIBase::bind();
- props->tie("controls/gear/gear-down",
- SGRawValueMethods<FGAIAircraft,bool>(*this,
- &FGAIAircraft::_getGearDown));
- props->tie("transponder-id",
- SGRawValueMethods<FGAIAircraft,const char*>(*this,
- &FGAIAircraft::_getTransponderCode));
+ tie("controls/gear/gear-down",
+ SGRawValueMethods<FGAIAircraft,bool>(*this,
+ &FGAIAircraft::_getGearDown));
+ tie("transponder-id",
+ SGRawValueMethods<FGAIAircraft,const char*>(*this,
+ &FGAIAircraft::_getTransponderCode));
}
-
-void FGAIAircraft::unbind() {
- FGAIBase::unbind();
-
- props->untie("controls/gear/gear-down");
- props->untie("transponder-id");
-}
-
-
void FGAIAircraft::update(double dt) {
FGAIBase::update(dt);
Run(dt);
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);
}
curr = fp->getCurrentWaypoint();
next = fp->getNextWaypoint();
}
+ if (!curr)
+ {
+ // Oops! FIXME
+ return;
+ }
+
if (! leadPointReached(curr)) {
controlHeading(curr);
controlSpeed(curr, next);
{
// err is negative when we passed too high
double vert_m = vert_ft * SG_FEET_TO_METER;
- double err_m = err * SG_FEET_TO_METER;
+ //double err_m = err * SG_FEET_TO_METER;
//double angle = atan2(vert_m, dist_m);
double speedMs = (speed * SG_NM_TO_METER) / 3600;
//double vs = cos(angle) * speedMs; // Now in m/s
// 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;
}
}
if (trafficRef) {
//cerr << "Tracking callsign : \"" << fgGetString("/ai/track-callsign") << "\"" << endl;
-/* if (trafficRef->getCallSign() == fgGetString("/ai/track-callsign")) {
- cerr << trafficRef->getCallSign() << " " << tgt_altitude_ft << " " << _getSpeed() << " "
- << _getAltitude() << " "<< _getLatitude() << " " << _getLongitude() << " " << dist_to_go << " " << lead_dist << " " << curr->name << " " << vs << " " << tgt_vs << " " << bearing << " " << minBearing << " " << speedFraction << endl;
- }*/
+ //if (trafficRef->getCallSign() == fgGetString("/ai/track-callsign")) {
+ //cerr << trafficRef->getCallSign() << " " << tgt_altitude_ft << " " << _getSpeed() << " "
+ // << _getAltitude() << " "<< _getLatitude() << " " << _getLongitude() << " " << dist_to_go << " " << lead_dist << " " << curr->getName() << " " << vs << " " << //tgt_vs << " " << bearing << " " << minBearing << " " << speedFraction << endl;
+ //}
}
if ((dist_to_go < lead_dist) ||
((dist_to_go > prev_dist_to_go) && (bearing > (minBearing * 1.1))) ) {
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 << "calc_bearing is not a finite number : "
<< "Speed " << speed
<< "pos : " << pos.getLatitudeDeg() << ", " << pos.getLongitudeDeg()
- << "waypoint " << curr->getLatitude() << ", " << curr->getLongitude() << endl;
- cerr << "waypoint name " << curr->getName();
- exit(1); // FIXME
+ << ", waypoint: " << curr->getLatitude() << ", " << curr->getLongitude() << endl;
+ cerr << "waypoint name: '" << curr->getName() << "'" << endl;
+ //exit(1); // FIXME
}
}
// If on ground, calculate heading change directly
if (onGround()) {
double headingDiff = fabs(hdg-tgt_heading);
- double bank_sense = 0.0;
+// double bank_sense = 0.0;
/*
double diff = fabs(hdg - tgt_heading);
if (diff > 180)
if (sum > 360.0)
sum -= 360.0;
if (fabs(sum - tgt_heading) > 0.0001) {
- bank_sense = -1.0;
+// bank_sense = -1.0;
} else {
- bank_sense = 1.0;
+// bank_sense = 1.0;
}
//if (trafficRef)
// cerr << trafficRef->getCallSign() << " Heading "
updatePosition();
if (onGround())
- speed = _performance->actualSpeed(this, groundTargetSpeed, dt);
+ speed = _performance->actualSpeed(this, groundTargetSpeed, dt, holdPos);
else
- speed = _performance->actualSpeed(this, (tgt_speed *speedFraction), dt);
+ speed = _performance->actualSpeed(this, (tgt_speed *speedFraction), dt, false);
//assertSpeed(speed);
updateHeading();
roll = _performance->actualBankAngle(this, tgt_roll, dt);