From b649f97b19b60ae273bf18e25b9539363b3d1c9a Mon Sep 17 00:00:00 2001 From: ThorstenB Date: Sun, 6 Feb 2011 15:33:27 +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 | 27 ++++++++++++++++++++++++++ src/FDM/JSBSim/JSBSim.hxx | 5 +++-- src/FDM/JSBSim/models/FGPropulsion.cpp | 8 ++++++-- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/FDM/JSBSim/JSBSim.cxx b/src/FDM/JSBSim/JSBSim.cxx index 4fb0f43ed..a2d217ba2 100644 --- a/src/FDM/JSBSim/JSBSim.cxx +++ b/src/FDM/JSBSim/JSBSim.cxx @@ -424,6 +424,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 ) 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