From ab242159a35646fd055119eb98fab62a8308ffdb Mon Sep 17 00:00:00 2001 From: tony Date: Tue, 24 Sep 2002 12:54:43 +0000 Subject: [PATCH] JSBSim updates. This update changes the file format, so an update of the base package is required. --- src/FDM/JSBSim/FGCoefficient.cpp | 47 ++++++--- src/FDM/JSBSim/FGCoefficient.h | 2 + src/FDM/JSBSim/FGConfigFile.cpp | 22 ----- src/FDM/JSBSim/FGConfigFile.h | 3 +- src/FDM/JSBSim/FGFCS.cpp | 8 +- src/FDM/JSBSim/FGJSBBase.cpp | 2 +- src/FDM/JSBSim/FGJSBBase.h | 97 ------------------ src/FDM/JSBSim/FGPropertyManager.cpp | 14 ++- src/FDM/JSBSim/FGScript.cpp | 4 +- src/FDM/JSBSim/FGState.cpp | 104 -------------------- src/FDM/JSBSim/FGState.h | 7 -- src/FDM/JSBSim/FGTrim.cpp | 2 +- src/FDM/JSBSim/filtersjb/FGDeadBand.cpp | 2 +- src/FDM/JSBSim/filtersjb/FGFCSComponent.cpp | 68 ++++++++++--- src/FDM/JSBSim/filtersjb/FGFCSComponent.h | 17 ++-- src/FDM/JSBSim/filtersjb/FGFilter.cpp | 33 ++----- src/FDM/JSBSim/filtersjb/FGGain.cpp | 38 +++---- src/FDM/JSBSim/filtersjb/FGGradient.cpp | 2 + src/FDM/JSBSim/filtersjb/FGKinemat.cpp | 21 ++-- src/FDM/JSBSim/filtersjb/FGSummer.cpp | 63 ++---------- src/FDM/JSBSim/filtersjb/FGSummer.h | 6 -- src/FDM/JSBSim/filtersjb/FGSwitch.cpp | 2 + 22 files changed, 167 insertions(+), 397 deletions(-) diff --git a/src/FDM/JSBSim/FGCoefficient.cpp b/src/FDM/JSBSim/FGCoefficient.cpp index d430af3e4..523d8ff7a 100644 --- a/src/FDM/JSBSim/FGCoefficient.cpp +++ b/src/FDM/JSBSim/FGCoefficient.cpp @@ -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= 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 diff --git a/src/FDM/JSBSim/FGCoefficient.h b/src/FDM/JSBSim/FGCoefficient.h index 0c1796c42..a809ae11a 100644 --- a/src/FDM/JSBSim/FGCoefficient.h +++ b/src/FDM/JSBSim/FGCoefficient.h @@ -202,6 +202,8 @@ private: FGAuxiliary* Auxiliary; FGOutput* Output; FGPropertyManager* PropertyManager; + + FGPropertyManager* resolveSymbol(string name); virtual void Debug(int from); }; diff --git a/src/FDM/JSBSim/FGConfigFile.cpp b/src/FDM/JSBSim/FGConfigFile.cpp index 77d0628de..a3bb23477 100644 --- a/src/FDM/JSBSim/FGConfigFile.cpp +++ b/src/FDM/JSBSim/FGConfigFile.cpp @@ -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; diff --git a/src/FDM/JSBSim/FGConfigFile.h b/src/FDM/JSBSim/FGConfigFile.h index ffcb29fb2..8b19d78a1 100644 --- a/src/FDM/JSBSim/FGConfigFile.h +++ b/src/FDM/JSBSim/FGConfigFile.h @@ -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: diff --git a/src/FDM/JSBSim/FGFCS.cpp b/src/FDM/JSBSim/FGFCS.cpp index 0ac825348..3fcaab4aa 100644 --- a/src/FDM/JSBSim/FGFCS.cpp +++ b/src/FDM/JSBSim/FGFCS.cpp @@ -285,6 +285,7 @@ bool FGFCS::Load(FGConfigFile* AC_cfg) vector *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; iTie( tmp,this,i, diff --git a/src/FDM/JSBSim/FGJSBBase.cpp b/src/FDM/JSBSim/FGJSBBase.cpp index 7ad08bb31..a38a4c697 100644 --- a/src/FDM/JSBSim/FGJSBBase.cpp +++ b/src/FDM/JSBSim/FGJSBBase.cpp @@ -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::Messages; diff --git a/src/FDM/JSBSim/FGJSBBase.h b/src/FDM/JSBSim/FGJSBBase.h index 4b522d3f2..f203f36e3 100644 --- a/src/FDM/JSBSim/FGJSBBase.h +++ b/src/FDM/JSBSim/FGJSBBase.h @@ -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] diff --git a/src/FDM/JSBSim/FGPropertyManager.cpp b/src/FDM/JSBSim/FGPropertyManager.cpp index 09337b899..1253d6d2d 100644 --- a/src/FDM/JSBSim/FGPropertyManager.cpp +++ b/src/FDM/JSBSim/FGPropertyManager.cpp @@ -31,6 +31,10 @@ INCLUDES #include #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;iGetPropertyName( 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); diff --git a/src/FDM/JSBSim/FGState.cpp b/src/FDM/JSBSim/FGState.cpp index 4ca4edc77..6ce19c407 100644 --- a/src/FDM/JSBSim/FGState.cpp +++ b/src/FDM/JSBSim/FGState.cpp @@ -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, diff --git a/src/FDM/JSBSim/FGState.h b/src/FDM/JSBSim/FGState.h index 37cd93173..3eaf0f2b2 100644 --- a/src/FDM/JSBSim/FGState.h +++ b/src/FDM/JSBSim/FGState.h @@ -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 ParamNameMap; - ParamNameMap ParamNameToProp; - - void InitPropertyMaps(void); - void Debug(int from); }; diff --git a/src/FDM/JSBSim/FGTrim.cpp b/src/FDM/JSBSim/FGTrim.cpp index 48fb0cfd7..21dae465d 100644 --- a/src/FDM/JSBSim/FGTrim.cpp +++ b/src/FDM/JSBSim/FGTrim.cpp @@ -144,7 +144,7 @@ void FGTrim::ClearStates(void) { iAxes++; } TrimAxes.clear(); - cout << "TrimAxes.size(): " << TrimAxes.size() << endl; + //cout << "TrimAxes.size(): " << TrimAxes.size() << endl; } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/src/FDM/JSBSim/filtersjb/FGDeadBand.cpp b/src/FDM/JSBSim/filtersjb/FGDeadBand.cpp index 2f2283ef6..4b0f4191d 100644 --- a/src/FDM/JSBSim/filtersjb/FGDeadBand.cpp +++ b/src/FDM/JSBSim/filtersjb/FGDeadBand.cpp @@ -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); } diff --git a/src/FDM/JSBSim/filtersjb/FGFCSComponent.cpp b/src/FDM/JSBSim/filtersjb/FGFCSComponent.cpp index 6130c1b62..3da814261 100644 --- a/src/FDM/JSBSim/filtersjb/FGFCSComponent.cpp +++ b/src/FDM/JSBSim/filtersjb/FGFCSComponent.cpp @@ -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;iGetNode( "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 diff --git a/src/FDM/JSBSim/filtersjb/FGFCSComponent.h b/src/FDM/JSBSim/filtersjb/FGFCSComponent.h index 599716c05..07c6a03a6 100644 --- a/src/FDM/JSBSim/filtersjb/FGFCSComponent.h +++ b/src/FDM/JSBSim/filtersjb/FGFCSComponent.h @@ -42,6 +42,7 @@ INCLUDES #endif #include +#include #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 InputNodes; int InputIdx; double Input; FGPropertyManager* OutputNode; diff --git a/src/FDM/JSBSim/filtersjb/FGFilter.cpp b/src/FDM/JSBSim/filtersjb/FGFilter.cpp index 009eccfca..5ca2f7930 100644 --- a/src/FDM/JSBSim/filtersjb/FGFilter.cpp +++ b/src/FDM/JSBSim/filtersjb/FGFilter.cpp @@ -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; diff --git a/src/FDM/JSBSim/filtersjb/FGGain.cpp b/src/FDM/JSBSim/filtersjb/FGGain.cpp index fba678284..7c6f6f1da 100644 --- a/src/FDM/JSBSim/filtersjb/FGGain.cpp +++ b/src/FDM/JSBSim/filtersjb/FGGain.cpp @@ -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; diff --git a/src/FDM/JSBSim/filtersjb/FGGradient.cpp b/src/FDM/JSBSim/filtersjb/FGGradient.cpp index cc9bb7340..2f344bfe2 100644 --- a/src/FDM/JSBSim/filtersjb/FGGradient.cpp +++ b/src/FDM/JSBSim/filtersjb/FGGradient.cpp @@ -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); } diff --git a/src/FDM/JSBSim/filtersjb/FGKinemat.cpp b/src/FDM/JSBSim/filtersjb/FGKinemat.cpp index 1bf63e823..98600cda4 100644 --- a/src/FDM/JSBSim/filtersjb/FGKinemat.cpp +++ b/src/FDM/JSBSim/filtersjb/FGKinemat.cpp @@ -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> 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;iGetValue("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;iType) { - 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; idxgetDoubleValue(); } 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;iType) { - 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;igetName() << endl; } if (clip) cout << " CLIPTO: " << clipmin << ", " << clipmax << endl; diff --git a/src/FDM/JSBSim/filtersjb/FGSummer.h b/src/FDM/JSBSim/filtersjb/FGSummer.h index 42454bd88..e8817cb87 100644 --- a/src/FDM/JSBSim/filtersjb/FGSummer.h +++ b/src/FDM/JSBSim/filtersjb/FGSummer.h @@ -100,12 +100,6 @@ public: private: FGConfigFile* AC_cfg; - typedef struct { - FGPropertyManager* Node; - int Idx; - int Type; - } InputRec; - vector Inputs; bool clip; double clipmin,clipmax; double Bias; diff --git a/src/FDM/JSBSim/filtersjb/FGSwitch.cpp b/src/FDM/JSBSim/filtersjb/FGSwitch.cpp index ca0eb0c80..33e459425 100644 --- a/src/FDM/JSBSim/filtersjb/FGSwitch.cpp +++ b/src/FDM/JSBSim/filtersjb/FGSwitch.cpp @@ -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); } -- 2.39.5