1
0
Fork 0

Removed FGEngInterface and FGGearInterface after consultation with

FDM people.  FlightGear now supports an unlimited number of fuel
tanks.  Also added correct fuel-flow reporting for piston engines, and
tracked new features in SimGear property support.
This commit is contained in:
david 2002-01-19 05:34:03 +00:00
parent eedf9f9671
commit 80b4567d54
10 changed files with 138 additions and 492 deletions

View file

@ -111,9 +111,6 @@ FGJSBsim::FGJSBsim( double dt )
int Neng = Propulsion->GetNumEngines(); int Neng = Propulsion->GetNumEngines();
SG_LOG( SG_FLIGHT, SG_INFO, "num engines = " << Neng ); SG_LOG( SG_FLIGHT, SG_INFO, "num engines = " << Neng );
for(int i=0;i<Neng;i++) {
add_engine( FGEngInterface() );
}
if ( GroundReactions->GetNumGearUnits() <= 0 ) { if ( GroundReactions->GetNumGearUnits() <= 0 ) {
SG_LOG( SG_FLIGHT, SG_ALERT, "num gear units = " SG_LOG( SG_FLIGHT, SG_ALERT, "num gear units = "
@ -250,16 +247,6 @@ FGJSBsim::update( int multiloop ) {
needTrim = false; needTrim = false;
} }
for( i=0; i<get_num_engines(); i++ ) {
FGEngInterface * e = get_engine(i);
FGEngine * eng = Propulsion->GetEngine(i);
FGThruster * thrust = Propulsion->GetThruster(i);
eng->SetMagnetos( globals->get_controls()->get_magnetos(i) );
eng->SetStarter( globals->get_controls()->get_starter(i) );
e->set_Throttle( globals->get_controls()->get_throttle(i) );
}
for ( i=0; i < multiloop; i++ ) { for ( i=0; i < multiloop; i++ ) {
fdmex->Run(); fdmex->Run();
} }
@ -286,24 +273,6 @@ FGJSBsim::update( int multiloop ) {
} }
} }
for( i=0; i<get_num_engines(); i++ ) {
FGEngInterface * e = get_engine(i);
FGEngine * eng = Propulsion->GetEngine(i);
FGThruster * thrust = Propulsion->GetThruster(i);
e->set_Manifold_Pressure( eng->getManifoldPressure_inHg() );
e->set_RPM( thrust->GetRPM() );
e->set_EGT( eng->getExhaustGasTemp_degF() );
e->set_CHT( eng->getCylinderHeadTemp_degF() );
e->set_Oil_Temp( eng->getOilTemp_degF() );
e->set_Running_Flag( eng->GetRunning() );
e->set_Cranking_Flag( eng->GetCranking() );
}
update_gear();
stall_warning->setDoubleValue( Aircraft->GetStallWarn() );
// translate JSBsim back to FG structure so that the // translate JSBsim back to FG structure so that the
// autopilot (and the rest of the sim can use the updated values // autopilot (and the rest of the sim can use the updated values
copy_from_JSBsim(); copy_from_JSBsim();
@ -314,6 +283,8 @@ FGJSBsim::update( int multiloop ) {
// Convert from the FGInterface struct to the JSBsim generic_ struct // Convert from the FGInterface struct to the JSBsim generic_ struct
bool FGJSBsim::copy_to_JSBsim() { bool FGJSBsim::copy_to_JSBsim() {
int i;
// copy control positions into the JSBsim structure // copy control positions into the JSBsim structure
FCS->SetDaCmd( globals->get_controls()->get_aileron()); FCS->SetDaCmd( globals->get_controls()->get_aileron());
@ -329,11 +300,15 @@ bool FGJSBsim::copy_to_JSBsim() {
FCS->SetRBrake( globals->get_controls()->get_brake( 1 ) ); FCS->SetRBrake( globals->get_controls()->get_brake( 1 ) );
FCS->SetCBrake( globals->get_controls()->get_brake( 2 ) ); FCS->SetCBrake( globals->get_controls()->get_brake( 2 ) );
FCS->SetGearCmd( globals->get_controls()->get_gear_down()); FCS->SetGearCmd( globals->get_controls()->get_gear_down());
for (int i = 0; i < get_num_engines(); i++) { for (i = 0; i < Propulsion->GetNumEngines(); i++) {
FGEngine * eng = Propulsion->GetEngine(i);
SGPropertyNode * node = fgGetNode("engines/engine", i, true);
FCS->SetThrottleCmd(i, globals->get_controls()->get_throttle(i)); FCS->SetThrottleCmd(i, globals->get_controls()->get_throttle(i));
FCS->SetMixtureCmd(i, globals->get_controls()->get_mixture(i)); FCS->SetMixtureCmd(i, globals->get_controls()->get_mixture(i));
FCS->SetPropAdvanceCmd(i, globals->get_controls()->get_prop_advance(i)); FCS->SetPropAdvanceCmd(i, globals->get_controls()->get_prop_advance(i));
Propulsion->GetThruster(i)->SetRPM(get_engine(i)->get_RPM()); Propulsion->GetThruster(i)->SetRPM(node->getDoubleValue("rpm"));
eng->SetMagnetos( globals->get_controls()->get_magnetos(i) );
eng->SetStarter( globals->get_controls()->get_starter(i) );
} }
Position->SetSeaLevelRadius( get_Sea_level_radius() ); Position->SetSeaLevelRadius( get_Sea_level_radius() );
@ -351,6 +326,12 @@ bool FGJSBsim::copy_to_JSBsim() {
// << get_V_east_airmass() << ", " // << get_V_east_airmass() << ", "
// << get_V_down_airmass() ); // << get_V_down_airmass() );
for (i = 0; i < Propulsion->GetNumTanks(); i++) {
FGTank * tank = Propulsion->GetTank(i);
tank->SetContents(fgGetNode("consumables/fuel/tank", i, true)
->getDoubleValue());
}
return true; return true;
} }
@ -455,6 +436,33 @@ bool FGJSBsim::copy_from_JSBsim() {
_set_T_Local_to_Body( i, j, State->GetTl2b(i,j) ); _set_T_Local_to_Body( i, j, State->GetTl2b(i,j) );
} }
} }
// Copy the engine values from JSBSim.
for( i=0; i < Propulsion->GetNumEngines(); i++ ) {
SGPropertyNode * node = fgGetNode("engines/engine", i, true);
FGEngine * eng = Propulsion->GetEngine(i);
FGThruster * thrust = Propulsion->GetThruster(i);
node->setDoubleValue("mp-osi", eng->getManifoldPressure_inHg());
node->setDoubleValue("rpm", thrust->GetRPM());
node->setDoubleValue("egt-degf", eng->getExhaustGasTemp_degF());
node->setDoubleValue("fuel-flow-gph", eng->getFuelFlow_gph());
node->setDoubleValue("cht-degf", eng->getCylinderHeadTemp_degF());
node->setDoubleValue("oil-temperature-degf", eng->getOilTemp_degF());
node->setDoubleValue("oil-pressure-psi", eng->getOilPressure_psi());
node->setBoolValue("running", eng->GetRunning());
node->setBoolValue("cranking", eng->GetCranking());
}
// Copy the fuel levels from JSBSim.
for (i = 0; i < Propulsion->GetNumTanks(); i++)
fgGetNode("consumables/fuel/tank", i, true)
->setDoubleValue(Propulsion->GetTank(i)->GetContents());
update_gear();
stall_warning->setDoubleValue( Aircraft->GetStallWarn() );
return true; return true;
} }
@ -637,38 +645,32 @@ void FGJSBsim::set_Velocities_Local_Airmass (double wnorth,
void FGJSBsim::init_gear(void ) { void FGJSBsim::init_gear(void ) {
FGGearInterface *gear;
FGGroundReactions* gr=fdmex->GetGroundReactions(); FGGroundReactions* gr=fdmex->GetGroundReactions();
int Ngear=GroundReactions->GetNumGearUnits(); int Ngear=GroundReactions->GetNumGearUnits();
for (int i=0;i<Ngear;i++) { for (int i=0;i<Ngear;i++) {
add_gear_unit( FGGearInterface() ); SGPropertyNode * node = fgGetNode("gear/gear", i, true);
gear=get_gear_unit(i); node->setDoubleValue("xoffset-in",
gear->SetX( gr->GetGearUnit(i)->GetBodyLocation()(1) ); gr->GetGearUnit(i)->GetBodyLocation()(1));
gear->SetY( gr->GetGearUnit(i)->GetBodyLocation()(2) ); node->setDoubleValue("yoffset-in",
gear->SetZ( gr->GetGearUnit(i)->GetBodyLocation()(3) ); gr->GetGearUnit(i)->GetBodyLocation()(2));
gear->SetWoW( gr->GetGearUnit(i)->GetWOW() ); node->setDoubleValue("zoffset-in",
if ( gr->GetGearUnit(i)->GetBrakeGroup() > 0 ) { gr->GetGearUnit(i)->GetBodyLocation()(3));
gear->SetBrake(true); node->setBoolValue("wow", gr->GetGearUnit(i)->GetWOW());
} node->setBoolValue("has-brake", gr->GetGearUnit(i)->GetBrakeGroup() > 0);
if ( gr->GetGearUnit(i)->GetRetractable() ) { node->setDoubleValue("position", FCS->GetGearPos());
gear->SetPosition( FCS->GetGearPos() );
} else {
gear->SetPosition( 1.0 );
}
} }
} }
void FGJSBsim::update_gear(void) { void FGJSBsim::update_gear(void) {
FGGearInterface* gear;
FGGroundReactions* gr=fdmex->GetGroundReactions(); FGGroundReactions* gr=fdmex->GetGroundReactions();
int Ngear=GroundReactions->GetNumGearUnits(); int Ngear=GroundReactions->GetNumGearUnits();
for (int i=0;i<Ngear;i++) { for (int i=0;i<Ngear;i++) {
gear=get_gear_unit(i); SGPropertyNode * node = fgGetNode("gear/gear", i, true);
gear->SetWoW( gr->GetGearUnit(i)->GetWOW() ); node->getChild("wow", 0, true)
if ( gr->GetGearUnit(i)->GetRetractable() ) { ->setBoolValue(gr->GetGearUnit(i)->GetWOW());
gear->SetPosition( FCS->GetGearPos() ); node->getChild("position", 0, true)
} ->setDoubleValue(FCS->GetGearPos());
} }
} }

View file

@ -65,22 +65,10 @@ FGLaRCsim::FGLaRCsim( double dt ) {
eng.init( get_delta_t() ); eng.init( get_delta_t() );
// dcl - in passing dt to init rather than update I am assuming // dcl - in passing dt to init rather than update I am assuming
// that the LaRCsim dt is fixed at one value (yes it is 120hz CLO) // that the LaRCsim dt is fixed at one value (yes it is 120hz CLO)
// update the engines interface
FGEngInterface e;
add_engine( e );
// Fill the fuel tanks
// Hardwired to C172 full tanks for now - need to fix this sometime
// Also note that this is the max quantity - the usable quantity
// is slightly less
set_Tank1Fuel(28.0);
set_Tank2Fuel(28.0);
} }
FGLaRCsim::~FGLaRCsim(void) { FGLaRCsim::~FGLaRCsim(void) {
if ( lsic != NULL ) { if ( lsic != NULL ) {
free_engines();
delete lsic; delete lsic;
lsic = NULL; lsic = NULL;
} }
@ -117,41 +105,30 @@ void FGLaRCsim::update( int multiloop ) {
eng.update(); eng.update();
// copy engine state values onto "bus" // copy engine state values onto "bus"
FGEngInterface *e = get_engine( 0 ); fgSetDouble("/engines/engine/rpm", eng.get_RPM());
e->set_Throttle( globals->get_controls()->get_throttle(0) * 100.0 ); fgSetDouble("/engines/engine/mp-osi", eng.get_Manifold_Pressure());
e->set_Mixture( 80 ); // ??????? fgSetDouble("/engines/engine/max-hp", eng.get_MaxHP());
e->set_Prop_Advance( 100 ); fgSetDouble("/engines/engine/power-pct", eng.get_Percentage_Power());
e->set_RPM( eng.get_RPM() ); fgSetDouble("/engines/engine/egt-degf", eng.get_EGT());
e->set_Manifold_Pressure( eng.get_Manifold_Pressure() ); fgSetDouble("/engines/engine/cht-degf", eng.get_CHT());
e->set_MaxHP( eng.get_MaxHP() ); fgSetDouble("/engines/engine/prop-thrust", eng.get_prop_thrust_SI());
e->set_Percentage_Power( eng.get_Percentage_Power() ); fgSetDouble("/engines/engine/fuel-flow-gph",
e->set_EGT( eng.get_EGT() ); eng.get_fuel_flow_gals_hr());
e->set_CHT( eng.get_CHT() ); fgSetDouble("/engines/engine/oil-temperature-degf",
e->set_prop_thrust( eng.get_prop_thrust_SI() ); eng.get_oil_temp());
e->set_Fuel_Flow( eng.get_fuel_flow_gals_hr() ); fgSetDouble("/engines/engine/running", eng.getRunningFlag());
e->set_Oil_Temp( eng.get_oil_temp() ); fgSetDouble("/engines/engine/cranking", eng.getCrankingFlag());
e->set_Running_Flag( eng.getRunningFlag() );
e->set_Cranking_Flag( eng.getCrankingFlag() );
//Assume we are using both tanks equally for now //Assume we are using both tanks equally for now
reduce_Tank1Fuel( (eng.get_fuel_flow_gals_hr() / (2 * 3600)) fgSetDouble("/consumables/fuel/tank[0]",
* get_delta_t() ); fgGetDouble("/consumables/fuel/tank[0]")
reduce_Tank2Fuel( (eng.get_fuel_flow_gals_hr() / (2 * 3600)) - (eng.get_fuel_flow_gals_hr() / (2 * 3600))
* get_delta_t() ); * get_delta_t());
fgSetDouble("/consumables/fuel/tank[1]",
fgGetDouble("/consumables/fuel/tank[1]")
- (eng.get_fuel_flow_gals_hr() / (2 * 3600))
* get_delta_t());
#if 0
SG_LOG( SG_FLIGHT, SG_INFO, "Throttle = "
<< globals->get_controls()->get_throttle( 0 ) * 100.0);
SG_LOG( SG_FLIGHT, SG_INFO, " Mixture = " << 80);
SG_LOG( SG_FLIGHT, SG_INFO, " RPM = " << eng.get_RPM());
SG_LOG( SG_FLIGHT, SG_INFO, " MP = " << eng.get_Manifold_Pressure());
SG_LOG( SG_FLIGHT, SG_INFO, " HP = "
<< ( eng.get_MaxHP() * eng.get_Percentage_Power()/ 100.0) );
SG_LOG( SG_FLIGHT, SG_INFO, " EGT = " << eng.get_EGT());
SG_LOG( SG_FLIGHT, SG_INFO, " Thrust (N) "
<< eng.get_prop_thrust_SI()); // Thrust in Newtons
SG_LOG( SG_FLIGHT, SG_INFO, '\n');
#endif
F_X_engine = eng.get_prop_thrust_lbs(); F_X_engine = eng.get_prop_thrust_lbs();
// cout << "F_X_engine = " << F_X_engine << '\n'; // cout << "F_X_engine = " << F_X_engine << '\n';
} }

View file

@ -141,16 +141,14 @@ void YASim::init()
int i; int i;
for(i=0; i<a->numGear(); i++) { for(i=0; i<a->numGear(); i++) {
Gear* g = a->getGear(i); Gear* g = a->getGear(i);
FGGearInterface fgg; SGPropertyNode * node = fgGetNode("gear/gear", i, true);
float pos[3]; float pos[3];
g->getPosition(pos); g->getPosition(pos);
fgg.SetX(pos[0]); fgg.SetY(-pos[1]); fgg.SetZ(-pos[2]); node->setDoubleValue("xoffset-in", pos[0]);
add_gear_unit(fgg); node->setDoubleValue("yoffset-in", pos[1]);
node->setDoubleValue("zoffset-in", pos[2]);
} }
for(i=0; i<m->numThrusters(); i++) { for(i=0; i<m->numThrusters(); i++) {
FGEngInterface fge;
add_engine(fge);
// Sanify the initial input conditions // Sanify the initial input conditions
char buf[64]; char buf[64];
sprintf(buf, "/controls/throttle[%d]", i); fgSetFloat(buf, 0); sprintf(buf, "/controls/throttle[%d]", i); fgSetFloat(buf, 0);
@ -402,43 +400,39 @@ void YASim::copyFromYASim()
// Fill out our engine and gear objects // Fill out our engine and gear objects
int i; int i;
for(i=0; i<get_num_gear(); i++) { for(i=0; i<airplane->numGear(); i++) {
FGGearInterface* fgg = get_gear_unit(i);
Gear* g = airplane->getGear(i); Gear* g = airplane->getGear(i);
if(g->getBrake() != 0) SGPropertyNode * node = fgGetNode("gear/gear", i, true);
fgg->SetBrake(true); node->setBoolValue("has-brake", g->getBrake() != 0);
if(g->getCompressFraction() != 0) node->setBoolValue("wow", g->getCompressFraction() != 0);
fgg->SetWoW(true); node->setBoolValue("position", g->getExtension());
else
fgg->SetWoW(false);
fgg->SetPosition(g->getExtension());
} }
for(i=0; i<get_num_engines(); i++) { for(i=0; i<model->numThrusters(); i++) {
FGEngInterface* fge = get_engine(i); SGPropertyNode * node = fgGetNode("engines/engine", i, true);
Thruster* t = model->getThruster(i); Thruster* t = model->getThruster(i);
fge->set_Running_Flag(true); node->setBoolValue("running", true);
fge->set_Cranking_Flag(false); node->setBoolValue("cranking", false);
// Note: assumes all tanks have the same fuel density! // Note: assumes all tanks have the same fuel density!
fge->set_Fuel_Flow(CM2GALS * t->getFuelFlow() node->setDoubleValue("fuel-flow-gph", CM2GALS * t->getFuelFlow()
/ airplane->getFuelDensity(0)); / airplane->getFuelDensity(0));
float tmp[3]; float tmp[3];
t->getThrust(tmp); t->getThrust(tmp);
fge->set_prop_thrust(Math::mag3(tmp) * KG2LBS / 9.8); node->setDoubleValue("prop-thrust", Math::mag3(tmp) * KG2LBS / 9.8);
PropEngine* pe = t->getPropEngine(); PropEngine* pe = t->getPropEngine();
if(pe) { if(pe) {
fge->set_RPM(pe->getOmega() * RAD2RPM); node->setDoubleValue("rpm", pe->getOmega() * RAD2RPM);
pe->getTorque(tmp); pe->getTorque(tmp);
float power = Math::mag3(tmp) * pe->getOmega(); float power = Math::mag3(tmp) * pe->getOmega();
float maxPower = pe->getPistonEngine()->getMaxPower(); float maxPower = pe->getPistonEngine()->getMaxPower();
fge->set_MaxHP(maxPower * W2HP); node->setDoubleValue("max-hp", maxPower * W2HP);
fge->set_Percentage_Power(100 * power/maxPower); node->setDoubleValue("power-pct", 100 * power/maxPower);
} }
} }
} }

View file

@ -54,34 +54,6 @@ inline void init_vec(FG_VECTOR_3 vec) {
vec[0] = 0.0; vec[1] = 0.0; vec[2] = 0.0; vec[0] = 0.0; vec[1] = 0.0; vec[2] = 0.0;
} }
FGEngInterface::FGEngInterface() {
// inputs
Throttle=0;
Mixture=0;
Prop_Advance=0;
// outputs
RPM=0;
Manifold_Pressure=0;
MaxHP=0;
Percentage_Power=0;
EGT=0;
prop_thrust=0;
}
FGEngInterface::~FGEngInterface(void) {
}
FGGearInterface::FGGearInterface(void) {
x=y=z=0.0;
brake=rolls=WoW=false;
position=1.0;
}
FGGearInterface::~FGGearInterface() {
}
// Constructor // Constructor
FGInterface::FGInterface() { FGInterface::FGInterface() {
_setup(); _setup();
@ -386,38 +358,6 @@ FGInterface::bind ()
&FGInterface::get_Climb_Rate); // read-only &FGInterface::get_Climb_Rate); // read-only
fgTie("/velocities/side-slip-rad", this, fgTie("/velocities/side-slip-rad", this,
&FGInterface::get_Beta); // read-only &FGInterface::get_Beta); // read-only
// Powerplant
for (int i = 0; i < get_num_engines(); i++) {
char buf[64];
sprintf(buf, "/engines/engine[%d]/rpm", i);
fgTie(buf, get_engine(i),
&FGEngInterface::get_RPM, &FGEngInterface::set_RPM);
fgSetArchivable(buf);
sprintf(buf, "/engines/engine[%d]/egt-degf", i);
fgTie(buf, get_engine(i), &FGEngInterface::get_EGT);
sprintf(buf, "/engines/engine[%d]/cht-degf", i);
fgTie(buf, get_engine(i), &FGEngInterface::get_CHT);
sprintf(buf, "/engines/engine[%d]/oil-temperature-degf", i);
fgTie(buf, get_engine(i), &FGEngInterface::get_Oil_Temp);
sprintf(buf, "/engines/engine[%d]/mp-osi", i);
fgTie(buf, get_engine(i), &FGEngInterface::get_Manifold_Pressure);
sprintf(buf, "/engines/engine[%d]/fuel-flow-gph", i);
fgTie(buf, get_engine(i), &FGEngInterface::get_Fuel_Flow);
sprintf(buf, "/engines/engine[%d]/running", i);
fgTie(buf, get_engine(i), &FGEngInterface::get_Running_Flag);
sprintf(buf, "/engines/engine[%d]/cranking", i);
fgTie(buf, get_engine(i), &FGEngInterface::get_Cranking_Flag);
}
} }
@ -452,45 +392,6 @@ FGInterface::unbind ()
fgUntie("/velocities/wBody-fps"); fgUntie("/velocities/wBody-fps");
fgUntie("/velocities/vertical-speed-fps"); fgUntie("/velocities/vertical-speed-fps");
fgUntie("/velocities/side-slip-rad"); fgUntie("/velocities/side-slip-rad");
for (int i = 0; i < get_num_engines(); i++) {
char buf[64];
sprintf(buf, "/engines/engine[%d]/rpm", i);
fgUntie(buf);
sprintf(buf, "/engines/engine[%d]/egt-degf", i);
fgUntie(buf);
sprintf(buf, "/engines/engine[%d]/cht-degf", i);
fgUntie(buf);
sprintf(buf, "/engines/engine[%d]/oil-temperature-degf", i);
fgUntie(buf);
sprintf(buf, "/engines/engine[%d]/mp-osi", i);
fgUntie(buf);
sprintf(buf, "/engines/engine[%d]/fuel-flow-gph", i);
fgUntie(buf);
sprintf(buf, "/engines/engine[%d]/running", i);
fgUntie(buf);
sprintf(buf, "/engines/engine[%d]/cranking", i);
fgUntie(buf);
}
}
void
FGInterface::free_engines ()
{
int i;
for ( i = 0; i < get_num_engines(); ++i ) {
delete get_engine(i);
}
engines.clear();
}
void
FGInterface::free_gear_units ()
{
int i;
for ( i = 0; i < get_num_gear(); ++i ) {
delete [] get_gear_unit(i);
}
gear.clear();
} }
/** /**

View file

@ -101,120 +101,6 @@ SG_USING_STD(string);
typedef double FG_VECTOR_3[3]; typedef double FG_VECTOR_3[3];
class FGEngInterface {
private:
// inputs
double Throttle;
double Mixture;
double Prop_Advance;
// int Magnetos; // 0=off, 1=left, 2=right, 3=both
// bool Starter; // flag to indicate the starter switch is on
// outputs
double RPM;
double Manifold_Pressure; //inches
double MaxHP;
double Percentage_Power; //HP
double EGT; //deg F
double CHT; //deg F
double prop_thrust; //lbs
double Fuel_Flow; //Gals/hr
double Oil_Temp; //deg F
double Oil_Pressure; //PSI
bool running; //flag to indicate the engine is running self-sustained
bool cranking; //flag to indicate the engine is being turned by the starter
/* others...
double PercentN1,N1; //GE,CFM
double PercentN2,N2;
double EPR; //P&W, RR?
double FuelFlow;
bool AfterBurner;
double InletAngles[3];
double InletPosition[3];
double ThrustVector[3];
*/
public:
FGEngInterface(void);
~FGEngInterface(void);
inline double get_Throttle() const { return Throttle; }
inline double get_Mixture() const { return Mixture; }
inline double get_Prop_Advance() const { return Prop_Advance; }
inline double get_RPM() const { return RPM; }
inline double get_Manifold_Pressure() const { return Manifold_Pressure; }
inline double get_MaxHP() const { return MaxHP; }
inline double get_Percentage_Power() const { return Percentage_Power; }
inline double get_EGT() const { return EGT; }
inline double get_CHT() const { return CHT; }
inline double get_prop_thrust() const { return prop_thrust; }
inline double get_Fuel_Flow() const { return Fuel_Flow; }
inline double get_Oil_Temp() const { return Oil_Temp; }
inline double get_Oil_Pressure() const { return Oil_Pressure; }
inline bool get_Running_Flag() const { return running; }
inline bool get_Cranking_Flag() const { return cranking; }
inline void set_Throttle( double t ) { Throttle = t; }
inline void set_Mixture( double m ) { Mixture = m; }
inline void set_Prop_Advance( double p ) { Prop_Advance = p; }
inline void set_RPM( double r ) { RPM = r; }
inline void set_Manifold_Pressure( double mp ) { Manifold_Pressure = mp; }
inline void set_MaxHP( double hp ) { MaxHP = hp; }
inline void set_Percentage_Power( double p ) { Percentage_Power = p; }
inline void set_EGT( double e ) { EGT = e; }
inline void set_CHT( double c ) { CHT = c; }
inline void set_prop_thrust( double t ) { prop_thrust = t; }
inline void set_Fuel_Flow( double f ) { Fuel_Flow = f; }
inline void set_Oil_Temp (double o) { Oil_Temp = o; }
inline void set_Running_Flag (bool r) { running = r; }
inline void set_Cranking_Flag (bool c) { cranking = c; }
};
typedef vector < FGEngInterface > engine_list;
class FGGearInterface {
private:
string name;
float x,y,z; // >0 forward of cg, >0 right, >0 down
bool brake; // true if this gear unit has a brake mechanism
bool rolls; // true if this gear unit has a wheel
bool WoW; // true if this gear unit is touching the ground
float position; // 0 if retracted, 1 if extended
public:
FGGearInterface(void);
~FGGearInterface(void);
inline string GetName(void) { return name; }
inline void SetName(string nm) { name=nm; }
inline float GetX(void) { return x; }
inline void SetX(float xloc) { x=xloc; }
inline float GetY(void) { return y; }
inline void SetY(float yloc) { y=yloc; }
inline float GetZ(void) { return z; }
inline void SetZ(float zloc) { z=zloc; }
inline bool GetBrake(void) { return brake; }
inline void SetBrake(bool brk) { brake=brk; }
// no good way to implement these right now
//inline bool GetRolls(void) { return rolls; }
//inline SetRolls(bool rl) { rolls=rl; }
inline bool GetWoW(void) { return WoW; }
inline void SetWoW(bool wow) { WoW=wow; }
inline float GetPosition(void) { return position; }
inline void SetPosition(float pos) { position=pos; }
};
typedef vector < FGGearInterface > gear_list;
// This is based heavily on LaRCsim/ls_generic.h // This is based heavily on LaRCsim/ls_generic.h
class FGInterface : public FGSubsystem { class FGInterface : public FGSubsystem {
@ -330,19 +216,11 @@ private:
double sin_longitude, cos_longitude; double sin_longitude, cos_longitude;
double sin_latitude, cos_latitude; double sin_latitude, cos_latitude;
double altitude_agl; double altitude_agl;
double Tank1Fuel; // Gals
double Tank2Fuel; // Gals
double daux[16]; // auxilliary doubles double daux[16]; // auxilliary doubles
float faux[16]; // auxilliary floats float faux[16]; // auxilliary floats
int iaux[16]; // auxilliary ints int iaux[16]; // auxilliary ints
// Engine list
engine_list engines;
//gear list
gear_list gear;
// SGTimeStamp valid_stamp; // time this record is valid // SGTimeStamp valid_stamp; // time this record is valid
// SGTimeStamp next_stamp; // time this record is valid // SGTimeStamp next_stamp; // time this record is valid
@ -646,22 +524,6 @@ public:
double weast, double weast,
double wdown ); double wdown );
// Consumables
inline void set_Tank1Fuel( double f ) { Tank1Fuel = f; }
inline void set_Tank2Fuel( double f ) { Tank2Fuel = f; }
inline void reduce_Tank1Fuel( double f ) {
Tank1Fuel -= f;
if(Tank1Fuel < 0)
Tank1Fuel = 0;
}
inline void reduce_Tank2Fuel( double f ) {
Tank2Fuel -= f;
if(Tank2Fuel < 0)
Tank2Fuel = 0;
}
// ========== Mass properties and geometry values ========== // ========== Mass properties and geometry values ==========
// Inertias // Inertias
@ -1206,40 +1068,6 @@ public:
inline float get_faux( int n ) const { return faux[n]; } inline float get_faux( int n ) const { return faux[n]; }
inline int get_iaux( int n ) const { return iaux[n]; } inline int get_iaux( int n ) const { return iaux[n]; }
// Consumables
inline double get_Tank1Fuel() const { return Tank1Fuel; }
inline double get_Tank2Fuel() const { return Tank2Fuel; }
// engines
inline int get_num_engines() const {
return engines.size();
}
inline FGEngInterface* get_engine( int i ) {
return &engines[i];
}
inline void add_engine( FGEngInterface e ) {
engines.push_back( e );
}
void free_engines();
//gear
inline int get_num_gear() const {
return gear.size();
}
inline FGGearInterface* get_gear_unit( int i ) {
return &gear[i];
}
inline void add_gear_unit( FGGearInterface fgi ) {
gear.push_back( fgi );
}
void free_gear_units();
}; };

