From: curt Date: Tue, 2 May 2000 19:41:35 +0000 (+0000) Subject: Instrument panel / steam updates for more realistic modeling of various X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=4f6ed28a176a7122846301c1295f780ba4387b8d;p=flightgear.git Instrument panel / steam updates for more realistic modeling of various instruments (contributed by Alex Perry) --- diff --git a/src/Cockpit/hud_ladr.cxx b/src/Cockpit/hud_ladr.cxx index e3143cee6..6500b80b6 100644 --- a/src/Cockpit/hud_ladr.cxx +++ b/src/Cockpit/hud_ladr.cxx @@ -108,6 +108,7 @@ void HudLadder :: draw( void ) glPushMatrix(); glTranslatef( centroid.x, centroid.y, 0); + glScalef( current_options.get_fov()/55.0, 1.0, 1.0 ); glRotatef(roll_value * RAD_TO_DEG, 0.0, 0.0, 1.0); // Draw the target spot. diff --git a/src/Cockpit/sp_panel.cxx b/src/Cockpit/sp_panel.cxx index 1d59fd37f..a1ab6842f 100644 --- a/src/Cockpit/sp_panel.cxx +++ b/src/Cockpit/sp_panel.cxx @@ -183,8 +183,8 @@ createTurnCoordinator (int x, int y) // moves with roll inst->addLayer(createTexture("Textures/Panel/turn.rgb")); inst->addTransformation(FGInstrumentLayer::ROTATION, - FGSteam::get_TC_radps, - -30.0, 30.0, 1.0, 0.0); + FGSteam::get_TC_std, + -2.5, 2.5, 20.0, 0.0); // Layer 2: little ball // moves with slip/skid @@ -227,18 +227,18 @@ createGyroCompass (int x, int y) // rotates with heading inst->addLayer(createTexture("Textures/Panel/gyro-bg.rgb")); inst->addTransformation(FGInstrumentLayer::ROTATION, - FGBFI::getHeading, - -360.0, 360.0, -1.0, 0.0); + FGSteam::get_MH_deg, + -720.0, 720.0, -1.0, 0.0); // Layer 1: heading bug // rotates with heading and AP heading inst->addLayer(createTexture("Textures/Panel/bug.rgb")); inst->addTransformation(FGInstrumentLayer::ROTATION, - FGBFI::getHeading, - -360.0, 360.0, -1.0, 0.0); + FGSteam::get_MH_deg, + -720.0, 720.0, -1.0, 0.0); inst->addTransformation(FGInstrumentLayer::ROTATION, FGBFI::getAPHeading, - -360.0, 360.0, 1.0, 0.0); + -720.0, 720.0, 1.0, 0.0); // Layer 2: fixed center inst->addLayer(createTexture("Textures/Panel/gyro-fg.rgb")); diff --git a/src/Cockpit/steam.cxx b/src/Cockpit/steam.cxx index 9ed946f56..106debe06 100644 --- a/src/Cockpit/steam.cxx +++ b/src/Cockpit/steam.cxx @@ -31,8 +31,10 @@ #include #include +#include #include
#include
+#include FG_USING_NAMESPACE(std); @@ -48,9 +50,6 @@ FG_USING_NAMESPACE(std); // Anything that reads the BFI directly is not implemented at all! -#define VARY_E (14) - - double FGSteam::the_STATIC_inhg = 29.92; double FGSteam::the_ALT_ft = 0.0; double FGSteam::get_ALT_ft() { _CatchUp(); return the_ALT_ft; } @@ -64,15 +63,20 @@ double FGSteam::get_VSI_fps() { _CatchUp(); return the_VSI_fps; } double FGSteam::the_VACUUM_inhg = 0.0; double FGSteam::get_VACUUM_inhg() { _CatchUp(); return the_VACUUM_inhg; } -double FGSteam::get_MH_deg () { - return FGBFI::getHeading () - FGBFI::getMagVar (); -} -double FGSteam::get_DG_deg () { - return FGBFI::getHeading () - FGBFI::getMagVar (); -} +double FGSteam::the_MH_err = 0.0; +double FGSteam::the_MH_deg = 0.0; +double FGSteam::the_MH_degps = 0.0; +double FGSteam::get_MH_deg () { _CatchUp(); return the_MH_deg; } + +double FGSteam::the_DG_deg = 0.0; +double FGSteam::the_DG_degps = 0.0; +double FGSteam::the_DG_inhg = 0.0; +double FGSteam::get_DG_deg () { _CatchUp(); return the_DG_deg; } -double FGSteam::get_TC_rad () { return FGBFI::getSideSlip (); } -double FGSteam::get_TC_radps () { return FGBFI::getRoll (); } +double FGSteam::the_TC_rad = 0.0; +double FGSteam::the_TC_std = 0.0; +double FGSteam::get_TC_rad () { _CatchUp(); return the_TC_rad; } +double FGSteam::get_TC_std () { _CatchUp(); return the_TC_std; } //////////////////////////////////////////////////////////////////////// @@ -126,14 +130,124 @@ void FGSteam::set_lowpass ( double *outthe, double inthe, double tc ) void FGSteam::_CatchUp() { if ( _UpdatesPending != 0 ) { double dt = _UpdatesPending * 1.0 / current_options.get_model_hz(); + double AccN, AccE, AccU; int i,j; double d, the_ENGINE_rpm; - /* + +#if 0 + /************************** + There is the possibility that this is the first call. + If this is the case, we will emit the feature registrations + just to be on the safe side. Doing it more than once will + waste CPU time but doesn't hurt anything really. + */ + if ( _UpdatesPending == 999 ) + { FGFeature::register_int ( "Avionics/NAV1/Localizer", &NAV1_LOC ); + FGFeature::register_double ( "Avionics/NAV1/Latitude", &NAV1_Lat ); + FGFeature::register_double ( "Avionics/NAV1/Longitude", &NAV1_Lon ); + FGFeature::register_double ( "Avionics/NAV1/Radial", &NAV1_Rad ); + FGFeature::register_double ( "Avionics/NAV1/Altitude", &NAV1_Alt ); + FGFeature::register_int ( "Avionics/NAV2/Localizer", &NAV2_LOC ); + FGFeature::register_double ( "Avionics/NAV2/Latitude", &NAV2_Lat ); + FGFeature::register_double ( "Avionics/NAV2/Longitude", &NAV2_Lon ); + FGFeature::register_double ( "Avionics/NAV2/Radial", &NAV2_Rad ); + FGFeature::register_double ( "Avionics/NAV2/Altitude", &NAV2_Alt ); + FGFeature::register_double ( "Avionics/ADF/Latitude", &ADF_Lat ); + FGFeature::register_double ( "Avionics/ADF/Longitude", &ADF_Lon ); + } +#endif + + /************************** Someone has called our update function and it turns out that we are running somewhat behind. Here, we recalculate everything for a 'dt' second step. */ + /************************** + The ball responds to the acceleration vector in the body + frame, only the components perpendicular to the longitudinal + axis of the aircraft. This is only related to actual + side slip for a symmetrical aircraft which is not touching + the ground and not changing its attitude. Math simplifies + by assuming (for small angles) arctan(x)=x in radians. + Obvious failure mode is the absence of liquid in the + tube, which is there to damp the motion, so that instead + the ball will bounce around, hitting the tube ends. + More subtle flaw is having it not move or a travel limit + occasionally due to some dirt in the tube or on the ball. + */ + // the_TC_rad = - ( FGBFI::getSideSlip () ); /* incorrect */ + d = - current_aircraft.fdm_state->get_A_Z_pilot(); + if ( d < 1 ) d = 1; + set_lowpass ( & the_TC_rad, + current_aircraft.fdm_state->get_A_Y_pilot () / d, + dt ); + + /************************** + The rate of turn indication is from an electric gyro. + We should have it spin up with the master switch. + It is mounted at a funny angle so that it detects + both rate of bank (i.e. rolling into and out of turns) + and the rate of turn (i.e. how fast heading is changing). + */ + set_lowpass ( & the_TC_std, + current_aircraft.fdm_state->get_Phi_dot () + * RAD_TO_DEG / 20.0 + + current_aircraft.fdm_state->get_Psi_dot () + * RAD_TO_DEG / 3.0 , dt ); + + /************************** + We want to know the pilot accelerations, + to compute the magnetic compass errors. + */ + AccN = current_aircraft.fdm_state->get_V_dot_north(); + AccE = current_aircraft.fdm_state->get_V_dot_east(); + AccU = current_aircraft.fdm_state->get_V_dot_down() + - 9.81 / 0.3; + if ( fabs(the_TC_rad) > 0.2 ) + { /* Massive sideslip jams it; it stops turning */ + the_MH_degps = 0.0; + the_MH_err = FGBFI::getHeading () - the_MH_deg; + } else + { double MagDip, MagVar, CosDip; + double FrcN, FrcE, FrcU, AccTot; + double EdgN, EdgE, EdgU; + double TrqN, TrqE, TrqU, Torque; + /* Find a force vector towards exact magnetic north */ + MagVar = FGBFI::getMagVar() / RAD_TO_DEG; + MagDip = FGBFI::getMagDip() / RAD_TO_DEG; + CosDip = cos ( MagDip ); + FrcN = CosDip * cos ( MagVar ); + FrcE = CosDip * sin ( MagVar ); + FrcU = sin ( MagDip ); + /* Rotation occurs around acceleration axis, + but axis magnitude is irrelevant. So compute it. */ + AccTot = AccN*AccN + AccE*AccE + AccU*AccU; + if ( AccTot > 1.0 ) AccTot = sqrt ( AccTot ); + else AccTot = 1.0; + /* Force applies to north marking on compass card */ + EdgN = cos ( the_MH_err / RAD_TO_DEG ); + EdgE = sin ( the_MH_err / RAD_TO_DEG ); + EdgU = 0.0; + /* Apply the force to the edge to get torques */ + TrqN = EdgE * FrcU - EdgU * FrcE; + TrqE = EdgU * FrcN - EdgN * FrcU; + TrqU = EdgN * FrcE - EdgE * FrcN; + /* Select the component parallel to the axis */ + Torque = ( TrqN * AccN + + TrqE * AccE + + TrqU * AccU ) * 5.0 / AccTot; + /* The magnetic compass has angular momentum, + so we apply a torque to it and wait */ + if ( dt < 1.0 ) + { the_MH_degps= the_MH_degps * (1.0 - dt) - Torque; + the_MH_err += dt * the_MH_degps; + } + if ( the_MH_err > 180.0 ) the_MH_err -= 360.0; else + if ( the_MH_err < -180.0 ) the_MH_err += 360.0; + the_MH_deg = FGBFI::getHeading () - the_MH_err; + } + /************************** This is not actually correct, but provides a scaling capability for the vacuum pump later on. @@ -201,6 +315,7 @@ void FGSteam::_CatchUp() > have it tumble when you exceed the usual pitch or bank limits, > put in those insidious turning errors ... for now anyway. */ + the_DG_deg = FGBFI::getHeading () - FGBFI::getMagVar (); /************************** Finished updates, now clear the timer @@ -216,19 +331,6 @@ void FGSteam::_CatchUp() double FGSteam::get_HackGS_deg () { - -#if 0 - double x,y,dme; - if (0==NAV1_LOC) return 0.0; - y = 60.0 * ( NAV1_Lat - FGBFI::getLatitude () ); - x = 60.0 * ( NAV1_Lon - FGBFI::getLongitude() ) - * cos ( FGBFI::getLatitude () / RAD_TO_DEG ); - dme = x*x + y*y; - if ( dme > 0.1 ) x = sqrt ( dme ); else x = 0.3; - y = FGBFI::getAltitude() - NAV1_Alt; - return 3.0 - (y/x) * 60.0 / 6000.0; -#endif - if ( current_radiostack->get_nav1_inrange() && current_radiostack->get_nav1_loc() ) { @@ -246,14 +348,6 @@ double FGSteam::get_HackGS_deg () { double FGSteam::get_HackVOR1_deg () { double r; -#if 0 - double x,y; - y = 60.0 * ( NAV1_Lat - FGBFI::getLatitude () ); - x = 60.0 * ( NAV1_Lon - FGBFI::getLongitude() ) - * cos ( FGBFI::getLatitude () / RAD_TO_DEG ); - r = atan2 ( x, y ) * RAD_TO_DEG - NAV1_Rad - FGBFI::getMagVar(); -#endif - if ( current_radiostack->get_nav1_inrange() ) { r = current_radiostack->get_nav1_radial() - current_radiostack->get_nav1_heading(); @@ -277,14 +371,6 @@ double FGSteam::get_HackVOR1_deg () { double FGSteam::get_HackVOR2_deg () { double r; -#if 0 - double x,y; - y = 60.0 * ( NAV2_Lat - FGBFI::getLatitude () ); - x = 60.0 * ( NAV2_Lon - FGBFI::getLongitude() ) - * cos ( FGBFI::getLatitude () / RAD_TO_DEG ); - r = atan2 ( x, y ) * RAD_TO_DEG - NAV2_Rad - FGBFI::getMagVar(); -#endif - if ( current_radiostack->get_nav2_inrange() ) { r = current_radiostack->get_nav2_radial() - current_radiostack->get_nav2_heading() + 180.0; @@ -316,14 +402,6 @@ double FGSteam::get_HackOBS2_deg () { double FGSteam::get_HackADF_deg () { double r; -#if 0 - double x,y; - y = 60.0 * ( ADF_Lat - FGBFI::getLatitude () ); - x = 60.0 * ( ADF_Lon - FGBFI::getLongitude() ) - * cos ( FGBFI::getLatitude () / RAD_TO_DEG ); - r = atan2 ( x, y ) * RAD_TO_DEG - FGBFI::getHeading (); -#endif - if ( current_radiostack->get_adf_inrange() ) { r = current_radiostack->get_adf_heading() - FGBFI::getHeading() + 180.0; diff --git a/src/Cockpit/steam.hxx b/src/Cockpit/steam.hxx index a0bf479d8..b68941b75 100644 --- a/src/Cockpit/steam.hxx +++ b/src/Cockpit/steam.hxx @@ -64,7 +64,7 @@ public: // Velocities static double get_ASI_kias (); - static double get_TC_radps (); + static double get_TC_std (); static double get_VSI_fps (); // Engine Gauges @@ -81,8 +81,11 @@ public: private: static double the_ALT_ft; + static double the_TC_rad, the_TC_std; static double the_STATIC_inhg, the_VACUUM_inhg; static double the_VSI_fps, the_VSI_case; + static double the_MH_deg, the_MH_degps, the_MH_err; + static double the_DG_deg, the_DG_degps, the_DG_inhg; static int _UpdatesPending; static void _CatchUp (); diff --git a/src/FDM/LaRCsim.cxx b/src/FDM/LaRCsim.cxx index 651f264a4..e47457dab 100644 --- a/src/FDM/LaRCsim.cxx +++ b/src/FDM/LaRCsim.cxx @@ -327,7 +327,7 @@ int FGLaRCsim::copy_from_LaRCsim() { // set_Moments_Gear( M_l_gear, M_m_gear, M_n_gear ); // Accelerations - // set_Accels_Local( V_dot_north, V_dot_east, V_dot_down ); + set_Accels_Local( V_dot_north, V_dot_east, V_dot_down ); set_Accels_Body( U_dot_body, V_dot_body, W_dot_body ); set_Accels_CG_Body( A_X_cg, A_Y_cg, A_Z_cg ); set_Accels_Pilot_Body( A_X_pilot, A_Y_pilot, A_Z_pilot ); diff --git a/src/FDM/flight.hxx b/src/FDM/flight.hxx index c0c6c0319..8aa3b7841 100644 --- a/src/FDM/flight.hxx +++ b/src/FDM/flight.hxx @@ -298,14 +298,14 @@ public: FG_VECTOR_3 v_dot_local_v; // inline double * get_V_dot_local_v() { return v_dot_local_v; } - // inline double get_V_dot_north() const { return v_dot_local_v[0]; } - // inline double get_V_dot_east() const { return v_dot_local_v[1]; } - // inline double get_V_dot_down() const { return v_dot_local_v[2]; } - /* inline void set_Accels_Local( double north, double east, double down ) { + inline double get_V_dot_north() const { return v_dot_local_v[0]; } + inline double get_V_dot_east() const { return v_dot_local_v[1]; } + inline double get_V_dot_down() const { return v_dot_local_v[2]; } + inline void set_Accels_Local( double north, double east, double down ) { v_dot_local_v[0] = north; v_dot_local_v[1] = east; v_dot_local_v[2] = down; - } */ + } FG_VECTOR_3 v_dot_body_v; // inline double * get_V_dot_body_v() { return v_dot_body_v; } @@ -529,9 +529,9 @@ public: FG_VECTOR_3 euler_rates_v; // inline double * get_Euler_rates_v() { return euler_rates_v; } - // inline double get_Phi_dot() const { return euler_rates_v[0]; } - // inline double get_Theta_dot() const { return euler_rates_v[1]; } - // inline double get_Psi_dot() const { return euler_rates_v[2]; } + inline double get_Phi_dot() const { return euler_rates_v[0]; } + inline double get_Theta_dot() const { return euler_rates_v[1]; } + inline double get_Psi_dot() const { return euler_rates_v[2]; } inline void set_Euler_Rates( double phi, double theta, double psi ) { euler_rates_v[0] = phi; euler_rates_v[1] = theta; diff --git a/src/GUI/gui.cxx b/src/GUI/gui.cxx index cc0c0b141..f8200d075 100644 --- a/src/GUI/gui.cxx +++ b/src/GUI/gui.cxx @@ -678,7 +678,7 @@ void guiFixPanel( void ) int toggle_pause; if ( current_options.get_panel_status() ) { - FGView *v = ¤t_view; + // FGView *v = ¤t_view; FGTime *t = FGTime::cur_time_params; if( (toggle_pause = !t->getPause()) ) @@ -809,11 +809,11 @@ void ConfirmExitDialogInit(void) YNdialogBoxOkButton = new puOneShot (100, 10, 160, 50); YNdialogBoxOkButton -> setLegend (gui_msg_OK); + YNdialogBoxOkButton -> makeReturnDefault (TRUE ); YNdialogBoxOkButton -> setCallback (goodBye); YNdialogBoxNoButton = new puOneShot (240, 10, 300, 50); YNdialogBoxNoButton -> setLegend (gui_msg_NO); - // YNdialogBoxNoButton -> makeReturnDefault (TRUE ); YNdialogBoxNoButton -> setCallback (goAwayYesNoCb); } FG_FINALIZE_PUI_DIALOG( YNdialogBox ); diff --git a/src/NetworkOLK/Makefile.am b/src/NetworkOLK/Makefile.am index 9b845a7d9..9eb82a8c9 100644 --- a/src/NetworkOLK/Makefile.am +++ b/src/NetworkOLK/Makefile.am @@ -1,6 +1,7 @@ noinst_LIBRARIES = libNetworkOLK.a libNetworkOLK_a_SOURCES = \ - net_send.cxx net_hud.cxx network.cxx network.h fgd.h + net_send.cxx net_hud.cxx network.cxx network.h fgd.h \ + features.cxx features.hxx INCLUDES += -I$(top_builddir) -I$(top_builddir)/src