X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FFDM%2FJSBSim%2Fmodels%2FFGGroundReactions.cpp;h=b334851ced2b52416f26a78529ee891d5de3b4ce;hb=024ef128e3395e8c0e32b360abe19b4d345e4f80;hp=c8bf6ab9e589ab85d0b19411692eda4ba0cf595b;hpb=bfc19675291404ddda86c9b2a12c8f9dab1bc478;p=flightgear.git diff --git a/src/FDM/JSBSim/models/FGGroundReactions.cpp b/src/FDM/JSBSim/models/FGGroundReactions.cpp index c8bf6ab9e..b334851ce 100644 --- a/src/FDM/JSBSim/models/FGGroundReactions.cpp +++ b/src/FDM/JSBSim/models/FGGroundReactions.cpp @@ -5,7 +5,7 @@ Date started: 09/13/00 Purpose: Encapsulates the ground reaction forces (gear and collision) - ------------- Copyright (C) 2000 Jon S. Berndt (jsb@hal-pc.org) ------------- + ------------- Copyright (C) 2000 Jon S. Berndt (jon@jsbsim.org) ------------- This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software @@ -39,18 +39,20 @@ INCLUDES #include #include "FGGroundReactions.h" -#include +#include "FGLGear.h" +#include "input_output/FGPropertyManager.h" + +using namespace std; namespace JSBSim { -static const char *IdSrc = "$Id$"; +static const char *IdSrc = "$Id: FGGroundReactions.cpp,v 1.39 2012/04/01 17:05:51 bcoconni Exp $"; static const char *IdHdr = ID_GROUNDREACTIONS; /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CLASS IMPLEMENTATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - FGGroundReactions::FGGroundReactions(FGFDMExec* fgex) : FGModel(fgex) { Name = "FGGroundReactions"; @@ -64,50 +66,55 @@ FGGroundReactions::FGGroundReactions(FGFDMExec* fgex) : FGModel(fgex) FGGroundReactions::~FGGroundReactions(void) { - for (unsigned int i=0; iHolding()) return false; + return true; +} - vForces.InitMatrix(); - vMoments.InitMatrix(); +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if ( Propagate->GetDistanceAGL() < 300.0 ) { // Only execute gear code below 300 feet - vector ::iterator iGear = lGear.begin(); +bool FGGroundReactions::Run(bool Holding) +{ + if (FGModel::Run(Holding)) return true; + if (Holding) return false; - // Sum forces and moments for all gear, here. - // Some optimizations may be made here - or rather in the gear code itself. - // The gear ::Run() method is called several times - once for each gear. - // Perhaps there is some commonality for things which only need to be - // calculated once. + RunPreFunctions(); - while (iGear != lGear.end()) { - vForces += iGear->Force(); - vMoments += iGear->Moment(); - iGear++; - } + vForces.InitMatrix(); + vMoments.InitMatrix(); + multipliers.clear(); + + // Sum forces and moments for all gear, here. + // Some optimizations may be made here - or rather in the gear code itself. + // The gear ::Run() method is called several times - once for each gear. + // Perhaps there is some commonality for things which only need to be + // calculated once. + for (unsigned int i=0; iGetBodyForces(); + vMoments += lGear[i]->GetMoments(); } + RunPostFunctions(); + return false; } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -bool FGGroundReactions::GetWOW(void) +bool FGGroundReactions::GetWOW(void) const { bool result = false; for (unsigned int i=0; iIsBogey() && lGear[i]->GetWOW()) { result = true; break; } @@ -123,27 +130,32 @@ bool FGGroundReactions::Load(Element* el) Debug(2); + unsigned int numContacts = el->GetNumElements("contact"); + lGear.resize(numContacts); Element* contact_element = el->FindElement("contact"); - while (contact_element) { - lGear.push_back(FGLGear(contact_element, FDMExec, num++)); - FCS->AddGear(); // make the FCS aware of the landing gear + for (unsigned int idx=0; idxFindNextElement("contact"); } - for (unsigned int i=0; ibind(); + + PostLoad(el, PropertyManager); return true; } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -string FGGroundReactions::GetGroundReactionStrings(string delimeter) +string FGGroundReactions::GetGroundReactionStrings(string delimeter) const { std::ostringstream buf; for (unsigned int i=0;iIsBogey()) { + string name = lGear[i]->GetName(); buf << name << " WOW" << delimeter << name << " stroke (ft)" << delimeter << name << " stroke velocity (ft/sec)" << delimeter @@ -172,26 +184,26 @@ string FGGroundReactions::GetGroundReactionStrings(string delimeter) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -string FGGroundReactions::GetGroundReactionValues(string delimeter) +string FGGroundReactions::GetGroundReactionValues(string delimeter) const { std::ostringstream buf; for (unsigned int i=0;iIsBogey()) { + FGLGear *gear = lGear[i]; + buf << (gear->GetWOW() ? "1" : "0") << delimeter + << setprecision(5) << gear->GetCompLen() << delimeter + << setprecision(6) << gear->GetCompVel() << delimeter + << setprecision(10) << gear->GetCompForce() << delimeter + << gear->GetWheelSideForce() << delimeter + << gear->GetWheelRollForce() << delimeter + << gear->GetBodyXForce() << delimeter + << gear->GetBodyYForce() << delimeter + << setprecision(6) << gear->GetWheelVel(eX) << delimeter + << gear->GetWheelVel(eY) << delimeter + << gear->GetWheelRollVel() << delimeter + << gear->GetWheelSideVel() << delimeter + << gear->GetWheelSlipAngle() << delimeter; } } @@ -211,25 +223,7 @@ void FGGroundReactions::bind(void) { typedef double (FGGroundReactions::*PMF)(int) const; PropertyManager->Tie("gear/num-units", this, &FGGroundReactions::GetNumGearUnits); - PropertyManager->Tie("moments/l-gear-lbsft", this, eL, (PMF)&FGGroundReactions::GetMoments); - PropertyManager->Tie("moments/m-gear-lbsft", this, eM, (PMF)&FGGroundReactions::GetMoments); - PropertyManager->Tie("moments/n-gear-lbsft", this, eN, (PMF)&FGGroundReactions::GetMoments); - PropertyManager->Tie("forces/fbx-gear-lbs", this, eX, (PMF)&FGGroundReactions::GetForces); - PropertyManager->Tie("forces/fby-gear-lbs", this, eY, (PMF)&FGGroundReactions::GetForces); - PropertyManager->Tie("forces/fbz-gear-lbs", this, eZ, (PMF)&FGGroundReactions::GetForces); -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -void FGGroundReactions::unbind(void) -{ - PropertyManager->Untie("gear/num-units"); - PropertyManager->Untie("moments/l-gear-lbsft"); - PropertyManager->Untie("moments/m-gear-lbsft"); - PropertyManager->Untie("moments/n-gear-lbsft"); - PropertyManager->Untie("forces/fbx-gear-lbs"); - PropertyManager->Untie("forces/fby-gear-lbs"); - PropertyManager->Untie("forces/fbz-gear-lbs"); + PropertyManager->Tie("gear/wow", this, &FGGroundReactions::GetWOW); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%