]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/JSBSim/models/FGFCS.cpp
sync. with JSBSim CVS again
[flightgear.git] / src / FDM / JSBSim / models / FGFCS.cpp
index 49c12f4352e9be12a49b19dd06f0395c8bf7a0fc..aaca68478d4639e0cf439d5ced5e23cc9355542b 100644 (file)
@@ -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,25 @@ INCLUDES
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
 #include "FGFCS.h"
-#include <FGFDMExec.h>
-#include <input_output/FGPropertyManager.h>
+#include "FGFDMExec.h"
+#include "input_output/FGPropertyManager.h"
 #include <fstream>
 #include <sstream>
 #include <iomanip>
 
-#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/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"
 
 namespace JSBSim {
 
@@ -100,8 +103,6 @@ FGFCS::~FGFCS()
 
   unsigned int i;
 
-  for (i=0;i<sensors.size();i++) delete sensors[i];
-  sensors.clear();
   for (i=0;i<APComponents.size();i++) delete APComponents[i];
   APComponents.clear();
   for (i=0;i<FCSComponents.size();i++) delete FCSComponents[i];
@@ -109,8 +110,6 @@ FGFCS::~FGFCS()
   for (i=0;i<Systems.size();i++) delete Systems[i];
   Systems.clear();
 
-  for (unsigned int i=0; i<interface_properties.size(); i++) delete interface_properties[i];
-  interface_properties.clear();
 
   Debug(1);
 }
@@ -139,6 +138,45 @@ bool FGFCS::InitModel(void)
     DfPos[i] = DsbPos[i] = DspPos[i] = 0.0;
   }
 
+  for (unsigned int i=0; i<Systems.size(); i++) {
+    if (Systems[i]->GetType() == "LAG" ||
+        Systems[i]->GetType() == "LEAD_LAG" ||
+        Systems[i]->GetType() == "WASHOUT" ||
+        Systems[i]->GetType() == "SECOND_ORDER_FILTER" ||
+        Systems[i]->GetType() == "INTEGRATOR")
+    {
+      ((FGFilter*)Systems[i])->ResetPastStates();
+    } else if (Systems[i]->GetType() == "PID" ) {
+      ((FGPID*)Systems[i])->ResetPastStates();
+    }
+  }
+
+  for (unsigned int i=0; i<FCSComponents.size(); i++) {
+    if (FCSComponents[i]->GetType() == "LAG" ||
+        FCSComponents[i]->GetType() == "LEAD_LAG" ||
+        FCSComponents[i]->GetType() == "WASHOUT" ||
+        FCSComponents[i]->GetType() == "SECOND_ORDER_FILTER" ||
+        FCSComponents[i]->GetType() == "INTEGRATOR")
+    {
+      ((FGFilter*)FCSComponents[i])->ResetPastStates();
+    } else if (FCSComponents[i]->GetType() == "PID" ) {
+      ((FGPID*)FCSComponents[i])->ResetPastStates();
+    }
+  }
+
+  for (unsigned int i=0; i<APComponents.size(); i++) {
+    if (APComponents[i]->GetType() == "LAG" ||
+        APComponents[i]->GetType() == "LEAD_LAG" ||
+        APComponents[i]->GetType() == "WASHOUT" ||
+        APComponents[i]->GetType() == "SECOND_ORDER_FILTER" ||
+        APComponents[i]->GetType() == "INTEGRATOR")
+    {
+      ((FGFilter*)APComponents[i])->ResetPastStates();
+    } else if (APComponents[i]->GetType() == "PID" ) {
+      ((FGPID*)APComponents[i])->ResetPastStates();
+    }
+  }
+
   return true;
 }
   
@@ -168,10 +206,6 @@ bool FGFCS::Run(void)
     SteerPosDeg[i] = gear->GetDefaultSteerAngle( GetDsCmd() );
   }
 
-  // Cycle through the sensor, systems, autopilot, and flight control components
-  // Execute Sensors
-  for (i=0; i<sensors.size(); i++) sensors[i]->Run();
-
   // Execute Systems in order
   for (i=0; i<Systems.size(); i++) Systems[i]->Run();
 
@@ -414,7 +448,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<MixtureCmd.size();ctr++) MixturePos[ctr] = MixtureCmd[ctr];
     } else {
       MixturePos[engineNum] = setting;
     }
@@ -444,7 +478,7 @@ void FGFCS::SetPropAdvance(int engineNum, double setting)
 
   if (engineNum < (int)ThrottlePos.size()) {
     if (engineNum < 0) {
-      for (ctr=0;ctr<=PropAdvanceCmd.size();ctr++) PropAdvance[ctr] = PropAdvanceCmd[ctr];
+      for (ctr=0;ctr<PropAdvanceCmd.size();ctr++) PropAdvance[ctr] = PropAdvanceCmd[ctr];
     } else {
       PropAdvance[engineNum] = setting;
     }
@@ -474,7 +508,7 @@ void FGFCS::SetPropFeather(int engineNum, bool setting)
 
   if (engineNum < (int)ThrottlePos.size()) {
     if (engineNum < 0) {
-      for (ctr=0;ctr<=PropFeatherCmd.size();ctr++) PropFeather[ctr] = PropFeatherCmd[ctr];
+      for (ctr=0;ctr<PropFeatherCmd.size();ctr++) PropFeather[ctr] = PropFeatherCmd[ctr];
     } else {
       PropFeather[engineNum] = setting;
     }
@@ -487,7 +521,7 @@ bool FGFCS::Load(Element* el, SystemType systype)
 {
   string name, file, fname="", interface_property_string, parent_name;
   vector <FGFCSComponent*> *Components;
-  Element *component_element, *property_element, *sensor_element;
+  Element *component_element;
   Element *channel_element;
 
   Components=0;
@@ -535,70 +569,41 @@ 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) {
-    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 << "    Declared properties" << endl << endl;
+    if (property_element && debug_lvl > 0) cout << endl << "    Overriding properties" << endl << endl;
     while (property_element) {
       double value=0.0;
       if ( ! property_element->GetAttributeValue("value").empty())
         value = property_element->GetAttributeValueAsNumber("value");
 
       interface_property_string = property_element->GetDataLine();
-      
-      FGPropertyManager* node = PropertyManager->GetNode(interface_property_string);
-      if (node) {
-        cout << "      " << "Overriding value for property " << interface_property_string
-             << " (old value: " << node->getDoubleValue() << "  new value: " << value << ")" << endl;
+      if (PropertyManager->HasNode(interface_property_string)) {
+        FGPropertyManager* node = PropertyManager->GetNode(interface_property_string);
+        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));
         PropertyManager->Tie(interface_property_string, interface_properties.back());
-       if (debug_lvl > 0)
+        if (debug_lvl > 0)
           cout << "      " << interface_property_string << " (initial value: " << value << ")" << endl;
       }
       
-      
       property_element = el->FindNextElement("property");
     }
   }
 
-  // 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) {
   
@@ -637,6 +642,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;
         }