]> git.mxchange.org Git - flightgear.git/commitdiff
Sync.with JSBSim CVS
authorehofman <ehofman>
Thu, 23 Oct 2008 19:04:45 +0000 (19:04 +0000)
committerehofman <ehofman>
Thu, 23 Oct 2008 19:04:45 +0000 (19:04 +0000)
src/FDM/JSBSim/JSBSim.cxx
src/FDM/JSBSim/JSBSim.hxx
src/FDM/JSBSim/math/FGColumnVector3.cpp
src/FDM/JSBSim/models/FGFCS.cpp
src/FDM/JSBSim/models/FGFCS.h
src/FDM/JSBSim/models/FGMassBalance.cpp
src/FDM/JSBSim/models/FGPropagate.cpp
src/FDM/JSBSim/models/propulsion/FGPiston.cpp
src/FDM/JSBSim/models/propulsion/Makefile.am

index 4955a0b9fe29d1604c6a01121dcb1e407f4239e0..9ae8470437a3d664f847ecf7d3643175d0a45321 100644 (file)
@@ -248,6 +248,8 @@ FGJSBsim::FGJSBsim( double dt )
     speedbrake_pos_pct
         =fgGetNode("/surface-positions/speedbrake-pos-norm",true);
     spoilers_pos_pct=fgGetNode("/surface-positions/spoilers-pos-norm",true);
+    tailhook_pos_pct=fgGetNode("/gear/tailhook/position-norm",true);
+    wing_fold_pos_pct=fgGetNode("surface-positions/wing-fold-pos-norm",true);
 
     elevator_pos_pct->setDoubleValue(0);
     left_aileron_pos_pct->setDoubleValue(0);
@@ -279,6 +281,8 @@ FGJSBsim::FGJSBsim( double dt )
         fgGetDouble("/fdm/jsbsim/systems/hook/tailhook-offset-x-in", 196),
         fgGetDouble("/fdm/jsbsim/systems/hook/tailhook-offset-y-in", 0),
         fgGetDouble("/fdm/jsbsim/systems/hook/tailhook-offset-z-in", -16));
+
+    crashed = false;
 }
 
 /******************************************************************************/
@@ -398,6 +402,12 @@ void FGJSBsim::init()
 
 void FGJSBsim::update( double dt )
 {
+    if(crashed) {
+      if(!fgGetBool("/sim/crashed"))
+        fgSetBool("/sim/crashed", true);
+      return;
+    }
+
     if (is_suspended())
       return;
 
@@ -480,6 +490,8 @@ void FGJSBsim::update( double dt )
       msg = fdmex->ProcessMessage();
       switch (msg->type) {
       case FGJSBBase::Message::eText:
+        if (msg->text == "Crash Detected: Simulation FREEZE.")
+          crashed = true;
         SG_LOG( SG_FLIGHT, SG_INFO, msg->messageId << ": " << msg->text );
         break;
       case FGJSBBase::Message::eBool:
@@ -862,12 +874,13 @@ bool FGJSBsim::copy_from_JSBsim()
     flap_pos_pct->setDoubleValue( FCS->GetDfPos(ofNorm) );
     speedbrake_pos_pct->setDoubleValue( FCS->GetDsbPos(ofNorm) );
     spoilers_pos_pct->setDoubleValue( FCS->GetDspPos(ofNorm) );
+    tailhook_pos_pct->setDoubleValue( FCS->GetTailhookPos() );
+    wing_fold_pos_pct->setDoubleValue( FCS->GetWingFoldPos() );
 
-    // force a sim reset if crashed (altitude AGL < 0)
+    // force a sim crashed if crashed (altitude AGL < 0)
     if (get_Altitude_AGL() < -100.0) {
-         fgSetBool("/sim/crashed", true);
-         SGPropertyNode* node = fgGetNode("/sim/presets", true);
-         globals->get_commands()->execute("old-reinit-dialog", node);
+         State->SuspendIntegration();
+         crashed = true;
     }
 
     return true;
@@ -1073,6 +1086,7 @@ void FGJSBsim::init_gear(void )
       node->setDoubleValue("position-norm", gear->GetGearUnitPos());
       node->setDoubleValue("tire-pressure-norm", gear->GetTirePressure());
       node->setDoubleValue("compression-norm", gear->GetCompLen());
+      node->setDoubleValue("compression-ft", gear->GetCompLen());
       if ( gear->GetSteerable() )
         node->setDoubleValue("steering-norm", gear->GetSteerNorm());
     }
@@ -1089,6 +1103,7 @@ void FGJSBsim::update_gear(void)
       node->getChild("position-norm", 0, true)->setDoubleValue(gear->GetGearUnitPos());
       gear->SetTirePressure(node->getDoubleValue("tire-pressure-norm"));
       node->setDoubleValue("compression-norm", gear->GetCompLen());
+      node->setDoubleValue("compression-ft", gear->GetCompLen());
       if ( gear->GetSteerable() )
         node->setDoubleValue("steering-norm", gear->GetSteerNorm());
     }
