]> git.mxchange.org Git - flightgear.git/commitdiff
Added minimal support for magnetos, so that engines can be shut off.
authordavid <david>
Wed, 20 Feb 2002 04:27:22 +0000 (04:27 +0000)
committerdavid <david>
Wed, 20 Feb 2002 04:27:22 +0000 (04:27 +0000)
The starter isn't working yet, so the engine just springs to life.

14 files changed:
src/FDM/YASim/ControlMap.cpp
src/FDM/YASim/ControlMap.hpp
src/FDM/YASim/FGFDM.cpp
src/FDM/YASim/Jet.cpp
src/FDM/YASim/Jet.hpp
src/FDM/YASim/PistonEngine.cpp
src/FDM/YASim/PistonEngine.hpp
src/FDM/YASim/PropEngine.cpp
src/FDM/YASim/PropEngine.hpp
src/FDM/YASim/SimpleJet.cpp
src/FDM/YASim/SimpleJet.hpp
src/FDM/YASim/Thruster.cpp
src/FDM/YASim/Thruster.hpp
src/FDM/YASim/YASim.cxx

index 25a7db746db816381c88882f314e5a9c8879da45..9cd985304aecc0aa42a6c88848f060d113acd2d6 100644 (file)
@@ -139,18 +139,20 @@ void ControlMap::applyControls()
 
        void* obj = o->object;
        switch(o->type) {
-       case THROTTLE: ((Thruster*)obj)->setThrottle(lval);    break;
-       case MIXTURE:  ((Thruster*)obj)->setMixture(lval);     break;
-       case ADVANCE:  ((PropEngine*)obj)->setAdvance(lval);   break;
-       case REHEAT:   ((Jet*)obj)->setReheat(lval);           break;
-       case VECTOR:   ((Jet*)obj)->setRotation(lval);         break;
-       case BRAKE:    ((Gear*)obj)->setBrake(lval);           break;
-       case STEER:    ((Gear*)obj)->setRotation(lval);        break;
-       case EXTEND:   ((Gear*)obj)->setExtension(lval);       break;
-       case SLAT:     ((Wing*)obj)->setSlat(lval);            break;
-       case FLAP0:    ((Wing*)obj)->setFlap0(lval, rval);     break;
-       case FLAP1:    ((Wing*)obj)->setFlap1(lval, rval);     break;
-       case SPOILER:  ((Wing*)obj)->setSpoiler(lval, rval);   break;
+       case THROTTLE: ((Thruster*)obj)->setThrottle(lval);        break;
+       case MIXTURE:  ((Thruster*)obj)->setMixture(lval);         break;
+       case STARTER:  ((Thruster*)obj)->setStarter(bool(lval));   break;
+       case MAGNETOS: ((PropEngine*)obj)->setMagnetos(int(lval)); break;
+       case ADVANCE:  ((PropEngine*)obj)->setAdvance(lval);       break;
+       case REHEAT:   ((Jet*)obj)->setReheat(lval);               break;
+       case VECTOR:   ((Jet*)obj)->setRotation(lval);             break;
+       case BRAKE:    ((Gear*)obj)->setBrake(lval);               break;
+       case STEER:    ((Gear*)obj)->setRotation(lval);            break;
+       case EXTEND:   ((Gear*)obj)->setExtension(lval);           break;
+       case SLAT:     ((Wing*)obj)->setSlat(lval);                break;
+       case FLAP0:    ((Wing*)obj)->setFlap0(lval, rval);         break;
+       case FLAP1:    ((Wing*)obj)->setFlap1(lval, rval);         break;
+       case SPOILER:  ((Wing*)obj)->setSpoiler(lval, rval);       break;
        case BOOST:
            ((Thruster*)obj)->getPistonEngine()->setBoost(lval);
            break;
index 627e5e484f42c73568e88c45144d18b391e7d7e0..b9d6f0f1746904982c5357a6886a1a4bee75aa97 100644 (file)
@@ -9,7 +9,8 @@ class ControlMap {
 public:
     ~ControlMap();
 
-    enum OutputType { THROTTLE, MIXTURE, ADVANCE, REHEAT, PROP,
+    enum OutputType { THROTTLE, MIXTURE, STARTER, MAGNETOS,
+                     ADVANCE, REHEAT, PROP,
                      BRAKE, STEER, EXTEND,
                      INCIDENCE, FLAP0, FLAP1, SLAT, SPOILER, VECTOR,
                       BOOST };
index 299a6389d34d8387249913cad2632331880a58a4..5d31991c1242f1ae88bdf7d16916a4dfcf9defca 100644 (file)
@@ -445,6 +445,8 @@ int FGFDM::parseOutput(const char* name)
 {
     if(eq(name, "THROTTLE"))  return ControlMap::THROTTLE;
     if(eq(name, "MIXTURE"))   return ControlMap::MIXTURE;
+    if(eq(name, "STARTER"))   return ControlMap::STARTER;
+    if(eq(name, "MAGNETOS"))  return ControlMap::MAGNETOS;
     if(eq(name, "ADVANCE"))   return ControlMap::ADVANCE;
     if(eq(name, "REHEAT"))    return ControlMap::REHEAT;
     if(eq(name, "BOOST"))     return ControlMap::BOOST;
index 82d1172a57add29bf666653f4c0d5f38ec27e923..599a25e63bbb31150ead363d31935bbff74a49ea 100644 (file)
@@ -29,6 +29,8 @@ Jet::Jet()
     _n2 = _n2Min;
 
     // And sanify the remaining junk, just in case.
+    _running = true;
+    _cranking = false;
     _epr = 1;
     _fuelFlow = 0;
     _egt = 273;
@@ -103,7 +105,6 @@ void Jet::setRotation(float rot)
     _rotControl = rot;
 }
 
-
 float Jet::getN1()
 {
     return _n1 * _tempCorrect;
@@ -187,6 +188,16 @@ void Jet::integrate(float dt)
     _egt = T0 + beta*ibeta0 * (_egt0 - T0);
 }
 
+bool Jet::isRunning()
+{
+    return _running;
+}
+
+bool Jet::isCranking()
+{
+    return _cranking;
+}
+
 void Jet::getThrust(float* out)
 {
     Math::mul3(_thrust, _dir, out);
index 52d2ebe59ae08c1602aaaf9054370be2bf2e6320..b5d5f92f5256fb6e8917d9da773a640eb4b43cf0 100644 (file)
@@ -34,6 +34,8 @@ public:
     float getEGT();
 
     // From Thruster:
+    virtual bool isRunning();
+    virtual bool isCranking();
     virtual void getThrust(float* out);
     virtual void getTorque(float* out);
     virtual void getGyro(float* out);
@@ -60,6 +62,8 @@ private:
     float _n2Min;  // N2 at ground idle
     float _n2Max;  // N2 at takeoff thrust
 
+    bool _running;   // Is the engine running?
+    bool _cranking;  // Is the engine cranking?
     float _thrust;   // Current thrust
     float _epr;      // Current EPR
     float _n1;       // Current UNCORRECTED N1 (percent)
index 73f3c9b828ffbdc64d72326c70fe204269108620..fee36442859e4c7cce86d5c05dc66691099aa8a2 100644 (file)
@@ -9,6 +9,8 @@ const static float CIN2CM = 1.6387064e-5;
 PistonEngine::PistonEngine(float power, float speed)
 {
     _boost = 1;
+    _running = false;
+    _cranking = false;
 
     // Presume a BSFC (in lb/hour per HP) of 0.45.  In SI that becomes
     // (2.2 lb/kg, 745.7 W/hp, 3600 sec/hour) 7.62e-08 kg/Ws.
@@ -69,6 +71,16 @@ void PistonEngine::setThrottle(float t)
     _throttle = t;
 }
 
+void PistonEngine::setStarter(bool s)
+{
+    _starter = s;
+}
+
+void PistonEngine::setMagnetos(int m)
+{
+    _magnetos = m;
+}
+
 void PistonEngine::setMixture(float m)
 {
     _mixture = m;
@@ -79,6 +91,16 @@ void PistonEngine::setBoost(float boost)
     _boost = boost;
 }
 
+bool PistonEngine::isRunning()
+{
+    return _running;
+}
+
+bool PistonEngine::isCranking()
+{
+    return _cranking;
+}
+
 float PistonEngine::getTorque()
 {
     return _torque;
@@ -101,6 +123,20 @@ float PistonEngine::getEGT()
 
 void PistonEngine::calc(float pressure, float temp, float speed)
 {
+    if (_magnetos == 0) {
+      _running = false;
+      _mp = _rho0;
+      _torque = 0;
+      _fuelFlow = 0;
+      _egt = 80;               // FIXME: totally made-up
+      return;
+    }
+
+    _running = true;
+    _cranking = false;
+
+    // TODO: degrade performance on single magneto
+
     // Calculate manifold pressure as ambient pressure modified for
     // turbocharging and reduced by the throttle setting.  According
     // to Dave Luff, minimum throttle at sea level corresponds to 6"
index 8552d86cbf6471558549473e4e901a07f1085011..b8d4cb5651c4b2da96814973d972dce81fcdff70 100644 (file)
@@ -12,12 +12,16 @@ public:
     void setCompression(float c);
 
     void setThrottle(float throttle);
+    void setStarter(bool starter);
+    void setMagnetos(int magnetos);
     void setMixture(float mixture);
     void setBoost(float boost); // fraction of turbo-mul used
 
     float getMaxPower(); // max sea-level power
 
     void calc(float pressure, float temp, float speed);
+    bool isRunning();
+    bool isCranking();
     float getTorque();
     float getFuelFlow();
     float getMP();
@@ -37,10 +41,14 @@ private:
 
     // Runtime settables:
     float _throttle;
+    bool _starter; // true=engaged, false=disengaged
+    int _magnetos; // 0=off, 1=right, 2=left, 3=both
     float _mixture;
     float _boost;
 
     // Runtime state/output:
+    bool _running;
+    bool _cranking;
     float _mp;
     float _torque;
     float _fuelFlow;
index c4c85af9390c50575f9af3a941c3b33d6e20bc95..b790cbeb964e7ba4ccec5122788a2a7c699920b4 100644 (file)
@@ -23,6 +23,11 @@ PropEngine::~PropEngine()
     delete _eng;
 }
 
+void PropEngine::setMagnetos(int pos)
+{
+    _magnetos = pos;
+}
+
 void PropEngine::setAdvance(float advance)
 {
     _advance = Math::clamp(advance, 0, 1);
@@ -35,6 +40,16 @@ void PropEngine::setVariableProp(float min, float max)
     _maxOmega = max;
 }
 
+bool PropEngine::isRunning()
+{
+    return _eng->isRunning();
+}
+
+bool PropEngine::isCranking()
+{
+    return _eng->isCranking();
+}
+
 float PropEngine::getOmega()
 {
     return _omega;
@@ -67,6 +82,8 @@ void PropEngine::stabilize()
 {
     float speed = -Math::dot3(_wind, _dir);
     _eng->setThrottle(_throttle);
+    _eng->setStarter(_starter);
+    _eng->setMagnetos(true);   // FIXME: otherwise, an infinite loop
     _eng->setMixture(_mixture);
 
     if(_variable) {
@@ -109,6 +126,8 @@ void PropEngine::integrate(float dt)
     float propTorque, engTorque, thrust;
 
     _eng->setThrottle(_throttle);
+    _eng->setStarter(_starter);
+    _eng->setMagnetos(_magnetos);
     _eng->setMixture(_mixture);
     
     _prop->calc(_rho, speed, _omega, &thrust, &propTorque);
@@ -126,7 +145,7 @@ void PropEngine::integrate(float dt)
 
     // Clamp to a 500 rpm idle.  This should probably be settable, and
     // needs to go away when the startup code gets written.
-    if(_omega < 52.3) _omega = 52.3;
+//     if(_omega < 52.3) _omega = 52.3;
 
     // Store the total angular momentum into _gyro
     Math::mul3(_omega*_moment, _dir, _gyro);
index e861fb087891a1cbb05426519c560ed73a08f995..11cdb914d10c1a8c596bf713d2a786668df8dd59 100644 (file)
@@ -13,6 +13,7 @@ public:
     PropEngine(Propeller* prop, PistonEngine* eng, float moment);
     virtual ~PropEngine();
 
+    void setMagnetos(int magnetos);
     void setAdvance(float advance);
     void setVariableProp(float min, float max);
 
@@ -21,6 +22,8 @@ public:
     virtual Propeller* getPropeller() { return _prop; }
 
     // Dynamic output
+    virtual bool isRunning();
+    virtual bool isCranking();
     virtual void getThrust(float* out);
     virtual void getTorque(float* out);
     virtual void getGyro(float* out);
@@ -38,6 +41,7 @@ private:
     PistonEngine* _eng;
 
     bool _variable;
+    int _magnetos;  // 0=off, 1=right, 2=left, 3=both
     float _advance; // control input, 0-1
     float _maxOmega;
     float _minOmega;
index 505bef119e1d3da621796768eed9acbc4ea7ee8e..84839965e16cc099cbd6d4edea22704a79cb1152 100644 (file)
@@ -13,6 +13,16 @@ void SimpleJet::setThrust(float thrust)
     _thrust = thrust;
 }
 
+bool SimpleJet::isRunning()
+{
+    return true;
+}
+
+bool SimpleJet::isCranking()
+{
+    return false;
+}
+
 void SimpleJet::getThrust(float* out)
 {
     Math::mul3(_thrust * _throttle, _dir, out);
index 97174e65128dc89b813f06436e49faa76507ff1a..36e0e4786ce5d6a2be405360e7555048116fd1dd 100644 (file)
@@ -11,6 +11,8 @@ class SimpleJet : public Thruster
 public:
     SimpleJet();
     void setThrust(float thrust);
+    virtual bool isRunning();
+    virtual bool isCranking();
     virtual void getThrust(float* out);
     virtual void getTorque(float* out);
     virtual void getGyro(float* out);
index 0eb047182f3bb1552b9f97b0d004de308337c4a2..bd3aa46b4688628f863afd73a10503f583589ca2 100644 (file)
@@ -9,6 +9,7 @@ Thruster::Thruster()
     for(i=0; i<3; i++) _pos[i] = _wind[i] = 0;
     _throttle = 0;
     _mixture = 0;
+    _starter = false;
     _pressure = _temp = _rho = 0;
 }
 
@@ -49,6 +50,11 @@ void Thruster::setMixture(float mixture)
     _mixture = Math::clamp(mixture, 0, 1);
 }
 
+void Thruster::setStarter(bool starter)
+{
+    _starter = starter;
+}
+
 void Thruster::setWind(float* wind)
 {
     int i;
index b99c854a88e78592fd8d5a99a573cc431449dfbe..953c2eb0104964b5f1ced5e754c34a1d478f7232 100644 (file)
@@ -30,8 +30,11 @@ public:
     // Controls
     void setThrottle(float throttle);
     void setMixture(float mixture);
+    void setStarter(bool starter);
 
     // Dynamic output
+    virtual bool isRunning()=0;
+    virtual bool isCranking()=0;
     virtual void getThrust(float* out)=0;
     virtual void getTorque(float* out)=0;
     virtual void getGyro(float* out)=0;
@@ -48,6 +51,7 @@ protected:
     float _dir[3];
     float _throttle;
     float _mixture;
+    bool _starter; // true=engaged, false=disengaged
 
     float _wind[3];
     float _pressure;
index de2ba71fc84f59912250c0583bd9d7a184b9f652..524fe004a80f68a3b70898f13d638fc0f0d052c3 100644 (file)
@@ -419,8 +419,8 @@ void YASim::copyFromYASim()
         SGPropertyNode * node = fgGetNode("engines/engine", i, true);
         Thruster* t = model->getThruster(i);
 
-       node->setBoolValue("running", true);
-       node->setBoolValue("cranking", false);
+       node->setBoolValue("running", t->isRunning());
+       node->setBoolValue("cranking", t->isCranking());
 
         // Note: assumes all tanks have the same fuel density!
        node->setDoubleValue("fuel-flow-gph", CM2GALS * t->getFuelFlow()