X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAIAircraft.hxx;h=9b804f90c57b97cbe61678170be91b8f1fd00e38;hb=43add4f820300833024366cb58cfedb90bfbe5a0;hp=6a53e5a2bf32238b4c61fa6f81e5bfd6a179507e;hpb=33aead9a21f84f87204be649bb69edafe092f68f;p=flightgear.git diff --git a/src/AIModel/AIAircraft.hxx b/src/AIModel/AIAircraft.hxx index 6a53e5a2b..9b804f90c 100644 --- a/src/AIModel/AIAircraft.hxx +++ b/src/AIModel/AIAircraft.hxx @@ -21,16 +21,16 @@ #ifndef _FG_AIAircraft_HXX #define _FG_AIAircraft_HXX -#include "AIManager.hxx" #include "AIBase.hxx" -#include -#include -#include - #include class PerformanceData; +class FGAISchedule; +class FGAIFlightPlan; +class FGATCController; +class FGATCInstruction; +class FGAIWaypoint; class FGAIAircraft : public FGAIBase { @@ -42,17 +42,18 @@ public: // virtual bool init(bool search_in_AI_path=false); virtual void bind(); - virtual void unbind(); virtual void update(double dt); + virtual void unbind(); - void setPerformance(const std::string& perfString); - void setPerformance(PerformanceData *ps); + void setPerformance(const std::string& acType, const std::string& perfString); + // void setPerformance(PerformanceData *ps); void setFlightPlan(const std::string& fp, bool repat = false); void SetFlightPlan(FGAIFlightPlan *f); void initializeFlightPlan(); FGAIFlightPlan* GetFlightPlan() const { return fp; }; void ProcessFlightPlan( double dt, time_t now ); + time_t checkForArrivalTime(const std::string& wptName); void AccelTo(double speed); void PitchTo(double angle); @@ -63,18 +64,30 @@ public: void getGroundElev(double dt); //TODO these 3 really need to be public? void doGroundAltitude(); - bool loadNextLeg (); + bool loadNextLeg (double dist=0); + void resetPositionFromFlightPlan(); + double getBearing(double crse); void setAcType(const std::string& ac) { acType = ac; }; + const std::string& getAcType() const { return acType; } + void setCompany(const std::string& comp) { company = comp;}; void announcePositionToController(); //TODO have to be public? - void processATC(FGATCInstruction instruction); + void processATC(const FGATCInstruction& instruction); + void setTaxiClearanceRequest(bool arg) { needsTaxiClearance = arg; }; + bool getTaxiClearanceRequest() { return needsTaxiClearance; }; FGAISchedule * getTrafficRef() { return trafficRef; }; + void setTrafficRef(FGAISchedule *ref) { trafficRef = ref; }; + void resetTakeOffStatus() { takeOffStatus = 0;}; + void setTakeOffStatus(int status) { takeOffStatus = status; }; + void scheduleForATCTowerDepartureControl(int state); + + //inline bool isScheduledForTakeoff() { return scheduledForTakeoff; }; virtual const char* getTypeString(void) const { return "aircraft"; } - std::string GetTransponderCode() { return transponderCode; }; + const std::string& GetTransponderCode() { return transponderCode; }; void SetTransponderCode(const std::string& tc) { transponderCode = tc;}; // included as performance data needs them, who else? @@ -87,14 +100,24 @@ public: inline double getVerticalSpeed() const { return vs; }; inline double altitudeAGL() const { return props->getFloatValue("position/altitude-agl-ft");}; inline double airspeed() const { return props->getFloatValue("velocities/airspeed-kt");}; - std::string atGate(); + const std::string& atGate(); + + int getTakeOffStatus() { return takeOffStatus; }; + + void checkTcas(); + double calcVerticalSpeed(double vert_ft, double dist_m, double speed, double error); + + FGATCController * getATCController() { return controller; }; + void clearATCController(); protected: void Run(double dt); private: FGAISchedule *trafficRef; - FGATCController *controller, *prevController; + FGATCController *controller, + *prevController, + *towerController; // Only needed to make a pre-announcement bool hdg_lock; bool alt_lock; @@ -102,9 +125,10 @@ private: double dt_elev_count; double headingChangeRate; double headingError; + double minBearing; + double speedFraction; double groundTargetSpeed; double groundOffset; - double dt; bool use_perf_vs; SGPropertyNode_ptr refuel_node; @@ -114,24 +138,27 @@ private: //subclasses to override specific behaviour bool fpExecutable(time_t now); void handleFirstWaypoint(void); - bool leadPointReached(FGAIFlightPlan::waypoint* curr); - bool handleAirportEndPoints(FGAIFlightPlan::waypoint* prev, time_t now); + bool leadPointReached(FGAIWaypoint* curr); + bool handleAirportEndPoints(FGAIWaypoint* prev, time_t now); + bool reachedEndOfCruise(double&); bool aiTrafficVisible(void); - void controlHeading(FGAIFlightPlan::waypoint* curr); - void controlSpeed(FGAIFlightPlan::waypoint* curr, - FGAIFlightPlan::waypoint* next); + void controlHeading(FGAIWaypoint* curr); + void controlSpeed(FGAIWaypoint* curr, + FGAIWaypoint* next); - void updatePrimaryTargetValues(bool& flightplanActive, bool& aiOutOfSight); + void updatePrimaryTargetValues(double dt, bool& flightplanActive, bool& aiOutOfSight); - void updateSecondaryTargetValues(); - void updatePosition(); - void updateHeading(); + void updateSecondaryTargetValues(double dt); + void updateHeading(double dt); void updateBankAngleTarget(); - void updateVerticalSpeedTarget(); + void updateVerticalSpeedTarget(double dt); void updatePitchAngleTarget(); - void updateActualState(); - void handleATCRequests(); - void checkVisibility(); + void updateActualState(double dt); + void updateModelProperties(double dt); + void handleATCRequests(double dt); + inline bool isStationary() { return ((fabs(speed)<=0.0001)&&(fabs(tgt_speed)<=0.0001));} + inline bool needGroundElevation() { if (!isStationary()) _needsGroundElevation=true;return _needsGroundElevation;} + double sign(double x); @@ -145,14 +172,23 @@ private: bool holdPos; - bool _getGearDown() const; - const char * _getTransponderCode() const; - bool reachedWaypoint; + bool needsTaxiClearance; + bool _needsGroundElevation; + int takeOffStatus; // 1 = joined departure cue; 2 = Passed DepartureHold waypoint; handover control to tower; 0 = any other state. time_t timeElapsed; PerformanceData* _performance; // the performance data for this aircraft + + void assertSpeed(double speed); + + struct + { + double remainingLength; + std::string startWptName; + std::string finalWptName; + } trackCache; };