]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/JSBSim/FGInitialCondition.cpp
JSBSim updates. This update changes the file format, so an update of the base
[flightgear.git] / src / FDM / JSBSim / FGInitialCondition.cpp
index 99cad97a5cfef446caf249986402e8cb1f51e86e..f9fbc31b5c7236005480376e85f17e77b2ca261e 100644 (file)
@@ -46,6 +46,7 @@ INCLUDES
 #include "FGFDMExec.h"
 #include "FGState.h"
 #include "FGAtmosphere.h"
+#include "FGAerodynamics.h"
 #include "FGFCS.h"
 #include "FGAircraft.h"
 #include "FGTranslation.h"
@@ -54,6 +55,7 @@ INCLUDES
 #include "FGAuxiliary.h"
 #include "FGOutput.h"
 #include "FGConfigFile.h"
+#include "FGPropertyManager.h"
 
 static const char *IdSrc = "$Id$";
 static const char *IdHdr = ID_INITIALCONDITION;
@@ -87,18 +89,21 @@ FGInitialCondition::FGInitialCondition(FGFDMExec *FDMExec)
     fdmex=FDMExec;
     fdmex->GetPosition()->Seth(altitude);
     fdmex->GetAtmosphere()->Run();
+    PropertyManager=fdmex->GetPropertyManager();
+    bind();
   } else {
     cout << "FGInitialCondition: This class requires a pointer to a valid FGFDMExec object" << endl;
   }
-
-  if (debug_lvl & 2) cout << "Instantiated: FGInitialCondition" << endl;
+  
+  Debug(0);
 }
 
 //******************************************************************************
 
 FGInitialCondition::~FGInitialCondition()
 {
-  if (debug_lvl & 2) cout << "Destroyed:    FGInitialCondition" << endl;
+  unbind();
+  Debug(1);
 }
 
 //******************************************************************************
