X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAIAircraft.hxx;h=49639799a19de71d367330e0f201e5a64517dfb0;hb=40639d38a877b7f58702db0c2b8831985b8ddbaf;hp=6ea34c092fbfbe51d7440b3235d73125dd63f504;hpb=85a1e5cc983169594563763c903436c8f1cfa934;p=flightgear.git diff --git a/src/AIModel/AIAircraft.hxx b/src/AIModel/AIAircraft.hxx index 6ea34c092..49639799a 100644 --- a/src/AIModel/AIAircraft.hxx +++ b/src/AIModel/AIAircraft.hxx @@ -16,7 +16,7 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #ifndef _FG_AIAircraft_HXX #define _FG_AIAircraft_HXX @@ -24,71 +24,135 @@ #include "AIManager.hxx" #include "AIBase.hxx" +#include +#include +#include + #include -SG_USING_STD(string); +using std::string; +class PerformanceData; class FGAIAircraft : public FGAIBase { -private: - - typedef struct { - double accel; - double decel; - double climb_rate; - double descent_rate; - double takeoff_speed; - double climb_speed; - double cruise_speed; - double descent_speed; - double land_speed; - } PERF_STRUCT; - public: - - enum aircraft_e {LIGHT=0, WW2_FIGHTER, JET_TRANSPORT, JET_FIGHTER}; - static const PERF_STRUCT settings[]; - - FGAIAircraft(FGAIManager* mgr); - ~FGAIAircraft(); - - bool init(); - virtual void bind(); - virtual void unbind(); - void update(double dt); - - void SetPerformance(const PERF_STRUCT *ps); - void AccelTo(double speed); - void PitchTo(double angle); - void RollTo(double angle); - void YawTo(double angle); - void ClimbTo(double altitude); - void TurnTo(double heading); - + FGAIAircraft(FGAISchedule *ref=0); + ~FGAIAircraft(); + + virtual void readFromScenario(SGPropertyNode* scFileNode); + + // virtual bool init(bool search_in_AI_path=false); + virtual void bind(); + virtual void unbind(); + virtual void update(double dt); + + void setPerformance(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 ); + + void AccelTo(double speed); + void PitchTo(double angle); + void RollTo(double angle); + void YawTo(double angle); + void ClimbTo(double altitude); + void TurnTo(double heading); + + void getGroundElev(double dt); //TODO these 3 really need to be public? + void doGroundAltitude(); + bool loadNextLeg (); + + void setAcType(const string& ac) { acType = ac; }; + void setCompany(const string& comp) { company = comp;}; + + void announcePositionToController(); //TODO have to be public? + void processATC(FGATCInstruction instruction); + FGAISchedule * getTrafficRef() { return trafficRef; }; + + virtual const char* getTypeString(void) const { return "aircraft"; } + + string GetTransponderCode() { return transponderCode; }; + void SetTransponderCode(string tc) { transponderCode = tc;}; + + // included as performance data needs them, who else? + inline PerformanceData* getPerformance() { return _performance; }; + inline bool onGround() const { return no_roll; }; + inline double getSpeed() const { return speed; }; + inline double getRoll() const { return roll; }; + inline double getPitch() const { return pitch; }; + inline double getAltitude() const { return altitude_ft; }; + 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");}; + string atGate(); + protected: - static FGAIAircraft *_self; - -private: + void Run(double dt); - bool hdg_lock; - bool alt_lock; - - double dt; - - const PERF_STRUCT *performance; - - void Run(double dt); - double sign(double x); - - static bool _getGearDown(); +private: + FGAISchedule *trafficRef; + FGATCController *controller, *prevController; + + bool hdg_lock; + bool alt_lock; + double dt_count; + double dt_elev_count; + double headingChangeRate; + double headingError; + double groundTargetSpeed; + double groundOffset; + double dt; + + bool use_perf_vs; + SGPropertyNode_ptr refuel_node; + + // helpers for Run + //TODO sort out which ones are better protected virtuals to allow + //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 aiTrafficVisible(void); + void controlHeading(FGAIFlightPlan::waypoint* curr); + void controlSpeed(FGAIFlightPlan::waypoint* curr, + FGAIFlightPlan::waypoint* next); + void updatePrimaryTargetValues(); + void updateSecondaryTargetValues(); + void updatePosition(); + void updateHeading(); + void updateBankAngleTarget(); + void updateVerticalSpeedTarget(); + void updatePitchAngleTarget(); + void updateActualState(); + void handleATCRequests(); + void checkVisibility(); + + double sign(double x); + + string acType; + string company; + string transponderCode; + + int spinCounter; + double prevSpeed; + double prev_dist_to_go; + + bool holdPos; + + bool _getGearDown() const; + + const char * _getTransponderCode() const; + + bool reachedWaypoint; + time_t timeElapsed; + + PerformanceData* _performance; // the performance data for this aircraft }; -inline bool FGAIAircraft::_getGearDown() { - return ((fgGetFloat("/position/altitude-agl-ft") < 150.0) - && (fgGetFloat("/orientation/pitch-deg") < 0.0) - && (fgGetFloat("/velocities/airspeed-kt") - < _self->performance->land_speed*1.5)); -} - #endif // _FG_AIAircraft_HXX