From 5aee96c481e99a4b17fc9df4b7959ae2fa89ac2c Mon Sep 17 00:00:00 2001 From: david Date: Sun, 7 Jul 2002 15:45:56 +0000 Subject: [PATCH] Change FGSteam into a proper subsystem rather than a collection of static methods, and remove outdated dependency in panel_io.cxx. --- src/Autopilot/newauto.cxx | 8 +- src/Cockpit/built_in/FGMagRibbon.cxx | 2 +- src/Cockpit/panel_io.cxx | 1 - src/Cockpit/steam.cxx | 244 ++++++++++++++++++--------- src/Cockpit/steam.hxx | 76 +++++---- src/Main/fg_init.cxx | 9 + src/Main/globals.hxx | 7 + src/Main/main.cxx | 5 +- 8 files changed, 236 insertions(+), 116 deletions(-) diff --git a/src/Autopilot/newauto.cxx b/src/Autopilot/newauto.cxx index 1341368d9..f32338833 100644 --- a/src/Autopilot/newauto.cxx +++ b/src/Autopilot/newauto.cxx @@ -481,7 +481,8 @@ FGAutopilot::update (double dt) // heading hold if ( heading_hold == true ) { if ( heading_mode == FG_DG_HEADING_LOCK ) { - TargetHeading = DGTargetHeading + FGSteam::get_DG_err(); + TargetHeading = DGTargetHeading + + globals->get_steam()->get_DG_err(); while ( TargetHeading < 0.0 ) { TargetHeading += 360.0; } while ( TargetHeading > 360.0 ) { TargetHeading -= 360.0; } MakeTargetHeadingStr( TargetHeading ); @@ -603,7 +604,7 @@ FGAutopilot::update (double dt) if ( heading_mode == FG_TC_HEADING_LOCK ) { // drive the turn coordinator to zero - double turn = FGSteam::get_TC_std(); + double turn = globals->get_steam()->get_TC_std(); double AileronSet = -turn / 2.0; SG_CLAMP_RANGE( AileronSet, -1.0, 1.0 ); globals->get_controls()->set_aileron( AileronSet ); @@ -689,7 +690,8 @@ FGAutopilot::update (double dt) if ( altitude_mode == FG_ALTITUDE_LOCK ) { climb_rate = - ( TargetAltitude - FGSteam::get_ALT_ft() * SG_FEET_TO_METER ) * 8.0; + ( TargetAltitude - + globals->get_steam()->get_ALT_ft() * SG_FEET_TO_METER ) * 8.0; } else if ( altitude_mode == FG_ALTITUDE_GS1 ) { double x = current_radiostack->get_nav1_gs_dist(); double y = (altitude_node->getDoubleValue() diff --git a/src/Cockpit/built_in/FGMagRibbon.cxx b/src/Cockpit/built_in/FGMagRibbon.cxx index bcbfce41b..f76d1126f 100644 --- a/src/Cockpit/built_in/FGMagRibbon.cxx +++ b/src/Cockpit/built_in/FGMagRibbon.cxx @@ -33,7 +33,7 @@ FGMagRibbon::FGMagRibbon (int w, int h) void FGMagRibbon::draw () { - double heading = FGSteam::get_MH_deg(); + double heading = globals->get_steam()->get_MH_deg(); double xoffset, yoffset; while (heading >= 360.0) { diff --git a/src/Cockpit/panel_io.cxx b/src/Cockpit/panel_io.cxx index 4e89749ca..f3922b8da 100644 --- a/src/Cockpit/panel_io.cxx +++ b/src/Cockpit/panel_io.cxx @@ -45,7 +45,6 @@ #include #include "panel.hxx" -#include "steam.hxx" #include "panel_io.hxx" //built-in layers diff --git a/src/Cockpit/steam.cxx b/src/Cockpit/steam.cxx index 2f3e64bf5..39583312a 100644 --- a/src/Cockpit/steam.cxx +++ b/src/Cockpit/steam.cxx @@ -30,6 +30,8 @@ #include #include #include + +#include
#include #ifdef FG_WEATHERCM # include @@ -48,94 +50,177 @@ static bool isTied = false; //////////////////////////////////////////////////////////////////////// -// Declare the functions that read the variables +// Constructor and destructor. //////////////////////////////////////////////////////////////////////// -double FGSteam::the_STATIC_inhg = 29.92; -double FGSteam::the_ALT_ft = 0.0; // Indicated altitude -double FGSteam::get_ALT_ft() { _CatchUp(); return the_ALT_ft; } - -double FGSteam::the_ALT_datum_mb = 1013.0; -double FGSteam::get_ALT_datum_mb() { return the_ALT_datum_mb; } - -void FGSteam::set_ALT_datum_mb ( double datum_mb ) { - the_ALT_datum_mb = datum_mb; +FGSteam::FGSteam () + : the_STATIC_inhg(29.92), + the_ALT_ft(0.0), + the_ALT_datum_mb(1013.0), + the_VSI_case(29.92), + the_VSI_fps(0.0), + the_VACUUM_inhg(0.0), + the_MH_err(0.0), + the_MH_deg(0.0), + the_MH_degps(0.0), + the_DG_err(0.0), + the_DG_deg(0.0), + the_DG_degps(0.0), + the_DG_inhg(0.0), + the_TC_rad(0.0), + the_TC_std(0.0), + _UpdateTimePending(1000000) +{ } -double FGSteam::get_ASI_kias() { return fgGetDouble("/velocities/airspeed-kt"); } - -double FGSteam::the_VSI_case = 29.92; -double FGSteam::the_VSI_fps = 0.0; -double FGSteam::get_VSI_fps() { _CatchUp(); return the_VSI_fps; } +FGSteam::~FGSteam () +{ +} -double FGSteam::the_VACUUM_inhg = 0.0; -double FGSteam::get_VACUUM_inhg() { _CatchUp(); return the_VACUUM_inhg; } +void +FGSteam::init () +{ + _heading_deg_node = fgGetNode("/orientation/heading-deg", true); + _mag_var_deg_node = fgGetNode("/environment/magnetic-variation-deg", true); + _mag_dip_deg_node = fgGetNode("/environment/magnetic-dip-deg", true); + _engine_0_rpm_node = fgGetNode("/engines/engine[0]/rpm", true); + _pressure_inhg_node = fgGetNode("environment/pressure-inhg", true); +} -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; } +void +FGSteam::update (double dt_sec) +{ + _UpdateTimePending += dt_sec; + _CatchUp(); +} -double FGSteam::the_DG_err = 0.0; -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_DG_err () { _CatchUp(); return the_DG_err; } +void +FGSteam::bind () +{ + fgTie("/steam/airspeed-kt", this, &FGSteam::get_ASI_kias); + fgSetArchivable("/steam/airspeed-kt"); + fgTie("/steam/altitude-ft", this, &FGSteam::get_ALT_ft); + fgSetArchivable("/steam/altitude-ft"); + fgTie("/steam/altimeter-datum-mb", this, + &FGSteam::get_ALT_datum_mb, &FGSteam::set_ALT_datum_mb, + false); /* don't modify the value */ + fgSetArchivable("/steam/altimeter-datum-mb"); + fgTie("/steam/turn-rate", this, &FGSteam::get_TC_std); + fgSetArchivable("/steam/turn-rate"); + fgTie("/steam/slip-skid",this, &FGSteam::get_TC_rad); + fgSetArchivable("/steam/slip-skid"); + fgTie("/steam/vertical-speed-fps", this, &FGSteam::get_VSI_fps); + fgSetArchivable("/steam/vertical-speed-fps"); + fgTie("/steam/gyro-compass-deg", this, &FGSteam::get_DG_deg); + fgSetArchivable("/steam/gyro-compass-deg"); + // fgTie("/steam/adf-deg", FGSteam::get_HackADF_deg); + // fgSetArchivable("/steam/adf-deg"); + fgTie("/steam/gyro-compass-error-deg", this, + &FGSteam::get_DG_err, &FGSteam::set_DG_err, + false); /* don't modify the value */ + fgSetArchivable("/steam/gyro-compass-error-deg"); + fgTie("/steam/mag-compass-deg", this, &FGSteam::get_MH_deg); + fgSetArchivable("/steam/mag-compass-deg"); +} -void FGSteam::set_DG_err ( double approx_magvar ) { - the_DG_err = approx_magvar; +void +FGSteam::unbind () +{ + fgUntie("/steam/airspeed-kt"); + fgUntie("/steam/altitude-ft"); + fgUntie("/steam/altimeter-datum-mb"); + fgUntie("/steam/turn-rate"); + fgUntie("/steam/slip-skid"); + fgUntie("/steam/vertical-speed-fps"); + fgUntie("/steam/gyro-compass-deg"); + fgUntie("/steam/gyro-compass-error-deg"); + fgUntie("/steam/mag-compass-deg"); } -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; } //////////////////////////////////////////////////////////////////////// -// Recording the current time +// Declare the functions that read the variables //////////////////////////////////////////////////////////////////////// +double +FGSteam::get_ALT_ft () const +{ + return the_ALT_ft; +} -double FGSteam::_UpdateTimePending = 1000000; /* Forces filters to reset */ +double +FGSteam::get_ALT_datum_mb () const +{ + return the_ALT_datum_mb; +} +void +FGSteam::set_ALT_datum_mb (double datum_mb) +{ + the_ALT_datum_mb = datum_mb; +} - // FIXME: no need to use static - // functions any longer. +double +FGSteam::get_ASI_kias () const +{ + return fgGetDouble("/velocities/airspeed-kt"); +} -void FGSteam::update (double dt) +double +FGSteam::get_VSI_fps () const { - if (!isTied) { - isTied = true; - fgTie("/steam/airspeed-kt", FGSteam::get_ASI_kias); - fgSetArchivable("/steam/airspeed-kt"); - fgTie("/steam/altitude-ft", FGSteam::get_ALT_ft); - fgSetArchivable("/steam/altitude-ft"); - fgTie("/steam/altimeter-datum-mb", - FGSteam::get_ALT_datum_mb, FGSteam::set_ALT_datum_mb, - false); /* don't modify the value */ - fgSetArchivable("/steam/altimeter-datum-mb"); - fgTie("/steam/turn-rate", FGSteam::get_TC_std); - fgSetArchivable("/steam/turn-rate"); - fgTie("/steam/slip-skid", FGSteam::get_TC_rad); - fgSetArchivable("/steam/slip-skid"); - fgTie("/steam/vertical-speed-fps", FGSteam::get_VSI_fps); - fgSetArchivable("/steam/vertical-speed-fps"); - fgTie("/steam/gyro-compass-deg", FGSteam::get_DG_deg); - fgSetArchivable("/steam/gyro-compass-deg"); - // fgTie("/steam/adf-deg", FGSteam::get_HackADF_deg); - // fgSetArchivable("/steam/adf-deg"); - fgTie("/steam/gyro-compass-error-deg", - FGSteam::get_DG_err, FGSteam::set_DG_err, - false); /* don't modify the value */ - fgSetArchivable("/steam/gyro-compass-error-deg"); - fgTie("/steam/mag-compass-deg", FGSteam::get_MH_deg); - fgSetArchivable("/steam/mag-compass-deg"); - } - _UpdateTimePending += dt; + return the_VSI_fps; } +double +FGSteam::get_VACUUM_inhg () const +{ + return the_VACUUM_inhg; +} + +double +FGSteam::get_MH_deg () const +{ + return the_MH_deg; +} + +double +FGSteam::get_DG_deg () const +{ + return the_DG_deg; +} + +double +FGSteam::get_DG_err () const +{ + return the_DG_err; +} + +void +FGSteam::set_DG_err (double approx_magvar) +{ + the_DG_err = approx_magvar; +} + +double +FGSteam::get_TC_rad () const +{ + return the_TC_rad; +} + +double +FGSteam::get_TC_std () const +{ + return the_TC_std; +} + + + +//////////////////////////////////////////////////////////////////////// +// Recording the current time +//////////////////////////////////////////////////////////////////////// + /* tc should be (elapsed_time_between_updates / desired_smoothing_time) */ void FGSteam::set_lowpass ( double *outthe, double inthe, double tc ) @@ -206,11 +291,6 @@ double altFtToPressInHg(double alt_ft) void FGSteam::_CatchUp() { - static const SGPropertyNode *heading_deg_node = fgGetNode("/orientation/heading-deg", true); - static const SGPropertyNode *mag_var_deg_node = fgGetNode("/environment/magnetic-variation-deg", true); - static const SGPropertyNode *mag_dip_deg_node = fgGetNode("/environment/magnetic-dip-deg", true); - static const SGPropertyNode *enginge_0_rpm_node = fgGetNode("/engines/engine[0]/rpm", true); - if ( _UpdateTimePending != 0 ) { double dt = _UpdateTimePending; @@ -267,16 +347,16 @@ void FGSteam::_CatchUp() if ( fabs(the_TC_rad) > 0.2 /* 2.0 */ ) { /* Massive sideslip jams it; it stops turning */ the_MH_degps = 0.0; - the_MH_err = heading_deg_node->getDoubleValue() - the_MH_deg; + the_MH_err = _heading_deg_node->getDoubleValue() - 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 = mag_var_deg_node->getDoubleValue() + MagVar = _mag_var_deg_node->getDoubleValue() / SGD_RADIANS_TO_DEGREES; - MagDip = mag_var_deg_node->getDoubleValue() + MagDip = _mag_var_deg_node->getDoubleValue() / SGD_RADIANS_TO_DEGREES; CosDip = cos ( MagDip ); FrcN = CosDip * cos ( MagVar ); @@ -307,7 +387,7 @@ void FGSteam::_CatchUp() } 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 = heading_deg_node->getDoubleValue() - the_MH_err; + the_MH_deg = _heading_deg_node->getDoubleValue() - the_MH_err; } /************************** @@ -315,7 +395,7 @@ void FGSteam::_CatchUp() scaling capability for the vacuum pump later on. When we have a real engine model, we can ask it. */ - the_ENGINE_rpm = enginge_0_rpm_node->getDoubleValue(); + the_ENGINE_rpm = _engine_0_rpm_node->getDoubleValue(); /************************** First, we need to know what the static line is reporting, @@ -330,7 +410,7 @@ void FGSteam::_CatchUp() double static_inhg = WeatherDatabase->get(plane_pos).AirPressure * (0.01 / INHG_TO_MB); #else - double static_inhg = fgGetDouble("/environment/pressure-inhg"); + double static_inhg = _pressure_inhg_node->getDoubleValue(); #endif set_lowpass ( & the_STATIC_inhg, static_inhg, dt ); @@ -395,7 +475,7 @@ void FGSteam::_CatchUp() the_DG_err = fgGetDouble("/environment/magnetic-variation-deg"); the_DG_degps = 0.01; /* HACK! */ if (dt<1.0) the_DG_err += dt * the_DG_degps; - the_DG_deg = heading_deg_node->getDoubleValue() - the_DG_err; + the_DG_deg = _heading_deg_node->getDoubleValue() - the_DG_err; /************************** Finished updates, now clear the timer @@ -411,11 +491,13 @@ void FGSteam::_CatchUp() // Everything below is a transient hack; expect it to disappear //////////////////////////////////////////////////////////////////////// -double FGSteam::get_HackOBS1_deg () { - return current_radiostack->get_nav1_radial(); +double FGSteam::get_HackOBS1_deg () const +{ + return current_radiostack->get_nav1_radial(); } -double FGSteam::get_HackOBS2_deg () { +double FGSteam::get_HackOBS2_deg () const +{ return current_radiostack->get_nav2_radial(); } diff --git a/src/Cockpit/steam.hxx b/src/Cockpit/steam.hxx index 87ea3bb67..0ab17ad4b 100644 --- a/src/Cockpit/steam.hxx +++ b/src/Cockpit/steam.hxx @@ -31,6 +31,8 @@ #include +#include
+ #include #include STL_STRING @@ -49,54 +51,70 @@ SG_USING_NAMESPACE(std); * and autopilot features where these are slaved thus. * They should not be used for other simulation purposes. */ -class FGSteam +class FGSteam : public FGSubsystem { public: - static void update ( double dt ); + FGSteam (); + virtual ~FGSteam (); + + virtual void init (); + + virtual void update (double dt_sec); + + virtual void bind (); + + virtual void unbind (); // Position - static double get_ALT_ft (); - static double get_TC_rad (); - static double get_MH_deg (); - static double get_DG_deg (); - static double get_DG_err (); - static void set_DG_err(double approx_magvar); + virtual double get_ALT_ft () const; + virtual double get_TC_rad () const; + virtual double get_MH_deg () const; + virtual double get_DG_deg () const; + virtual double get_DG_err () const; + virtual void set_DG_err(double approx_magvar); // Velocities - static double get_ASI_kias (); - static double get_TC_std (); - static double get_VSI_fps (); + virtual double get_ASI_kias () const; + virtual double get_TC_std () const; + virtual double get_VSI_fps () const; // Engine Gauges - static double get_VACUUM_inhg (); + virtual double get_VACUUM_inhg () const; // Atmosphere - static double get_ALT_datum_mb (); - static void set_ALT_datum_mb(double datum_mb); + virtual double get_ALT_datum_mb () const; + virtual void set_ALT_datum_mb(double datum_mb); // Hacks ... temporary stuff // static double get_HackVOR1_deg (); - static double get_HackOBS1_deg (); + virtual double get_HackOBS1_deg () const; // static double get_HackGS_deg (); // static double get_HackVOR2_deg (); - static double get_HackOBS2_deg (); + virtual double get_HackOBS2_deg () const; private: - static double the_ALT_ft; - static double the_ALT_datum_mb; - 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, the_DG_err; - - static double _UpdateTimePending; - static void _CatchUp (); - - static void set_lowpass ( double *outthe, - double inthe, double tc ); + + void _CatchUp (); + void set_lowpass ( double *outthe, double inthe, double tc ); + + double the_ALT_ft; + double the_ALT_datum_mb; + double the_TC_rad, the_TC_std; + double the_STATIC_inhg, the_VACUUM_inhg; + double the_VSI_fps, the_VSI_case; + double the_MH_deg, the_MH_degps, the_MH_err; + double the_DG_deg, the_DG_degps, the_DG_inhg, the_DG_err; + + double _UpdateTimePending; + + SGPropertyNode_ptr _heading_deg_node; + SGPropertyNode_ptr _mag_var_deg_node; + SGPropertyNode_ptr _mag_dip_deg_node; + SGPropertyNode_ptr _engine_0_rpm_node; + SGPropertyNode_ptr _pressure_inhg_node; + }; diff --git a/src/Main/fg_init.cxx b/src/Main/fg_init.cxx index 50871d7e8..2a2c99998 100644 --- a/src/Main/fg_init.cxx +++ b/src/Main/fg_init.cxx @@ -80,6 +80,7 @@ #include #include #include +#include #include #include #include @@ -1061,6 +1062,14 @@ bool fgInitSubsystems( void ) { globals->get_controls()->bind(); + //////////////////////////////////////////////////////////////////// + // Initialize the steam subsystem. + //////////////////////////////////////////////////////////////////// + + globals->get_steam()->init(); + globals->get_steam()->bind(); + + //////////////////////////////////////////////////////////////////// // Initialize the input subsystem. //////////////////////////////////////////////////////////////////// diff --git a/src/Main/globals.hxx b/src/Main/globals.hxx index f89f11089..438c6ec65 100644 --- a/src/Main/globals.hxx +++ b/src/Main/globals.hxx @@ -56,6 +56,7 @@ class FGLogger; class FGEnvironmentMgr; class FGEnvironment; class FGControls; +class FGSteam; class FGSoundMgr; class FGAutopilot; class FGFX; @@ -143,6 +144,9 @@ private: // control input state FGControls *controls; + // Steam instruments + FGSteam *steam; + // viewer manager FGViewMgr *viewmgr; @@ -240,6 +244,9 @@ public: inline FGControls *get_controls() const { return controls; } inline void set_controls( FGControls *c ) { controls = c; } + inline FGSteam *get_steam() const { return steam; } + inline void set_steam( FGSteam *s ) { steam = s; } + inline FGViewMgr *get_viewmgr() const { return viewmgr; } inline void set_viewmgr( FGViewMgr *vm ) { viewmgr = vm; } FGViewer *get_current_view() const; diff --git a/src/Main/main.cxx b/src/Main/main.cxx index 4c0a44d6c..8afb24b01 100644 --- a/src/Main/main.cxx +++ b/src/Main/main.cxx @@ -798,7 +798,7 @@ void fgUpdateTimeDepCalcs() { globals->get_autopilot()->update(delta_time_sec); cur_fdm_state->update(delta_time_sec); - FGSteam::update(delta_time_sec); + globals->get_steam()->update(delta_time_sec); } if ( !strcmp(fgGetString("/sim/view-mode"), "pilot") ) { @@ -1411,6 +1411,9 @@ int mainLoop( int argc, char **argv ) { FGControls *controls = new FGControls; globals->set_controls( controls ); + FGSteam *steam = new FGSteam; + globals->set_steam( steam ); + string_list *col = new string_list; globals->set_channel_options_list( col ); -- 2.39.5