From c62048d5e26a2931f2a0f5fa7e94b3f7203e4762 Mon Sep 17 00:00:00 2001 From: andy Date: Sat, 27 Mar 2004 04:07:18 +0000 Subject: [PATCH] YASim now supports the new fuel.nas fuel management system. It reads the /consumables tree for input to determine weights, but places output only in /engines/engine[n]/fuel-consumed-lbs where it gets picked up by the Nasal code. --- src/FDM/YASim/Airplane.cpp | 32 +++++---------------- src/FDM/YASim/Airplane.hpp | 7 ++++- src/FDM/YASim/FGFDM.cpp | 55 +++++++++++++++++++++++------------- src/FDM/YASim/yasim-test.cpp | 2 ++ 4 files changed, 50 insertions(+), 46 deletions(-) diff --git a/src/FDM/YASim/Airplane.cpp b/src/FDM/YASim/Airplane.cpp index ba1674b0c..166a861b5 100644 --- a/src/FDM/YASim/Airplane.cpp +++ b/src/FDM/YASim/Airplane.cpp @@ -78,32 +78,9 @@ void Airplane::iterate(float dt) _model.iterate(); } -void Airplane::consumeFuel(float dt) +void Airplane::calcFuelWeights() { - // This is a really simple implementation that assumes all engines - // draw equally from all tanks in proportion to the amount of fuel - // stored there. Needs to be fixed, but that has to wait for a - // decision as to what the property interface will look like. - int i, outOfFuel = 0; - float fuelFlow = 0, totalFuel = 0.00001; // <-- overflow protection - for(i=0; i<_thrusters.size(); i++) - fuelFlow += ((ThrustRec*)_thrusters.get(i))->thruster->getFuelFlow(); - for(i=0; i<_tanks.size(); i++) - totalFuel += ((Tank*)_tanks.get(i))->fill; - for(i=0; i<_tanks.size(); i++) { - Tank* t = (Tank*)_tanks.get(i); - t->fill -= dt * fuelFlow * (t->fill/totalFuel); - if(t->fill <= 0) { - t->fill = 0; - outOfFuel = 1; - } - } - if(outOfFuel) - for(int i=0; i<_thrusters.size(); i++) - ((ThrustRec*)_thrusters.get(i))->thruster->setFuelState(false); - - // Set the tank masses on the RigidBody - for(i=0; i<_tanks.size(); i++) { + for(int i=0; i<_tanks.size(); i++) { Tank* t = (Tank*)_tanks.get(i); _model.getBody()->setMass(t->handle, t->fill); } @@ -233,6 +210,11 @@ float Airplane::getFuel(int tank) return ((Tank*)_tanks.get(tank))->fill; } +float Airplane::setFuel(int tank, float fuel) +{ + ((Tank*)_tanks.get(tank))->fill = fuel; +} + float Airplane::getFuelDensity(int tank) { return ((Tank*)_tanks.get(tank))->density; diff --git a/src/FDM/YASim/Airplane.hpp b/src/FDM/YASim/Airplane.hpp index 763e8d5ea..9131fa683 100644 --- a/src/FDM/YASim/Airplane.hpp +++ b/src/FDM/YASim/Airplane.hpp @@ -18,7 +18,7 @@ public: ~Airplane(); void iterate(float dt); - void consumeFuel(float dt); + void calcFuelWeights(); ControlMap* getControlMap(); Model* getModel(); @@ -60,9 +60,14 @@ public: int numGear(); Gear* getGear(int g); + int numThrusters() { return _thrusters.size(); } + Thruster* getThruster(int n) { + return ((ThrustRec*)_thrusters.get(n))->thruster; } + int numTanks(); void setFuelFraction(float frac); // 0-1, total amount of fuel float getFuel(int tank); // in kg! + float setFuel(int tank, float fuel); // in kg! float getFuelDensity(int tank); // kg/m^3 float getTankCapacity(int tank); diff --git a/src/FDM/YASim/FGFDM.cpp b/src/FDM/YASim/FGFDM.cpp index 234a25c1a..aa04eea8b 100644 --- a/src/FDM/YASim/FGFDM.cpp +++ b/src/FDM/YASim/FGFDM.cpp @@ -82,9 +82,24 @@ void FGFDM::iterate(float dt) getExternalInput(dt); _airplane.iterate(dt); - if(fgGetBool("/sim/freeze/fuel") != true) - _airplane.consumeFuel(dt); + // Do fuel stuff (FIXME: should stash SGPropertyNode objects here) + char buf[256]; + for(int i=0; i<_airplane.numThrusters(); i++) { + Thruster* t = _airplane.getThruster(i); + + sprintf(buf, "/engines/engine[%d]/out-of-fuel", i); + t->setFuelState(!fgGetBool(buf)); + sprintf(buf, "/engines/engine[%d]/fuel-consumed-lbs", i); + double consumed = fgGetDouble(buf) + dt * t->getFuelFlow(); + fgSetDouble(buf, consumed); + } + for(int i=0; i<_airplane.numTanks(); i++) { + sprintf(buf, "/consumables/fuel/tank[%d]/level-lbs", i); + _airplane.setFuel(i, LBS2KG * fgGetFloat(buf)); + } + _airplane.calcFuelWeights(); + setOutputProperties(); } @@ -98,6 +113,23 @@ void FGFDM::init() // Allows the user to start with something other than full fuel _airplane.setFuelFraction(fgGetFloat("/sim/fuel-fraction", 1)); + // Read out the resulting fuel state + char buf[256]; + for(int i=0; i<_airplane.numTanks(); i++) { + sprintf(buf, "/consumables/fuel/tank[%d]/level-lbs", i); + fgSetDouble(buf, _airplane.getFuel(i) * KG2LBS); + + double density = _airplane.getFuelDensity(i); + sprintf(buf, "/consumables/fuel/tank[%d]/density-ppg", i); + fgSetDouble(buf, density * (KG2LBS/CM2GALS)); + + sprintf(buf, "/consumables/fuel/tank[%d]/level-gal_us", i); + fgSetDouble(buf, _airplane.getFuel(i) * CM2GALS / density); + + sprintf(buf, "/consumables/fuel/tank[%d]/capacity-gal_us", i); + fgSetDouble(buf, CM2GALS * _airplane.getTankCapacity(i)/density); + } + // This has a nasty habit of being false at startup. That's not // good. fgSetBool("/controls/gear/gear-down", true); @@ -372,24 +404,6 @@ void FGFDM::setOutputProperties() p->prop->setFloatValue(val); } - float totalFuel = 0, totalCap = 0; - float fuelDensity = 720; // in kg/m^3, default to gasoline: ~6 lb/gal - for(i=0; i<_airplane.numTanks(); i++) { - fuelDensity = _airplane.getFuelDensity(i); - sprintf(buf, "/consumables/fuel/tank[%d]/level-gal_us", i); - fgSetFloat(buf, CM2GALS*_airplane.getFuel(i)/fuelDensity); - sprintf(buf, "/consumables/fuel/tank[%d]/level-lbs", i); - fgSetFloat(buf, KG2LBS*_airplane.getFuel(i)); - totalFuel += _airplane.getFuel(i); - totalCap += _airplane.getTankCapacity(i); - } - if(totalCap != 0) { - fgSetFloat("/consumables/fuel/total-fuel-lbs", KG2LBS*totalFuel); - fgSetFloat("/consumables/fuel/total-fuel-gals", - CM2GALS*totalFuel/fuelDensity); - fgSetFloat("/consumables/fuel/total-fuel-norm", totalFuel/totalCap); - } - for(i=0; i<_airplane.getNumRotors(); i++) { Rotor*r=(Rotor*)_airplane.getRotor(i); int j = 0; @@ -418,6 +432,7 @@ void FGFDM::setOutputProperties() } } + float fuelDensity = _airplane.getFuelDensity(0); // HACK for(i=0; i<_thrusters.size(); i++) { EngRec* er = (EngRec*)_thrusters.get(i); Thruster* t = er->eng; diff --git a/src/FDM/YASim/yasim-test.cpp b/src/FDM/YASim/yasim-test.cpp index 5693c898a..faf7520e4 100644 --- a/src/FDM/YASim/yasim-test.cpp +++ b/src/FDM/YASim/yasim-test.cpp @@ -14,6 +14,8 @@ bool fgSetBool(char const * name, bool val) { return false; } bool fgGetBool(char const * name, bool def) { return false; } SGPropertyNode* fgGetNode (const char * path, bool create) { return 0; } float fgGetFloat (const char * name, float defaultValue) { return 0; } +float fgGetDouble (const char * name, double defaultValue) { return 0; } +float fgSetDouble (const char * name, double defaultValue) { return 0; } static const float RAD2DEG = 57.2957795131; -- 2.39.5