]> git.mxchange.org Git - flightgear.git/commitdiff
Change FGSteam into a proper subsystem rather than a collection of
authordavid <david>
Sun, 7 Jul 2002 15:45:56 +0000 (15:45 +0000)
committerdavid <david>
Sun, 7 Jul 2002 15:45:56 +0000 (15:45 +0000)
static methods, and remove outdated dependency in panel_io.cxx.

src/Autopilot/newauto.cxx
src/Cockpit/built_in/FGMagRibbon.cxx
src/Cockpit/panel_io.cxx
src/Cockpit/steam.cxx
src/Cockpit/steam.hxx
src/Main/fg_init.cxx
src/Main/globals.hxx
src/Main/main.cxx

index 1341368d90bf2502ac8d3593a513456ec31f9d7a..f3233883344a4d752aff9b6fa426c160c1d3c1f2 100644 (file)
@@ -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()
index bcbfce41b1143786c8f77de41d8b5119c4b94e40..f76d1126f758643f10dcc816696361116d6c3b51 100644 (file)
@@ -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) {
index 4e89749ca40effb8a1450dd644755520c1c8354c..f3922b8dac9db8d56b247f3eb40f41298f44ab0e 100644 (file)
@@ -45,7 +45,6 @@
 #include <GUI/gui.h>
 
 #include "panel.hxx"
-#include "steam.hxx"
 #include "panel_io.hxx"
 
 //built-in layers
index 2f3e64bf5577339ded082aa1337c8b6397abc761..39583312af817cef6ced7bad010bdacc75e443ce 100644 (file)
@@ -30,6 +30,8 @@
 #include <simgear/constants.h>
 #include <simgear/math/sg_types.hxx>
 #include <simgear/misc/props.hxx>
+
+#include <Main/fg_props.hxx>
 #include <Aircraft/aircraft.hxx>
 #ifdef FG_WEATHERCM
 # include <WeatherCM/FGLocalWeatherDatabase.h>
@@ -48,94 +50,177 @@ static bool isTied = false;
 
 \f
 ////////////////////////////////////////////////////////////////////////
-// 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; }
 
 \f
 ////////////////////////////////////////////////////////////////////////
-// 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;
+}
+
+
+\f
+////////////////////////////////////////////////////////////////////////
+// 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(); 
 }
 
index 87ea3bb6763abde977be64690c89fe28cb7a5981..0ab17ad4bf9a741fc97e18da9673f3822cf5a723 100644 (file)
@@ -31,6 +31,8 @@
 
 #include <simgear/compiler.h>
 
+#include <Main/fgfs.hxx>
+
 #include <time.h>
 #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;
+
 };
 
 
index 50871d7e89fac43bbfc077ccfcccc0832bcb7955..2a2c999989129035e9fa671e97235b43904a2c51 100644 (file)
@@ -80,6 +80,7 @@
 #include <Autopilot/newauto.hxx>
 #include <Cockpit/cockpit.hxx>
 #include <Cockpit/radiostack.hxx>
+#include <Cockpit/steam.hxx>
 #include <Cockpit/panel.hxx>
 #include <Cockpit/panel_io.hxx>
 #include <FDM/ADA.hxx>
@@ -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.
     ////////////////////////////////////////////////////////////////////
index f89f110899703430fee0c0714a93f4015a4d4ded..438c6ec65e73b0626d1d5caa70e6cfd7266dadb1 100644 (file)
@@ -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;
index 4c0a44d6cb85301d4b52a70ca9a21246c3864185..8afb24b01db64436034fba0f3558826b92d25c95 100644 (file)
@@ -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 );