JSBSim updates. This update changes the file format, so an update of the base
package is required.
This commit is contained in:
parent
4acbe1fcc3
commit
ab242159a3
22 changed files with 167 additions and 397 deletions
|
@ -111,14 +111,13 @@ FGCoefficient::~FGCoefficient()
|
|||
bool FGCoefficient::Load(FGConfigFile *AC_cfg)
|
||||
{
|
||||
int start, end, n;
|
||||
string mult,prop;
|
||||
string mult;
|
||||
|
||||
if (AC_cfg) {
|
||||
name = AC_cfg->GetValue("NAME");
|
||||
method = AC_cfg->GetValue("TYPE");
|
||||
AC_cfg->GetNextConfigLine();
|
||||
*AC_cfg >> description;
|
||||
|
||||
if (method == "EQUATION") type = EQUATION;
|
||||
else if (method == "TABLE") type = TABLE;
|
||||
else if (method == "VECTOR") type = VECTOR;
|
||||
|
@ -135,42 +134,46 @@ bool FGCoefficient::Load(FGConfigFile *AC_cfg)
|
|||
}
|
||||
|
||||
*AC_cfg >> multparmsRow;
|
||||
prop = State->GetPropertyName( multparmsRow );
|
||||
LookupR = PropertyManager->GetNode( prop );
|
||||
LookupR = PropertyManager->GetNode( multparmsRow );
|
||||
}
|
||||
|
||||
if (type == TABLE) {
|
||||
*AC_cfg >> multparmsCol;
|
||||
prop = State->GetPropertyName( multparmsCol );
|
||||
|
||||
LookupC = PropertyManager->GetNode( prop );
|
||||
LookupC = PropertyManager->GetNode( multparmsCol );
|
||||
}
|
||||
|
||||
// Here, read in the line of the form (e.g.) FG_MACH|FG_QBAR|FG_ALPHA
|
||||
// where each non-dimensionalizing parameter for this coefficient is
|
||||
// separated by a | character
|
||||
|
||||
*AC_cfg >> multparms;
|
||||
string line=AC_cfg->GetCurrentLine();
|
||||
unsigned j=0;
|
||||
char tmp[255];
|
||||
for(unsigned i=0;i<line.length(); i++ ) {
|
||||
if( !isspace(line[i]) ) {
|
||||
tmp[j]=line[i];
|
||||
j++;
|
||||
}
|
||||
}
|
||||
tmp[j]='\0'; multparms=tmp;
|
||||
end = multparms.length();
|
||||
|
||||
end = multparms.length();
|
||||
n = multparms.find("|");
|
||||
start = 0;
|
||||
|
||||
if (multparms != string("FG_NONE")) {
|
||||
if (multparms != string("none")) {
|
||||
while (n < end && n >= 0) {
|
||||
n -= start;
|
||||
mult = multparms.substr(start,n);
|
||||
prop= State->GetPropertyName( mult );
|
||||
multipliers.push_back( PropertyManager->GetNode(prop) );
|
||||
multipliers.push_back( resolveSymbol( mult ) );
|
||||
start += n+1;
|
||||
n = multparms.find("|",start);
|
||||
}
|
||||
prop=State->GetPropertyName( multparms.substr(start,n) );
|
||||
mult = multparms.substr(start,n);
|
||||
multipliers.push_back( PropertyManager->GetNode(prop) );
|
||||
multipliers.push_back( resolveSymbol( mult ) );
|
||||
// End of non-dimensionalizing parameter read-in
|
||||
}
|
||||
|
||||
AC_cfg->GetNextConfigLine();
|
||||
if (type == VALUE) {
|
||||
*AC_cfg >> StaticValue;
|
||||
} else if (type == VECTOR || type == TABLE) {
|
||||
|
@ -335,7 +338,19 @@ void FGCoefficient::unbind(void)
|
|||
node->Untie("bias");
|
||||
node->Untie("gain");
|
||||
}
|
||||
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
FGPropertyManager* FGCoefficient::resolveSymbol(string name){
|
||||
FGPropertyManager* tmpn;
|
||||
tmpn = PropertyManager->GetNode(name,false);
|
||||
if( !tmpn ) {
|
||||
cerr << "Coefficient multipliers cannot create properties, check spelling?" << endl;
|
||||
exit(1);
|
||||
}
|
||||
return tmpn;
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
// The bitmasked value choices are as follows:
|
||||
// unset: In this case (the default) JSBSim would only print
|
||||
|
|
|
@ -202,6 +202,8 @@ private:
|
|||
FGAuxiliary* Auxiliary;
|
||||
FGOutput* Output;
|
||||
FGPropertyManager* PropertyManager;
|
||||
|
||||
FGPropertyManager* resolveSymbol(string name);
|
||||
|
||||
virtual void Debug(int from);
|
||||
};
|
||||
|
|
|
@ -271,28 +271,6 @@ FGConfigFile& FGConfigFile::operator>>(int& val)
|
|||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
FGConfigFile& FGConfigFile::operator>>(eParam& val)
|
||||
{
|
||||
string::size_type pos, end;
|
||||
|
||||
pos = CurrentLine.find_first_not_of(", ",CurrentIndex);
|
||||
if (pos == CurrentLine.npos) pos = CurrentLine.length();
|
||||
end = CurrentLine.find_first_of(", ",pos+1);
|
||||
if (end == CurrentLine.npos) end = CurrentLine.length();
|
||||
string str = CurrentLine.substr(pos, end - pos);
|
||||
val = (eParam)atoi(str.c_str());
|
||||
CurrentIndex = end+1;
|
||||
if (end == pos) {
|
||||
GetNextConfigLine();
|
||||
*this >> val;
|
||||
} else {
|
||||
if (CurrentIndex >= CurrentLine.length()) GetNextConfigLine();
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
FGConfigFile& FGConfigFile::operator>>(string& str)
|
||||
{
|
||||
string::size_type pos, end;
|
||||
|
|
|
@ -120,6 +120,8 @@ public:
|
|||
@return the next valid line from the config file OR "EOF" if end of file is
|
||||
reached.*/
|
||||
string GetNextConfigLine(void);
|
||||
|
||||
string GetCurrentLine(void) { return CurrentLine; }
|
||||
|
||||
/** Returns the value of the tag supplied.
|
||||
@param
|
||||
|
@ -132,7 +134,6 @@ public:
|
|||
FGConfigFile& operator>>(double&);
|
||||
FGConfigFile& operator>>(int&);
|
||||
FGConfigFile& operator>>(string&);
|
||||
FGConfigFile& operator>>(eParam&);
|
||||
void ResetLineIndexToZero(void);
|
||||
|
||||
private:
|
||||
|
|
|
@ -285,6 +285,7 @@ bool FGFCS::Load(FGConfigFile* AC_cfg)
|
|||
vector <FGFCSComponent*> *Components;
|
||||
FGConfigFile *FCS_cfg;
|
||||
|
||||
Components=0;
|
||||
// Determine if the FCS/Autopilot is defined inline in the aircraft configuration
|
||||
// file or in a separate file. Set up the config file class as appropriate.
|
||||
|
||||
|
@ -324,11 +325,11 @@ bool FGFCS::Load(FGConfigFile* AC_cfg)
|
|||
if (delimiter == "AUTOPILOT") {
|
||||
Components = &APComponents;
|
||||
eMode = mAP;
|
||||
Name = "Autopilot:" + name;
|
||||
Name = "Autopilot: " + name;
|
||||
} else if (delimiter == "FLIGHT_CONTROL") {
|
||||
Components = &FCSComponents;
|
||||
eMode = mFCS;
|
||||
Name = "FCS:" + name;
|
||||
Name = "FCS: " + name;
|
||||
} else {
|
||||
cerr << endl << "Unknown FCS delimiter" << endl << endl;
|
||||
}
|
||||
|
@ -436,7 +437,7 @@ string FGFCS::GetComponentName(int idx)
|
|||
break;
|
||||
}
|
||||
return string("");
|
||||
}
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
|
@ -792,6 +793,7 @@ void FGFCS::bindModel(void)
|
|||
unsigned i;
|
||||
char tmp[80];
|
||||
|
||||
|
||||
for (i=0; i<ThrottleCmd.size(); i++) {
|
||||
snprintf(tmp,80,"fcs/throttle-cmd-norm[%u]",i);
|
||||
PropertyManager->Tie( tmp,this,i,
|
||||
|
|
|
@ -66,7 +66,7 @@ const double FGJSBBase::inchtoft = 0.08333333;
|
|||
const double FGJSBBase::in3tom3 = 1.638706E-5;
|
||||
const double FGJSBBase::Reng = 1716.0;
|
||||
const double FGJSBBase::SHRatio = 1.40;
|
||||
const string FGJSBBase::needed_cfg_version = "1.58";
|
||||
const string FGJSBBase::needed_cfg_version = "1.60";
|
||||
const string FGJSBBase::JSBSim_version = "0.9.2";
|
||||
|
||||
queue <FGJSBBase::Message*> FGJSBBase::Messages;
|
||||
|
|
|
@ -87,103 +87,6 @@ DEFINITIONS
|
|||
FORWARD DECLARATIONS
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||
|
||||
enum eParam {
|
||||
FG_UNDEF = 0,
|
||||
FG_TIME,
|
||||
FG_QBAR,
|
||||
FG_WINGAREA,
|
||||
FG_WINGSPAN,
|
||||
FG_CBAR,
|
||||
FG_ALPHA,
|
||||
FG_ALPHADOT,
|
||||
FG_BETA,
|
||||
FG_ABETA,
|
||||
FG_BETADOT,
|
||||
FG_PHI,
|
||||
FG_THT,
|
||||
FG_PSI,
|
||||
FG_PITCHRATE,
|
||||
FG_ROLLRATE,
|
||||
FG_YAWRATE,
|
||||
FG_AEROP,
|
||||
FG_AEROQ,
|
||||
FG_AEROR,
|
||||
FG_CL_SQRD,
|
||||
FG_MACH,
|
||||
FG_ALTITUDE,
|
||||
FG_BI2VEL,
|
||||
FG_CI2VEL,
|
||||
FG_ELEVATOR_POS,
|
||||
FG_AELEVATOR_POS,
|
||||
FG_NELEVATOR_POS,
|
||||
FG_AILERON_POS,
|
||||
FG_AAILERON_POS,
|
||||
FG_NAILERON_POS,
|
||||
FG_LEFT_AILERON_POS,
|
||||
FG_ALEFT_AILERON_POS,
|
||||
FG_NLEFT_AILERON_POS,
|
||||
FG_RIGHT_AILERON_POS,
|
||||
FG_ARIGHT_AILERON_POS,
|
||||
FG_NRIGHT_AILERON_POS,
|
||||
FG_RUDDER_POS,
|
||||
FG_ARUDDER_POS,
|
||||
FG_NRUDDER_POS,
|
||||
FG_SPDBRAKE_POS,
|
||||
FG_NSPDBRAKE_POS,
|
||||
FG_SPOILERS_POS,
|
||||
FG_NSPOILERS_POS,
|
||||
FG_FLAPS_POS,
|
||||
FG_NFLAPS_POS,
|
||||
FG_ELEVATOR_CMD,
|
||||
FG_AILERON_CMD,
|
||||
FG_RUDDER_CMD,
|
||||
FG_SPDBRAKE_CMD,
|
||||
FG_SPOILERS_CMD,
|
||||
FG_FLAPS_CMD,
|
||||
FG_THROTTLE_CMD,
|
||||
FG_THROTTLE_POS,
|
||||
FG_MIXTURE_CMD,
|
||||
FG_MIXTURE_POS,
|
||||
FG_MAGNETO_CMD,
|
||||
FG_STARTER_CMD,
|
||||
FG_ACTIVE_ENGINE,
|
||||
FG_HOVERB,
|
||||
FG_PITCH_TRIM_CMD,
|
||||
FG_YAW_TRIM_CMD,
|
||||
FG_ROLL_TRIM_CMD,
|
||||
FG_LEFT_BRAKE_CMD,
|
||||
FG_CENTER_BRAKE_CMD,
|
||||
FG_RIGHT_BRAKE_CMD,
|
||||
FG_SET_LOGGING,
|
||||
FG_ALPHAH,
|
||||
FG_ALPHAW,
|
||||
FG_LBARH, //normalized horizontal tail arm
|
||||
FG_LBARV, //normalized vertical tail arm
|
||||
FG_HTAILAREA,
|
||||
FG_VTAILAREA,
|
||||
FG_VBARH, //horizontal tail volume
|
||||
FG_VBARV, //vertical tail volume
|
||||
FG_GEAR_CMD,
|
||||
FG_GEAR_POS,
|
||||
FG_HYSTPARM,
|
||||
AP_ELEVATOR_CMD,
|
||||
AP_AILERON_CMD,
|
||||
AP_RUDDER_CMD,
|
||||
AP_THROTTLE_CMD,
|
||||
AP_SET_ATTITUDE,
|
||||
AP_SET_ALTITUDE,
|
||||
AP_SET_HEADING,
|
||||
AP_SET_AIRSPEED,
|
||||
AP_ACQUIRE_ATTITUDE,
|
||||
AP_ACQUIRE_ALTITUDE,
|
||||
AP_ACQUIRE_HEADING,
|
||||
AP_ACQUIRE_AIRSPEED,
|
||||
AP_ATTITUDE_HOLD_ON,
|
||||
AP_ALTITUDE_HOLD_ON,
|
||||
AP_HEADING_HOLD_ON,
|
||||
AP_AIRSPEED_HOLD_ON,
|
||||
AP_WINGSLEVEL_HOLD_ON
|
||||
};
|
||||
|
||||
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
COMMENTS, REFERENCES, and NOTES [use "class documentation" below for API docs]
|
||||
|
|
|
@ -31,6 +31,10 @@ INCLUDES
|
|||
#include <simgear/misc/props.hxx>
|
||||
#include "FGPropertyManager.h"
|
||||
|
||||
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
DEFINITIONS
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||
|
||||
|
||||
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
FORWARD DECLARATIONS
|
||||
|
@ -47,15 +51,23 @@ COMMENTS, REFERENCES, and NOTES [use "class documentation" below for API docs]
|
|||
|
||||
string FGPropertyManager::mkPropertyName(string name, bool lowercase) {
|
||||
|
||||
/* do this two pass to avoid problems with characters getting skipped
|
||||
because the index changed */
|
||||
|
||||
for(unsigned i=0;i<name.length();i++) {
|
||||
if( lowercase && isupper(name[i]) )
|
||||
name[i]=tolower(name[i]);
|
||||
else if( isspace(name[i]) )
|
||||
name[i]='-';
|
||||
}
|
||||
for(unsigned i=0;i<name.length();i++) {
|
||||
if( name[i] == '/' )
|
||||
name.erase(i,1);
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
FGPropertyManager*
|
||||
|
|
|
@ -143,12 +143,12 @@ bool FGScript::LoadScript( string script )
|
|||
newCondition = new struct condition();
|
||||
while (token != string("/when")) {
|
||||
if (token == "parameter") {
|
||||
prop_name = State->GetPropertyName( Script.GetValue("name") );
|
||||
prop_name = 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") {
|
||||
prop_name = State->GetPropertyName( Script.GetValue("name") );
|
||||
prop_name = 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);
|
||||
|
|
|
@ -86,8 +86,6 @@ FGState::FGState(FGFDMExec* fdex)
|
|||
|
||||
for(int i=0;i<3;i++) vQdot_prev[i].InitMatrix();
|
||||
|
||||
InitPropertyMaps();
|
||||
|
||||
bind();
|
||||
|
||||
Debug(0);
|
||||
|
@ -421,108 +419,6 @@ void FGState::ReportState(void)
|
|||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
void FGState::InitPropertyMaps(void)
|
||||
{
|
||||
ParamNameToProp[ "FG_TIME" ]="sim-time-sec";
|
||||
ParamNameToProp[ "FG_QBAR" ]="aero/qbar-psf";
|
||||
ParamNameToProp[ "FG_QBARUW" ]="aero/qbarUW-psf";
|
||||
ParamNameToProp[ "FG_QBARUV" ]="aero/qbarUV-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" ]="propulsion/magneto_cmd";
|
||||
ParamNameToProp[ "FG_STARTER_CMD" ]="propulsion/starter_cmd";
|
||||
ParamNameToProp[ "FG_ACTIVE_ENGINE" ]="propulsion/active_engine";
|
||||
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" ]="fcs/left_brake";
|
||||
ParamNameToProp[ "FG_CENTER_BRAKE_CMD" ]="fcs/center_brake";
|
||||
ParamNameToProp[ "FG_RIGHT_BRAKE_CMD" ]="fcs/right_brake";
|
||||
ParamNameToProp[ "FG_SET_LOGGING" ]="sim/set_logging";
|
||||
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";
|
||||
ParamNameToProp[ "FG_HYSTPARM" ]="aero/stall-hyst-norm";
|
||||
ParamNameToProp[ "AP_ELEVATOR_CMD" ]="jsbsim/ap/elevator_cmd";
|
||||
ParamNameToProp[ "AP_AILERON_CMD" ]="jsbsim/ap/aileron_cmd";
|
||||
ParamNameToProp[ "AP_RUDDER_CMD" ]="jsbsim/ap/rudder_cmd";
|
||||
ParamNameToProp[ "AP_THROTTLE_CMD" ]="jsbsim/ap/throttle_cmd";
|
||||
ParamNameToProp[ "AP_SET_ATTITUDE" ]="jsbsim/ap/set_attitude";
|
||||
ParamNameToProp[ "AP_SET_ALTITUDE" ]="jsbsim/ap/set_altitude";
|
||||
ParamNameToProp[ "AP_SET_HEADING" ]="jsbsim/ap/set_heading";
|
||||
ParamNameToProp[ "AP_SET_AIRSPEED" ]="jsbsim/ap/set_airspeed";
|
||||
ParamNameToProp[ "AP_ACQUIRE_ATTITUDE" ]="jsbsim/ap/acquire_attitude";
|
||||
ParamNameToProp[ "AP_ACQUIRE_ALTITUDE" ]="jsbsim/ap/acquire_altitude";
|
||||
ParamNameToProp[ "AP_ACQUIRE_HEADING" ]="jsbsim/ap/acquire_heading";
|
||||
ParamNameToProp[ "AP_ACQUIRE_AIRSPEED" ]="jsbsim/ap/acquire_aispeed";
|
||||
ParamNameToProp[ "AP_ATTITUDE_HOLD_ON" ]="jsbsim/ap/attitude_hold_on";
|
||||
ParamNameToProp[ "AP_ALTITUDE,_HOLD_ON" ]="jsbsim/ap/altitude_hold_on";
|
||||
ParamNameToProp[ "AP_HEADING_HOLD_ON" ]="jsbsim/ap/heading_hold_on";
|
||||
ParamNameToProp[ "AP_AIRSPEED_HOLD_ON" ]="jsbsim/ap/airspeed_hold_on";
|
||||
ParamNameToProp[ "AP_WINGSLEVEL_HOLD_ON" ]="jsbsim/ap/wingslevel_hold_on";
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
void FGState::bind(void)
|
||||
{
|
||||
PropertyManager->Tie("sim-time-sec",this,
|
||||
|
|
|
@ -325,8 +325,6 @@ public:
|
|||
*/
|
||||
void ReportState(void);
|
||||
|
||||
inline string GetPropertyName(string prm) { return ParamNameToProp[prm]; }
|
||||
|
||||
void bind();
|
||||
void unbind();
|
||||
|
||||
|
@ -362,11 +360,6 @@ private:
|
|||
FGPropulsion* Propulsion;
|
||||
FGPropertyManager* PropertyManager;
|
||||
|
||||
typedef map<string,string> ParamNameMap;
|
||||
ParamNameMap ParamNameToProp;
|
||||
|
||||
void InitPropertyMaps(void);
|
||||
|
||||
void Debug(int from);
|
||||
};
|
||||
|
||||
|
|
|
@ -144,7 +144,7 @@ void FGTrim::ClearStates(void) {
|
|||
iAxes++;
|
||||
}
|
||||
TrimAxes.clear();
|
||||
cout << "TrimAxes.size(): " << TrimAxes.size() << endl;
|
||||
//cout << "TrimAxes.size(): " << TrimAxes.size() << endl;
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
|
|
@ -66,7 +66,7 @@ FGDeadBand::FGDeadBand(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
|
|||
*AC_cfg >> token;
|
||||
}
|
||||
}
|
||||
|
||||
FGFCSComponent::bind( PropertyManager->GetNode("fcs/components",true) );
|
||||
Debug(0);
|
||||
}
|
||||
|
||||
|
|
|
@ -51,7 +51,6 @@ FGFCSComponent::FGFCSComponent(FGFCS* _fcs) : fcs(_fcs)
|
|||
Type = "";
|
||||
ID = 0;
|
||||
Input = 0.0;
|
||||
InputNode = 0;
|
||||
Output = 0.0;
|
||||
OutputNode = 0;
|
||||
IsOutput = false;
|
||||
|
@ -63,6 +62,7 @@ FGFCSComponent::FGFCSComponent(FGFCS* _fcs) : fcs(_fcs)
|
|||
|
||||
FGFCSComponent::~FGFCSComponent()
|
||||
{
|
||||
unbind();
|
||||
Debug(1);
|
||||
}
|
||||
|
||||
|
@ -77,22 +77,64 @@ void FGFCSComponent::SetOutput(void)
|
|||
|
||||
bool FGFCSComponent::Run(void)
|
||||
{
|
||||
switch(InputType) {
|
||||
case itPilotAC:
|
||||
Input = InputNode->getDoubleValue();
|
||||
break;
|
||||
case itFCS:
|
||||
Input = fcs->GetComponentOutput(InputIdx);
|
||||
case itAP:
|
||||
// implement autopilot input mechanism
|
||||
break;
|
||||
case itBias:
|
||||
break;
|
||||
}
|
||||
|
||||
// switch(InputType) {
|
||||
// case itAP:
|
||||
// case itPilotAC:
|
||||
// Input = InputNode->getDoubleValue();
|
||||
// break;
|
||||
// case itFCS:
|
||||
// Input = fcs->GetComponentOutput(InputIdx);
|
||||
// case itBias:
|
||||
// break;
|
||||
// }
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
FGPropertyManager* FGFCSComponent::resolveSymbol(string token) {
|
||||
string prop;
|
||||
FGPropertyManager* tmp=PropertyManager->GetNode(token,false);
|
||||
if( !tmp ){
|
||||
if( token.find("/") == token.npos )
|
||||
prop = "model/" + token;
|
||||
cerr << "Creating new property " << prop << endl;
|
||||
tmp=PropertyManager->GetNode(token,true);
|
||||
}
|
||||
return tmp;
|
||||
}
|
||||
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
void FGFCSComponent::bind(FGPropertyManager *node) {
|
||||
string tmp = "fcs/" + node->mkPropertyName(Name, true);
|
||||
FGPropertyManager *tmpn;
|
||||
PropertyManager->Tie( tmp,this, &FGFCSComponent::GetOutput);
|
||||
node = node->GetNode( node->mkPropertyName(Name, true), true );
|
||||
for(unsigned i=0;i<InputNodes.size();i++) {
|
||||
tmpn=node->GetNode( "input-property",(int)i,true );
|
||||
tmpn->setStringValue( InputNodes[i]->GetName().c_str() );
|
||||
}
|
||||
if(OutputNode) node->SetString("output-property",OutputNode->GetName());
|
||||
node->Tie("output-value",this,&FGFCSComponent::GetOutput);
|
||||
node->SetString("type",Type);
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
void FGFCSComponent::unbind(void) {
|
||||
string name = "fcs";
|
||||
FGPropertyManager *node=PropertyManager->GetNode(name);
|
||||
node->Untie( PropertyManager->mkPropertyName(Name, true) );
|
||||
name += "/components"
|
||||
+ PropertyManager->mkPropertyName(Name, true);
|
||||
node= PropertyManager->GetNode(name);
|
||||
node->Untie("output-value");
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
// The bitmasked value choices are as follows:
|
||||
// unset: In this case (the default) JSBSim would only print
|
||||
|
|
|
@ -42,6 +42,7 @@ INCLUDES
|
|||
#endif
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "../FGJSBBase.h"
|
||||
#include "../FGPropertyManager.h"
|
||||
|
||||
|
@ -101,12 +102,16 @@ public:
|
|||
|
||||
virtual bool Run(void);
|
||||
virtual void SetOutput(void);
|
||||
inline double GetOutput (void) {return Output;}
|
||||
inline double GetOutput (void) const {return Output;}
|
||||
inline FGPropertyManager* GetOutputNode(void) { return OutputNode; }
|
||||
inline string GetName(void) {return Name;}
|
||||
inline string GetType(void) { return Type; }
|
||||
virtual double GetOutputPct(void) { return 0; }
|
||||
|
||||
inline string GetName(void) const {return Name;}
|
||||
inline string GetType(void) const { return Type; }
|
||||
virtual double GetOutputPct(void) const { return 0; }
|
||||
|
||||
virtual void bind(FGPropertyManager *node);
|
||||
virtual void unbind( void );
|
||||
FGPropertyManager* resolveSymbol(string token);
|
||||
|
||||
protected:
|
||||
/// Pilot/Aircraft, FCS, Autopilot inputs
|
||||
enum eInputType {itPilotAC, itFCS, itAP, itBias} InputType;
|
||||
|
@ -115,7 +120,7 @@ protected:
|
|||
string Type;
|
||||
string Name;
|
||||
int ID;
|
||||
FGPropertyManager* InputNode;
|
||||
vector<FGPropertyManager*> InputNodes;
|
||||
int InputIdx;
|
||||
double Input;
|
||||
FGPropertyManager* OutputNode;
|
||||
|
|
|
@ -79,22 +79,18 @@ FGFilter::FGFilter(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
|
|||
else if (token == "INPUT")
|
||||
{
|
||||
token = AC_cfg->GetValue("INPUT");
|
||||
if (token.find("FG_") != token.npos) {
|
||||
if( InputNodes.size() > 0 ) {
|
||||
cerr << "Filters can only accept one input" << endl;
|
||||
} else {
|
||||
*AC_cfg >> token;
|
||||
InputNode = PropertyManager->GetNode(
|
||||
fcs->GetState()->GetPropertyName(token) );
|
||||
InputType = itPilotAC;
|
||||
} else {
|
||||
*AC_cfg >> InputIdx;
|
||||
InputType = itFCS;
|
||||
}
|
||||
InputNodes.push_back( resolveSymbol(token) );
|
||||
}
|
||||
}
|
||||
else if (token == "OUTPUT")
|
||||
{
|
||||
IsOutput = true;
|
||||
*AC_cfg >> sOutputIdx;
|
||||
OutputNode = PropertyManager->GetNode(
|
||||
fcs->GetState()->GetPropertyName(sOutputIdx) );
|
||||
OutputNode = PropertyManager->GetNode( sOutputIdx );
|
||||
}
|
||||
else cerr << "Unknown filter type: " << token << endl;
|
||||
}
|
||||
|
@ -133,6 +129,7 @@ FGFilter::FGFilter(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
|
|||
cerr << "Unknown filter type" << endl;
|
||||
break;
|
||||
}
|
||||
FGFCSComponent::bind( PropertyManager->GetNode("fcs/components",true) );
|
||||
|
||||
Debug(0);
|
||||
}
|
||||
|
@ -156,7 +153,7 @@ bool FGFilter::Run(void)
|
|||
Initialize = false;
|
||||
|
||||
} else {
|
||||
|
||||
Input = InputNodes[0]->getDoubleValue();
|
||||
switch (FilterType) {
|
||||
case eLag:
|
||||
Output = Input * ca + PreviousInput1 * ca + PreviousOutput1 * cb;
|
||||
|
@ -215,19 +212,7 @@ void FGFilter::Debug(int from)
|
|||
|
||||
if (debug_lvl & 1) { // Standard console startup message output
|
||||
if (from == 0) { // Constructor
|
||||
cout << " ID: " << ID << endl;
|
||||
switch(InputType) {
|
||||
case itPilotAC:
|
||||
cout << " INPUT: " << InputNode->getName() << endl;
|
||||
break;
|
||||
case itFCS:
|
||||
cout << " INPUT: FCS Component " << InputIdx << " (" <<
|
||||
fcs->GetComponentName(InputIdx) << ")" << endl;
|
||||
break;
|
||||
case itAP:
|
||||
case itBias:
|
||||
break;
|
||||
}
|
||||
cout << " INPUT: " << InputNodes[0]->getName() << endl;
|
||||
cout << " C1: " << C1 << endl;
|
||||
cout << " C2: " << C2 << endl;
|
||||
cout << " C3: " << C3 << endl;
|
||||
|
|
|
@ -73,15 +73,12 @@ FGGain::FGGain(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
|
|||
*AC_cfg >> ID;
|
||||
} else if (token == "INPUT") {
|
||||
token = AC_cfg->GetValue("INPUT");
|
||||
if (token.find("FG_") != token.npos) {
|
||||
if( InputNodes.size() > 0 ) {
|
||||
cerr << "Gains can only accept one input" << endl;
|
||||
} else {
|
||||
*AC_cfg >> token;
|
||||
InputNode = PropertyManager->GetNode(
|
||||
fcs->GetState()->GetPropertyName(token) );
|
||||
InputType = itPilotAC;
|
||||
} else {
|
||||
*AC_cfg >> InputIdx;
|
||||
InputType = itFCS;
|
||||
}
|
||||
InputNodes.push_back( resolveSymbol(token) );
|
||||
}
|
||||
} else if (token == "GAIN") {
|
||||
*AC_cfg >> Gain;
|
||||
} else if (token == "MIN") {
|
||||
|
@ -97,20 +94,21 @@ 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 = PropertyManager->GetNode(
|
||||
fcs->GetState()->GetPropertyName(strScheduledBy) );
|
||||
ScheduledBy = PropertyManager->GetNode( strScheduledBy );
|
||||
}
|
||||
} else if (token == "OUTPUT") {
|
||||
IsOutput = true;
|
||||
*AC_cfg >> sOutputIdx;
|
||||
OutputNode = PropertyManager->GetNode(
|
||||
fcs->GetState()->GetPropertyName(sOutputIdx) );
|
||||
OutputNode = PropertyManager->GetNode( sOutputIdx );
|
||||
|
||||
} else {
|
||||
AC_cfg->ResetLineIndexToZero();
|
||||
*Table << *AC_cfg;
|
||||
}
|
||||
}
|
||||
|
||||
FGFCSComponent::bind( PropertyManager->GetNode("fcs/components",true) );
|
||||
|
||||
Debug(0);
|
||||
}
|
||||
|
||||
|
@ -129,7 +127,7 @@ bool FGGain::Run(void )
|
|||
double LookupVal = 0;
|
||||
|
||||
FGFCSComponent::Run(); // call the base class for initialization of Input
|
||||
|
||||
Input = InputNodes[0]->getDoubleValue();
|
||||
if (Type == "PURE_GAIN") {
|
||||
Output = Gain * Input;
|
||||
} else if (Type == "SCHEDULED_GAIN") {
|
||||
|
@ -179,19 +177,7 @@ void FGGain::Debug(int from)
|
|||
|
||||
if (debug_lvl & 1) { // Standard console startup message output
|
||||
if (from == 0) { // Constructor
|
||||
cout << " ID: " << ID << endl;
|
||||
switch(InputType) {
|
||||
case itPilotAC:
|
||||
cout << " INPUT: " << InputNode->getName() << endl;
|
||||
break;
|
||||
case itFCS:
|
||||
cout << " INPUT: FCS Component " << InputIdx << " (" <<
|
||||
fcs->GetComponentName(InputIdx) << ")" << endl;
|
||||
break;
|
||||
case itAP:
|
||||
case itBias:
|
||||
break;
|
||||
}
|
||||
cout << " INPUT: " << InputNodes[0]->getName() << endl;
|
||||
cout << " GAIN: " << Gain << endl;
|
||||
if (IsOutput) cout << " OUTPUT: " << OutputNode->getName() << endl;
|
||||
cout << " MIN: " << Min << endl;
|
||||
|
|
|
@ -52,6 +52,8 @@ FGGradient::FGGradient(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
|
|||
{
|
||||
Type = AC_cfg->GetValue("TYPE");
|
||||
Name = AC_cfg->GetValue("NAME");
|
||||
|
||||
FGFCSComponent::bind( PropertyManager->GetNode("fcs/components",true) );
|
||||
|
||||
Debug(0);
|
||||
}
|
||||
|
|
|
@ -69,15 +69,13 @@ FGKinemat::FGKinemat(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
|
|||
*AC_cfg >> ID;
|
||||
} else if (token == "INPUT") {
|
||||
token = AC_cfg->GetValue("INPUT");
|
||||
if (token.find("FG_") != token.npos) {
|
||||
if( InputNodes.size() > 0 ) {
|
||||
cerr << "Kinemat can only accept one input" << endl;
|
||||
} else {
|
||||
*AC_cfg >> token;
|
||||
InputNode = PropertyManager->GetNode(
|
||||
fcs->GetState()->GetPropertyName(token) );
|
||||
InputType = itPilotAC;
|
||||
} else {
|
||||
*AC_cfg >> InputIdx;
|
||||
InputType = itFCS;
|
||||
}
|
||||
InputNodes.push_back( resolveSymbol(token) );
|
||||
}
|
||||
|
||||
} else if ( token == "DETENTS" ) {
|
||||
*AC_cfg >> NumDetents;
|
||||
for (int i=0;i<NumDetents;i++) {
|
||||
|
@ -90,10 +88,10 @@ FGKinemat::FGKinemat(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
|
|||
|
||||
IsOutput = true;
|
||||
*AC_cfg >> sOutputIdx;
|
||||
OutputNode = PropertyManager->GetNode(
|
||||
fcs->GetState()->GetPropertyName(sOutputIdx) );
|
||||
OutputNode = PropertyManager->GetNode(sOutputIdx);
|
||||
}
|
||||
}
|
||||
FGFCSComponent::bind( PropertyManager->GetNode("fcs/components") );
|
||||
|
||||
Debug(0);
|
||||
}
|
||||
|
@ -202,8 +200,7 @@ void FGKinemat::Debug(int from)
|
|||
|
||||
if (debug_lvl & 1) { // Standard console startup message output
|
||||
if (from == 0) { // Constructor
|
||||
cout << " ID: " << ID << endl;
|
||||
cout << " INPUT: " << InputNode->getName() << endl;
|
||||
cout << " INPUT: " << InputNodes[0]->getName() << endl;
|
||||
cout << " DETENTS: " << NumDetents << endl;
|
||||
for (int i=0;i<NumDetents;i++) {
|
||||
cout << " " << Detents[i] << " " << TransitionTimes[i] << endl;
|
||||
|
|
|
@ -51,13 +51,10 @@ FGSummer::FGSummer(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
|
|||
AC_cfg(AC_cfg)
|
||||
{
|
||||
string token,sOutputIdx;
|
||||
eParam tmpInputIndex;
|
||||
InputRec *input;
|
||||
|
||||
clip = false;
|
||||
clipmin = clipmax = 0.0;
|
||||
Bias = 0.0;
|
||||
Inputs.clear();
|
||||
|
||||
Type = AC_cfg->GetValue("TYPE");
|
||||
Name = AC_cfg->GetValue("NAME");
|
||||
|
@ -69,26 +66,9 @@ 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;
|
||||
input->Node = PropertyManager->GetNode(
|
||||
fcs->GetState()->GetPropertyName(token) );
|
||||
input->Idx=-1;
|
||||
input->Type = itPilotAC;
|
||||
} else if (token.find(".") != token.npos) { // bias
|
||||
*AC_cfg >> Bias;
|
||||
input->Node=0;
|
||||
input->Idx=0;
|
||||
input->Type=itBias;
|
||||
} else {
|
||||
*AC_cfg >> tmpInputIndex;
|
||||
input->Idx=tmpInputIndex;
|
||||
input->Node=0;
|
||||
input->Type=itFCS;
|
||||
}
|
||||
Inputs.push_back(input);
|
||||
*AC_cfg >> token;
|
||||
InputNodes.push_back( resolveSymbol(token) );
|
||||
} else if (token == "CLIPTO") {
|
||||
*AC_cfg >> clipmin >> clipmax;
|
||||
if (clipmax > clipmin) {
|
||||
|
@ -97,10 +77,11 @@ FGSummer::FGSummer(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
|
|||
} else if (token == "OUTPUT") {
|
||||
IsOutput = true;
|
||||
*AC_cfg >> sOutputIdx;
|
||||
OutputNode = PropertyManager->GetNode(
|
||||
fcs->GetState()->GetPropertyName(sOutputIdx) );
|
||||
OutputNode = PropertyManager->GetNode(sOutputIdx);
|
||||
}
|
||||
}
|
||||
|
||||
FGFCSComponent::bind( PropertyManager->GetNode("fcs/components",true) );
|
||||
|
||||
Debug(0);
|
||||
}
|
||||
|
@ -109,10 +90,6 @@ 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);
|
||||
}
|
||||
|
||||
|
@ -127,18 +104,8 @@ bool FGSummer::Run(void )
|
|||
|
||||
Output = 0.0;
|
||||
|
||||
for (idx=0; idx<Inputs.size(); idx++) {
|
||||
switch (Inputs[idx]->Type) {
|
||||
case itPilotAC:
|
||||
Output += Inputs[idx]->Node->getDoubleValue();
|
||||
break;
|
||||
case itFCS:
|
||||
Output += fcs->GetComponentOutput(Inputs[idx]->Idx);
|
||||
break;
|
||||
case itBias:
|
||||
Output += Bias;
|
||||
break;
|
||||
}
|
||||
for (idx=0; idx<InputNodes.size(); idx++) {
|
||||
Output += InputNodes[idx]->getDoubleValue();
|
||||
}
|
||||
|
||||
if (clip) {
|
||||
|
@ -176,21 +143,9 @@ void FGSummer::Debug(int from)
|
|||
|
||||
if (debug_lvl & 1) { // Standard console startup message output
|
||||
if (from == 0) { // Constructor
|
||||
cout << " ID: " << ID << endl;
|
||||
cout << " INPUTS: " << endl;
|
||||
for (unsigned i=0;i<Inputs.size();i++) {
|
||||
switch (Inputs[i]->Type) {
|
||||
case itPilotAC:
|
||||
cout << " " << Inputs[i]->Node->getName() << endl;
|
||||
break;
|
||||
case itFCS:
|
||||
cout << " FCS Component " << Inputs[i]->Idx << " (" <<
|
||||
fcs->GetComponentName(Inputs[i]->Idx) << ")" << endl;
|
||||
break;
|
||||
case itBias:
|
||||
cout << " " << "Bias of " << Bias << endl;
|
||||
break;
|
||||
}
|
||||
for (unsigned i=0;i<InputNodes.size();i++) {
|
||||
cout << " " << InputNodes[i]->getName() << endl;
|
||||
}
|
||||
if (clip) cout << " CLIPTO: " << clipmin
|
||||
<< ", " << clipmax << endl;
|
||||
|
|
|
@ -100,12 +100,6 @@ public:
|
|||
|
||||
private:
|
||||
FGConfigFile* AC_cfg;
|
||||
typedef struct {
|
||||
FGPropertyManager* Node;
|
||||
int Idx;
|
||||
int Type;
|
||||
} InputRec;
|
||||
vector <InputRec*> Inputs;
|
||||
bool clip;
|
||||
double clipmin,clipmax;
|
||||
double Bias;
|
||||
|
|
|
@ -53,6 +53,8 @@ FGSwitch::FGSwitch(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
|
|||
Type = AC_cfg->GetValue("TYPE");
|
||||
Name = AC_cfg->GetValue("NAME");
|
||||
|
||||
FGFCSComponent::bind( PropertyManager->GetNode("fcs/components",true) );
|
||||
|
||||
Debug(0);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue