1
0
Fork 0

Converted FCS to use property tree internally, documentation updates.

This commit is contained in:
tony 2002-04-06 16:03:16 +00:00
parent 41a4d0b351
commit 5fcabc9982
37 changed files with 417 additions and 786 deletions

View file

@ -85,7 +85,10 @@ CLASS DOCUMENTATION
as ground effect and maximum lift curve tailoff are handled.
@author Jon S. Berndt
@version $Id$
@see -
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGAerodynamics.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Header File </a>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGAerodynamics.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Source File </a>
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -112,17 +115,17 @@ public:
/** Gets the total aerodynamic force vector.
@return a force vector reference. */
FGColumnVector3& GetForces(void) {return vForces;}
inline double GetForces(int n) const {return vForces(n);}
double GetForces(int n) const {return vForces(n);}
/** Gets the total aerodynamic moment vector.
@return a moment vector reference. */
FGColumnVector3& GetMoments(void) {return vMoments;}
inline double GetMoments(int n) const {return vMoments(n);}
double GetMoments(int n) const {return vMoments(n);}
inline FGColumnVector3& GetvLastFs(void) { return vLastFs; }
inline double GetvLastFs(int axis) const { return vLastFs(axis); }
inline FGColumnVector3& GetvFs(void) { return vFs; }
inline double GetvFs(int axis) const { return vFs(axis); }
FGColumnVector3& GetvLastFs(void) { return vLastFs; }
double GetvLastFs(int axis) const { return vLastFs(axis); }
FGColumnVector3& GetvFs(void) { return vFs; }
double GetvFs(int axis) const { return vFs(axis); }
inline double GetLoD(void) const { return lod; }
inline double GetClSquared(void) const { return clsq; }

View file

