X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAIAircraft.cxx;h=5e803ef5e159b81e6c3934a73c060f13ab96a16a;hb=d035fdf3a949e62f0c8e772e100d14087b6d4ba9;hp=b5ef2418798fd70e0299ec144d9e0c18c55fd7ac;hpb=63c95642c8758edff2cb27c1d1fbda842b9b23f5;p=flightgear.git diff --git a/src/AIModel/AIAircraft.cxx b/src/AIModel/AIAircraft.cxx index b5ef24187..5e803ef5e 100644 --- a/src/AIModel/AIAircraft.cxx +++ b/src/AIModel/AIAircraft.cxx @@ -27,20 +27,17 @@ #include #include #include -#include +#include #include
+#include + #include -#include -#include - -#ifdef _MSC_VER -# include -# define finite _finite -#elif defined(__sun) || defined(sgi) -# include -#endif +#include +#include +// defined in AIShip.cxx +extern double fgIsFinite(double x); #include "AIAircraft.hxx" #include "performancedata.hxx" @@ -87,6 +84,7 @@ FGAIAircraft::FGAIAircraft(FGAISchedule *ref) : headingError = 0; minBearing = 360; speedFraction =1.0; + prev_dist_to_go = 0.0; holdPos = false; needsTaxiClearance = false; @@ -174,18 +172,12 @@ void FGAIAircraft::setPerformance(const std::string& acType, const std::string& // AI manager. In this particular case, the AIAircraft is used to shadow the user's aircraft's behavior in the AI world. // Since we perhaps don't want a radar entry of our own aircraft, the following conditional should probably be adequate // enough - if (manager) + if (manager){ UpdateRadar(manager); - checkVisibility(); + invisible = !manager->isVisible(pos); + } } -void FGAIAircraft::checkVisibility() -{ - double visibility_meters = fgGetDouble("/environment/visibility-m"); - invisible = (SGGeodesy::distanceM(globals->get_view_position(), pos) > visibility_meters); -} - - void FGAIAircraft::AccelTo(double speed) { tgt_speed = speed; @@ -232,16 +224,26 @@ double FGAIAircraft::sign(double x) { } -void FGAIAircraft::setFlightPlan(const std::string& flightplan, bool repeat) { - if (!flightplan.empty()) { - FGAIFlightPlan* fp = new FGAIFlightPlan(flightplan); +void FGAIAircraft::setFlightPlan(const std::string& flightplan, bool repeat) +{ + if (flightplan.empty()) { + // this is the case for Nasal-scripted aircraft + return; + } + + FGAIFlightPlan* fp = new FGAIFlightPlan(flightplan); + if (fp->isValidPlan()) { fp->setRepeat(repeat); SetFlightPlan(fp); + } else { + SG_LOG(SG_AI, SG_WARN, "setFlightPlan: invalid flightplan specified:" << flightplan); + delete fp; } } -void FGAIAircraft::SetFlightPlan(FGAIFlightPlan *f) { +void FGAIAircraft::SetFlightPlan(FGAIFlightPlan *f) +{ delete fp; fp = f; } @@ -557,54 +559,61 @@ void FGAIAircraft::doGroundAltitude() { void FGAIAircraft::announcePositionToController() { - if (trafficRef) { - int leg = fp->getLeg(); - - // Note that leg has been incremented after creating the current leg, so we should use - // leg numbers here that are one higher than the number that is used to create the leg - // NOTE: As of July, 30, 2011, the post-creation leg updating is no longer happening. - // Leg numbers are updated only once the aircraft passes the last waypoint created for that legm so I should probably just use - // the original leg numbers here! - switch (leg) { - case 1: // Startup and Push back - if (trafficRef->getDepartureAirport()->getDynamics()) - controller = trafficRef->getDepartureAirport()->getDynamics()->getStartupController(); - break; - case 2: // Taxiing to runway - if (trafficRef->getDepartureAirport()->getDynamics()->getGroundNetwork()->exists()) - controller = trafficRef->getDepartureAirport()->getDynamics()->getGroundNetwork(); - break; - case 3: //Take off tower controller - if (trafficRef->getDepartureAirport()->getDynamics()) { - controller = trafficRef->getDepartureAirport()->getDynamics()->getTowerController(); - towerController = 0; - } else { - cerr << "Error: Could not find Dynamics at airport : " << trafficRef->getDepartureAirport()->getId() << endl; - } - break; - case 6: - if (trafficRef->getDepartureAirport()->getDynamics()) { - controller = trafficRef->getArrivalAirport()->getDynamics()->getApproachController(); - } - break; - case 8: // Taxiing for parking - if (trafficRef->getArrivalAirport()->getDynamics()->getGroundNetwork()->exists()) - controller = trafficRef->getArrivalAirport()->getDynamics()->getGroundNetwork(); - break; - default: - controller = 0; - break; + if (!trafficRef) { + return; + } + + int leg = fp->getLeg(); + if (!fp->getCurrentWaypoint()) { + // http://code.google.com/p/flightgear-bugs/issues/detail?id=1153 + // throw an exception so this aircraft gets killed by the AIManager. + throw sg_exception("bad AI flight plan"); + } + + // Note that leg has been incremented after creating the current leg, so we should use + // leg numbers here that are one higher than the number that is used to create the leg + // NOTE: As of July, 30, 2011, the post-creation leg updating is no longer happening. + // Leg numbers are updated only once the aircraft passes the last waypoint created for that legm so I should probably just use + // the original leg numbers here! + switch (leg) { + case 1: // Startup and Push back + if (trafficRef->getDepartureAirport()->getDynamics()) + controller = trafficRef->getDepartureAirport()->getDynamics()->getStartupController(); + break; + case 2: // Taxiing to runway + if (trafficRef->getDepartureAirport()->getDynamics()->getGroundNetwork()->exists()) + controller = trafficRef->getDepartureAirport()->getDynamics()->getGroundNetwork(); + break; + case 3: //Take off tower controller + if (trafficRef->getDepartureAirport()->getDynamics()) { + controller = trafficRef->getDepartureAirport()->getDynamics()->getTowerController(); + towerController = 0; + } else { + cerr << "Error: Could not find Dynamics at airport : " << trafficRef->getDepartureAirport()->getId() << endl; } + break; + case 6: + if (trafficRef->getDepartureAirport()->getDynamics()) { + controller = trafficRef->getArrivalAirport()->getDynamics()->getApproachController(); + } + break; + case 8: // Taxiing for parking + if (trafficRef->getArrivalAirport()->getDynamics()->getGroundNetwork()->exists()) + controller = trafficRef->getArrivalAirport()->getDynamics()->getGroundNetwork(); + break; + default: + controller = 0; + break; + } - if ((controller != prevController) && (prevController != 0)) { - prevController->signOff(getID()); - } - prevController = controller; - if (controller) { - controller->announcePosition(getID(), fp, fp->getCurrentWaypoint()->getRouteIndex(), - _getLatitude(), _getLongitude(), hdg, speed, altitude_ft, - trafficRef->getRadius(), leg, this); - } + if ((controller != prevController) && (prevController != 0)) { + prevController->signOff(getID()); + } + prevController = controller; + if (controller) { + controller->announcePosition(getID(), fp, fp->getCurrentWaypoint()->getRouteIndex(), + _getLatitude(), _getLongitude(), hdg, speed, altitude_ft, + trafficRef->getRadius(), leg, this); } } @@ -925,7 +934,7 @@ void FGAIAircraft::controlHeading(FGAIWaypoint* curr) { SG_NORMALIZE_RANGE(calc_bearing, 0.0, 360.0); } - if (finite(calc_bearing)) { + if (fgIsFinite(calc_bearing)) { double hdg_error = calc_bearing - tgt_heading; if (fabs(hdg_error) > 0.01) { TurnTo( calc_bearing ); @@ -1101,10 +1110,8 @@ void FGAIAircraft::updateHeading() { } } } - if (trafficRef) - //cerr << trafficRef->getCallSign() << " Heading " - // << hdg << ". Target " << tgt_heading << ". Diff " << fabs(sum - tgt_heading) << ". Speed " << speed << "Heading change rate : " << headingChangeRate << " bacnk sence " << bank_sense << endl; - hdg += headingChangeRate * dt * sqrt(fabs(speed) / 15); + + hdg += headingChangeRate * dt * sqrt(fabs(speed) / 15); headingError = headingDiff; if (fabs(headingError) < 1.0) { hdg = tgt_heading;