X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FFDM%2Fflight.hxx;h=8dc1aaebb3dc48c8c2198e494519b988e196990a;hb=ee98995d30e75cda88c9866f3cb6a761fda7d078;hp=7014f82d5b1770107499cba95f04ebe6938f9111;hpb=f7b844f4d648fc48718c17ee83f6f041174dc999;p=flightgear.git diff --git a/src/FDM/flight.hxx b/src/FDM/flight.hxx index 7014f82d5..8dc1aaebb 100644 --- a/src/FDM/flight.hxx +++ b/src/FDM/flight.hxx @@ -90,83 +90,49 @@ #include #include -#include +// #include #include
+#include +#include +#include
-FG_USING_STD(list); -FG_USING_STD(vector); -FG_USING_STD(string); +SG_USING_STD(list); +SG_USING_STD(vector); +SG_USING_STD(string); typedef double FG_VECTOR_3[3]; - -class FGEngInterface { - -private: - - // inputs - double Throttle; - double Mixture; - double Prop_Advance; - - // outputs - double RPM; - double Manifold_Pressure; - double MaxHP; - double Percentage_Power; - double EGT; - double CHT; - double prop_thrust; - - /* others... - double PercentN1,N1; //GE,CFM - double PercentN2,N2; - double EPR; //P&W, RR? - double FuelFlow; - bool AfterBurner; - double InletAngles[3]; - double InletPosition[3]; - double ThrustVector[3]; - */ - -public: - FGEngInterface(void); - ~FGEngInterface(void); - - inline double get_Throttle() const { return Throttle; } - inline double get_Mixture() const { return Mixture; } - inline double get_Prop_Advance() const { return Prop_Advance; } - inline double get_RPM() const { return RPM; } - inline double get_Manifold_Pressure() const { return Manifold_Pressure; } - inline double get_MaxHP() const { return MaxHP; } - inline double get_Percentage_Power() const { return Percentage_Power; } - inline double get_EGT() const { return EGT; } - inline double get_CHT() const { return CHT; } - inline double get_prop_thrust() const { return prop_thrust; } - - inline void set_Throttle( double t ) { Throttle = t; } - inline void set_Mixture( double m ) { Mixture = m; } - inline void set_Prop_Advance( double p ) { Prop_Advance = p; } - inline void set_RPM( double r ) { RPM = r; } - inline void set_Manifold_Pressure( double mp ) { Manifold_Pressure = mp; } - inline void set_MaxHP( double hp ) { MaxHP = hp; } - inline void set_Percentage_Power( double p ) { Percentage_Power = p; } - inline void set_EGT( double e ) { EGT = e; } - inline void set_CHT( double c ) { CHT = c; } - inline void set_prop_thrust( double t ) { prop_thrust = t; } - -}; - -typedef vector < FGEngInterface > engine_list; - - // This is based heavily on LaRCsim/ls_generic.h class FGInterface : public FGSubsystem { private: + // Has the init() method been called. This is used to delay + // initialization until scenery can be loaded and we know the true + // ground elevation. + bool inited; + + // Have we bound to the property system + bool bound; + + // periodic update management variable. This is a scheme to run + // the fdm with a fixed delta-t. We control how many iteration of + // the fdm to run with the fixed dt based on the elapsed time from + // the last update. This allows us to maintain sync with the real + // time clock, even though each frame could take a random amount + // of time. Since "dt" is unlikely to divide evenly into the + // elapse time, we keep track of the remainder and add it into the + // next elapsed time. This yields a small amount of temporal + // jitter ( < dt ) but in practice seems to work well. + +// double delta_t; // delta "t" +// SGTimeStamp time_stamp; // time stamp of last run +// long elapsed; // time elapsed since last run + double remainder; // remainder time from last run +// int multi_loop; // number of iterations of "delta_t" to run + // Pilot location rel to ref pt FG_VECTOR_3 d_pilot_rp_body_v; @@ -253,18 +219,31 @@ private: double sin_longitude, cos_longitude; double sin_latitude, cos_latitude; double altitude_agl; - - // Engine list - engine_list engines; - SGTimeStamp valid_stamp; // time this record is valid - SGTimeStamp next_stamp; // time this record is valid + double daux[16]; // auxilliary doubles + float faux[16]; // auxilliary floats + int iaux[16]; // auxilliary ints + + // SGTimeStamp valid_stamp; // time this record is valid + // SGTimeStamp next_stamp; // time this record is valid + + // Model tied to FDM + FGAircraftModel * _acmodel; protected: - virtual bool init( double dt ); + + int _calc_multiloop (double dt); + +public: + + // deliberately not virtual so that + // FGInterface constructor will call + // the right version + void _setup(); void _busdump(void); - void _updatePosition( double lat_geoc, double lon, double alt ); + void _updateGeodeticPosition( double lat, double lon, double alt ); + void _updateGeocentricPosition( double lat_geoc, double lon, double alt ); void _updateWeather( void ); inline void _set_Inertias( double m, double xx, double yy, @@ -417,16 +396,22 @@ protected: cos_latitude = cos(parm); } + inline void _set_daux( int n, double value ) { daux[n] = value; } + inline void _set_faux( int n, float value ) { faux[n] = value; } + inline void _set_iaux( int n, int value ) { iaux[n] = value; } + public: - FGInterface(void); + FGInterface(); + FGInterface( double dt ); virtual ~FGInterface(); virtual void init (); virtual void bind (); virtual void unbind (); - virtual void update (); - virtual bool update( int multi_loop ); + virtual void update(double dt); + virtual bool ToggleDataLogging(bool state) { return false; } + virtual bool ToggleDataLogging(void) { return false; } // Define the various supported flight models (many not yet implemented) enum { @@ -457,29 +442,63 @@ public: FG_EXTERNAL = 10 }; + // initialization + inline bool get_inited() const { return inited; } + inline void set_inited( bool value ) { inited = value; } + + inline bool get_bound() const { return bound; } + + //perform initializion that is common to all FDM's + void common_init(); + + // time and update management values +// inline double get_delta_t() const { return delta_t; } +// inline void set_delta_t( double dt ) { delta_t = dt; } +// inline SGTimeStamp get_time_stamp() const { return time_stamp; } +// inline void set_time_stamp( SGTimeStamp s ) { time_stamp = s; } +// inline void stamp() { time_stamp.stamp(); } +// inline long get_elapsed() const { return elapsed; } +// inline void set_elapsed( long e ) { elapsed = e; } +// inline long get_remainder() const { return remainder; } +// inline void set_remainder( long r ) { remainder = r; } +// inline int get_multi_loop() const { return multi_loop; } +// inline void set_multi_loop( int ml ) { multi_loop = ml; } + // Positions virtual void set_Latitude(double lat); // geocentric virtual void set_Longitude(double lon); virtual void set_Altitude(double alt); // triggers re-calc of AGL altitude virtual void set_AltitudeAGL(double altagl); // and vice-versa virtual void set_Latitude_deg (double lat) { - set_Latitude(lat * DEG_TO_RAD); + set_Latitude(lat * SGD_DEGREES_TO_RADIANS); } virtual void set_Longitude_deg (double lon) { - set_Longitude(lon * DEG_TO_RAD); + set_Longitude(lon * SGD_DEGREES_TO_RADIANS); } // Speeds -- setting any of these will trigger a re-calc of the rest virtual void set_V_calibrated_kts(double vc); virtual void set_Mach_number(double mach); virtual void set_Velocities_Local( double north, double east, double down ); - inline void set_V_north (double north) { v_local_v[0] = north; } - inline void set_V_east (double east) { v_local_v[1] = east; } - inline void set_V_down (double down) { v_local_v[2] = down; } + inline void set_V_north (double north) { + set_Velocities_Local(north, v_local_v[1], v_local_v[2]); + } + inline void set_V_east (double east) { + set_Velocities_Local(v_local_v[0], east, v_local_v[2]); + } + inline void set_V_down (double down) { + set_Velocities_Local(v_local_v[0], v_local_v[1], down); + } virtual void set_Velocities_Wind_Body( double u, double v, double w); - virtual void set_uBody (double uBody) { v_wind_body_v[0] = uBody; } - virtual void set_vBody (double vBody) { v_wind_body_v[1] = vBody; } - virtual void set_wBody (double wBody) { v_wind_body_v[2] = wBody; } + virtual void set_uBody (double uBody) { + set_Velocities_Wind_Body(uBody, v_wind_body_v[1], v_wind_body_v[2]); + } + virtual void set_vBody (double vBody) { + set_Velocities_Wind_Body(v_wind_body_v[0], vBody, v_wind_body_v[2]); + } + virtual void set_wBody (double wBody) { + set_Velocities_Wind_Body(v_wind_body_v[0], v_wind_body_v[1], wBody); + } // Euler angles virtual void set_Euler_Angles( double phi, double theta, double psi ); @@ -492,19 +511,17 @@ public: virtual void set_Psi (double psi) { set_Euler_Angles(get_Phi(), get_Theta(), psi); } - virtual void set_Phi_deg (double phi) { set_Phi(phi * DEG_TO_RAD); } + virtual void set_Phi_deg (double phi) { set_Phi(phi * SGD_DEGREES_TO_RADIANS); } virtual void set_Theta_deg (double theta) { - set_Theta(theta * DEG_TO_RAD); + set_Theta(theta * SGD_DEGREES_TO_RADIANS); } - virtual void set_Psi_deg (double psi) { set_Psi(psi * DEG_TO_RAD); } + virtual void set_Psi_deg (double psi) { set_Psi(psi * SGD_DEGREES_TO_RADIANS); } // Flight Path virtual void set_Climb_Rate( double roc); virtual void set_Gamma_vert_rad( double gamma); // Earth - virtual void set_Sea_level_radius(double slr); - virtual void set_Runway_altitude(double ralt); virtual void set_Static_pressure(double p); virtual void set_Static_temperature(double T); @@ -513,8 +530,7 @@ public: virtual void set_Velocities_Local_Airmass (double wnorth, double weast, double wdown ); - - + // ========== Mass properties and geometry values ========== // Inertias @@ -684,7 +700,7 @@ public: // n_pilot_body_v[2] = z; // } - inline double get_Nlf(void) { return nlf; } + inline double get_Nlf(void) const { return nlf; } // inline double * get_Omega_dot_body_v() { return omega_dot_body_v; } // inline double get_P_dot_body() const { return omega_dot_body_v[0]; } @@ -707,18 +723,21 @@ public: inline double get_vBody () const { return v_wind_body_v[1]; } inline double get_wBody () const { return v_wind_body_v[2]; } - // inline double * get_V_local_rel_ground_v() { - // return v_local_rel_ground_v; - // } - // inline double get_V_north_rel_ground() const { - // return v_local_rel_ground_v[0]; - // } - // inline double get_V_east_rel_ground() const { - // return v_local_rel_ground_v[1]; - // } - // inline double get_V_down_rel_ground() const { - // return v_local_rel_ground_v[2]; - // } + // Please dont comment these out. fdm=ada uses these (see + // cockpit.cxx) ---> + inline double * get_V_local_rel_ground_v() { + return v_local_rel_ground_v; + } + inline double get_V_north_rel_ground() const { + return v_local_rel_ground_v[0]; + } + inline double get_V_east_rel_ground() const { + return v_local_rel_ground_v[1]; + } + inline double get_V_down_rel_ground() const { + return v_local_rel_ground_v[2]; + } + // <--- fdm=ada uses these (see cockpit.cxx) // inline double * get_V_local_airmass_v() { return v_local_airmass_v; } inline double get_V_north_airmass() const { return v_local_airmass_v[0]; } @@ -765,7 +784,7 @@ public: inline double get_V_rel_wind() const { return v_rel_wind; } // inline void set_V_rel_wind(double wind) { v_rel_wind = wind; } - // inline double get_V_true_kts() const { return v_true_kts; } + inline double get_V_true_kts() const { return v_true_kts; } // inline void set_V_true_kts(double kts) { v_true_kts = kts; } // inline double get_V_rel_ground() const { return v_rel_ground; } @@ -843,19 +862,19 @@ public: inline double get_Altitude_AGL(void) const { return altitude_agl; } inline double get_Latitude_deg () const { - return get_Latitude() * RAD_TO_DEG; + return get_Latitude() * SGD_RADIANS_TO_DEGREES; } inline double get_Longitude_deg () const { - return get_Longitude() * RAD_TO_DEG; + return get_Longitude() * SGD_RADIANS_TO_DEGREES; } // inline double * get_Euler_angles_v() { return euler_angles_v; } inline double get_Phi() const { return euler_angles_v[0]; } inline double get_Theta() const { return euler_angles_v[1]; } inline double get_Psi() const { return euler_angles_v[2]; } - inline double get_Phi_deg () const { return get_Phi() * RAD_TO_DEG; } - inline double get_Theta_deg () const { return get_Theta() * RAD_TO_DEG; } - inline double get_Psi_deg () const { return get_Psi() * RAD_TO_DEG; } + inline double get_Phi_deg () const { return get_Phi() * SGD_RADIANS_TO_DEGREES; } + inline double get_Theta_deg () const { return get_Theta() * SGD_RADIANS_TO_DEGREES; } + inline double get_Psi_deg () const { return get_Psi() * SGD_RADIANS_TO_DEGREES; } // ========== Miscellaneous quantities ========== @@ -900,10 +919,12 @@ public: // } inline double get_Alpha() const { return alpha; } + inline double get_Alpha_deg() const { return alpha * SGD_RADIANS_TO_DEGREES; } inline double get_Beta() const { return beta; } - // inline double get_Alpha_dot() const { return alpha_dot; } + inline double get_Beta_deg() const { return beta * SGD_RADIANS_TO_DEGREES; } + inline double get_Alpha_dot() const { return alpha_dot; } // inline void set_Alpha_dot( double ad ) { alpha_dot = ad; } - // inline double get_Beta_dot() const { return beta_dot; } + inline double get_Beta_dot() const { return beta_dot; } // inline void set_Beta_dot( double bd ) { beta_dot = bd; } // inline double get_Cos_alpha() const { return cos_alpha; } @@ -938,15 +959,15 @@ public: inline double get_Mach_number() const { return mach_number; } inline double get_Static_pressure() const { return static_pressure; } - // inline double get_Total_pressure() const { return total_pressure; } + inline double get_Total_pressure() const { return total_pressure; } // inline void set_Total_pressure( double tp ) { total_pressure = tp; } // inline double get_Impact_pressure() const { return impact_pressure; } // inline void set_Impact_pressure( double ip ) { impact_pressure = ip; } - // inline double get_Dynamic_pressure() const { return dynamic_pressure; } + inline double get_Dynamic_pressure() const { return dynamic_pressure; } // inline void set_Dynamic_pressure( double dp ) { dynamic_pressure = dp; } inline double get_Static_temperature() const { return static_temperature; } - // inline double get_Total_temperature() const { return total_temperature; } + inline double get_Total_temperature() const { return total_temperature; } // inline void set_Total_temperature( double t ) { total_temperature = t; } inline double get_Sea_level_radius() const { return sea_level_radius; } @@ -1023,8 +1044,8 @@ public: inline double get_Climb_Rate() const { return climb_rate; } - inline SGTimeStamp get_time_stamp() const { return valid_stamp; } - inline void stamp_time() { valid_stamp = next_stamp; next_stamp.stamp(); } + // inline SGTimeStamp get_time_stamp() const { return valid_stamp; } + // inline void stamp_time() { valid_stamp = next_stamp; next_stamp.stamp(); } // Extrapolate FDM based on time_offset (in usec) void extrapolate( int time_offset ); @@ -1051,18 +1072,17 @@ public: return cos_latitude; } - // engines - inline double get_num_engines() const { - return engines.size(); - } + // Auxilliary variables + inline double get_daux( int n ) const { return daux[n]; } + inline float get_faux( int n ) const { return faux[n]; } + inline int get_iaux( int n ) const { return iaux[n]; } - inline FGEngInterface* get_engine( int i ) { - return &engines[i]; - } + // Model tied to FDM + FGAircraftModel * getACModel() const { return _acmodel; } + + // Note that currently this is the "same" value runway altitude... + inline double get_ground_elev_ft() const { return runway_altitude; } - inline void add_engine( FGEngInterface e ) { - engines.push_back( e ); - } }; @@ -1076,11 +1096,9 @@ extern FGInterface * cur_fdm_state; // General interface to the flight model routines -// Set the altitude (force) -void fgFDMForceAltitude(const string &model, double alt_meters); -// Set the local ground elevation -void fgFDMSetGroundElevation(const string &model, double alt_meters); +// Toggle data logging on/off +void fgToggleFDMdataLogging(void); #endif // _FLIGHT_HXX