X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAIAircraft.cxx;h=2bf71b3b18b96b35a66462bce9f0fe2c9e282e97;hb=d35b8db13f7aceee46d63b061cd20e6d3968f92a;hp=3f8bb05a871351cf1dbf559baf0e86cead70a246;hpb=f9de92f53db91c45e4bd885ba606749e9597fdbb;p=flightgear.git diff --git a/src/AIModel/AIAircraft.cxx b/src/AIModel/AIAircraft.cxx index 3f8bb05a8..2bf71b3b1 100644 --- a/src/AIModel/AIAircraft.cxx +++ b/src/AIModel/AIAircraft.cxx @@ -33,6 +33,7 @@ #include #include #include + #ifdef _MSC_VER # include # define finite _finite @@ -50,9 +51,6 @@ using std::string; static string tempReg; -class AI_OutOfSight{}; -class FP_Inactive{}; - FGAIAircraft::FGAIAircraft(FGAISchedule *ref) : FGAIBase(otAircraft) { trafficRef = ref; if (trafficRef) { @@ -79,11 +77,12 @@ FGAIAircraft::FGAIAircraft(FGAISchedule *ref) : FGAIBase(otAircraft) { alt_lock = false; roll = 0; headingChangeRate = 0.0; + headingError = 0; holdPos = false; _performance = 0; //TODO initialize to JET_TRANSPORT from PerformanceDB - + dt = 0; } @@ -113,6 +112,9 @@ void FGAIAircraft::bind() { props->tie("controls/gear/gear-down", SGRawValueMethods(*this, &FGAIAircraft::_getGearDown)); + props->tie("transponder-id", + SGRawValueMethods(*this, + &FGAIAircraft::_getTransponderCode)); } @@ -120,6 +122,7 @@ void FGAIAircraft::unbind() { FGAIBase::unbind(); props->untie("controls/gear/gear-down"); + props->untie("transponder-id"); } @@ -142,16 +145,16 @@ void FGAIAircraft::setPerformance(const std::string& acclass) { void FGAIAircraft::Run(double dt) { FGAIAircraft::dt = dt; - - try { - updatePrimaryTargetValues(); // target hdg, alt, speed - } - catch (AI_OutOfSight) { - return; + + bool outOfSight = false, + flightplanActive = true; + updatePrimaryTargetValues(flightplanActive, outOfSight); // target hdg, alt, speed + if (outOfSight) { + return; } - catch (FP_Inactive) { - //return; - groundTargetSpeed = 0; + + if (!flightplanActive) { + groundTargetSpeed = 0; } handleATCRequests(); // ATC also has a word to say @@ -163,21 +166,9 @@ void FGAIAircraft::setPerformance(const std::string& acclass) { void FGAIAircraft::checkVisibility() { - 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); - //return; - invisible = true; - } else { - invisible = false; - } + double visibility_meters = fgGetDouble("/environment/visibility-m"); + FGViewer* vw = globals->get_current_view(); + invisible = (SGGeodesy::distanceM(vw->getPosition(), pos) > visibility_meters); } @@ -285,8 +276,8 @@ void FGAIAircraft::ProcessFlightPlan( double dt, time_t now ) { } //TODO let the fp handle this (loading of next leg) - fp->IncrementWaypoint((bool) trafficRef); - if (!(fp->getNextWaypoint()) && trafficRef) + fp->IncrementWaypoint( trafficRef != 0 ); + if (!(fp->getNextWaypoint()) && trafficRef != 0) if (!loadNextLeg()) { setDie(true); return; @@ -345,6 +336,11 @@ bool FGAIAircraft::_getGearDown() const { } +const char * FGAIAircraft::_getTransponderCode() const { + return transponderCode.c_str(); +} + + bool FGAIAircraft::loadNextLeg() { int leg; @@ -402,28 +398,20 @@ void FGAIAircraft::getGroundElev(double dt) { // 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; } } @@ -456,15 +444,6 @@ void FGAIAircraft::announcePositionToController() { 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; } @@ -655,16 +634,10 @@ bool FGAIAircraft::leadPointReached(FGAIFlightPlan::waypoint* curr) { 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) <= TRAFFICTOAIDISTTODIE); + SGGeod userPos(SGGeod::fromDeg(fgGetDouble("/position/longitude-deg"), + fgGetDouble("/position/latitude-deg"))); + + return (SGGeodesy::distanceNm(userPos, pos) <= TRAFFICTOAIDISTTODIE); } @@ -763,7 +736,7 @@ void FGAIAircraft::controlSpeed(FGAIFlightPlan::waypoint* curr, FGAIFlightPlan:: /** * Update target values (heading, alt, speed) depending on flight plan or control properties */ -void FGAIAircraft::updatePrimaryTargetValues() { +void FGAIAircraft::updatePrimaryTargetValues(bool& flightplanActive, bool& aiOutOfSight) { if (fp) // AI object has a flightplan { //TODO make this a function of AIBase @@ -784,16 +757,16 @@ void FGAIAircraft::updatePrimaryTargetValues() { } if (trafficRef) { //cerr << trafficRef->getRegistration() << " Setting altitude to " << altitude_ft; - if (! aiTrafficVisible()) { + aiOutOfSight = !aiTrafficVisible(); + if (aiOutOfSight) { setDie(true); //cerr << trafficRef->getRegistration() << " is set to die " << endl; - throw AI_OutOfSight(); + aiOutOfSight = true; + return; } } timeElapsed = now - fp->getStartTime(); - if (! fp->isActive(now)) { - throw FP_Inactive(); - } + flightplanActive = fp->isActive(now); } else { // no flight plan, update target heading, speed, and altitude // from control properties. These default to the initial