From 287cc74965e11ff3888117a9d9b88ed2bdbb9252 Mon Sep 17 00:00:00 2001 From: Erik Hofman Date: Sun, 30 Jan 2011 11:04:37 +0100 Subject: [PATCH] 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. --- src/FDM/JSBSim/JSBSim.cxx | 47 +++++++++++++++----------- src/FDM/JSBSim/JSBSim.hxx | 5 +-- src/FDM/JSBSim/models/FGPropulsion.cpp | 8 +++-- 3 files changed, 36 insertions(+), 24 deletions(-) diff --git a/src/FDM/JSBSim/JSBSim.cxx b/src/FDM/JSBSim/JSBSim.cxx index f802c8c2e..a9e9be771 100644 --- a/src/FDM/JSBSim/JSBSim.cxx +++ b/src/FDM/JSBSim/JSBSim.cxx @@ -144,8 +144,6 @@ FGJSBsim::FGJSBsim( double dt ) } } - resetPropertyState(); - fdmex = new FGFDMExec( (FGPropertyManager*)globals->get_props() ); // Register ground callback. @@ -424,6 +422,33 @@ void FGJSBsim::init() /******************************************************************************/ +void checkTied ( FGPropertyManager *node ) +{ + int N = node->nChildren(); + string name; + + for (int i=0; igetChild(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 ) @@ -1415,21 +1440,3 @@ void FGJSBsim::update_external_forces(double t_off) fgSetDouble("/fdm/jsbsim/systems/hook/tailhook-pos-deg", fi); } -void FGJSBsim::resetPropertyState() -{ -// this code works-around bug #222: -// http://code.google.com/p/flightgear-bugs/issues/detail?id=222 -// for whatever reason, having an existing value for the WOW -// property causes the NaNs. Should that be fixed, this code can die - SGPropertyNode* gear = fgGetNode("/fdm/jsbsim/gear", false); - if (!gear) { - return; - } - - int index = 0; - SGPropertyNode* unitNode = NULL; - for (; (unitNode = gear->getChild("unit", index)) != NULL; ++index) { - unitNode->removeChild("WOW", 0, false); - } -} - diff --git a/src/FDM/JSBSim/JSBSim.hxx b/src/FDM/JSBSim/JSBSim.hxx index 1a8037167..a01146bcc 100644 --- a/src/FDM/JSBSim/JSBSim.hxx +++ b/src/FDM/JSBSim/JSBSim.hxx @@ -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(); }; diff --git a/src/FDM/JSBSim/models/FGPropulsion.cpp b/src/FDM/JSBSim/models/FGPropulsion.cpp index 57d2852f3..05a2da4c4 100644 --- a/src/FDM/JSBSim/models/FGPropulsion.cpp +++ b/src/FDM/JSBSim/models/FGPropulsion.cpp @@ -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); -- 2.39.2