]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/JSBSim/FGRotation.cpp
JSBSim updates. This update changes the file format, so an update of the base
[flightgear.git] / src / FDM / JSBSim / FGRotation.cpp
index 73763e5a0cfbf045e58ddcc2d87f96c784b15ff8..88eeea4d9aebc9c9cdc38f20bfbb2c38d6bb450f 100644 (file)
@@ -66,6 +66,8 @@ INCLUDES
 #include "FGPosition.h"
 #include "FGAuxiliary.h"
 #include "FGOutput.h"
+#include "FGPropertyManager.h"
+
 
 static const char *IdSrc = "$Id$";
 static const char *IdHdr = ID_ROTATION;
@@ -78,8 +80,15 @@ CLASS IMPLEMENTATION
 FGRotation::FGRotation(FGFDMExec* fdmex) : FGModel(fdmex)
 {
   Name = "FGRotation";
-  cTht=cPhi=cPsi=1.0;
-  sTht=sPhi=sPsi=0.0;
+  cTht = cPhi = cPsi = 1.0;
+  sTht = sPhi = sPsi = 0.0;
+
+  vPQRdot.InitMatrix();
+  vPQRdot_prev[0].InitMatrix();
+  vPQRdot_prev[1].InitMatrix();
+  vPQRdot_prev[2].InitMatrix();
+
+  bind();
   
   Debug(0);
 }
@@ -88,6 +97,7 @@ FGRotation::FGRotation(FGFDMExec* fdmex) : FGModel(fdmex)
 
 FGRotation::~FGRotation()
 {
+  unbind();
   Debug(1);
 }
 
@@ -105,10 +115,12 @@ bool FGRotation::Run(void)
     N1 = vMoments(eN) - (Iyy-Ixx)*vPQR(eP)*vPQR(eQ) - Ixz*vPQR(eR)*vPQR(eQ);
 
     vPQRdot(eP) = (L2*Izz - N1*Ixz) / (Ixx*Izz - Ixz*Ixz);
-    vPQRdot(eQ) = (vMoments(eM) - (Ixx-Izz)*vPQR(eP)*vPQR(eR) - Ixz*(vPQR(eP)*vPQR(eP) - vPQR(eR)*vPQR(eR)))/Iyy;
+    vPQRdot(eQ) = (vMoments(eM) - (Ixx-Izz)*vPQR(eP)*vPQR(eR)
+                          - Ixz*(vPQR(eP)*vPQR(eP) - vPQR(eR)*vPQR(eR)))/Iyy;
     vPQRdot(eR) = (N1*Ixx + L2*Ixz) / (Ixx*Izz - Ixz*Ixz);
 
-    vPQR += dt*rate*(vlastPQRdot + vPQRdot)/2.0;
+    vPQR += State->Integrate(FGState::TRAPZ, dt*rate, vPQRdot, vPQRdot_prev);
+    
     vAeroPQR = vPQR + Atmosphere->GetTurbPQR();
 
     State->IntegrateQuat(vPQR, rate);
@@ -126,8 +138,6 @@ bool FGRotation::Run(void)
       vEulerRates(ePsi) = (vPQR(2)*sPhi + vPQR(3)*cPhi)/cTht;
     }
 
-    vlastPQRdot = vPQRdot;
-
     if (debug_lvl > 1) Debug(2);
 
     return false;
@@ -149,6 +159,73 @@ void FGRotation::GetState(void)
   Ixz = MassBalance->GetIxz();
 }
 
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+void FGRotation::bind(void)
+{
+  typedef double (FGRotation::*PMF)(int) const;
+  PropertyManager->Tie("velocities/p-rad_sec", this,1,
+                       (PMF)&FGRotation::GetPQR);
+  PropertyManager->Tie("velocities/q-rad_sec", this,2,
+                       (PMF)&FGRotation::GetPQR);
+  PropertyManager->Tie("velocities/r-rad_sec", this,3,
+                       (PMF)&FGRotation::GetPQR);
+  PropertyManager->Tie("velocities/p-aero-rad_sec", this,1,
+                       (PMF)&FGRotation::GetAeroPQR);
+  PropertyManager->Tie("velocities/q-aero-rad_sec", this,2,
+                       (PMF)&FGRotation::GetAeroPQR);
+  PropertyManager->Tie("velocities/r-aero-rad_sec", this,3,
+                       (PMF)&FGRotation::GetAeroPQR);
+  PropertyManager->Tie("accelerations/pdot-rad_sec", this,1,
+                       (PMF)&FGRotation::GetPQRdot);
+  PropertyManager->Tie("accelerations/qdot-rad_sec", this,2,
+                       (PMF)&FGRotation::GetPQRdot);
+  PropertyManager->Tie("accelerations/rdot-rad_sec", this,3,
+                       (PMF)&FGRotation::GetPQRdot);
+  PropertyManager->Tie("attitude/roll-rad", this,1,
+                       (PMF)&FGRotation::GetEuler);
+  PropertyManager->Tie("attitude/pitch-rad", this,2,
+                       (PMF)&FGRotation::GetEuler);
+  PropertyManager->Tie("attitude/heading-true-rad", this,3,
+                       (PMF)&FGRotation::GetEuler);
+  PropertyManager->Tie("velocities/phidot-rad_sec", this,1,
+                       (PMF)&FGRotation::GetEulerRates);
+  PropertyManager->Tie("velocities/thetadot-rad_sec", this,2,
+                       (PMF)&FGRotation::GetEulerRates);
+  PropertyManager->Tie("velocities/psidot-rad_sec", this,3,
+                       (PMF)&FGRotation::GetEulerRates);
+  PropertyManager->Tie("attitude/phi-rad", this,
+                       &FGRotation::Getphi);
+  PropertyManager->Tie("attitude/theta-rad", this,
+                       &FGRotation::Gettht);
+  PropertyManager->Tie("attitude/psi-true-rad", this,
+                       &FGRotation::Getpsi);
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+void FGRotation::unbind(void)
+{
+  PropertyManager->Untie("velocities/p-rad_sec");
+  PropertyManager->Untie("velocities/q-rad_sec");
+  PropertyManager->Untie("velocities/r-rad_sec");
+  PropertyManager->Untie("velocities/p-aero-rad_sec");
+  PropertyManager->Untie("velocities/q-aero-rad_sec");
+  PropertyManager->Untie("velocities/r-aero-rad_sec");
+  PropertyManager->Untie("accelerations/pdot-rad_sec");
+  PropertyManager->Untie("accelerations/qdot-rad_sec");
+  PropertyManager->Untie("accelerations/rdot-rad_sec");
+  PropertyManager->Untie("attitude/roll-rad");
+  PropertyManager->Untie("attitude/pitch-rad");
+  PropertyManager->Untie("attitude/heading-true-rad");
+  PropertyManager->Untie("velocities/phidot-rad_sec");
+  PropertyManager->Untie("velocities/thetadot-rad_sec");
+  PropertyManager->Untie("velocities/psidot-rad_sec");
+  PropertyManager->Untie("attitude/phi-rad");
+  PropertyManager->Untie("attitude/theta-rad");
+  PropertyManager->Untie("attitude/psi-true-rad");
+}
+
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 //    The bitmasked value choices are as follows:
 //    unset: In this case (the default) JSBSim would only print