1
0
Fork 0

Fix for bug #204 and #222 by Bertrand Coconnier; NaNs (bug #222) were basically generated because the method JSBSim::unbind() was not implemented in JSBSim.cxx.

This commit is contained in:
ThorstenB 2011-02-06 15:33:27 +01:00
parent 67978f92e5
commit b649f97b19
3 changed files with 36 additions and 4 deletions

View file

@ -424,6 +424,33 @@ void FGJSBsim::init()
/******************************************************************************/
void checkTied ( FGPropertyManager *node )
{
int N = node->nChildren();
string name;
for (int i=0; i<N; i++) {
if (node->getChild(i)->nChildren() ) {
checkTied( (FGPropertyManager*)node->getChild(i) );
}
if ( node->getChild(i)->isTied() ) {
name = ((FGPropertyManager*)node->getChild(i))->GetFullyQualifiedName();
node->Untie(name);
}
}
}
/******************************************************************************/
void FGJSBsim::unbind()
{
SGPropertyNode* instance = globals->get_props()->getNode("/fdm/jsbsim");
checkTied((FGPropertyManager*)instance);
FGInterface::unbind();
}
/******************************************************************************/
// Run an iteration of the EOM (equations of motion)
void FGJSBsim::update( double dt )

View file

@ -110,6 +110,9 @@ public:
/// Reset flight params to a specific position
void init();
/// Unbind properties
void unbind();
/// @name Position Parameter Set
//@{
/** Set geocentric latitude
@ -283,8 +286,6 @@ private:
void update_gear(void);
void update_external_forces(double t_off);
void resetPropertyState();
};

View file

@ -307,18 +307,23 @@ bool FGPropulsion::Load(Element* el)
try {
if (type == "piston_engine") {
HavePistonEngine = true;
if (!IsBound) bind();
Engines.push_back(new FGPiston(FDMExec, document, numEngines));
} else if (type == "turbine_engine") {
HaveTurbineEngine = true;
if (!IsBound) bind();
Engines.push_back(new FGTurbine(FDMExec, document, numEngines));
} else if (type == "turboprop_engine") {
HaveTurboPropEngine = true;
if (!IsBound) bind();
Engines.push_back(new FGTurboProp(FDMExec, document, numEngines));
} else if (type == "rocket_engine") {
HaveRocketEngine = true;
if (!IsBound) bind();
Engines.push_back(new FGRocket(FDMExec, document, numEngines));
} else if (type == "electric_engine") {
HaveElectricEngine = true;
if (!IsBound) bind();
Engines.push_back(new FGElectric(FDMExec, document, numEngines));
} else {
cerr << "Unknown engine type: " << type << endl;
@ -345,7 +350,6 @@ bool FGPropulsion::Load(Element* el)
if (el->FindElement("dump-rate"))
DumpRate = el->FindElementValueAsNumberConvertTo("dump-rate", "LBS/MIN");
if (!IsBound) bind();
PostLoad(el, PropertyManager);
return true;
@ -642,7 +646,7 @@ void FGPropulsion::bind(void)
typedef int (FGPropulsion::*iPMF)(void) const;
IsBound = true;
PropertyManager->Tie("propulsion/set-running", this, (iPMF)0, &FGPropulsion::InitRunning, true);
PropertyManager->Tie("propulsion/set-running", this, (iPMF)0, &FGPropulsion::InitRunning, false);
if (HaveTurbineEngine) {
PropertyManager->Tie("propulsion/starter_cmd", this, (iPMF)0, &FGPropulsion::SetStarter, true);
PropertyManager->Tie("propulsion/cutoff_cmd", this, (iPMF)0, &FGPropulsion::SetCutoff, true);