#include <Airports/dynamics.hxx>
#include <Airports/airport.hxx>
#include <Main/util.hxx>
+#include <Traffic/Schedule.hxx>
#include <simgear/structure/exception.hxx>
#include <string>
-#include <math.h>
-#include <time.h>
-
-#ifdef _MSC_VER
-# include <float.h>
-# define finite _finite
-#elif defined(__sun) || defined(sgi)
-# include <ieeefp.h>
-#endif
+#include <cmath>
+#include <ctime>
+// defined in AIShip.cxx
+extern double fgIsFinite(double x);
+#include "AIManager.hxx"
#include "AIAircraft.hxx"
+#include "AIFlightPlan.hxx"
#include "performancedata.hxx"
#include "performancedb.hxx"
#include <signal.h>
Transform();
}
+void FGAIAircraft::unbind()
+{
+ FGAIBase::unbind();
+ clearATCController();
+}
+
void FGAIAircraft::setPerformance(const std::string& acType, const std::string& acclass)
{
static PerformanceDB perfdb; //TODO make it a global service
// 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;
void FGAIAircraft::setFlightPlan(const std::string& flightplan, bool repeat)
{
if (flightplan.empty()) {
- SG_LOG(SG_AI, SG_WARN, "setFlightPlan: empty flight plan");
+ // this is the case for Nasal-scripted aircraft
+ return;
}
FGAIFlightPlan* fp = new FGAIFlightPlan(flightplan);
}
-void FGAIAircraft::SetFlightPlan(FGAIFlightPlan *f) {
+void FGAIAircraft::SetFlightPlan(FGAIFlightPlan *f)
+{
delete fp;
fp = f;
}
return vs;
}
+void FGAIAircraft::clearATCController()
+{
+ controller = 0;
+ prevController = 0;
+ towerController = 0;
+}
+
void FGAIAircraft::assertSpeed(double speed)
{
if ((speed < -50) || (speed > 1000)) {
controller = trafficRef->getDepartureAirport()->getDynamics()->getStartupController();
break;
case 2: // Taxiing to runway
- if (trafficRef->getDepartureAirport()->getDynamics()->getGroundNetwork()->exists())
- controller = trafficRef->getDepartureAirport()->getDynamics()->getGroundNetwork();
+ if (trafficRef->getDepartureAirport()->getDynamics()->getGroundController()->exists())
+ controller = trafficRef->getDepartureAirport()->getDynamics()->getGroundController();
break;
case 3: //Take off tower controller
if (trafficRef->getDepartureAirport()->getDynamics()) {
}
break;
case 6:
- if (trafficRef->getDepartureAirport()->getDynamics()) {
+ if (trafficRef->getArrivalAirport()->getDynamics()) {
controller = trafficRef->getArrivalAirport()->getDynamics()->getApproachController();
}
break;
case 8: // Taxiing for parking
- if (trafficRef->getArrivalAirport()->getDynamics()->getGroundNetwork()->exists())
- controller = trafficRef->getArrivalAirport()->getDynamics()->getGroundNetwork();
+ if (trafficRef->getArrivalAirport()->getDynamics()->getGroundController()->exists())
+ controller = trafficRef->getArrivalAirport()->getDynamics()->getGroundController();
break;
default:
controller = 0;
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 );