fgfcscomponent.cpp

来自「6 DOF Missle Simulation」· C++ 代码 · 共 277 行

CPP
277
字号
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Module:       FGFCSComponent.cpp Author:       Jon S. Berndt Date started: 11/1999 ------------- Copyright (C) 2000 ------------- This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. Further information about the GNU Lesser General Public License can also be found on the world wide web at http://www.gnu.org.FUNCTIONAL DESCRIPTION--------------------------------------------------------------------------------HISTORY--------------------------------------------------------------------------------%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%COMMENTS, REFERENCES,  and NOTES%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%INCLUDES%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/#include "FGFCSComponent.h"namespace JSBSim {static const char *IdSrc = "$Id$";static const char *IdHdr = ID_FCSCOMPONENT;/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%CLASS IMPLEMENTATION%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/FGFCSComponent::FGFCSComponent(FGFCS* _fcs, Element* element) : fcs(_fcs){  Element *input_element, *clip_el;  Input = Output = clipmin = clipmax = 0.0;  OutputNode = treenode = 0;  ClipMinPropertyNode = ClipMaxPropertyNode = 0;  clipMinSign = clipMaxSign = 1.0;  IsOutput   = clip = false;  string input, clip_string;  PropertyManager = fcs->GetPropertyManager();  if        (element->GetName() == string("lag_filter")) {    Type = "LAG_FILTER";  } else if (element->GetName() == string("lead_lag_filter")) {    Type = "LEAD_LAG_FILTER";  } else if (element->GetName() == string("washout_filter")) {    Type = "WASHOUT_FILTER";  } else if (element->GetName() == string("second_order_filter")) {    Type = "SECOND_ORDER_FILTER";  } else if (element->GetName() == string("integrator")) {    Type = "INTEGRATOR";  } else if (element->GetName() == string("summer")) {    Type = "SUMMER";  } else if (element->GetName() == string("pure_gain")) {    Type = "PURE_GAIN";  } else if (element->GetName() == string("scheduled_gain")) {    Type = "SCHEDULED_GAIN";  } else if (element->GetName() == string("aerosurface_scale")) {    Type = "AEROSURFACE_SCALE";  } else if (element->GetName() == string("switch")) {    Type = "SWITCH";  } else if (element->GetName() == string("kinematic")) {    Type = "KINEMATIC";  } else if (element->GetName() == string("deadband")) {    Type = "DEADBAND";  } else if (element->GetName() == string("fcs_function")) {    Type = "FCS_FUNCTION";  } else if (element->GetName() == string("pid")) {    Type = "PID";  } else if (element->GetName() == string("sensor")) {    Type = "SENSOR";  } else if (element->GetName() == string("actuator")) {    Type = "ACTUATOR";  } else { // illegal component in this channel    Type = "UNKNOWN";  }  Name = element->GetAttributeValue("name");  FGPropertyManager *tmp=0;  input_element = element->FindElement("input");  while (input_element) {    input = input_element->GetDataLine();    if (input[0] == '-') {      InputSigns.push_back(-1.0);      input.erase(0,1);    } else {      InputSigns.push_back( 1.0);    }    tmp = PropertyManager->GetNode(input);    if (tmp) {      InputNodes.push_back( tmp );    } else {      cerr << fgred << "  In component: " << Name << " unknown property "           << input << " referenced. Aborting" << reset << endl;      exit(-1);    }    input_element = element->FindNextElement("input");  }  if (element->FindElement("output")) {    IsOutput = true;    OutputNode = PropertyManager->GetNode( element->FindElementValue("output"), true );    if (!OutputNode) {      cerr << endl << "  Unable to process property: " << element->FindElementValue("output") << endl;      throw(string("Invalid output property name in flight control definition"));    }  }  clip_el = element->FindElement("clipto");  if (clip_el) {    clip_string = clip_el->FindElementValue("min");    if (clip_string.find_first_not_of("+-.0123456789") != string::npos) { // it's a property      if (clip_string[0] == '-') {        clipMinSign = -1.0;        clip_string.erase(0,1);      }      ClipMinPropertyNode = PropertyManager->GetNode( clip_string );    } else {      clipmin = clip_el->FindElementValueAsNumber("min");    }    clip_string = clip_el->FindElementValue("max");    if (clip_string.find_first_not_of("+-.0123456789") != string::npos) { // it's a property      if (clip_string[0] == '-') {        clipMaxSign = -1.0;        clip_string.erase(0,1);      }      ClipMaxPropertyNode = PropertyManager->GetNode( clip_string );    } else {      clipmax = clip_el->FindElementValueAsNumber("max");    }    clip = true;  }  Debug(0);}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%FGFCSComponent::~FGFCSComponent(){  Debug(1);}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%void FGFCSComponent::SetOutput(void){  OutputNode->setDoubleValue(Output);}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%bool FGFCSComponent::Run(void){  return true;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%void FGFCSComponent::Clip(void){  if (clip) {    if (ClipMinPropertyNode != 0) clipmin = clipMinSign*ClipMinPropertyNode->getDoubleValue();    if (ClipMaxPropertyNode != 0) clipmax = clipMaxSign*ClipMaxPropertyNode->getDoubleValue();    if (Output > clipmax)      Output = clipmax;    else if (Output < clipmin) Output = clipmin;  }}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%//// The old way of naming FCS components allowed upper or lower case, spaces, etc.// but then the names were modified to fit into a property name heirarchy. This// was confusing (it wasn't done intentionally - it was a carryover from the early// design). We now support the direct naming of properties in the FCS component// name attribute. The old way is supported in code at this time, but deprecated.void FGFCSComponent::bind(void){  string tmp;  if (Name.find("/") == string::npos) {    tmp = "fcs/" + PropertyManager->mkPropertyName(Name, true);  } else {    tmp = Name;  }  PropertyManager->Tie( tmp, this, &FGFCSComponent::GetOutput);}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%//    The bitmasked value choices are as follows://    unset: In this case (the default) JSBSim would only print//       out the normally expected messages, essentially echoing//       the config files as they are read. If the environment//       variable is not set, debug_lvl is set to 1 internally//    0: This requests JSBSim not to output any messages//       whatsoever.//    1: This value explicity requests the normal JSBSim//       startup messages//    2: This value asks for a message to be printed out when//       a class is instantiated//    4: When this value is set, a message is displayed when a//       FGModel object executes its Run() method//    8: When this value is set, various runtime state variables//       are printed out periodically//    16: When set various parameters are sanity checked and//       a message is printed out when they go out of boundsvoid FGFCSComponent::Debug(int from){  string propsign="";  if (debug_lvl <= 0) return;  if (debug_lvl & 1) { // Standard console startup message output    if (from == 0) {      cout << endl << "    Loading Component \"" << Name                   << "\" of type: " << Type << endl;      if (clip) {        if (ClipMinPropertyNode != 0L) {          if (clipMinSign < 0.0) propsign="-";          cout << "      Minimum limit: " << propsign << ClipMinPropertyNode->GetName() << endl;          propsign="";        } else {          cout << "      Minimum limit: " << clipmin << endl;        }        if (ClipMaxPropertyNode != 0L) {          if (clipMaxSign < 0.0) propsign="-";          cout << "      Maximum limit: " << propsign << ClipMaxPropertyNode->GetName() << endl;          propsign="";        } else {          cout << "      Maximum limit: " << clipmax << endl;        }      }      }  }  if (debug_lvl & 2 ) { // Instantiation/Destruction notification    if (from == 0) cout << "Instantiated: FGFCSComponent" << endl;    if (from == 1) cout << "Destroyed:    FGFCSComponent" << endl;  }  if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects  }  if (debug_lvl & 8 ) { // Runtime state variables  }  if (debug_lvl & 16) { // Sanity checking  }  if (debug_lvl & 64) {    if (from == 0) { // Constructor      cout << IdSrc << endl;      cout << IdHdr << endl;    }  }}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?