X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FFDM%2FJSBSim%2Fmodels%2FFGFCS.cpp;h=477890295478671424b026873c20664dfeb362fb;hb=edd83dd7e8fd7162ae49da6113ad797c68769f20;hp=ac015f9b010301ef6c6e50a331f1a047a018ccb6;hpb=70be1629e61d9b751a2f73df30b83bb1be6ca4fe;p=flightgear.git diff --git a/src/FDM/JSBSim/models/FGFCS.cpp b/src/FDM/JSBSim/models/FGFCS.cpp index ac015f9b0..477890295 100644 --- a/src/FDM/JSBSim/models/FGFCS.cpp +++ b/src/FDM/JSBSim/models/FGFCS.cpp @@ -6,7 +6,7 @@ Purpose: Model the flight controls Called by: FDMExec - ------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) ------------- + ------------- Copyright (C) 1999 Jon S. Berndt (jon@jsbsim.org) ------------- This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software @@ -38,22 +38,28 @@ INCLUDES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ #include "FGFCS.h" -#include -#include +#include "FGFDMExec.h" +#include "FGGroundReactions.h" +#include "input_output/FGPropertyManager.h" #include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "models/flight_control/FGFilter.h" +#include "models/flight_control/FGDeadBand.h" +#include "models/flight_control/FGGain.h" +#include "models/flight_control/FGPID.h" +#include "models/flight_control/FGSwitch.h" +#include "models/flight_control/FGSummer.h" +#include "models/flight_control/FGKinemat.h" +#include "models/flight_control/FGFCSFunction.h" +#include "models/flight_control/FGSensor.h" +#include "models/flight_control/FGActuator.h" +#include "models/flight_control/FGAccelerometer.h" +#include "models/flight_control/FGMagnetometer.h" +#include "models/flight_control/FGGyro.h" + +using namespace std; namespace JSBSim { @@ -100,8 +106,6 @@ FGFCS::~FGFCS() unsigned int i; - for (i=0;iHolding()) return false; + RunPreFunctions(); + for (i=0; iGetDefaultSteerAngle( GetDsCmd() ); } - // Cycle through the sensor, systems, autopilot, and flight control components - // Execute Sensors - for (i=0; iRun(); - // Execute Systems in order for (i=0; iRun(); @@ -220,6 +220,8 @@ bool FGFCS::Run(void) // Execute Flight Control System for (i=0; iRun(); + RunPostFunctions(); + return false; } @@ -453,7 +455,7 @@ void FGFCS::SetMixturePos(int engineNum, double setting) if (engineNum < (int)ThrottlePos.size()) { if (engineNum < 0) { - for (ctr=0;ctr<=MixtureCmd.size();ctr++) MixturePos[ctr] = MixtureCmd[ctr]; + for (ctr=0;ctr *Components; - Element *component_element, *property_element, *sensor_element; + Element *component_element; Element *channel_element; Components=0; @@ -574,32 +576,15 @@ bool FGFCS::Load(Element* el, SystemType systype) if (document->GetName() == "flight_control") bindModel(); - // Interface properties from any autopilot, flight control, or other system are - // all stored in the interface properties array. - - property_element = document->FindElement("property"); - if (property_element) cout << endl << " Declared properties" << endl << endl; - while (property_element) { - interface_property_string = property_element->GetDataLine(); - if (PropertyManager->HasNode(interface_property_string)) { - cout << " Property " << interface_property_string << " is already defined." << endl; - } else { - double value=0.0; - if ( ! property_element->GetAttributeValue("value").empty()) - value = property_element->GetAttributeValueAsNumber("value"); - interface_properties.push_back(new double(value)); - interface_property_string = property_element->GetDataLine(); - PropertyManager->Tie(interface_property_string, interface_properties.back()); - cout << " " << interface_property_string << " (initial value: " << value << ")" << endl; - } - property_element = document->FindNextElement("property"); - } + FGModel::Load(document); // Load interface properties from document // After reading interface properties in a file, read properties in the local // flight_control, autopilot, or system element. This allows general-purpose // systems to be defined in a file, with overrides or initial loaded constants // supplied in the relevant element of the aircraft configuration file. + Element* property_element = 0; + if (!fname.empty()) { property_element = el->FindElement("property"); if (property_element && debug_lvl > 0) cout << endl << " Overriding properties" << endl << endl; @@ -611,8 +596,9 @@ bool FGFCS::Load(Element* el, SystemType systype) interface_property_string = property_element->GetDataLine(); if (PropertyManager->HasNode(interface_property_string)) { FGPropertyManager* node = PropertyManager->GetNode(interface_property_string); - cout << " " << "Overriding value for property " << interface_property_string - << " (old value: " << node->getDoubleValue() << " new value: " << value << ")" << endl; + if (debug_lvl > 0) + cout << " " << "Overriding value for property " << interface_property_string + << " (old value: " << node->getDoubleValue() << " new value: " << value << ")" << endl; node->setDoubleValue(value); } else { interface_properties.push_back(new double(value)); @@ -625,22 +611,6 @@ bool FGFCS::Load(Element* el, SystemType systype) } } - // Any sensor elements that are outside of a channel (in either the autopilot - // or the flight_control, or even any possible "system") are placed into the global - // "sensors" array, and are executed prior to any autopilot, flight control, or - // system. - - sensor_element = document->FindElement("sensor"); - while (sensor_element) { - try { - sensors.push_back(new FGSensor(this, sensor_element)); - } catch (string s) { - cerr << highint << fgred << endl << " " << s << endl; - return false; - } - sensor_element = document->FindNextElement("sensor"); - } - channel_element = document->FindElement("channel"); while (channel_element) { @@ -679,6 +649,12 @@ bool FGFCS::Load(Element* el, SystemType systype) Components->push_back(new FGActuator(this, component_element)); } else if (component_element->GetName() == string("sensor")) { Components->push_back(new FGSensor(this, component_element)); + } else if (component_element->GetName() == string("accelerometer")) { + Components->push_back(new FGAccelerometer(this, component_element)); + } else if (component_element->GetName() == string("magnetometer")) { + Components->push_back(new FGMagnetometer(this, component_element)); + } else if (component_element->GetName() == string("gyro")) { + Components->push_back(new FGGyro(this, component_element)); } else { cerr << "Unknown FCS component: " << component_element->GetName() << endl; } @@ -716,7 +692,7 @@ double FGFCS::GetBrake(FGLGear::BrakeGroup bg) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -string FGFCS::FindSystemFullPathname(string system_filename) +string FGFCS::FindSystemFullPathname(const string& system_filename) { string fullpath, localpath; string systemPath = FDMExec->GetSystemsPath(); @@ -744,7 +720,7 @@ string FGFCS::FindSystemFullPathname(string system_filename) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ifstream* FGFCS::FindSystemFile(string system_filename) +ifstream* FGFCS::FindSystemFile(const string& system_filename) { string fullpath, localpath; string systemPath = FDMExec->GetSystemsPath(); @@ -769,7 +745,7 @@ ifstream* FGFCS::FindSystemFile(string system_filename) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -string FGFCS::GetComponentStrings(string delimeter) +string FGFCS::GetComponentStrings(const string& delimiter) { unsigned int comp; string CompStrings = ""; @@ -778,7 +754,7 @@ string FGFCS::GetComponentStrings(string delimeter) for (unsigned int i=0; iGetName(); total_count++; @@ -787,7 +763,7 @@ string FGFCS::GetComponentStrings(string delimeter) for (comp = 0; comp < APComponents.size(); comp++) { if (firstime) firstime = false; - else CompStrings += delimeter; + else CompStrings += delimiter; CompStrings += APComponents[comp]->GetName(); total_count++; @@ -795,7 +771,7 @@ string FGFCS::GetComponentStrings(string delimeter) for (comp = 0; comp < FCSComponents.size(); comp++) { if (firstime) firstime = false; - else CompStrings += delimeter; + else CompStrings += delimiter; CompStrings += FCSComponents[comp]->GetName(); total_count++; @@ -806,7 +782,7 @@ string FGFCS::GetComponentStrings(string delimeter) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -string FGFCS::GetComponentValues(string delimeter) +string FGFCS::GetComponentValues(const string& delimiter) { std::ostringstream buf; @@ -816,7 +792,7 @@ string FGFCS::GetComponentValues(string delimeter) for (unsigned int i=0; iGetOutput(); total_count++; @@ -824,7 +800,7 @@ string FGFCS::GetComponentValues(string delimeter) for (comp = 0; comp < APComponents.size(); comp++) { if (firstime) firstime = false; - else buf << delimeter; + else buf << delimiter; buf << setprecision(9) << APComponents[comp]->GetOutput(); total_count++; @@ -832,7 +808,7 @@ string FGFCS::GetComponentValues(string delimeter) for (comp = 0; comp < FCSComponents.size(); comp++) { if (firstime) firstime = false; - else buf << delimeter; + else buf << delimiter; buf << setprecision(9) << FCSComponents[comp]->GetOutput(); total_count++;