index 6fa38fdb1111eedaed276f34275392b5c59bbbc4..89ae03289938e7378027de748facfa3e1fcd20fc 100644 (file)
@@ -252,6 +252,8 @@ private:
     SGPropertyNode_ptr spoilers_pos_pct;
 
     SGPropertyNode_ptr gear_pos_pct;
+    SGPropertyNode_ptr wing_fold_pos_pct;
+    SGPropertyNode_ptr tailhook_pos_pct;
 
     SGPropertyNode_ptr temperature;
     SGPropertyNode_ptr pressure;
@@ -271,6 +273,8 @@ private:
     double hook_length;
     bool got_wire;
 
+    bool crashed;
+
     void init_gear(void);
     void update_gear(void);
 
index 73f291b309c2d834e18eb9972b90c6eb888db4d9..0bd5c011f27b851c4b06f38c086e48fbf936a638 100644 (file)
@@ -60,7 +60,7 @@ FGColumnVector3::FGColumnVector3(void)
 string FGColumnVector3::Dump(string delimeter) const
 {
   char buffer[256];
-  sprintf(buffer, "%f%s%f%s%f", Entry(1), delimeter.c_str(), Entry(2), delimeter.c_str(), Entry(3));
+  sprintf(buffer, "%10.3e%s%10.3e%s%10.3e", Entry(1), delimeter.c_str(), Entry(2), delimeter.c_str(), Entry(3));
   return string(buffer);
 }
 
index 0262e0872ed26698d379215667e58c9e2e95b0bb..e688273510a95f59b33e6c51a10c6df4579cb3d4 100644 (file)
@@ -76,6 +76,7 @@ FGFCS::FGFCS(FGFDMExec* fdmex) : FGModel(fdmex)
   PTrimCmd = YTrimCmd = RTrimCmd = 0.0;
   GearCmd = GearPos = 1; // default to gear down
   LeftBrake = RightBrake = CenterBrake = 0.0;
