X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAutopilot%2Fnewauto.hxx;h=a2670d319c61a1019440b20406e4aba6de03f7ac;hb=a682823adaf0fded092a7c6cfc5d099c27525ba8;hp=feeca7ab4b3b2080c782f2aa4148d2130620b00b;hpb=f5cc3b9b9ce5d8358ce645badd3d6bfde6a717d2;p=flightgear.git diff --git a/src/Autopilot/newauto.hxx b/src/Autopilot/newauto.hxx index feeca7ab4..a2670d319 100644 --- a/src/Autopilot/newauto.hxx +++ b/src/Autopilot/newauto.hxx @@ -27,28 +27,36 @@ #define _NEWAUTO_HXX +#include #include +#include
+#include
// Structures -class FGAutopilot { +class FGAutopilot : public FGSubsystem +{ public: enum fgAutoHeadingMode { - FG_HEADING_LOCK = 0, - FG_HEADING_NAV1 = 1, - FG_HEADING_NAV2 = 2, - FG_HEADING_WAYPOINT = 3 + FG_DG_HEADING_LOCK = 0, // follow bug on directional gryo + FG_TC_HEADING_LOCK = 1, // keep turn coordinator zero'd + FG_TRUE_HEADING_LOCK = 2, // lock to true heading (i.e. a perfect world) + FG_HEADING_NAV1 = 3, // follow nav1 radial + FG_HEADING_NAV2 = 4, // follow nav2 radial + FG_HEADING_WAYPOINT = 5 // track next waypoint }; enum fgAutoAltitudeMode { - FG_ALTITUDE_LOCK = 0, - FG_ALTITUDE_TERRAIN = 1, - FG_ALTITUDE_GS1 = 2, - FG_ALTITUDE_GS2 = 3 + FG_ALTITUDE_LOCK = 0, // lock to a specific altitude + FG_ALTITUDE_TERRAIN = 1, // try to maintain a specific AGL + FG_ALTITUDE_GS1 = 2, // follow glide slope 1 + FG_ALTITUDE_GS2 = 3, // follow glide slope 2 + FG_ALTITUDE_ARM = 4 // ascend to selected altitude }; + private: bool heading_hold; // the current state of the heading hold @@ -63,12 +71,13 @@ private: // double TargetLatitude; // the latitude the AP should steer to. // double TargetLongitude; // the longitude the AP should steer to. double TargetDistance; // the distance to Target. - double TargetHeading; // the heading the AP should steer to. + double DGTargetHeading; // the apparent DG heading to steer towards. + double TargetHeading; // the true heading the AP should steer to. double TargetAltitude; // altitude to hold double TargetAGL; // the terrain separation - double TargetClimbRate; // climb rate to shoot for + double TargetSpeed; // speed to shoot for - double alt_error_accum; // altitude error accumulator + double alt_error_accum; // altitude error accumulator double climb_error_accum; // climb error accumulator (for GS) double speed_error_accum; // speed error accumulator @@ -100,21 +109,59 @@ private: char TargetLatitudeStr[64]; char TargetLongitudeStr[64]; char TargetLatLonStr[64]; - char TargetDistanceStr[64]; + char TargetWP1Str[64]; + char TargetWP2Str[64]; + char TargetWP3Str[64]; char TargetHeadingStr[64]; char TargetAltitudeStr[64]; + // property nodes + SGPropertyNode *latitude_node; + SGPropertyNode *longitude_node; + SGPropertyNode *altitude_node; + SGPropertyNode *altitude_agl_node; + SGPropertyNode *vertical_speed_node; + SGPropertyNode *heading_node; + SGPropertyNode *roll_node; + SGPropertyNode *pitch_node; + + SGPropertyNode *min_climb; // minimum climb speed + SGPropertyNode *best_climb; // best climb speed + SGPropertyNode *elevator_adj_factor; // factor to optimize altitude hold adjustments + SGPropertyNode *integral_contrib; // amount of contribution of the integral + // component of the pid + SGPropertyNode *zero_pitch_throttle; // amount of throttle at which the aircraft does not pitch up + SGPropertyNode *zero_pitch_trim_full_throttle; // amount of trim required to level at full throttle + SGPropertyNode *max_aileron_node; // maximum aileron setting range -1 ~ 1 + SGPropertyNode *max_roll_node; // maximum roll setting in degrees + SGPropertyNode *roll_out_node; // start rollout offset from desired heading in degrees + SGPropertyNode *roll_out_smooth_node; // rollout smoothing offset in degrees + + SGPropertyNode *TargetClimbRate; // target climb rate + SGPropertyNode *TargetDescentRate; // target decent rate + SGPropertyNode *current_throttle; // current throttle (engine 0) + public: - // Initialize autopilot system - void init(); + // constructor + FGAutopilot(); + + // destructor + ~FGAutopilot(); + + + //////////////////////////////////////////////////////////////////// + // Implementation of FGSubsystem. + //////////////////////////////////////////////////////////////////// + + void init (); + void bind (); + void unbind (); + void update (double dt); // Reset the autopilot system void reset(void); - // run an interation of the autopilot (updates control positions) - int run(); - void AltitudeSet( double new_altitude ); void AltitudeAdjust( double inc ); void HeadingAdjust( double inc ); @@ -149,14 +196,26 @@ public: inline void set_old_lon( double val ) { old_lon = val; } inline double get_TargetHeading() const { return TargetHeading; } inline void set_TargetHeading( double val ) { TargetHeading = val; } + inline double get_DGTargetHeading() const { return DGTargetHeading; } + inline void set_DGTargetHeading( double val ) { DGTargetHeading = val; } inline double get_TargetDistance() const { return TargetDistance; } inline void set_TargetDistance( double val ) { TargetDistance = val; } inline double get_TargetAltitude() const { return TargetAltitude; } inline void set_TargetAltitude( double val ) { TargetAltitude = val; } + inline double get_TargetAGL() const { return TargetAGL; } + inline void set_TargetAGL( double val ) { TargetAGL = val; } + inline double get_TargetClimbRate() const { + return TargetClimbRate->getFloatValue(); + } + inline void set_TargetClimbRate( double val ) { + fgSetFloat( "/autopilot/config/target-climb-rate-fpm", val); + } inline char *get_TargetLatitudeStr() { return TargetLatitudeStr; } inline char *get_TargetLongitudeStr() { return TargetLongitudeStr; } - inline char *get_TargetDistanceStr() { return TargetDistanceStr; } + inline char *get_TargetWP1Str() { return TargetWP1Str; } + inline char *get_TargetWP2Str() { return TargetWP2Str; } + inline char *get_TargetWP3Str() { return TargetWP3Str; } inline char *get_TargetHeadingStr() { return TargetHeadingStr; } inline char *get_TargetAltitudeStr() { return TargetAltitudeStr; } inline char *get_TargetLatLonStr() { return TargetLatLonStr; } @@ -165,7 +224,7 @@ public: void MakeTargetLatLonStr( double lat, double lon ); void MakeTargetAltitudeStr( double altitude ); void MakeTargetHeadingStr( double bearing ); - void MakeTargetDistanceStr( double distance ); + void MakeTargetWPStr( double distance ); void update_old_control_values(); // accessors @@ -179,10 +238,46 @@ public: inline double get_RollOutSmooth() const { return RollOutSmooth; } inline void set_RollOutSmooth( double val ) { RollOutSmooth = val; } +private: + + bool getAPAltitudeLock () const; + void setAPAltitudeLock (bool lock); + double getAPAltitude () const; + void setAPAltitude (double altitude); + bool getAPGSLock () const; + void setAPGSLock (bool lock); + bool getAPTerrainLock () const; + void setAPTerrainLock (bool lock); + double getAPClimb () const; + void setAPClimb (double rate); + bool getAPHeadingLock () const; + void setAPHeadingLock (bool lock); + double getAPHeadingBug () const; + void setAPHeadingBug (double heading); + bool getAPWingLeveler () const; + void setAPWingLeveler (bool lock); + bool getAPNAV1Lock () const; + void setAPNAV1Lock (bool lock); + bool getAPAutoThrottleLock () const; + void setAPAutoThrottleLock (bool lock); + double getAPRudderControl () const; + void setAPRudderControl (double value); + double getAPElevatorControl () const; + void setAPElevatorControl (double value); + double getAPThrottleControl () const; + void setAPThrottleControl (double value); + }; -extern FGAutopilot *current_autopilot; +#define DEFAULT_AP_HEADING_LOCK FGAutopilot::FG_DG_HEADING_LOCK +// #define DEFAULT_AP_HEADING_LOCK FGAutopilot::FG_TRUE_HEADING_LOCK +#define DEFAULT_AP_ALTITUDE_LOCK FGAutopilot::FG_ALTITUDE_LOCK + +/** + * static functions for autopilot properties + */ #endif // _NEWAUTO_HXX +