@ -102,12 +102,15 @@ CLASS IMPLEMENTATION
FGAircraft::FGAircraft(FGFDMExec* fdmex) : FGModel(fdmex)
{
Name = "FGAircraft";
alphaclmin = alphaclmax = 0;
HTailArea = VTailArea = HTailArm = VTailArm = 0.0;
lbarh = lbarv = vbarh = vbarv = 0.0;
WingIncidence=0;
impending_stall = 0;
bi2vel=ci2vel=alphaw=0;
WingIncidence = 0.0;
impending_stall = 0.0;
alphaclmin = alphaclmax = 0.0;
HTailArea = VTailArea = 0.0;
HTailArm = VTailArm = 0.0;
lbarh = lbarv = 0.0;
vbarh = vbarv = 0.0;
bi2vel = ci2vel = 0.0;
alphaw = 0.0;
bind();
@ -147,8 +150,8 @@ bool FGAircraft::Run(void)
vNwcg = State->GetTb2s() * vNcg;
vNwcg(3) = -1*vNwcg(3) + 1;
twovel=2*Translation->GetVt();
if(twovel > 0) {
twovel = 2*Translation->GetVt();
if (twovel > 0) {
bi2vel = WingSpan / twovel;
ci2vel = cbar / twovel;
}
@ -372,8 +375,8 @@ void FGAircraft::unbind(void)
PropertyManager->Untie("metrics/eyepoint-x-ft");
PropertyManager->Untie("metrics/eyepoint-y-ft");
PropertyManager->Untie("metrics/eyepoint-z-ft");
PropertyManager->Untie("metrics/alpha-max-rad");
PropertyManager->Untie("metrics/alpha-min-rad");
PropertyManager->Untie("metrics/alpha-max-deg");
PropertyManager->Untie("metrics/alpha-min-deg");
PropertyManager->Untie("aero/bi2vel");
PropertyManager->Untie("aero/ci2vel");
PropertyManager->Untie("aero/alpha-wing-rad");

View file

@ -99,6 +99,10 @@ CLASS DOCUMENTATION
Wiley & Sons, 1979 ISBN 0-471-03032-5</li>
<li>Bernard Etkin, "Dynamics of Flight, Stability and Control", Wiley & Sons,
1982 ISBN 0-471-08936-2</li></ol>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGAircraft.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Header File </a>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGAircraft.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Source File </a>
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -167,7 +171,6 @@ public:
double GetCI2Vel(void) const { return ci2vel; }
double GetAlphaW(void) const { return alphaw; }
float GetNlf(void);
inline FGColumnVector3& GetNwcg(void) { return vNwcg; }

View file

@ -72,8 +72,9 @@ CLASS IMPLEMENTATION
FGAtmosphere::FGAtmosphere(FGFDMExec* fdmex) : FGModel(fdmex)
{
Name = "FGAtmosphere";
lastIndex=0;
h = 0;
lastIndex = 0;
h = 0.0;
psiw = 0.0;
htab[0]=0;
htab[1]=36089.239;
htab[2]=65616.798;

View file

@ -71,6 +71,10 @@ CLASS DOCUMENTATION
/** Models the standard atmosphere.
@author Tony Peden, Jon Berndt
@version $Id$
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGAtmosphere.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Header File </a>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGAtmosphere.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Source File </a>
*/
/******************************************************************************

View file

@ -65,7 +65,10 @@ CLASS DOCUMENTATION
/** Encapsulates various uncategorized scheduled functions.
@author Tony Peden, Jon Berndt
@version $Id$
@see -
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGAuxiliary.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Header File </a>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGAuxiliary.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Source File </a>
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -122,13 +122,13 @@ bool FGCoefficient::Load(FGConfigFile *AC_cfg)
}
*AC_cfg >> multparmsRow;
prop = State->GetPropertyName( State->GetParameterIndex(multparmsRow) );
prop = State->GetPropertyName( multparmsRow );
LookupR = PropertyManager->GetNode( prop );
}
if (type == TABLE) {
*AC_cfg >> multparmsCol;
prop = State->GetPropertyName( State->GetParameterIndex(multparmsCol) );
prop = State->GetPropertyName( multparmsCol );
LookupC = PropertyManager->GetNode( prop );
}
@ -147,13 +147,12 @@ bool FGCoefficient::Load(FGConfigFile *AC_cfg)
while (n < end && n >= 0) {
n -= start;
mult = multparms.substr(start,n);
prop= State->GetPropertyName( State->GetParameterIndex(mult) );
prop= State->GetPropertyName( mult );
multipliers.push_back( PropertyManager->GetNode(prop) );
start += n+1;
n = multparms.find("|",start);
}
prop=State->GetPropertyName(
State->GetParameterIndex( multparms.substr(start,n) ) );
prop=State->GetPropertyName( multparms.substr(start,n) );
mult = multparms.substr(start,n);
multipliers.push_back( PropertyManager->GetNode(prop) );
// End of non-dimensionalizing parameter read-in

View file

@ -89,7 +89,10 @@ CLASS DOCUMENTATION
is called and the coefficient value is calculated.
@author Jon S. Berndt
@version $Id$
@see -
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGCoefficient.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Header File </a>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGCoefficient.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Source File </a>
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -96,7 +96,10 @@ CLASS DOCUMENTATION
JSBSim config files are in XML format.
@author Jon S. Berndt
@version $Id$
@see -
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGConfigFile.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Header File </a>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGConfigFile.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Source File </a>
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -162,7 +162,7 @@ void FGFCS::SetThrottlePos(int engineNum, double setting)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
double FGFCS::GetThrottleCmd(int engineNum)
double FGFCS::GetThrottleCmd(int engineNum) const
{
if (engineNum < (int)ThrottlePos.size()) {
if (engineNum < 0) {
@ -180,7 +180,7 @@ double FGFCS::GetThrottleCmd(int engineNum)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
double FGFCS::GetThrottlePos(int engineNum)
double FGFCS::GetThrottlePos(int engineNum) const
{
if (engineNum < (int)ThrottlePos.size()) {
if (engineNum < 0) {
@ -306,36 +306,40 @@ bool FGFCS::Load(FGConfigFile* AC_cfg)
}
}
//collect information for normalizing control surfaces
string nodeName;
for(i=0;i<Components.size();i++) {
if(Components[i]->GetType() == "AEROSURFACE_SCALE"
|| Components[i]->GetType() == "KINEMAT" ) {
if( Components[i]->GetOutputIdx() == FG_ELEVATOR_POS ) {
if( (Components[i]->GetType() == "AEROSURFACE_SCALE"
|| Components[i]->GetType() == "KINEMAT")
&& Components[i]->GetOutputNode() ) {
nodeName= Components[i]->GetOutputNode()->GetName();
if( nodeName == "elevator-pos-rad" ) {
ToNormalize[iDe]=i;
} else if ( Components[i]->GetOutputIdx() == FG_LEFT_AILERON_POS
|| Components[i]->GetOutputIdx() == FG_AILERON_POS ) {
} else if ( nodeName == "left-aileron-pos-rad"
|| nodeName == "aileron-pos-rad" ) {
ToNormalize[iDaL]=i;
} else if ( Components[i]->GetOutputIdx() == FG_RIGHT_AILERON_POS ) {
} else if ( nodeName == "right-aileron-pos-rad" ) {
ToNormalize[iDaR]=i;
} else if ( Components[i]->GetOutputIdx() == FG_RUDDER_POS ) {
} else if ( nodeName == "rudder-pos-rad" ) {
ToNormalize[iDr]=i;
} else if ( Components[i]->GetOutputIdx() == FG_SPDBRAKE_POS ) {
} else if ( nodeName == "speedbrake-pos-rad" ) {
ToNormalize[iDsb]=i;
} else if ( Components[i]->GetOutputIdx() == FG_SPOILERS_POS ) {
} else if ( nodeName == "spoiler-pos-rad" ) {
ToNormalize[iDsp]=i;
} else if ( Components[i]->GetOutputIdx() == FG_FLAPS_POS ) {
} else if ( nodeName == "flaps-pos-deg" ) {
ToNormalize[iDf]=i;
}
}
}
bindModel();
return true;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
double FGFCS::GetComponentOutput(eParam idx) {
double FGFCS::GetComponentOutput(int idx) {
return Components[idx]->GetOutput();
}
@ -594,7 +598,42 @@ void FGFCS::bind(void){
&FGFCS::SetGearPos,
true);
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGFCS::bindModel(void){
unsigned i;
for(i=0;i<ThrottleCmd.size();i++) {
PropertyManager->Tie("fcs/throttle-cmd-norm",this,i,
&FGFCS::GetThrottleCmd,
&FGFCS::SetThrottleCmd,
true );
PropertyManager->Tie("fcs/throttle-pos-norm",this,i,
&FGFCS::GetThrottlePos,
&FGFCS::SetThrottlePos,
true );
if( MixtureCmd.size() > i ) {
PropertyManager->Tie("fcs/mixture-cmd-norm",this,i,
&FGFCS::GetMixtureCmd,
&FGFCS::SetMixtureCmd,
true );
PropertyManager->Tie("fcs/mixture-pos-norm",this,i,
&FGFCS::GetMixturePos,
&FGFCS::SetMixturePos,
true );
}
if( PropAdvanceCmd.size() > i ) {
PropertyManager->Tie("fcs/advance-cmd-norm",this,i,
&FGFCS::GetPropAdvanceCmd,
&FGFCS::SetPropAdvanceCmd,
true );
PropertyManager->Tie("fcs/advance-pos-norm",this,i,
&FGFCS::GetPropAdvance,
&FGFCS::SetPropAdvance,
true );
}
}
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGFCS::unbind(void){

View file

@ -65,10 +65,8 @@ DEFINITIONS
FORWARD DECLARATIONS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
typedef enum { iDe=0, iDaL, iDaR, iDr, iDsb, iDsp, iDf } FcIdx;
int const NNorm=7;
typedef enum { ofRad=0, ofNorm, ofMag } OutputForm;
int const NForms=3;
typedef enum { iDe=0, iDaL, iDaR, iDr, iDsb, iDsp, iDf, NNorm } FcIdx;
typedef enum { ofRad=0, ofNorm, ofMag , NForms} OutputForm;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
COMMENTS, REFERENCES, and NOTES [use "class documentation" below for API docs]
@ -152,6 +150,10 @@ CLASS DOCUMENTATION
@see FGGradient
@see FGFilter
@see FGDeadBand
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGFCS.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Header File </a>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGFCS.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Source File </a>
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -200,7 +202,7 @@ public:
/** Gets the throttle command.
@param engine engine ID number
@return throttle command in percent ( 0 - 100) for the given engine */
double GetThrottleCmd(int engine);
double GetThrottleCmd(int engine) const;
/** Gets the mixture command.
@param engine engine ID number
@ -272,7 +274,7 @@ public:
/** Gets the throttle position.
@param engine engine ID number
@return throttle position for the given engine in percent ( 0 - 100)*/
double GetThrottlePos(int engine);
double GetThrottlePos(int engine) const;
/** Gets the mixture position.
@param engine engine ID number
@ -297,7 +299,7 @@ public:
/** Retrieves a components output value
@param idx the index of the component (the component ID)
@return output value from the component */
double GetComponentOutput(eParam idx);
double GetComponentOutput(int idx);
/** Retrieves the component name
@param idx the index of the component (the component ID)
@ -456,9 +458,11 @@ public:
void AddThrottle(void);
FGPropertyManager* GetPropertyManager(void) { return PropertyManager; }
void bind(void);
void bindModel(void);
void unbind(void);
private:
double DaCmd, DeCmd, DrCmd, DfCmd, DsbCmd, DspCmd;

View file

@ -85,7 +85,10 @@ CLASS DOCUMENTATION
/** This class encapsulates the functionality needed to manage a factor group
i.e. factor*(coeff1 + coeff2 + coeff3)
@author Tony Peden
@see -
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGFactorGroup.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Header File </a>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGFactorGroup.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Source File </a>
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -126,6 +126,10 @@ CLASS DOCUMENTATION
considered equivalent to setting gamma.
@author Anthony K. Peden
@version $Id$
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGInitialCondition.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Header File </a>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGInitialCondition.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Source File </a>
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -169,6 +169,10 @@ CLASS DOCUMENTATION
Wiley & Sons, 1979 ISBN 0-471-03032-5
@see W. A. Ragsdale, "A Generic Landing Gear Dynamics Model for LASRS++",
AIAA-2000-4303
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGLGear.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Header File </a>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGLGear.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Source File </a>
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -59,7 +59,11 @@ CLASS DOCUMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
/** Models a rocket nozzle.
*/
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGNozzle.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Header File </a>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGNozzle.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Source File </a>
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DECLARATION

View file

@ -70,6 +70,10 @@ DOCUMENTATION
@author Dave Luff (engine operational code)
@author David Megginson (porting and additional code)
@version $Id$
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGPiston.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Header File </a>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGPiston.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Source File </a>
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -64,6 +64,10 @@ DOCUMENTATION
/** Models the lateral and longitudinal translational EOM.
@author Jon S. Berndt
@version $Id$
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGPosition.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Header File </a>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGPosition.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Source File </a>
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -81,6 +81,10 @@ CLASS DOCUMENTATION
@see FGEngine
@see FGThruster
@see FGTable
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGPropeller.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Header File </a>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGPropeller.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Source File </a>
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -61,6 +61,8 @@ CLASS DOCUMENTATION
@author David Megginson, Tony Peden
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGPropertyManager.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Header File </a>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGPropertyManager.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Source File </a>
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -113,6 +115,13 @@ class FGPropertyManager:public SGPropertyNode {
return (GetNode(path, false) != 0);
}
/**
* Get the name of a node
*/
inline string
GetName( void ) {
return string( getName() );
}
/**
* Get a bool value for a property.

View file

@ -69,6 +69,7 @@ FGPropulsion::FGPropulsion(FGFDMExec* exec) : FGModel(exec)
numSelectedFuelTanks = numSelectedOxiTanks = 0;
numTanks = numEngines = numThrusters = 0;
numOxiTanks = numFuelTanks = 0;
dt = 0.0;
bind();
Debug(0);
}

View file

@ -90,15 +90,22 @@ CLASS DOCUMENTATION
@see FGEngine
@see FGTank
@see FGThruster
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGPropulsion.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Header File </a>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGPropulsion.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Source File </a>
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DECLARATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
class FGPropulsion : public FGModel {
class FGPropulsion : public FGModel
{
public:
/// Constructor
FGPropulsion(FGFDMExec*);
/// Destructor
~FGPropulsion();
/** Executes the propulsion model.

View file

@ -94,6 +94,10 @@ CLASS DOCUMENTATION
@see FGEngine
@see FGPropulsion
@see FGTank
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGRocket.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Header File </a>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGRocket.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Source File </a>
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -73,6 +73,7 @@ CLASS IMPLEMENTATION
FGScript::FGScript(FGFDMExec* fgex) : FDMExec(fgex)
{
State = FDMExec->GetState();
PropertyManager=FDMExec->GetPropertyManager();
Debug(0);
}
@ -91,6 +92,7 @@ bool FGScript::LoadScript(string script)
string token="";
string aircraft="";
string initialize="";
string prop_name;
bool result = false;
double dt = 0.0;
struct condition *newCondition;
@ -113,6 +115,11 @@ bool FGScript::LoadScript(string script)
if (token == "use") {
if ((token = Script.GetValue("aircraft")) != string("")) {
aircraft = token;
result = FDMExec->LoadModel("aircraft", "engine", aircraft);
if (!result) {
cerr << "Aircraft file " << aircraft << " was not found" << endl;
exit(-1);
}
if (debug_lvl > 0) cout << " Use aircraft: " << token << endl;
} else if ((token = Script.GetValue("initialize")) != string("")) {
initialize = token;
@ -136,11 +143,13 @@ bool FGScript::LoadScript(string script)
newCondition = new struct condition();
while (token != string("/when")) {
if (token == "parameter") {
newCondition->TestParam.push_back(State->GetParameterIndex(Script.GetValue("name")));
prop_name = State->GetPropertyName( Script.GetValue("name") );
newCondition->TestParam.push_back( PropertyManager->GetNode(prop_name) );
newCondition->TestValue.push_back(strtod(Script.GetValue("value").c_str(), NULL));
newCondition->Comparison.push_back(Script.GetValue("comparison"));
} else if (token == "set") {
newCondition->SetParam.push_back(State->GetParameterIndex(Script.GetValue("name")));
prop_name = State->GetPropertyName( Script.GetValue("name") );
newCondition->SetParam.push_back( PropertyManager->GetNode(prop_name) );
newCondition->SetValue.push_back(strtod(Script.GetValue("value").c_str(), NULL));
newCondition->Triggered.push_back(false);
newCondition->OriginalValue.push_back(0.0);
@ -194,11 +203,6 @@ bool FGScript::LoadScript(string script)
Debug(4);
result = FDMExec->LoadModel("aircraft", "engine", aircraft);
if (!result) {
cerr << "Aircraft file " << aircraft << " was not found" << endl;
exit(-1);
}
FGInitialCondition IC(FDMExec);
if ( ! IC.Load("aircraft", aircraft, initialize)) {
@ -228,17 +232,17 @@ bool FGScript::RunScript(void)
// to true
for (i=0; i<iC->TestValue.size(); i++) {
if (iC->Comparison[i] == "lt")
truth = State->GetParameter(iC->TestParam[i]) < iC->TestValue[i];
truth = iC->TestParam[i]->getDoubleValue() < iC->TestValue[i];
else if (iC->Comparison[i] == "le")
truth = State->GetParameter(iC->TestParam[i]) <= iC->TestValue[i];
truth = iC->TestParam[i]->getDoubleValue() <= iC->TestValue[i];
else if (iC->Comparison[i] == "eq")
truth = State->GetParameter(iC->TestParam[i]) == iC->TestValue[i];
truth = iC->TestParam[i]->getDoubleValue() == iC->TestValue[i];
else if (iC->Comparison[i] == "ge")
truth = State->GetParameter(iC->TestParam[i]) >= iC->TestValue[i];
truth = iC->TestParam[i]->getDoubleValue() >= iC->TestValue[i];
else if (iC->Comparison[i] == "gt")
truth = State->GetParameter(iC->TestParam[i]) > iC->TestValue[i];
truth = iC->TestParam[i]->getDoubleValue() > iC->TestValue[i];
else if (iC->Comparison[i] == "ne")
truth = State->GetParameter(iC->TestParam[i]) != iC->TestValue[i];
truth = iC->TestParam[i]->getDoubleValue() != iC->TestValue[i];
else
cerr << "Bad comparison" << endl;
@ -253,7 +257,7 @@ bool FGScript::RunScript(void)
if (WholeTruth) {
for (i=0; i<iC->SetValue.size(); i++) {
if ( ! iC->Triggered[i]) {
iC->OriginalValue[i] = State->GetParameter(iC->SetParam[i]);
iC->OriginalValue[i] = iC->SetParam[i]->getDoubleValue();
switch (iC->Type[i]) {
case FG_VALUE:
iC->newValue[i] = iC->SetValue[i];
@ -289,7 +293,7 @@ bool FGScript::RunScript(void)
cerr << "Invalid Action specified" << endl;
break;
}
State->SetParameter(iC->SetParam[i], newSetValue);
iC->SetParam[i]->setDoubleValue(newSetValue);
}
}
iC++;
@ -338,15 +342,15 @@ void FGScript::Debug(int from)
for (i=0; i<iterConditions->TestValue.size(); i++) {
if (i>0) cout << " and" << endl << " ";
cout << "(" << State->GetParameterName(iterConditions->TestParam[i])
<< iterConditions->Comparison[i] << " "
cout << "(" << iterConditions->TestParam[i]->GetName()
<< " " << iterConditions->Comparison[i] << " "
<< iterConditions->TestValue[i] << ")";
}
cout << ") then {";
for (i=0; i<iterConditions->SetValue.size(); i++) {
cout << endl << " set" << State->GetParameterName(iterConditions->SetParam[i])
<< "to " << iterConditions->SetValue[i];
cout << endl << " set " << iterConditions->SetParam[i]->GetName()
<< " to " << iterConditions->SetValue[i];
switch (iterConditions->Type[i]) {
case FG_VALUE:

View file

@ -63,6 +63,10 @@ CLASS DOCUMENTATION
/** Encapsulates the JSBSim scripting capability.
@author Jon S. Berndt
@version $Id$
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGScript.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Header File </a>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGScript.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Source File </a>
<h4>Scripting support provided via FGScript.</h4>
@ -163,8 +167,8 @@ private:
};
struct condition {
vector <eParam> TestParam;
vector <eParam> SetParam;
vector <FGPropertyManager*> TestParam;
vector <FGPropertyManager*> SetParam;
vector <double> TestValue;
vector <double> SetValue;
vector <string> Comparison;
@ -191,6 +195,7 @@ private:
FGFDMExec* FDMExec;
FGState* State;
FGPropertyManager* PropertyManager;
void Debug(int from);
};

View file

@ -47,8 +47,7 @@ INCLUDES
# endif
#endif
#if defined(_MSC_VER)||defined(__BORLANDCPP__)
#pragma message("\n\nRedefining snprintf\n")
#ifdef _WIN32
#define snprintf _snprintf
#endif
@ -61,7 +60,8 @@ static const char *IdHdr = ID_STATE;
MACROS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#define RegisterVariable(ID,DEF) coeffdef[#ID] = ID; paramdef[ID] = DEF
//#define RegisterVariable(ID,DEF) coeffdef[#ID] = ID; paramdef[ID] = DEF
#define RegisterVariable(ID,DEF) coeffdef[#ID] = ID;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS IMPLEMENTATION
@ -96,84 +96,7 @@ FGState::FGState(FGFDMExec* fdex)
PropertyManager = FDMExec->GetPropertyManager();
InitPropertyMaps();
RegisterVariable(FG_TIME, " time " );
RegisterVariable(FG_QBAR, " qbar " );
RegisterVariable(FG_WINGAREA, " wing_area " );
RegisterVariable(FG_WINGSPAN, " wingspan " );
RegisterVariable(FG_CBAR, " cbar " );
RegisterVariable(FG_ALPHA, " alpha " );
RegisterVariable(FG_ALPHADOT, " alphadot " );
RegisterVariable(FG_BETA, " beta " );
RegisterVariable(FG_ABETA, " |beta| " );
RegisterVariable(FG_BETADOT, " betadot " );
RegisterVariable(FG_PHI, " roll_angle " );
RegisterVariable(FG_THT, " pitch_angle " );
RegisterVariable(FG_PSI, " heading_angle " );
RegisterVariable(FG_PITCHRATE, " pitch_rate " );
RegisterVariable(FG_ROLLRATE, " roll_rate " );
RegisterVariable(FG_YAWRATE, " yaw_rate " );
RegisterVariable(FG_AEROQ, " aero_pitch_rate " );
RegisterVariable(FG_AEROP, " aero_roll_rate " );
RegisterVariable(FG_AEROR, " aero_yaw_rate " );
RegisterVariable(FG_CL_SQRD, " Clift_sqrd " );
RegisterVariable(FG_MACH, " mach " );
RegisterVariable(FG_ALTITUDE, " altitude " );
RegisterVariable(FG_BI2VEL, " BI2Vel " );
RegisterVariable(FG_CI2VEL, " CI2Vel " );
RegisterVariable(FG_ELEVATOR_POS, " elevator_pos " );
RegisterVariable(FG_AELEVATOR_POS, " |elevator_pos| " );
RegisterVariable(FG_NELEVATOR_POS, " elevator_pos_n " );
RegisterVariable(FG_AILERON_POS, " aileron_pos " );
RegisterVariable(FG_AAILERON_POS, " |aileron_pos| " );
RegisterVariable(FG_NAILERON_POS, " aileron_pos_n " );
RegisterVariable(FG_LEFT_AILERON_POS, " left_aileron_pos " );
RegisterVariable(FG_ALEFT_AILERON_POS, " |left_aileron_pos| " );
RegisterVariable(FG_NLEFT_AILERON_POS, " left_aileron_pos_n " );
RegisterVariable(FG_RIGHT_AILERON_POS, " right_aileron_pos " );
RegisterVariable(FG_ARIGHT_AILERON_POS, " |right_aileron_pos| " );
RegisterVariable(FG_NRIGHT_AILERON_POS, " right_aileron_pos_n " );
RegisterVariable(FG_RUDDER_POS, " rudder_pos " );
RegisterVariable(FG_ARUDDER_POS, " |rudder_pos| " );
RegisterVariable(FG_NRUDDER_POS, " rudder_pos_n " );
RegisterVariable(FG_SPDBRAKE_POS, " speedbrake_pos " );
RegisterVariable(FG_NSPDBRAKE_POS, " speedbrake_pos_n " );
RegisterVariable(FG_SPOILERS_POS, " spoiler_pos " );
RegisterVariable(FG_NSPOILERS_POS, " spoiler_pos_n " );
RegisterVariable(FG_FLAPS_POS, " flaps_pos " );
RegisterVariable(FG_NFLAPS_POS, " flaps_pos_n " );
RegisterVariable(FG_GEAR_POS, " gear_pos " );
RegisterVariable(FG_ELEVATOR_CMD, " elevator_cmd " );
RegisterVariable(FG_AILERON_CMD, " aileron_cmd " );
RegisterVariable(FG_RUDDER_CMD, " rudder_cmd " );
RegisterVariable(FG_SPDBRAKE_CMD, " speedbrake_cmd " );
RegisterVariable(FG_SPOILERS_CMD, " spoiler_cmd " );
RegisterVariable(FG_FLAPS_CMD, " flaps_cmd " );
RegisterVariable(FG_THROTTLE_CMD, " throttle_cmd " );
RegisterVariable(FG_GEAR_CMD, " gear_cmd " );
RegisterVariable(FG_THROTTLE_POS, " throttle_pos " );
RegisterVariable(FG_MIXTURE_CMD, " mixture_cmd " );
RegisterVariable(FG_MIXTURE_POS, " mixture_pos " );
RegisterVariable(FG_MAGNETO_CMD, " magneto_cmd " );
RegisterVariable(FG_STARTER_CMD, " starter_cmd " );
RegisterVariable(FG_ACTIVE_ENGINE, " active_engine " );
RegisterVariable(FG_HOVERB, " height/span " );
RegisterVariable(FG_PITCH_TRIM_CMD, " pitch_trim_cmd " );
RegisterVariable(FG_YAW_TRIM_CMD, " yaw_trim_cmd " );
RegisterVariable(FG_ROLL_TRIM_CMD, " roll_trim_cmd " );
RegisterVariable(FG_LEFT_BRAKE_CMD, " left_brake_cmd " );
RegisterVariable(FG_RIGHT_BRAKE_CMD, " right_brake_cmd " );
RegisterVariable(FG_CENTER_BRAKE_CMD, " center_brake_cmd " );
RegisterVariable(FG_ALPHAH, " h-tail alpha " );
RegisterVariable(FG_ALPHAW, " wing alpha " );
RegisterVariable(FG_LBARH, " h-tail arm " );
RegisterVariable(FG_LBARV, " v-tail arm " );
RegisterVariable(FG_HTAILAREA, " h-tail area " );
RegisterVariable(FG_VTAILAREA, " v-tail area " );
RegisterVariable(FG_VBARH, " h-tail volume " );
RegisterVariable(FG_VBARV, " v-tail volume " );
RegisterVariable(FG_SET_LOGGING, " data_logging " );
bind();
Debug(0);
@ -187,354 +110,6 @@ FGState::~FGState()
Debug(1);
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
double FGState::GetParameter(eParam val_idx) {
double scratch;
switch(val_idx) {
case FG_TIME:
return sim_time;
case FG_QBAR:
return Translation->Getqbar();
case FG_WINGAREA:
return Aircraft->GetWingArea();
case FG_WINGSPAN:
return Aircraft->GetWingSpan();
case FG_CBAR:
return Aircraft->Getcbar();
case FG_LBARH:
return Aircraft->Getlbarh();
case FG_LBARV:
return Aircraft->Getvbarh();
case FG_HTAILAREA:
return Aircraft->GetHTailArea();
case FG_VTAILAREA:
return Aircraft->GetVTailArea();
case FG_VBARH:
return Aircraft->Getvbarh();
case FG_VBARV:
return Aircraft->Getvbarv();
case FG_ALPHA:
return Translation->Getalpha();
case FG_ALPHAW:
return Translation->Getalpha() + Aircraft->GetWingIncidence();
case FG_ALPHADOT:
return Translation->Getadot();
case FG_BETA:
return Translation->Getbeta();
case FG_ABETA:
return fabs(Translation->Getbeta());
case FG_BETADOT:
return Translation->Getbdot();
case FG_PHI:
return Rotation->Getphi();
case FG_THT:
return Rotation->Gettht();
case FG_PSI:
return Rotation->Getpsi();
case FG_PITCHRATE:
return Rotation->GetPQR(eQ);
case FG_ROLLRATE:
return Rotation->GetPQR(eP);
case FG_YAWRATE:
return Rotation->GetPQR(eR);
case FG_AEROP:
return Rotation->GetAeroPQR(eP);
case FG_AEROQ:
return Rotation->GetAeroPQR(eQ);
case FG_AEROR:
return Rotation->GetAeroPQR(eR);
case FG_CL_SQRD:
if (Translation->Getqbar() > 0.00)
scratch = Aerodynamics->GetvLastFs(eLift)/(Aircraft->GetWingArea()*Translation->Getqbar());
else
scratch = 0.0;
return scratch*scratch;
case FG_ELEVATOR_POS:
return FCS->GetDePos();
case FG_AELEVATOR_POS:
return fabs(FCS->GetDePos());
case FG_NELEVATOR_POS:
return FCS->GetDePos(ofNorm);
case FG_AILERON_POS:
return FCS->GetDaLPos();
case FG_AAILERON_POS:
return fabs(FCS->GetDaLPos());
case FG_NAILERON_POS:
return FCS->GetDaLPos(ofNorm);
case FG_LEFT_AILERON_POS:
return FCS->GetDaLPos();
case FG_ALEFT_AILERON_POS:
return FCS->GetDaLPos(ofMag);
case FG_NLEFT_AILERON_POS:
return FCS->GetDaLPos(ofNorm);
case FG_RIGHT_AILERON_POS:
return FCS->GetDaRPos();
case FG_ARIGHT_AILERON_POS:
return FCS->GetDaRPos(ofMag);
case FG_NRIGHT_AILERON_POS:
return FCS->GetDaRPos(ofNorm);
case FG_RUDDER_POS:
return FCS->GetDrPos();
case FG_ARUDDER_POS:
return FCS->GetDrPos(ofMag);
case FG_NRUDDER_POS:
return FCS->GetDrPos(ofNorm);
case FG_SPDBRAKE_POS:
return FCS->GetDsbPos();
case FG_NSPDBRAKE_POS:
return FCS->GetDsbPos(ofNorm);
case FG_SPOILERS_POS:
return FCS->GetDspPos();
case FG_NSPOILERS_POS:
return FCS->GetDspPos(ofNorm);
case FG_FLAPS_POS:
return FCS->GetDfPos();
case FG_NFLAPS_POS:
return FCS->GetDfPos(ofNorm);
case FG_ELEVATOR_CMD:
return FCS->GetDeCmd();
case FG_AILERON_CMD:
return FCS->GetDaCmd();
case FG_RUDDER_CMD:
return FCS->GetDrCmd();
case FG_SPDBRAKE_CMD:
return FCS->GetDsbCmd();
case FG_SPOILERS_CMD:
return FCS->GetDspCmd();
case FG_FLAPS_CMD:
return FCS->GetDfCmd();
case FG_MACH:
return Translation->GetMach();
case FG_ALTITUDE:
return Position->Geth();
case FG_BI2VEL:
if(Translation->GetVt() > 0)
return Aircraft->GetWingSpan()/(2.0 * Translation->GetVt());
else
return 0;
case FG_CI2VEL:
if(Translation->GetVt() > 0)
return Aircraft->Getcbar()/(2.0 * Translation->GetVt());
else
return 0;
case FG_THROTTLE_CMD:
if (ActiveEngine < 0) return FCS->GetThrottleCmd(0);
else return FCS->GetThrottleCmd(ActiveEngine);
case FG_THROTTLE_POS:
if (ActiveEngine < 0) return FCS->GetThrottlePos(0);
else return FCS->GetThrottlePos(ActiveEngine);
case FG_MAGNETO_CMD:
if (ActiveEngine < 0) return Propulsion->GetEngine(0)->GetMagnetos();
else return Propulsion->GetEngine(ActiveEngine)->GetMagnetos();
case FG_STARTER_CMD:
if (ActiveEngine < 0) {
if (Propulsion->GetEngine(0)->GetStarter()) return 1.0;
else return 0.0;
} else {
if (Propulsion->GetEngine(ActiveEngine)->GetStarter()) return 1.0;
else return 0.0;
}
case FG_MIXTURE_CMD:
if (ActiveEngine < 0) return FCS->GetMixtureCmd(0);
else return FCS->GetMixtureCmd(ActiveEngine);
case FG_MIXTURE_POS:
if (ActiveEngine < 0) return FCS->GetMixturePos(0);
else return FCS->GetMixturePos(ActiveEngine);
case FG_HOVERB:
return Position->GetHOverBMAC();
case FG_PITCH_TRIM_CMD:
return FCS->GetPitchTrimCmd();
case FG_YAW_TRIM_CMD:
return FCS->GetYawTrimCmd();
case FG_ROLL_TRIM_CMD:
return FCS->GetRollTrimCmd();
case FG_GEAR_CMD:
return FCS->GetGearCmd();
case FG_GEAR_POS:
return FCS->GetGearPos();
default:
cerr << "FGState::GetParameter() - No handler for parameter " << paramdef[val_idx] << endl;
return 0.0;
}
return 0;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
double FGState::GetParameter(string val_string) {
return GetParameter(coeffdef[val_string]);
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
eParam FGState::GetParameterIndex(string val_string)
{
return coeffdef[val_string];
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGState::SetParameter(eParam val_idx, double val)
{
unsigned i;
switch(val_idx) {
case FG_ELEVATOR_POS:
FCS->SetDePos(ofRad,val);
break;
case FG_NELEVATOR_POS:
FCS->SetDePos(ofNorm,val);
break;
case FG_AILERON_POS:
FCS->SetDaLPos(ofRad,val);
break;
case FG_NAILERON_POS:
FCS->SetDaLPos(ofNorm,val);
break;
case FG_LEFT_AILERON_POS:
FCS->SetDaLPos(ofRad,val);
break;
case FG_NLEFT_AILERON_POS:
FCS->SetDaLPos(ofNorm,val);
break;
case FG_RIGHT_AILERON_POS:
FCS->SetDaRPos(ofRad,val);
break;
case FG_NRIGHT_AILERON_POS:
FCS->SetDaRPos(ofNorm,val);
break;
case FG_RUDDER_POS:
FCS->SetDrPos(ofRad,val);
break;
case FG_NRUDDER_POS:
FCS->SetDrPos(ofNorm,val);
break;
case FG_SPDBRAKE_POS:
FCS->SetDsbPos(ofRad,val);
break;
case FG_NSPDBRAKE_POS:
FCS->SetDsbPos(ofNorm,val);
break;
case FG_SPOILERS_POS:
FCS->SetDspPos(ofRad,val);
break;
case FG_NSPOILERS_POS:
FCS->SetDspPos(ofNorm,val);
break;
case FG_FLAPS_POS:
FCS->SetDfPos(ofRad,val);
break;
case FG_NFLAPS_POS:
FCS->SetDfPos(ofNorm,val);
break;
case FG_THROTTLE_POS:
if (ActiveEngine == -1) {
for (i=0; i<Propulsion->GetNumEngines(); i++) {
FCS->SetThrottlePos(i,val);
}
} else {
FCS->SetThrottlePos(ActiveEngine,val);
}
break;
case FG_MIXTURE_POS:
if (ActiveEngine == -1) {
for (i=0; i<Propulsion->GetNumEngines(); i++) {
FCS->SetMixturePos(i,val);
}
} else {
FCS->SetMixturePos(ActiveEngine,val);
}
break;
case FG_ELEVATOR_CMD:
FCS->SetDeCmd(val);
break;
case FG_AILERON_CMD:
FCS->SetDaCmd(val);
break;
case FG_RUDDER_CMD:
FCS->SetDrCmd(val);
break;
case FG_SPDBRAKE_CMD:
FCS->SetDsbCmd(val);
break;
case FG_SPOILERS_CMD:
FCS->SetDspCmd(val);
break;
case FG_FLAPS_CMD:
FCS->SetDfCmd(val);
break;
case FG_THROTTLE_CMD:
if (ActiveEngine == -1) {
for (i=0; i<Propulsion->GetNumEngines(); i++) {
FCS->SetThrottleCmd(i,val);
}
} else {
FCS->SetThrottleCmd(ActiveEngine,val);
}
break;
case FG_MIXTURE_CMD:
if (ActiveEngine == -1) {
for (i=0; i<Propulsion->GetNumEngines(); i++) {
FCS->SetMixtureCmd(i,val);
}
} else {
FCS->SetMixtureCmd(ActiveEngine,val);
}
break;
case FG_MAGNETO_CMD:
if (ActiveEngine == -1) {
for (i=0; i<Propulsion->GetNumEngines(); i++) {
Propulsion->GetEngine(i)->SetMagnetos((int)val);
}
} else {
Propulsion->GetEngine(ActiveEngine)->SetMagnetos((int)val);
}
break;
case FG_STARTER_CMD:
if (ActiveEngine == -1) {
for (i=0; i<Propulsion->GetNumEngines(); i++) {
if (val < 0.001)
Propulsion->GetEngine(i)->SetStarter(false);
else if (val >= 0.001)
Propulsion->GetEngine(i)->SetStarter(true);
}
} else {
Propulsion->GetEngine(ActiveEngine)->SetStarter(true);
}
break;
case FG_ACTIVE_ENGINE:
ActiveEngine = (int)val;
break;
case FG_LEFT_BRAKE_CMD:
FCS->SetLBrake(val);
break;
case FG_CENTER_BRAKE_CMD:
FCS->SetCBrake(val);
break;
case FG_RIGHT_BRAKE_CMD:
FCS->SetRBrake(val);
break;
case FG_GEAR_CMD:
FCS->SetGearCmd(val);
break;
case FG_GEAR_POS:
FCS->SetGearPos(val);
break;
case FG_SET_LOGGING:
if (val < -0.01) Output->Disable();
else if (val > 0.01) Output->Enable();
else Output->Toggle();
break;
default:
cerr << "Parameter '" << val_idx << "' (" << paramdef[val_idx] << ") not handled" << endl;
}
}
//***************************************************************************
//
// Reset: Assume all angles READ FROM FILE IN DEGREES !!
@ -688,29 +263,6 @@ void FGState::Initialize(FGInitialCondition *FGIC) {
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
bool FGState::StoreData(string fname) {
ofstream datafile(fname.c_str());
if (datafile) {
datafile << Translation->GetUVW(eU);
datafile << Translation->GetUVW(eV);
datafile << Translation->GetUVW(eW);
datafile << Position->GetLatitude();
datafile << Position->GetLongitude();
datafile << Rotation->GetEuler(ePhi);
datafile << Rotation->GetEuler(eTht);
datafile << Rotation->GetEuler(ePsi);
datafile << Position->Geth();
datafile.close();
return true;
} else {
cerr << "Could not open dump file " << fname << endl;
return false;
}
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGState::InitMatrices(double phi, double tht, double psi) {
double thtd2, psid2, phid2;
double Sthtd2, Spsid2, Sphid2;
@ -889,14 +441,14 @@ void FGState::ReportState(void)
cout << out;
snprintf(out,80, " Speed: %4.0f KCAS Mach: %5.2f\n",
FDMExec->GetAuxiliary()->GetVcalibratedKTS(),
GetParameter(FG_MACH) );
Translation->GetMach() );
cout << out;
snprintf(out,80, " Altitude: %7.0f ft. AGL Altitude: %7.0f ft.\n",
Position->Geth(),
Position->GetDistanceAGL() );
cout << out;
snprintf(out,80, " Angle of Attack: %6.2f deg Pitch Angle: %6.2f deg\n",
GetParameter(FG_ALPHA)*radtodeg,
Translation->Getalpha()*radtodeg,
Rotation->Gettht()*radtodeg );
cout << out;
snprintf(out,80, " Flight Path Angle: %6.2f deg Climb Rate: %5.0f ft/min\n",
@ -905,11 +457,11 @@ void FGState::ReportState(void)
cout << out;
snprintf(out,80, " Normal Load Factor: %4.2f g's Pitch Rate: %5.2f deg/s\n",
Aircraft->GetNlf(),
GetParameter(FG_PITCHRATE)*radtodeg );
Rotation->GetPQR(2)*radtodeg );
cout << out;
snprintf(out,80, " Heading: %3.0f deg true Sideslip: %5.2f deg Yaw Rate: %5.2f deg/s\n",
Rotation->Getpsi()*radtodeg,
GetParameter(FG_BETA)*radtodeg,
Translation->Getbeta()*radtodeg,
Rotation->GetPQR(3)*radtodeg );
cout << out;
snprintf(out,80, " Bank Angle: %5.2f deg Roll Rate: %5.2f deg/s\n",
@ -917,9 +469,9 @@ void FGState::ReportState(void)
Rotation->GetPQR(1)*radtodeg );
cout << out;
snprintf(out,80, " Elevator: %5.2f deg Left Aileron: %5.2f deg Rudder: %5.2f deg\n",
GetParameter(FG_ELEVATOR_POS)*radtodeg,
GetParameter(FG_AILERON_POS)*radtodeg,
GetParameter(FG_RUDDER_POS)*radtodeg );
FCS->GetDePos(ofRad)*radtodeg,
FCS->GetDaLPos(ofRad)*radtodeg,
FCS->GetDrPos(ofRad)*radtodeg );
cout << out;
snprintf(out,80, " Throttle: %5.2f%c\n",
FCS->GetThrottlePos(0)*100,'%' );
@ -940,149 +492,83 @@ void FGState::ReportState(void)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGState::InitPropertyMaps(void) {
ParamToProp[ FG_TIME ]="sim-time-sec";
ParamToProp[ FG_QBAR ]="aero/qbar-psf";
ParamToProp[ FG_WINGAREA ]="metrics/Sw-sqft";
ParamToProp[ FG_WINGSPAN ]="metrics/bw-ft";
ParamToProp[ FG_CBAR ]="metrics/cbarw-ft";
ParamToProp[ FG_ALPHA ]="aero/alpha-rad";
ParamToProp[ FG_ALPHADOT ]="aero/alphadot-rad_sec";
ParamToProp[ FG_BETA ]="aero/beta-rad";
ParamToProp[ FG_ABETA ]="aero/mag-beta-rad";
ParamToProp[ FG_BETADOT ]="aero/betadot-rad_sec";
ParamToProp[ FG_PHI ]="attitude/phi-rad";
ParamToProp[ FG_THT ]="attitude/theta-rad";
ParamToProp[ FG_PSI ]="attitude/psi-true-rad";
ParamToProp[ FG_PITCHRATE ]="velocities/q-rad_sec";
ParamToProp[ FG_ROLLRATE ]="velocities/p-rad_sec";
ParamToProp[ FG_YAWRATE ]="velocities/r-rad_sec";
ParamToProp[ FG_AEROP ]="velocities/p-aero-rad_sec";
ParamToProp[ FG_AEROQ ]="velocities/q-aero-rad_sec";
ParamToProp[ FG_AEROR ]="velocities/r-aero-rad_sec";
ParamToProp[ FG_CL_SQRD ]="aero/cl-squared-norm";
ParamToProp[ FG_MACH ]="velocities/mach-norm";
ParamToProp[ FG_ALTITUDE ]="position/h-sl-ft";
ParamToProp[ FG_BI2VEL ]="aero/bi2vel";
ParamToProp[ FG_CI2VEL ]="aero/ci2vel";
ParamToProp[ FG_ELEVATOR_POS ]="fcs/elevator-pos-rad";
ParamToProp[ FG_AELEVATOR_POS ]="fcs/mag-elevator-pos-rad";
ParamToProp[ FG_NELEVATOR_POS ]="fcs/elevator-pos-norm";
ParamToProp[ FG_AILERON_POS ]="fcs/left-aileron-pos-rad";
ParamToProp[ FG_AAILERON_POS ]="fcs/mag-aileron-pos-rad";
ParamToProp[ FG_NAILERON_POS ]="fcs/left-aileron-pos-norm";
ParamToProp[ FG_LEFT_AILERON_POS ]="fcs/left-aileron-pos-rad";
ParamToProp[ FG_ALEFT_AILERON_POS ]="fcs/mag-left-aileron-pos-rad";
ParamToProp[ FG_NLEFT_AILERON_POS ]="fcs/left-aileron-pos-norm";
ParamToProp[ FG_RIGHT_AILERON_POS ]="fcs/right-aileron-pos-rad";
ParamToProp[ FG_ARIGHT_AILERON_POS ]="fcs/mag-aileron-pos-rad";
ParamToProp[ FG_NRIGHT_AILERON_POS ]="fcs/right-aileron-pos-norm";
ParamToProp[ FG_RUDDER_POS ]="fcs/rudder-pos-rad";
ParamToProp[ FG_ARUDDER_POS ]="fcs/mag-rudder-pos-rad";
ParamToProp[ FG_NRUDDER_POS ]="fcs/rudder-pos-norm";
ParamToProp[ FG_SPDBRAKE_POS ]="fcs/speedbrake-pos-rad";
ParamToProp[ FG_NSPDBRAKE_POS ]="fcs/speedbrake-pos-norm";
ParamToProp[ FG_SPOILERS_POS ]="fcs/spoiler-pos-rad";
ParamToProp[ FG_NSPOILERS_POS ]="fcs/spoiler-pos-norm";
ParamToProp[ FG_FLAPS_POS ]="fcs/flap-pos-deg";
ParamToProp[ FG_NFLAPS_POS ]="fcs/flap-pos-norm";
ParamToProp[ FG_ELEVATOR_CMD ]="fcs/elevator-cmd-norm";
ParamToProp[ FG_AILERON_CMD ]="fcs/aileron-cmd-norm";
ParamToProp[ FG_RUDDER_CMD ]="fcs/rudder-cmd-norm";
ParamToProp[ FG_SPDBRAKE_CMD ]="fcs/speedbrake-cmd-norm";
ParamToProp[ FG_SPOILERS_CMD ]="fcs/spoiler-cmd-norm";
ParamToProp[ FG_FLAPS_CMD ]="fcs/flap-cmd-norm";
ParamToProp[ FG_THROTTLE_CMD ]="zero";
ParamToProp[ FG_THROTTLE_POS ]="zero";
ParamToProp[ FG_MIXTURE_CMD ]="zero";
ParamToProp[ FG_MIXTURE_POS ]="zero";
ParamToProp[ FG_MAGNETO_CMD ]="zero";
ParamToProp[ FG_STARTER_CMD ]="zero";
ParamToProp[ FG_ACTIVE_ENGINE ]="zero";
ParamToProp[ FG_HOVERB ]="aero/h_b-mac-ft";
ParamToProp[ FG_PITCH_TRIM_CMD ]="fcs/pitch-trim-cmd-norm";
ParamToProp[ FG_YAW_TRIM_CMD ]="fcs/yaw-trim-cmd-norm";
ParamToProp[ FG_ROLL_TRIM_CMD ]="fcs/roll-trim-cmd-norm";
ParamToProp[ FG_LEFT_BRAKE_CMD ]="zero";
ParamToProp[ FG_CENTER_BRAKE_CMD ]="zero";
ParamToProp[ FG_RIGHT_BRAKE_CMD ]="zero";
ParamToProp[ FG_SET_LOGGING ]="zero";
ParamToProp[ FG_ALPHAH ]="aero/alpha-rad";
ParamToProp[ FG_ALPHAW ]="aero/alpha-wing-rad";
ParamToProp[ FG_LBARH ]="metrics/lh-norm";
ParamToProp[ FG_LBARV ]="metrics/lv-norm";
ParamToProp[ FG_HTAILAREA ]="metrics/Sh-sqft";
ParamToProp[ FG_VTAILAREA ]="metrics/Sv-sqft";
ParamToProp[ FG_VBARH ]="metrics/vbarh-norm";
ParamToProp[ FG_VBARV ]="metrics/vbarv-norm";
ParamToProp[ FG_GEAR_CMD ]="gear/gear-cmd-norm";
ParamToProp[ FG_GEAR_POS ]="gear/gear-pos-norm";
ParamNameToProp[ "FG_TIME" ]="sim-time-sec";
ParamNameToProp[ "FG_QBAR" ]="aero/qbar-psf";
ParamNameToProp[ "FG_WINGAREA" ]="metrics/Sw-sqft";
ParamNameToProp[ "FG_WINGSPAN" ]="metrics/bw-ft";
ParamNameToProp[ "FG_CBAR" ]="metrics/cbarw-ft";
ParamNameToProp[ "FG_ALPHA" ]="aero/alpha-rad";
ParamNameToProp[ "FG_ALPHADOT" ]="aero/alphadot-rad_sec";
ParamNameToProp[ "FG_BETA" ]="aero/beta-rad";
ParamNameToProp[ "FG_ABETA" ]="aero/mag-beta-rad";
ParamNameToProp[ "FG_BETADOT" ]="aero/betadot-rad_sec";
ParamNameToProp[ "FG_PHI" ]="attitude/phi-rad";
ParamNameToProp[ "FG_THT" ]="attitude/theta-rad";
ParamNameToProp[ "FG_PSI" ]="attitude/psi-true-rad";
ParamNameToProp[ "FG_PITCHRATE" ]="velocities/q-rad_sec";
ParamNameToProp[ "FG_ROLLRATE" ]="velocities/p-rad_sec";
ParamNameToProp[ "FG_YAWRATE" ]="velocities/r-rad_sec";
ParamNameToProp[ "FG_AEROP" ]="velocities/p-aero-rad_sec";
ParamNameToProp[ "FG_AEROQ" ]="velocities/q-aero-rad_sec";
ParamNameToProp[ "FG_AEROR" ]="velocities/r-aero-rad_sec";
ParamNameToProp[ "FG_CL_SQRD" ]="aero/cl-squared-norm";
ParamNameToProp[ "FG_MACH" ]="velocities/mach-norm";
ParamNameToProp[ "FG_ALTITUDE" ]="position/h-sl-ft";
ParamNameToProp[ "FG_BI2VEL" ]="aero/bi2vel";
ParamNameToProp[ "FG_CI2VEL" ]="aero/ci2vel";
ParamNameToProp[ "FG_ELEVATOR_POS" ]="fcs/elevator-pos-rad";
ParamNameToProp[ "FG_AELEVATOR_POS" ]="fcs/mag-elevator-pos-rad";
ParamNameToProp[ "FG_NELEVATOR_POS" ]="fcs/elevator-pos-norm";
ParamNameToProp[ "FG_AILERON_POS" ]="fcs/left-aileron-pos-rad";
ParamNameToProp[ "FG_AAILERON_POS" ]="fcs/mag-aileron-pos-rad";
ParamNameToProp[ "FG_NAILERON_POS" ]="fcs/left-aileron-pos-norm";
ParamNameToProp[ "FG_LEFT_AILERON_POS" ]="fcs/left-aileron-pos-rad";
ParamNameToProp[ "FG_ALEFT_AILERON_POS" ]="fcs/mag-left-aileron-pos-rad";
ParamNameToProp[ "FG_NLEFT_AILERON_POS" ]="fcs/left-aileron-pos-norm";
ParamNameToProp[ "FG_RIGHT_AILERON_POS" ]="fcs/right-aileron-pos-rad";
ParamNameToProp[ "FG_ARIGHT_AILERON_POS" ]="fcs/mag-aileron-pos-rad";
ParamNameToProp[ "FG_NRIGHT_AILERON_POS" ]="fcs/right-aileron-pos-norm";
ParamNameToProp[ "FG_RUDDER_POS" ]="fcs/rudder-pos-rad";
ParamNameToProp[ "FG_ARUDDER_POS" ]="fcs/mag-rudder-pos-rad";
ParamNameToProp[ "FG_NRUDDER_POS" ]="fcs/rudder-pos-norm";
ParamNameToProp[ "FG_SPDBRAKE_POS" ]="fcs/speedbrake-pos-rad";
ParamNameToProp[ "FG_NSPDBRAKE_POS" ]="fcs/speedbrake-pos-norm";
ParamNameToProp[ "FG_SPOILERS_POS" ]="fcs/spoiler-pos-rad";
ParamNameToProp[ "FG_NSPOILERS_POS" ]="fcs/spoiler-pos-norm";
ParamNameToProp[ "FG_FLAPS_POS" ]="fcs/flap-pos-deg";
ParamNameToProp[ "FG_NFLAPS_POS" ]="fcs/flap-pos-norm";
ParamNameToProp[ "FG_ELEVATOR_CMD" ]="fcs/elevator-cmd-norm";
ParamNameToProp[ "FG_AILERON_CMD" ]="fcs/aileron-cmd-norm";
ParamNameToProp[ "FG_RUDDER_CMD" ]="fcs/rudder-cmd-norm";
ParamNameToProp[ "FG_SPDBRAKE_CMD" ]="fcs/speedbrake-cmd-norm";
ParamNameToProp[ "FG_SPOILERS_CMD" ]="fcs/spoiler-cmd-norm";
ParamNameToProp[ "FG_FLAPS_CMD" ]="fcs/flap-cmd-norm";
ParamNameToProp[ "FG_THROTTLE_CMD" ]="fcs/throttle-cmd-norm";
ParamNameToProp[ "FG_THROTTLE_POS" ]="fcs/throttle-pos-norm";
ParamNameToProp[ "FG_MIXTURE_CMD" ]="fcs/mixture-cmd-norm";
ParamNameToProp[ "FG_MIXTURE_POS" ]="fcs/mixture-pos-norm";
ParamNameToProp[ "FG_MAGNETO_CMD" ]="zero";
ParamNameToProp[ "FG_STARTER_CMD" ]="zero";
ParamNameToProp[ "FG_ACTIVE_ENGINE" ]="zero";
ParamNameToProp[ "FG_HOVERB" ]="aero/h_b-mac-ft";
ParamNameToProp[ "FG_PITCH_TRIM_CMD" ]="fcs/pitch-trim-cmd-norm";
ParamNameToProp[ "FG_YAW_TRIM_CMD" ]="fcs/yaw-trim-cmd-norm";
ParamNameToProp[ "FG_ROLL_TRIM_CMD" ]="fcs/roll-trim-cmd-norm";
ParamNameToProp[ "FG_LEFT_BRAKE_CMD" ]="zero";
ParamNameToProp[ "FG_CENTER_BRAKE_CMD" ]="zero";
ParamNameToProp[ "FG_RIGHT_BRAKE_CMD" ]="zero";
ParamNameToProp[ "FG_SET_LOGGING" ]="zero";
ParamNameToProp[ "FG_ALPHAH" ]="aero/alpha-rad";
ParamNameToProp[ "FG_ALPHAW" ]="aero/alpha-wing-rad";
ParamNameToProp[ "FG_LBARH" ]="metrics/lh-norm";
ParamNameToProp[ "FG_LBARV" ]="metrics/lv-norm";
ParamNameToProp[ "FG_HTAILAREA" ]="metrics/Sh-sqft";
ParamNameToProp[ "FG_VTAILAREA" ]="metrics/Sv-sqft";
ParamNameToProp[ "FG_VBARH" ]="metrics/vbarh-norm";
ParamNameToProp[ "FG_VBARV" ]="metrics/vbarv-norm";
ParamNameToProp[ "FG_GEAR_CMD" ]="gear/gear-cmd-norm";
ParamNameToProp[ "FG_GEAR_POS" ]="gear/gear-pos-norm";
PropToParam[ "sim-time-sec" ] = FG_TIME;
PropToParam[ "aero/qbar-psf" ] = FG_QBAR;
PropToParam[ "metrics/Sw-sqft" ] = FG_WINGAREA;
PropToParam[ "metrics/bw-ft" ] = FG_WINGSPAN;
PropToParam[ "metrics/cbarw-ft" ] = FG_CBAR;
PropToParam[ "aero/alpha-rad" ] = FG_ALPHA;
PropToParam[ "aero/alphadot-rad_sec" ] = FG_ALPHADOT;
PropToParam[ "aero/beta-rad" ] = FG_BETA;
PropToParam[ "aero/mag-beta-rad" ] = FG_ABETA;
PropToParam[ "aero/betadot-rad_sec" ] = FG_BETADOT;
PropToParam[ "attitude/phi-rad" ] = FG_PHI;
PropToParam[ "attitude/theta-rad" ] = FG_THT;
PropToParam[ "attitude/psi-true-rad" ] = FG_PSI;
PropToParam[ "velocities/q-rad_sec" ] = FG_PITCHRATE;
PropToParam[ "velocities/p-rad_sec" ] = FG_ROLLRATE;
PropToParam[ "velocities/r-rad_sec" ] = FG_YAWRATE;
PropToParam[ "velocities/p-aero-rad_sec" ] = FG_AEROP;
PropToParam[ "velocities/q-aero-rad_sec" ] = FG_AEROQ;
PropToParam[ "velocities/r-aero-rad_sec" ] = FG_AEROR;
PropToParam[ "aero/cl-squared-norm" ] = FG_CL_SQRD;
PropToParam[ "velocities/mach-norm" ] = FG_MACH;
PropToParam[ "position/h-sl-ft" ] = FG_ALTITUDE;
PropToParam[ "aero/bi2vel" ] = FG_BI2VEL;
PropToParam[ "aero/ci2vel" ] = FG_CI2VEL;
PropToParam[ "fcs/elevator-pos-rad" ] = FG_ELEVATOR_POS;
PropToParam[ "fcs/mag-elevator-pos-rad" ] = FG_AELEVATOR_POS;
PropToParam[ "fcs/elevator-pos-norm" ] = FG_NELEVATOR_POS;
PropToParam[ "fcs/left-aileron-pos-rad" ] = FG_AILERON_POS;
PropToParam[ "fcs/mag-aileron-pos-rad" ] = FG_AAILERON_POS;
PropToParam[ "fcs/left-aileron-pos-norm" ] = FG_NAILERON_POS;
PropToParam[ "fcs/left-aileron-pos-rad" ] = FG_LEFT_AILERON_POS;
PropToParam[ "fcs/mag-left-aileron-pos-rad" ] = FG_ALEFT_AILERON_POS;
PropToParam[ "fcs/left-aileron-pos-norm" ] = FG_NLEFT_AILERON_POS;
PropToParam[ "fcs/right-aileron-pos-rad" ] = FG_RIGHT_AILERON_POS;
PropToParam[ "fcs/mag-aileron-pos-rad" ] = FG_ARIGHT_AILERON_POS;
PropToParam[ "fcs/right-aileron-pos-norm" ] = FG_NRIGHT_AILERON_POS;
PropToParam[ "fcs/rudder-pos-rad" ] = FG_RUDDER_POS;
PropToParam[ "fcs/mag-rudder-pos-rad" ] = FG_ARUDDER_POS;
PropToParam[ "fcs/rudder-pos-norm" ] = FG_NRUDDER_POS;
PropToParam[ "fcs/speedbrake-pos-rad" ] = FG_SPDBRAKE_POS;
PropToParam[ "fcs/speedbrake-pos-norm" ] = FG_NSPDBRAKE_POS;
PropToParam[ "fcs/spoiler-pos-rad" ] = FG_SPOILERS_POS;
PropToParam[ "fcs/spoiler-pos-norm" ] = FG_NSPOILERS_POS;
PropToParam[ "fcs/flap-pos-deg" ] = FG_FLAPS_POS;
PropToParam[ "fcs/flap-pos-norm" ] = FG_NFLAPS_POS;
PropToParam[ "fcs/elevator-cmd-norm" ] = FG_ELEVATOR_CMD;
PropToParam[ "fcs/aileron-cmd-norm" ] = FG_AILERON_CMD;
PropToParam[ "fcs/rudder-cmd-norm" ] = FG_RUDDER_CMD;
PropToParam[ "fcs/speedbrake-cmd-norm" ] = FG_SPDBRAKE_CMD;
PropToParam[ "fcs/spoiler-cmd-norm" ] = FG_SPOILERS_CMD;
PropToParam[ "fcs/flap-cmd-norm" ] = FG_FLAPS_CMD;
PropToParam[ "aero/h_b-mac-ft" ] = FG_HOVERB;
PropToParam[ "fcs/pitch-trim-cmd-norm" ] = FG_PITCH_TRIM_CMD;
PropToParam[ "fcs/yaw-trim-cmd-norm" ] = FG_YAW_TRIM_CMD;
PropToParam[ "fcs/roll-trim-cmd-norm" ] = FG_ROLL_TRIM_CMD;
PropToParam[ "aero/alpha-rad" ] = FG_ALPHAH;
PropToParam[ "aero/alpha-wing-rad" ] = FG_ALPHAW;
PropToParam[ "metrics/lh-norm" ] = FG_LBARH;
PropToParam[ "metrics/lv-norm" ] = FG_LBARV;
PropToParam[ "metrics/Sh-sqft" ] = FG_HTAILAREA;
PropToParam[ "metrics/Sv-sqft" ] = FG_VTAILAREA;
PropToParam[ "metrics/vbarh-norm" ] = FG_VBARH;
PropToParam[ "metrics/vbarv-norm" ] = FG_VBARV;
PropToParam[ "gear/gear-cmd-norm" ] = FG_GEAR_CMD;
PropToParam[ "gear/gear-pos-norm" ] = FG_GEAR_POS;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -95,6 +95,10 @@ CLASS DOCUMENTATION
/** Encapsulates the calculation of aircraft state.
@author Jon S. Berndt
@version $Id$
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGState.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Header File </a>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGState.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Source File </a>
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -166,12 +170,6 @@ public:
*/
void Initialize(FGInitialCondition *FGIC);
/** Stores state data in the supplied file name.
@param filename the file to store the data in.
@return true if successful.
*/
bool StoreData(string filename);
/// returns the speed of sound in feet per second.
inline double Geta(void) { return a; }
@ -185,38 +183,11 @@ public:
/// Resumes the simulation by resetting delta T to the correct value.
inline void Resume(void) {dt = saved_dt;}
/** Retrieves a parameter.
The parameters that can be retrieved are enumerated in FGJSBBase.h.
@param val_idx one of the enumerated JSBSim parameters.
@return the value of the parameter.
*/
double GetParameter(eParam val_idx);
/** Retrieves a parameter.
The parameters that can be retrieved are enumerated in FGJSBBase.h.
@param val_string a string representing one of the enumerated JSBSim parameters,
i.e. "FG_QBAR".
@return the value of the parameter.
*/
double GetParameter(string val_string);
/** Retrieves the JSBSim parameter enumerated item given the text string.
@param val_string the parameter string, i.e. "FG_QBAR".
@return the JSBSim parameter index (an enumerated type) for the supplied string.
*/
eParam GetParameterIndex(string val_string);
/** Sets the speed of sound.
@param speed the speed of sound in feet per second.
*/
inline void Seta(double speed) { a = speed; }
/** Gets the name of the parameter given the index.
@param val_idx one of the enumerated JSBSim parameters.
@return the name of the parameter pointed to by the index.
*/
string GetParameterName(eParam val_idx) {return paramdef[val_idx];}
/** Sets the current sim time.
@param cur_time the current time
@return the current time.
@ -231,12 +202,6 @@ public:
*/
inline void Setdt(double delta_t) { dt = delta_t; }
/** Sets the JSBSim parameter to the supplied value.
@param prm the JSBSim parameter to set, i.e. FG_RUDDER_POS.
@param val the value to give the parameter.
*/
void SetParameter(eParam prm, double val);
/** Increments the simulation time.
@return the new simulation time.
*/
@ -309,8 +274,9 @@ public:
*/
void ReportState(void);
inline string GetPropertyName(eParam prm) { return ParamToProp[prm]; }
inline eParam GetParam(string property) { return PropToParam[property]; }
inline string GetPropertyName(string prm) { return ParamNameToProp[prm]; }
//inline string GetPropertyName(eParam prm) { return ParamIdxToProp[prm]; }
//inline eParam GetParam(string property) { return PropToParam[property]; }
void bind();
void unbind();
@ -347,14 +313,19 @@ private:
FGPropulsion* Propulsion;
FGPropertyManager* PropertyManager;
typedef map<string, eParam> CoeffMap;
/* typedef map<string, eParam> CoeffMap;
CoeffMap coeffdef;
typedef map<eParam, string> ParamMap;
ParamMap paramdef;
//ParamMap paramdef; */
ParamMap ParamToProp;
CoeffMap PropToParam;
typedef map<string,string> ParamNameMap;
ParamNameMap ParamNameToProp;
typedef map<eParam,string> ParamIdxMap;
ParamIdxMap ParamIdxToProp;
//CoeffMap PropToParam;
int ActiveEngine;

View file

@ -65,6 +65,10 @@ CLASS DOCUMENTATION
@version $Id$
@see FGCoefficient
@see FGPropeller
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGTable.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Header File </a>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGTable.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Source File </a>
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -76,7 +76,7 @@ typedef enum { tLongitudinal, tFull, tGround, tPullup,
tCustom, tNone, tTurn
} TrimMode;
#ifdef _MSC_VER
#ifdef _WIN32
#define snprintf _snprintf
#endif
@ -140,6 +140,10 @@ CLASS DOCUMENTATION
fgt->ReportState();
@author Tony Peden
@version $Id$
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGTrim.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Header File </a>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGTrim.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Source File </a>
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -51,12 +51,11 @@ FGFCSComponent::FGFCSComponent(FGFCS* _fcs) : fcs(_fcs)
Type = "";
ID = 0;
Input = 0.0;
InputIdx = FG_UNDEF;
InputNode = 0;
Output = 0.0;
sOutputIdx = "";
OutputIdx = FG_UNDEF;
OutputNode = 0;
IsOutput = false;
PropertyManager=fcs->GetPropertyManager();
Debug(0);
}
@ -71,7 +70,7 @@ FGFCSComponent::~FGFCSComponent()
void FGFCSComponent::SetOutput(void)
{
fcs->GetState()->SetParameter(OutputIdx, Output);
OutputNode->setDoubleValue(Output);
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -80,14 +79,15 @@ bool FGFCSComponent::Run(void)
{
switch(InputType) {
case itPilotAC:
Input = fcs->GetState()->GetParameter(InputIdx);
Input = InputNode->getDoubleValue();
break;
case itFCS:
Input = fcs->GetComponentOutput(InputIdx);
break;
Input = fcs->GetComponentOutput(InputIdx);
case itAP:
// implement autopilot input mechanism
break;
case itBias:
break;
}
return true;

View file

@ -43,6 +43,8 @@ INCLUDES
#include <string>
#include "../FGJSBBase.h"
#include "../FGPropertyManager.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS
@ -100,7 +102,7 @@ public:
virtual bool Run(void);
virtual void SetOutput(void);
inline double GetOutput (void) {return Output;}
inline int GetOutputIdx(void) { return OutputIdx; }
inline FGPropertyManager* GetOutputNode(void) { return OutputNode; }
inline string GetName(void) {return Name;}
inline string GetType(void) { return Type; }
virtual double GetOutputPct(void) { return 0; }
@ -109,13 +111,14 @@ protected:
/// Pilot/Aircraft, FCS, Autopilot inputs
enum eInputType {itPilotAC, itFCS, itAP, itBias} InputType;
FGFCS* fcs;
FGPropertyManager* PropertyManager;
string Type;
string Name;
int ID;
eParam InputIdx;
FGPropertyManager* InputNode;
int InputIdx;
double Input;
string sOutputIdx;
eParam OutputIdx;
FGPropertyManager* OutputNode;
double Output;
bool IsOutput;
virtual void Debug(int from);

View file

@ -51,6 +51,7 @@ FGFilter::FGFilter(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
{
string token;
double denom;
string sOutputIdx;
Type = AC_cfg->GetValue("TYPE");
Name = AC_cfg->GetValue("NAME");
@ -80,7 +81,8 @@ FGFilter::FGFilter(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
token = AC_cfg->GetValue("INPUT");
if (token.find("FG_") != token.npos) {
*AC_cfg >> token;
InputIdx = fcs->GetState()->GetParameterIndex(token);
InputNode = PropertyManager->GetNode(
fcs->GetState()->GetPropertyName(token) );
InputType = itPilotAC;
} else {
*AC_cfg >> InputIdx;
@ -91,7 +93,8 @@ FGFilter::FGFilter(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
{
IsOutput = true;
*AC_cfg >> sOutputIdx;
OutputIdx = fcs->GetState()->GetParameterIndex(sOutputIdx);
OutputNode = PropertyManager->GetNode(
fcs->GetState()->GetPropertyName(sOutputIdx) );
}
else cerr << "Unknown filter type: " << token << endl;
}
@ -215,12 +218,15 @@ void FGFilter::Debug(int from)
cout << " ID: " << ID << endl;
switch(InputType) {
case itPilotAC:
cout << " INPUT: " << fcs->GetState()->GetParameterName(InputIdx) << endl;
cout << " INPUT: " << InputNode->getName() << endl;
break;
case itFCS:
cout << " INPUT: FCS Component " << InputIdx << " (" <<
fcs->GetComponentName(InputIdx) << ")" << endl;
break;
case itAP:
case itBias:
break;
}
cout << " C1: " << C1 << endl;
cout << " C2: " << C2 << endl;
@ -228,7 +234,7 @@ void FGFilter::Debug(int from)
cout << " C4: " << C4 << endl;
cout << " C5: " << C5 << endl;
cout << " C6: " << C6 << endl;
if (IsOutput) cout << " OUTPUT: " << sOutputIdx << endl;
if (IsOutput) cout << " OUTPUT: " << OutputNode->getName() << endl;
}
}
if (debug_lvl & 2 ) { // Instantiation/Destruction notification

View file

@ -77,6 +77,10 @@ CLASS DOCUMENTATION
</pre>
@author Jon S. Berndt
@version $Id$
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGFilter.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Header File </a>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGFilter.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Source File </a>
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -52,6 +52,7 @@ FGGain::FGGain(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
{
string token;
string strScheduledBy;
string sOutputIdx;
State = fcs->GetState();
@ -60,7 +61,7 @@ FGGain::FGGain(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
Min = Max = 0.0;
OutputPct=0;
invert=false;
ScheduledBy = FG_UNDEF;
ScheduledBy = 0;
Type = AC_cfg->GetValue("TYPE");
Name = AC_cfg->GetValue("NAME");
@ -74,7 +75,8 @@ FGGain::FGGain(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
token = AC_cfg->GetValue("INPUT");
if (token.find("FG_") != token.npos) {
*AC_cfg >> token;
InputIdx = State->GetParameterIndex(token);
InputNode = PropertyManager->GetNode(
fcs->GetState()->GetPropertyName(token) );
InputType = itPilotAC;
} else {
*AC_cfg >> InputIdx;
@ -95,14 +97,15 @@ FGGain::FGGain(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
token = AC_cfg->GetValue("SCHEDULED_BY");
if (token.find("FG_") != token.npos) {
*AC_cfg >> strScheduledBy;
ScheduledBy = State->GetParameterIndex(strScheduledBy);
} else {
*AC_cfg >> ScheduledBy;
}
ScheduledBy = PropertyManager->GetNode(
fcs->GetState()->GetPropertyName(strScheduledBy) );
}
} else if (token == "OUTPUT") {
IsOutput = true;
*AC_cfg >> sOutputIdx;
OutputIdx = State->GetParameterIndex(sOutputIdx);
*AC_cfg >> sOutputIdx;
OutputNode = PropertyManager->GetNode(
fcs->GetState()->GetPropertyName(sOutputIdx) );
} else {
AC_cfg->ResetLineIndexToZero();
*Table << *AC_cfg;
@ -130,7 +133,7 @@ bool FGGain::Run(void )
if (Type == "PURE_GAIN") {
Output = Gain * Input;
} else if (Type == "SCHEDULED_GAIN") {
LookupVal = State->GetParameter(ScheduledBy);
LookupVal = ScheduledBy->getDoubleValue();
SchedGain = Table->GetValue(LookupVal);
Output = Gain * SchedGain * Input;
} else if (Type == "AEROSURFACE_SCALE") {
@ -179,20 +182,23 @@ void FGGain::Debug(int from)
cout << " ID: " << ID << endl;
switch(InputType) {
case itPilotAC:
cout << " INPUT: " << State->GetParameterName(InputIdx) << endl;
cout << " INPUT: " << InputNode->getName() << endl;
break;
case itFCS:
cout << " INPUT: FCS Component " << InputIdx << " (" <<
fcs->GetComponentName(InputIdx) << ")" << endl;
break;
case itAP:
case itBias:
break;
}
cout << " GAIN: " << Gain << endl;
if (IsOutput) cout << " OUTPUT: " << sOutputIdx << endl;
if (IsOutput) cout << " OUTPUT: " << OutputNode->getName() << endl;
cout << " MIN: " << Min << endl;
cout << " MAX: " << Max << endl;
if(invert) cout << " Invert mapping" << endl;
if (ScheduledBy != FG_UNDEF) {
cout << " Scheduled by parameter: " << ScheduledBy << endl;
if (ScheduledBy != 0) {
cout << " Scheduled by parameter: " << ScheduledBy->getName() << endl;
Table->Print();
}
}

View file

@ -53,6 +53,7 @@ INCLUDES
#include "../FGConfigFile.h"
#include "../FGTable.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
@ -84,7 +85,7 @@ private:
double OutputPct;
bool invert;
int Rows;
eParam ScheduledBy;
FGPropertyManager* ScheduledBy;
void Debug(int from);
};

View file

@ -49,7 +49,7 @@ CLASS IMPLEMENTATION
FGKinemat::FGKinemat(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
AC_cfg(AC_cfg)
{
string token;
string token,sOutputIdx;
double tmpDetent;
double tmpTime;
@ -70,8 +70,12 @@ FGKinemat::FGKinemat(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
token = AC_cfg->GetValue("INPUT");
if (token.find("FG_") != token.npos) {
*AC_cfg >> token;
InputIdx = fcs->GetState()->GetParameterIndex(token);
InputNode = PropertyManager->GetNode(
fcs->GetState()->GetPropertyName(token) );
InputType = itPilotAC;
} else {
*AC_cfg >> InputIdx;
InputType = itFCS;
}
} else if ( token == "DETENTS" ) {
*AC_cfg >> NumDetents;
@ -85,7 +89,8 @@ FGKinemat::FGKinemat(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
IsOutput = true;
*AC_cfg >> sOutputIdx;
OutputIdx = fcs->GetState()->GetParameterIndex(sOutputIdx);
OutputNode = PropertyManager->GetNode(
fcs->GetState()->GetPropertyName(sOutputIdx) );
}
}
@ -107,8 +112,8 @@ bool FGKinemat::Run(void ) {
FGFCSComponent::Run(); // call the base class for initialization of Input
InputCmd = Input*Detents[NumDetents-1];
OutputPos = fcs->GetState()->GetParameter(OutputIdx);
OutputPos = OutputNode->getDoubleValue();
if(InputCmd < Detents[0]) {
fi=0;
InputCmd=Detents[0];
@ -127,11 +132,10 @@ bool FGKinemat::Run(void ) {
OutputPos=InputCmd;
else {
if(InputCmd != lastInputCmd) {
InTransit=1;
}
//cout << "FGKinemat::Run, InTransit: " << InTransit << endl;
if(InTransit) {
//fprintf(stderr,"InputCmd: %g, OutputPos: %g\n",InputCmd,OutputPos);
fi=0;
while(Detents[fi] < InputCmd) {
@ -142,15 +146,18 @@ bool FGKinemat::Run(void ) {
output_transit_rate=(Detents[fi] - Detents[fi-1])/TransitionTimes[fi];
else
output_transit_rate=(Detents[fi] - Detents[fi-1])/5;
//cout << "FGKinemat::Run, output_transit_rate: " << output_transit_rate << endl;
} else {
if(TransitionTimes[fi+1] > 0)
output_transit_rate=(Detents[fi] - Detents[fi+1])/TransitionTimes[fi+1];
else
output_transit_rate=(Detents[fi] - Detents[fi+1])/5;
}
if(fabs(OutputPos - InputCmd) > fabs(dt*output_transit_rate) )
if(fabs(OutputPos - InputCmd) > fabs(dt*output_transit_rate) ) {
OutputPos+=output_transit_rate*dt;
else {
//cout << "FGKinemat::Run, OutputPos: " << OutputPos
// << " dt: " << dt << endl;
} else {
InTransit=0;
OutputPos=InputCmd;
}
@ -195,12 +202,12 @@ void FGKinemat::Debug(int from)
if (debug_lvl & 1) { // Standard console startup message output
if (from == 0) { // Constructor
cout << " ID: " << ID << endl;
cout << " INPUT: " << InputIdx << endl;
cout << " INPUT: " << InputNode->getName() << endl;
cout << " DETENTS: " << NumDetents << endl;
for(int i=0;i<NumDetents;i++) {
cout << " " << Detents[i] << " " << TransitionTimes[i] << endl;
}
if (IsOutput) cout << " OUTPUT: " <<sOutputIdx << endl;
if (IsOutput) cout << " OUTPUT: " << OutputNode->getName() << endl;
}
}
if (debug_lvl & 2 ) { // Instantiation/Destruction notification

View file

@ -50,14 +50,14 @@ CLASS IMPLEMENTATION
FGSummer::FGSummer(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
AC_cfg(AC_cfg)
{
string token;
string token,sOutputIdx;
eParam tmpInputIndex;
InputRec *input;
clip = false;
clipmin = clipmax = 0.0;
Bias = 0.0;
InputIndices.clear();
InputTypes.clear();
Inputs.clear();
Type = AC_cfg->GetValue("TYPE");
Name = AC_cfg->GetValue("NAME");
@ -69,21 +69,26 @@ FGSummer::FGSummer(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
if (token == "ID") {
*AC_cfg >> ID;
} else if (token == "INPUT") {
input = new InputRec;
token = AC_cfg->GetValue("INPUT");
if (token.find("FG_") != token.npos) {
*AC_cfg >> token;
tmpInputIndex = fcs->GetState()->GetParameterIndex(token);
InputIndices.push_back(tmpInputIndex);
InputTypes.push_back(itPilotAC);
input->Node = PropertyManager->GetNode(
fcs->GetState()->GetPropertyName(token) );
input->Idx=-1;
input->Type = itPilotAC;
} else if (token.find(".") != token.npos) { // bias
*AC_cfg >> Bias;
InputIndices.push_back((eParam)0);
InputTypes.push_back(itBias);
input->Node=0;
input->Idx=0;
input->Type=itBias;
} else {
*AC_cfg >> tmpInputIndex;
InputIndices.push_back(tmpInputIndex);
InputTypes.push_back(itFCS);
input->Idx=tmpInputIndex;
input->Node=0;
input->Type=itFCS;
}
Inputs.push_back(input);
} else if (token == "CLIPTO") {
*AC_cfg >> clipmin >> clipmax;
if (clipmax > clipmin) {
@ -92,7 +97,8 @@ FGSummer::FGSummer(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
} else if (token == "OUTPUT") {
IsOutput = true;
*AC_cfg >> sOutputIdx;
OutputIdx = fcs->GetState()->GetParameterIndex(sOutputIdx);
OutputNode = PropertyManager->GetNode(
fcs->GetState()->GetPropertyName(sOutputIdx) );
}
}
@ -103,6 +109,10 @@ FGSummer::FGSummer(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
FGSummer::~FGSummer()
{
unsigned i;
for(i=0;i<Inputs.size();i++) {
delete Inputs[i];
}
Debug(1);
}
@ -117,13 +127,13 @@ bool FGSummer::Run(void )
Output = 0.0;
for (idx=0; idx<InputIndices.size(); idx++) {
switch (InputTypes[idx]) {
for (idx=0; idx<Inputs.size(); idx++) {
switch (Inputs[idx]->Type) {
case itPilotAC:
Output += fcs->GetState()->GetParameter(InputIndices[idx]);
Output += Inputs[idx]->Node->getDoubleValue();
break;
case itFCS:
Output += fcs->GetComponentOutput(InputIndices[idx]);
Output += fcs->GetComponentOutput(Inputs[idx]->Idx);
break;
case itBias:
Output += Bias;
@ -168,14 +178,14 @@ void FGSummer::Debug(int from)
if (from == 0) { // Constructor
cout << " ID: " << ID << endl;
cout << " INPUTS: " << endl;
for (unsigned i=0;i<InputIndices.size();i++) {
switch (InputTypes[i]) {
for (unsigned i=0;i<Inputs.size();i++) {
switch (Inputs[i]->Type) {
case itPilotAC:
cout << " " << fcs->GetState()->GetParameterName(InputIndices[i]) << endl;
cout << " " << Inputs[i]->Node->getName() << endl;
break;
case itFCS:
cout << " FCS Component " << InputIndices[i] << " (" <<
fcs->GetComponentName(InputIndices[i]) << ")" << endl;
cout << " FCS Component " << Inputs[i]->Idx << " (" <<
fcs->GetComponentName(Inputs[i]->Idx) << ")" << endl;
break;
case itBias:
cout << " " << "Bias of " << Bias << endl;
@ -184,7 +194,7 @@ void FGSummer::Debug(int from)
}
if (clip) cout << " CLIPTO: " << clipmin
<< ", " << clipmax << endl;
if (IsOutput) cout << " OUTPUT: " <<sOutputIdx << endl;
if (IsOutput) cout << " OUTPUT: " <<OutputNode->getName() << endl;
}
}
if (debug_lvl & 2 ) { // Instantiation/Destruction notification

View file

@ -75,7 +75,10 @@ CLASS DOCUMENTATION
state variables, or even floating point numbers (e.g. for a bias).
@author Jon S. Berndt
@version $Id$
@see
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGSummer.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Header File </a>
@see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGSummer.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
Source File </a>
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -97,8 +100,12 @@ public:
private:
FGConfigFile* AC_cfg;
vector <eParam> InputIndices;
vector <int> InputTypes;
typedef struct {
FGPropertyManager* Node;
int Idx;
int Type;
} InputRec;
vector <InputRec*> Inputs;
bool clip;
double clipmin,clipmax;
double Bias;