+  TailhookPos = WingFoldPos = 0.0; 
 
   bind();
   for (i=0;i<NForms;i++) {
@@ -134,6 +135,7 @@ bool FGFCS::InitModel(void)
 
   DaCmd = DeCmd = DrCmd = DsCmd = DfCmd = DsbCmd = DspCmd = 0;
   PTrimCmd = YTrimCmd = RTrimCmd = 0.0;
+  TailhookPos = WingFoldPos = 0.0;
 
   for (i=0;i<NForms;i++) {
     DePos[i] = DaLPos[i] = DaRPos[i] = DrPos[i] = 0.0;
@@ -486,7 +488,7 @@ void FGFCS::SetPropFeather(int engineNum, bool setting)
 
 bool FGFCS::Load(Element* el, SystemType systype)
 {
-  string name, file, fname, interface_property_string, parent_name;
+  string name, file, fname="", interface_property_string, parent_name;
   vector <FGFCSComponent*> *Components;
   Element *component_element, *property_element, *sensor_element;
   Element *channel_element;
@@ -505,7 +507,7 @@ bool FGFCS::Load(Element* el, SystemType systype)
     if (systype == stSystem) {
       file = FindSystemFullPathname(fname);
     } else { 
-    file = FDMExec->GetFullAircraftPath() + separator + fname + ".xml";
+      file = FDMExec->GetFullAircraftPath() + separator + fname + ".xml";
     }
     if (fname.empty()) {
       cerr << "FCS, Autopilot, or system does not appear to be defined inline nor in a file" << endl;
@@ -530,18 +532,13 @@ bool FGFCS::Load(Element* el, SystemType systype)
   }
   Debug(2);
 
-  // ToDo: How do these get untied?
-  // ToDo: Consider having INPUT and OUTPUT interface properties. Would then
-  //       have to duplicate this block of code after channel read code.
-  //       Input properties could be write only (nah), and output could be read
-  //       only.
-
   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())
@@ -549,9 +546,41 @@ bool FGFCS::Load(Element* el, SystemType systype)
     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");
   }
 
+  // After reading interface properties in a file, read properties in the local
+  // flight_control, autopiot, 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.
+
+  if (!fname.empty()) {
+    property_element = el->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_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;
+        node->setDoubleValue(value);
+      } else {
+        interface_properties.push_back(new double(value));
+        PropertyManager->Tie(interface_property_string, interface_properties.back());
+        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
@@ -570,6 +599,10 @@ bool FGFCS::Load(Element* el, SystemType systype)
 
   channel_element = document->FindElement("channel");
   while (channel_element) {
+  
+    cout << endl << highint << fgblue << "    Channel " 
+         << normint << channel_element->GetAttributeValue("name") << reset << endl;
+  
     component_element = channel_element->GetElement();
     while (component_element) {
       try {
@@ -732,7 +765,7 @@ string FGFCS::GetComponentValues(string delimeter)
 {
   unsigned int comp;
   string CompValues = "";
-  char buffer[20];
+  char buffer[100];
   bool firstime = true;
   int total_count=0;
 
@@ -740,7 +773,7 @@ string FGFCS::GetComponentValues(string delimeter)
     if (firstime) firstime = false;
     else          CompValues += delimeter;
 
-    sprintf(buffer, "%9.6f", Systems[i]->GetOutput());
+    snprintf(buffer, 100, "%9.6f", Systems[i]->GetOutput());
     CompValues += string(buffer);
     total_count++;
   }
@@ -852,6 +885,9 @@ void FGFCS::bind(void)
   PropertyManager->Tie("fcs/right-brake-cmd-norm", this, &FGFCS::GetRBrake, &FGFCS::SetRBrake);
   PropertyManager->Tie("fcs/center-brake-cmd-norm", this, &FGFCS::GetCBrake, &FGFCS::SetCBrake);
   PropertyManager->Tie("fcs/steer-cmd-norm", this, &FGFCS::GetDsCmd, &FGFCS::SetDsCmd);
+
+  PropertyManager->Tie("gear/tailhook-pos-norm", this, &FGFCS::GetTailhookPos, &FGFCS::SetTailhookPos);
+  PropertyManager->Tie("fcs/wing-fold-pos-norm", this, &FGFCS::GetWingFoldPos, &FGFCS::SetWingFoldPos);
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
index 6b1bd5a22974748d6a1b109a9e4b03b47c917ed3..33d443e5b72f58852d0f970c727300391cab9c25 100644 (file)
@@ -162,7 +162,9 @@ CLASS DOCUMENTATION
     @property fcs/spoiler-pos-deg
     @property fcs/spoiler-pos-norm
     @property fcs/mag-spoiler-pos-rad
+    @property fcs/wing-fold-pos-norm
     @property gear/gear-pos-norm
+    @property gear/tailhook-pos-norm
 
     @author Jon S. Berndt
     @version $Revision$
@@ -325,6 +327,14 @@ public:
       @return gear position (0 up, 1 down) */
   inline double GetGearPos(void) const { return GearPos; }
 
+  /** Gets the tailhook position (0 up, 1 down)
+      @return tailhook position (0 up, 1 down) */
+  inline double GetTailhookPos(void) const { return TailhookPos; }
+
+  /** Gets the wing fold position (0 unfolded, 1 folded)
+      @return wing fold position (0 unfolded, 1 folded) */
+  inline double GetWingFoldPos(void) const { return WingFoldPos; }
+
   /** Gets the prop pitch position.
       @param engine engine ID number
       @return prop pitch position for the given engine in range from 0 - 1.0 */
@@ -467,6 +477,13 @@ public:
       @param gear position 0 up, 1 down       */
    void SetGearPos(double gearpos) { GearPos = gearpos; }
 
+  /** Set the tailhook position
+      @param tailhook position 0 up, 1 down       */
+   void SetTailhookPos(double hookpos) { TailhookPos = hookpos; }
+
+  /** Set the wing fold position
+      @param wing fold position 0 unfolded, 1 folded  */
+   void SetWingFoldPos(double foldpos) { WingFoldPos = foldpos; }
 
   /** Sets the actual prop pitch setting for the specified engine
       @param engine engine ID number
@@ -545,6 +562,7 @@ private:
   vector <double> SteerPosDeg;
   double LeftBrake, RightBrake, CenterBrake; // Brake settings
   double GearCmd,GearPos;
+  double TailhookPos, WingFoldPos;
 
   typedef vector <FGFCSComponent*> FCSCompVec;
   FCSCompVec Systems;
index 69c3a67230064b9d5c945b28728f239e507de1ef..bbc5805a1c79bde37c11c6248b673d56a490230c 100644 (file)
@@ -130,6 +130,11 @@ bool FGMassBalance::Load(Element* el)
     element = el->FindNextElement("pointmass");
   }
 
+  Weight = EmptyWeight + Propulsion->GetTanksWeight() + GetPointMassWeight()
+    + BuoyantForces->GetGasMass()*slugtolb;
+
+  Mass = lbtoslug*Weight;
+
   Debug(2);
   return true;
 }
index 943d0b2fa04f91dc760ac592dbe8d190af8c773d..bbdee4aefa4265423b1dfe466f3c76e3a39b2109 100644 (file)
@@ -319,6 +319,7 @@ bool FGPropagate::Run(void)
   last2_vLocationDot = last_vLocationDot;
   last_vLocationDot = vLocationDot;
 
+  Debug(2);
   return false;
 }
 
@@ -580,6 +581,20 @@ void FGPropagate::Debug(int from)
   if (debug_lvl & 8 ) { // Runtime state variables
   }
   if (debug_lvl & 16) { // Sanity checking
+    if (from == 2) { // State sanity checking
+      if (fabs(VState.vPQR.Magnitude()) > 1000.0) {
+        cerr << endl << "Vehicle rotation rate is excessive (>1000 rad/sec): " << VState.vPQR.Magnitude() << endl;
+        exit(-1);
+      }
+      if (fabs(VState.vUVW.Magnitude()) > 1.0e10) {
+        cerr << endl << "Vehicle velocity is excessive (>1e10 ft/sec): " << VState.vUVW.Magnitude() << endl;
+        exit(-1);
+      }
+      if (fabs(GetDistanceAGL()) > 1e10) {
+        cerr << endl << "Vehicle altitude is excessive (>1e10 ft): " << GetDistanceAGL() << endl;
+        exit(-1);
+      }
+    }
   }
   if (debug_lvl & 64) {
     if (from == 0) { // Constructor
index 809cfadcef8c6e5f67236c96a95098bec781274a..7f981ce3397991a345c59750fac2c58362831d2e 100644 (file)
@@ -304,8 +304,6 @@ Manifold_Pressure_Lookup = new
 
 FGPiston::~FGPiston()
 {
-  char property_name[80];
-
   delete Lookup_Combustion_Efficiency;
   delete Power_Mixture_Correlation;
   delete Mixture_Efficiency_Correlation;
@@ -630,18 +628,18 @@ void FGPiston::doEnginePower(void)
     double T_amb_sea_lev_degF = KelvinToFahrenheit(288);
 
     // FIXME: this needs to be generalized
-    double ME, friction, percent_RPM;  // Convienience term for use in the calculations
+    double ME, friction, percent_RPM, power;  // Convienience term for use in the calculations
     ME = Mixture_Efficiency_Correlation->GetValue(m_dot_fuel/m_dot_air);
 
     percent_RPM = RPM/MaxRPM;
     friction = 1 - (percent_RPM * percent_RPM * percent_RPM * percent_RPM/10);
     if (friction < 0 ) friction = 0;
-    Percentage_Power = friction;
+    power = friction;
 
-    if ( Magnetos != 3 ) Percentage_Power *= SparkFailDrop;
+    if ( Magnetos != 3 ) power *= SparkFailDrop;
 
 
-    HP = (FuelFlow_gph * 6.0 / BSFC )* ME * suction_loss * Percentage_Power;
+    HP = (FuelFlow_gph * 6.0 / BSFC )* ME * suction_loss * power;
 
   } else {
 
@@ -663,6 +661,7 @@ void FGPiston::doEnginePower(void)
         HP = 0.0;
     }
   }
+  Percentage_Power = HP / MaxHP ;
 //  cout << "Power = " << HP << "  RPM = " << RPM << "  Running = " << Running << "  Cranking = " << Cranking << endl;
 }
 
@@ -790,7 +789,7 @@ void FGPiston::doOilPressure(void)
     OilPressure_psi = Oil_Press_Relief_Valve;
   }
 
-  OilPressure_psi += (Design_Oil_Temp - OilTemp_degK) * Oil_Viscosity_Index;
+  OilPressure_psi += (Design_Oil_Temp - OilTemp_degK) * Oil_Viscosity_Index * OilPressure_psi / Oil_Press_Relief_Valve;
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
index 5d2d72a9ffe199d6e03d60dcc9b4fb4cea57d740..9a5f0a2e4b387e5f5eaa17a3958c946dd2c4ff04 100644 (file)
@@ -1,11 +1,22 @@
-noinst_LIBRARIES = libPropulsion.a
+includedir = @includedir@/JSBSim/models/propulsion
 
-libPropulsion_a_SOURCES = FGElectric.cpp FGEngine.cpp FGForce.cpp FGNozzle.cpp \
-                         FGPiston.cpp FGPropeller.cpp FGRocket.cpp FGRotor.cpp \
+LIBRARY_SOURCES = FGElectric.cpp FGEngine.cpp FGForce.cpp FGNozzle.cpp \
+                         FGPiston.cpp FGPropeller.cpp FGRocket.cpp \
                          FGTank.cpp FGThruster.cpp FGTurbine.cpp FGTurboProp.cpp
 
-noinst_HEADERS =  FGElectric.h FGEngine.h FGForce.h FGNozzle.h FGPiston.h \
-                  FGPropeller.h FGRocket.h FGRotor.h FGTank.h FGThruster.h \
+LIBRARY_INCLUDES = FGElectric.h FGEngine.h FGForce.h FGNozzle.h FGPiston.h \
+                  FGPropeller.h FGRocket.h FGTank.h FGThruster.h \
                   FGTurbine.h FGTurboProp.h
 
-INCLUDES = -I$(top_srcdir)/src/FDM/JSBSim
+if BUILD_LIBRARIES
+noinst_LTLIBRARIES = libPropulsion.la
+include_HEADERS = $(LIBRARY_INCLUDES)
+libPropulsion_la_SOURCES = $(LIBRARY_SOURCES)
+libPropulsion_la_CXXFLAGS = $(AM_CXXFLAGS)
+else
+noinst_LIBRARIES = libPropulsion.a
+noinst_HEADERS = $(LIBRARY_INCLUDES)
+libPropulsion_a_SOURCES = $(LIBRARY_SOURCES)
+endif
+
+INCLUDES = -I$(top_srcdir)/src -I../../