@@ -501,9 +506,12 @@ bool FGInitialCondition::getMachFromVcas(double *Mach,double vcas) {
 bool FGInitialCondition::getAlpha(void) {
   bool result=false;
   double guess=theta-gamma;
+  
+  if(vt < 0.01) return 0;
+  
   xlo=xhi=0;
-  xmin=fdmex->GetAircraft()->GetAlphaCLMin();
-  xmax=fdmex->GetAircraft()->GetAlphaCLMax();
+  xmin=fdmex->GetAerodynamics()->GetAlphaCLMin();
+  xmax=fdmex->GetAerodynamics()->GetAlphaCLMax();
   sfunc=&FGInitialCondition::GammaEqOfAlpha;
   if(findInterval(0,guess)){
     if(solve(&alpha,0)){
@@ -521,6 +529,9 @@ bool FGInitialCondition::getAlpha(void) {
 bool FGInitialCondition::getTheta(void) {
   bool result=false;
   double guess=alpha+gamma;
+  
+  if(vt < 0.01) return 0;
+  
   xlo=xhi=0;
   xmin=-89;xmax=89;
   sfunc=&FGInitialCondition::GammaEqOfTheta;
@@ -555,7 +566,6 @@ double FGInitialCondition::GammaEqOfTheta(double Theta) {
 double FGInitialCondition::GammaEqOfAlpha(double Alpha) {
   double a,b,c;
   double sAlpha,cAlpha;
-
   sAlpha=sin(Alpha); cAlpha=cos(Alpha);
   a=wdown + vt*cAlpha*cbeta + uw;
   b=vt*sphi*sbeta + vw*sphi;
@@ -708,21 +718,30 @@ double FGInitialCondition::GetWindDirDegIC(void) {
 
 //******************************************************************************
 
-bool FGInitialCondition::Load(string acpath, string acname, string rstfile)
+bool FGInitialCondition::Load(string rstfile, bool useStoredPath)
 {
   string resetDef;
   string token="";
 
   double temp;
-
-# ifndef macintosh
-  resetDef = acpath + "/" + acname + "/" + rstfile + ".xml";
-# else
-  resetDef = acpath + ";" + acname + ";" + rstfile + ".xml";
-# endif
-
+  # ifndef macintosh
+    string sep = "/";
+  # else
+    string sep = ";";
+  #endif     
+  
+  if( useStoredPath ) {
+    string acpath = fdmex->GetAircraftPath() + sep + fdmex->GetModelName();
+    resetDef = acpath + sep + rstfile + ".xml";
+  } else {
+    resetDef = rstfile;
+  }  
+  
   FGConfigFile resetfile(resetDef);
-  if (!resetfile.IsOpen()) return false;
+  if (!resetfile.IsOpen()) {
+    cerr << "Failed to open reset file: " << resetDef << endl;
+    return false;
+  }  
 
   resetfile.GetNextConfigLine();
   token = resetfile.GetValue();
@@ -758,7 +777,248 @@ bool FGInitialCondition::Load(string acpath, string acname, string rstfile)
     resetfile >> token;
   }
 
-  fdmex->RunIC(this);
+  fdmex->RunIC();
   
   return true;
-}  
+}
+
+//******************************************************************************
+
+void FGInitialCondition::bind(void){
+  PropertyManager->Tie("ic/vc-kts", this,
+                       &FGInitialCondition::GetVcalibratedKtsIC,
+                       &FGInitialCondition::SetVcalibratedKtsIC,
+                       true);
+  PropertyManager->Tie("ic/ve-kts", this,
+                       &FGInitialCondition::GetVequivalentKtsIC,
+                       &FGInitialCondition::SetVequivalentKtsIC,
+                       true);
+  PropertyManager->Tie("ic/vg-kts", this,
+                       &FGInitialCondition::GetVgroundKtsIC,
+                       &FGInitialCondition::SetVgroundKtsIC,
+                       true);
+  PropertyManager->Tie("ic/vt-kts", this,
+                       &FGInitialCondition::GetVtrueKtsIC,
+                       &FGInitialCondition::SetVtrueKtsIC,
+                       true);
+  PropertyManager->Tie("ic/mach-norm", this,
+                       &FGInitialCondition::GetMachIC,
+                       &FGInitialCondition::SetMachIC,
+                       true);
+  PropertyManager->Tie("ic/roc-fpm", this,
+                       &FGInitialCondition::GetClimbRateFpmIC,
+                       &FGInitialCondition::SetClimbRateFpmIC,
+                       true);
+  PropertyManager->Tie("ic/gamma-deg", this,
+                       &FGInitialCondition::GetFlightPathAngleDegIC,
+                       &FGInitialCondition::SetFlightPathAngleDegIC,
+                       true);
+  PropertyManager->Tie("ic/alpha-deg", this,
+                       &FGInitialCondition::GetAlphaDegIC,
+                       &FGInitialCondition::SetAlphaDegIC,
+                       true);
+  PropertyManager->Tie("ic/beta-deg", this,
+                       &FGInitialCondition::GetBetaDegIC,
+                       &FGInitialCondition::SetBetaDegIC,
+                       true);
+  PropertyManager->Tie("ic/theta-deg", this,
+                       &FGInitialCondition::GetPitchAngleDegIC,
+                       &FGInitialCondition::SetPitchAngleDegIC,
+                       true);
+  PropertyManager->Tie("ic/phi-deg", this,
+                       &FGInitialCondition::GetRollAngleDegIC,
+                       &FGInitialCondition::SetRollAngleDegIC,
+                       true);
+  PropertyManager->Tie("ic/psi-true-deg", this,
+                       &FGInitialCondition::GetHeadingDegIC );
+  PropertyManager->Tie("ic/lat-gc-deg", this,
+                       &FGInitialCondition::GetLatitudeDegIC,
+                       &FGInitialCondition::SetLatitudeDegIC,
+                       true);
+  PropertyManager->Tie("ic/long-gc-deg", this,
+                       &FGInitialCondition::GetLongitudeDegIC,
+                       &FGInitialCondition::SetLongitudeDegIC,
+                       true);
+  PropertyManager->Tie("ic/h-sl-ft", this,
+                       &FGInitialCondition::GetAltitudeFtIC,
+                       &FGInitialCondition::SetAltitudeFtIC,
+                       true);
+  PropertyManager->Tie("ic/h-agl-ft", this,
+                       &FGInitialCondition::GetAltitudeAGLFtIC,
+                       &FGInitialCondition::SetAltitudeAGLFtIC,
+                       true);
+  PropertyManager->Tie("ic/sea-level-radius-ft", this,
+                       &FGInitialCondition::GetSeaLevelRadiusFtIC,
+                       &FGInitialCondition::SetSeaLevelRadiusFtIC,
+                       true);
+  PropertyManager->Tie("ic/terrain-altitude-ft", this,
+                       &FGInitialCondition::GetTerrainAltitudeFtIC,
+                       &FGInitialCondition::SetTerrainAltitudeFtIC,
+                       true);
+  PropertyManager->Tie("ic/vg-fps", this,
+                       &FGInitialCondition::GetVgroundFpsIC,
+                       &FGInitialCondition::SetVgroundFpsIC,
+                       true);
+  PropertyManager->Tie("ic/vt-fps", this,
+                       &FGInitialCondition::GetVtrueFpsIC,
+                       &FGInitialCondition::SetVtrueFpsIC,
+                       true);
+  PropertyManager->Tie("ic/vw-bx-fps", this,
+                       &FGInitialCondition::GetWindUFpsIC);
+  PropertyManager->Tie("ic/vw-by-fps", this,
+                       &FGInitialCondition::GetWindVFpsIC);
+  PropertyManager->Tie("ic/vw-bz-fps", this,
+                       &FGInitialCondition::GetWindWFpsIC);
+  PropertyManager->Tie("ic/vw-north-fps", this,
+                       &FGInitialCondition::GetWindNFpsIC);
+  PropertyManager->Tie("ic/vw-east-fps", this,
+                       &FGInitialCondition::GetWindEFpsIC);
+  PropertyManager->Tie("ic/vw-down-fps", this,
+                       &FGInitialCondition::GetWindDFpsIC);
+  PropertyManager->Tie("ic/vw-mag-fps", this,
+                       &FGInitialCondition::GetWindFpsIC);
+ /*  PropertyManager->Tie("ic/vw-dir-deg", this,
+                       &FGInitialCondition::GetWindDirDegIC,
+                       &FGInitialCondition::SetWindDirDegIC,
+                       true); */
+
+  PropertyManager->Tie("ic/roc-fps", this,
+                       &FGInitialCondition::GetClimbRateFpsIC,
+                       &FGInitialCondition::SetClimbRateFpsIC,
+                       true);
+  /* PropertyManager->Tie("ic/u-fps", this,
+                       &FGInitialCondition::GetUBodyFpsIC,
+                       &FGInitialCondition::SetUBodyFpsIC,
+                       true);
+  PropertyManager->Tie("ic/v-fps", this,
+                       &FGInitialCondition::GetVBodyFpsIC,
+                       &FGInitialCondition::SetVBodyFpsIC,
+                       true);
+  PropertyManager->Tie("ic/w-fps", this,
+                       &FGInitialCondition::GetWBodyFpsIC,
+                       &FGInitialCondition::SetWBodyFpsIC,
+                       true); */
+
+  PropertyManager->Tie("ic/gamma-rad", this,
+                       &FGInitialCondition::GetFlightPathAngleRadIC,
+                       &FGInitialCondition::SetFlightPathAngleRadIC,
+                       true);
+  PropertyManager->Tie("ic/alpha-rad", this,
+                       &FGInitialCondition::GetAlphaRadIC,
+                       &FGInitialCondition::SetAlphaRadIC,
+                       true);
+  PropertyManager->Tie("ic/theta-rad", this,
+                       &FGInitialCondition::GetPitchAngleRadIC,
+                       &FGInitialCondition::SetPitchAngleRadIC,
+                       true);
+  PropertyManager->Tie("ic/beta-rad", this,
+                       &FGInitialCondition::GetBetaRadIC,
+                       &FGInitialCondition::SetBetaRadIC,
+                       true);
+  PropertyManager->Tie("ic/phi-rad", this,
+                       &FGInitialCondition::GetRollAngleRadIC,
+                       &FGInitialCondition::SetRollAngleRadIC,
+                       true);
+  PropertyManager->Tie("ic/psi-true-rad", this,
+                       &FGInitialCondition::GetHeadingRadIC);
+  PropertyManager->Tie("ic/lat-gc-rad", this,
+                       &FGInitialCondition::GetLatitudeRadIC,
+                       &FGInitialCondition::SetLatitudeRadIC,
+                       true);
+  PropertyManager->Tie("ic/long-gc-rad", this,
+                       &FGInitialCondition::GetLongitudeRadIC,
+                       &FGInitialCondition::SetLongitudeRadIC,
+                       true);
+}
+
+//******************************************************************************
+
+void FGInitialCondition::unbind(void){
+  PropertyManager->Untie("ic/vc-kts");
+  PropertyManager->Untie("ic/ve-kts");
+  PropertyManager->Untie("ic/vg-kts");
+  PropertyManager->Untie("ic/vt-kts");
+  PropertyManager->Untie("ic/mach-norm");
+  PropertyManager->Untie("ic/roc-fpm");
+  PropertyManager->Untie("ic/gamma-deg");
+  PropertyManager->Untie("ic/alpha-deg");
+  PropertyManager->Untie("ic/beta-deg");
+  PropertyManager->Untie("ic/theta-deg");
+  PropertyManager->Untie("ic/phi-deg");
+  PropertyManager->Untie("ic/psi-true-deg");
+  PropertyManager->Untie("ic/lat-gc-deg");
+  PropertyManager->Untie("ic/long-gc-deg");
+  PropertyManager->Untie("ic/h-sl-ft");
+  PropertyManager->Untie("ic/h-agl-ft");
+  PropertyManager->Untie("ic/sea-level-radius-ft");
+  PropertyManager->Untie("ic/terrain-altitude-ft");
+  PropertyManager->Untie("ic/vg-fps");
+  PropertyManager->Untie("ic/vt-fps");
+  PropertyManager->Untie("ic/vw-bx-fps");
+  PropertyManager->Untie("ic/vw-by-fps");
+  PropertyManager->Untie("ic/vw-bz-fps");
+  PropertyManager->Untie("ic/vw-north-fps");
+  PropertyManager->Untie("ic/vw-east-fps");
+  PropertyManager->Untie("ic/vw-down-fps");
+  PropertyManager->Untie("ic/vw-mag-fps");
+  /* PropertyManager->Untie("ic/vw-dir-deg"); */
+
+  PropertyManager->Untie("ic/roc-fps");
+  
+  /*  PropertyManager->Untie("ic/u-fps");
+  PropertyManager->Untie("ic/v-fps");
+  PropertyManager->Untie("ic/w-fps"); */
+
+  PropertyManager->Untie("ic/gamma-rad");
+  PropertyManager->Untie("ic/alpha-rad");
+  PropertyManager->Untie("ic/theta-rad");
+  PropertyManager->Untie("ic/beta-rad");
+  PropertyManager->Untie("ic/phi-rad");
+  PropertyManager->Untie("ic/psi-true-rad");
+  PropertyManager->Untie("ic/lat-gc-rad");
+  PropertyManager->Untie("ic/long-gc-rad");
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+//    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 bounds
+
+void FGInitialCondition::Debug(int from)
+{
+  if (debug_lvl <= 0) return;
+
+  if (debug_lvl & 1) { // Standard console startup message output
+  }
+  if (debug_lvl & 2 ) { // Instantiation/Destruction notification
+    if (from == 0) cout << "Instantiated: FGInitialCondition" << endl;
+    if (from == 1) cout << "Destroyed:    FGInitialCondition" << 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;
+    }
+  }
+}
+