View file

@ -539,37 +539,6 @@ getHeadingMag ()
} }
/**
* Return the fuel level in tank 1
*/
static double
getTank1Fuel ()
{
return current_aircraft.fdm_state->get_Tank1Fuel();
}
static void
setTank1Fuel ( double gals )
{
current_aircraft.fdm_state->set_Tank1Fuel( gals );
}
/**
* Return the fuel level in tank 2
*/
static double
getTank2Fuel ()
{
return current_aircraft.fdm_state->get_Tank2Fuel();
}
static void
setTank2Fuel ( double gals )
{
current_aircraft.fdm_state->set_Tank2Fuel( gals );
}
/** /**
* Get the autopilot altitude lock (true=on). * Get the autopilot altitude lock (true=on).
*/ */
@ -963,31 +932,6 @@ setWindDown (double speed)
speed); speed);
} }
/*
* Set the current engine0 running flag.
*/
static void
setRunningFlag (bool flag)
{
if ( current_aircraft.fdm_state->get_num_engines() > 0 ) {
current_aircraft.fdm_state->get_engine(0)->set_Running_Flag( flag );
}
}
/*
* Set the current engine0 cranking flag.
*/
//Although there is no real reason to want to tell the engine that it is cranking,
//this is currently necessary to avoid the cranking sound being played
//before the engine inits.
static void
setCrankingFlag (bool flag)
{
if ( current_aircraft.fdm_state->get_num_engines() > 0 ) {
current_aircraft.fdm_state->get_engine(0)->set_Cranking_Flag( flag );
}
}
static double static double
getFOV () getFOV ()
{ {
@ -1125,14 +1069,6 @@ fgInitProps ()
// Orientation // Orientation
fgTie("/orientation/heading-magnetic-deg", getHeadingMag); fgTie("/orientation/heading-magnetic-deg", getHeadingMag);
//consumables
fgTie("/consumables/fuel/tank[0]/level-gal_us",
getTank1Fuel, setTank1Fuel, false);
fgSetArchivable("/consumables/fuel/tank[0]/level-gal_us");
fgTie("/consumables/fuel/tank[1]/level-gal_us",
getTank2Fuel, setTank2Fuel, false);
fgSetArchivable("/consumables/fuel/tank[1]/level-gal_us");
// Autopilot // Autopilot
fgTie("/autopilot/locks/altitude", getAPAltitudeLock, setAPAltitudeLock); fgTie("/autopilot/locks/altitude", getAPAltitudeLock, setAPAltitudeLock);
fgSetArchivable("/autopilot/locks/altitude"); fgSetArchivable("/autopilot/locks/altitude");

View file

@ -80,6 +80,27 @@ fgGetNode (const string &path, bool create = false)
} }
/**
* Get a property node with separate index.
*
* This method separates the index from the path string, to make it
* easier to iterate through multiple components without using sprintf
* to add indices. For example, fgGetNode("foo[1]/bar", 3) will
* return the same result as fgGetNode("foo[1]/bar[3]").
*
* @param path The path of the node, relative to root.
* @param index The index for the last member of the path (overrides
* any given in the string).
* @param create true to create the node if it doesn't exist.
* @return The node, or 0 if none exists and none was created.
*/
inline SGPropertyNode *
fgGetNode (const string &path, int index, bool create = false)
{
return globals->get_props()->getNode(path, index, create);
}
/** /**
* Test whether a given node exists. * Test whether a given node exists.
* *

View file

@ -61,11 +61,6 @@ bool FGOpenGC::open() {
static void collect_data( const FGInterface *fdm, ogcFGData *data ) { static void collect_data( const FGInterface *fdm, ogcFGData *data ) {
//static void collect_data( ogcFGData *data ) { //static void collect_data( ogcFGData *data ) {
FGEngInterface *p_engine[4]; // four is enough unless you're a BUF
p_engine[0] = cur_fdm_state->get_engine(0);
p_engine[1] = cur_fdm_state->get_engine(1);
data->version_id = 0x0011; data->version_id = 0x0011;
data->latitude = fdm->get_Longitude_deg(); data->latitude = fdm->get_Longitude_deg();
@ -80,17 +75,17 @@ static void collect_data( const FGInterface *fdm, ogcFGData *data ) {
data->magvar = globals->get_mag()->get_magvar(); data->magvar = globals->get_mag()->get_magvar();
data->rpm[0] = p_engine[0]->get_RPM(); data->rpm[0] = fgGetDouble("/engines/engine[0]/rpm");
data->rpm[1] = p_engine[1]->get_RPM(); data->rpm[1] = fgGetDouble("/engines/engine[1]/rpm");
data->epr[0] = p_engine[0]->get_Manifold_Pressure(); data->epr[0] = fgGetDouble("/engines/engine[0]/mp-osi");
data->epr[1] = p_engine[1]->get_Manifold_Pressure(); data->epr[1] = fgGetDouble("/engines/engine[1]/mp-osi");
data->egt[0] = p_engine[0]->get_EGT(); data->egt[0] = fgGetDouble("/engines/engine[0]/egt-degf");
data->egt[1] = p_engine[1]->get_EGT(); data->egt[1] = fgGetDouble("/engines/engine[1]/egt-degf");
data->oil_pressure[0] = p_engine[0]->get_Oil_Pressure(); data->oil_pressure[0] = fgGetDouble("/engines/engine[0]/oil-pressure-psi");
data->oil_pressure[1] = p_engine[1]->get_Oil_Pressure(); data->oil_pressure[1] = fgGetDouble("/engines/engine[1]/oil-pressure-psi");
// navigation data // navigation data

View file

@ -33,7 +33,7 @@
#include "protocol.hxx" #include "protocol.hxx"
#include "opengc_data.hxx" #include "opengc_data.hxx"
class FGOpenGC : public FGProtocol, public FGInterface, public FGEngInterface { class FGOpenGC : public FGProtocol, public FGInterface {
ogcFGData buf; ogcFGData buf;
int length; int length;

View file

@ -192,11 +192,9 @@ FGFX::init ()
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
for (i = 0; i < MAX_ENGINES; i++) { for (i = 0; i < MAX_ENGINES; i++) {
char buf[100]; SGPropertyNode * node = fgGetNode("engines/engine", i, true);
sprintf(buf, "/engines/engine[%d]/running", i); _engine_running_prop[i] = node->getChild("running", 0, true);
_engine_running_prop[i] = fgGetNode(buf, true); _engine_cranking_prop[i] = node->getChild("cranking", 0, true);
sprintf(buf, "/engines/engine[%d]/cranking", i);
_engine_cranking_prop[i] = fgGetNode(buf, true);
} }
_stall_warning_prop = fgGetNode("/sim/aero/alarms/stall-warning", true); _stall_warning_prop = fgGetNode("/sim/aero/alarms/stall-warning", true);
_vc_prop = fgGetNode("/velocities/airspeed-kt", true); _vc_prop = fgGetNode("/velocities/airspeed-kt", true);
@ -226,16 +224,14 @@ FGFX::update (int dt)
for (i = 0; i < MAX_ENGINES; i++) { for (i = 0; i < MAX_ENGINES; i++) {
if (cur_fdm_state->get_num_engines() > 0 && SGPropertyNode * node = fgGetNode("engines/engine", i, true);
_engine_running_prop[i]->getBoolValue()) {
if (_engine_running_prop[i]->getBoolValue()) {
// pitch corresponds to rpm // pitch corresponds to rpm
// volume corresponds to manifold pressure // volume corresponds to manifold pressure
double rpm_factor; double rpm_factor;
if ( cur_fdm_state->get_num_engines() > 0 ) rpm_factor = node->getDoubleValue("rpm") / 2500.0;
rpm_factor = cur_fdm_state->get_engine(i)->get_RPM() / 2500.0;
else
rpm_factor = 1.0;
double pitch = 0.3 + rpm_factor * 3.0; double pitch = 0.3 + rpm_factor * 3.0;
@ -247,11 +243,7 @@ FGFX::update (int dt)
pitch = 5.0; pitch = 5.0;
double mp_factor; double mp_factor;
if ( cur_fdm_state->get_num_engines() > 0 ) mp_factor = node->getDoubleValue("mp-osi") / 100;
mp_factor =
cur_fdm_state->get_engine(i)->get_Manifold_Pressure() / 100;
else
mp_factor = 0.3;
double volume = 0.15 + mp_factor / 2.0; double volume = 0.15 + mp_factor / 2.0;
@ -311,7 +303,6 @@ FGFX::update (int dt)
// Update the rumble. // Update the rumble.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
float totalGear = min(cur_fdm_state->get_num_gear(), int(MAX_GEAR));
float gearOnGround = 0; float gearOnGround = 0;
@ -324,10 +315,11 @@ FGFX::update (int dt)
// FIXME: take rotational velocities // FIXME: take rotational velocities
// into account as well. // into account as well.
for (i = 0; i < totalGear; i++) { for (i = 0; i < MAX_GEAR; i++) {
SGPropertyNode * node = fgGetNode("gear/gear", i, true);
// cout << "air speed = " << cur_fdm_state->get_V_equiv_kts(); // cout << "air speed = " << cur_fdm_state->get_V_equiv_kts();
// cout << " wheel " << i << " speed = " << _wheel_spin[i]; // cout << " wheel " << i << " speed = " << _wheel_spin[i];
if (cur_fdm_state->get_gear_unit(i)->GetWoW()) { if (node->getBoolValue("wow")) {
gearOnGround++; gearOnGround++;
if (!_gear_on_ground[i]) { if (!_gear_on_ground[i]) {
// wheel just touched down // wheel just touched down
@ -377,7 +369,7 @@ FGFX::update (int dt)
// velocity is under ~0.25 kt. // velocity is under ~0.25 kt.
double speed = cur_fdm_state->get_V_equiv_kts(); double speed = cur_fdm_state->get_V_equiv_kts();
if (gearOnGround > 0 && speed > 0.5) { if (gearOnGround > 0 && speed > 0.5) {
double volume = 2.0 * (gearOnGround/totalGear) * log(speed)/12; //(speed/60.0); double volume = 2.0 * (gearOnGround/MAX_GEAR) * log(speed)/12; //(speed/60.0);
_rumble->set_volume(volume); _rumble->set_volume(volume);
set_playing("rumble", true); set_playing("rumble", true);
} else { } else {