]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/JSBSim/FGLGear.cpp
Updated to match changes in radiostack.[ch]xx
[flightgear.git] / src / FDM / JSBSim / FGLGear.cpp
index 4826990ded172d84f4956ca4a4c7fdaa820ff9f1..8f137f88bde4f0e5bd19ad376580eb8b03eaf637 100644 (file)
@@ -57,35 +57,14 @@ static const char *IdHdr = ID_LGEAR;
 CLASS IMPLEMENTATION
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-FGLGear::FGLGear(FGConfigFile* AC_cfg, FGFDMExec* fdmex) : vXYZ(3),
-                                                           vMoment(3),
-                                                           vWhlBodyVec(3),
-                                                           vForce(3),
-                                                           vLocalForce(3),
-                                                           vWhlVelVec(3),
-                                                           Exec(fdmex)
+FGLGear::FGLGear(FGConfigFile* AC_cfg, FGFDMExec* fdmex) : Exec(fdmex)
 {
   string tmp;
-  string Retractable;
   
   *AC_cfg >> tmp >> name >> vXYZ(1) >> vXYZ(2) >> vXYZ(3)
             >> kSpring >> bDamp>> dynamicFCoeff >> staticFCoeff
                   >> rollingFCoeff >> sSteerType >> sBrakeGroup 
-                     >> maxSteerAngle >> Retractable;
-
-  if (debug_lvl > 0) {
-    cout << "    Name: " << name << endl;
-    cout << "      Location: " << vXYZ << endl;
-    cout << "      Spring Constant:  " << kSpring << endl;
-    cout << "      Damping Constant: " << bDamp << endl;
-    cout << "      Dynamic Friction: " << dynamicFCoeff << endl;
-    cout << "      Static Friction:  " << staticFCoeff << endl;
-    cout << "      Rolling Friction: " << rollingFCoeff << endl;
-    cout << "      Steering Type:    " << sSteerType << endl;
-    cout << "      Grouping:         " << sBrakeGroup << endl;
-    cout << "      Max Steer Angle:  " << maxSteerAngle << endl;
-    cout << "      Retractable:      " << Retractable << endl;
-  }
+                     >> maxSteerAngle >> sRetractable;
 
   if      (sBrakeGroup == "LEFT"  ) eBrakeGrp = bgLeft;
   else if (sBrakeGroup == "RIGHT" ) eBrakeGrp = bgRight;
@@ -106,13 +85,14 @@ FGLGear::FGLGear(FGConfigFile* AC_cfg, FGFDMExec* fdmex) : vXYZ(3),
          << sSteerType << " is undefined." << endl;
   }
   
-  ifRetractable == "RETRACT" ) {
-    isRetractable=true;
+  if ( sRetractable == "RETRACT" ) {
+    isRetractable = true;
   } else  {
-    isRetractable=false;
+    isRetractable = false;
   }  
   
-  GearUp=false; GearDown=true;
+  GearUp = false;
+  GearDown = true;
 
 // Add some AI here to determine if gear is located properly according to its
 // brake group type ??
@@ -138,7 +118,12 @@ FGLGear::FGLGear(FGConfigFile* AC_cfg, FGFDMExec* fdmex) : vXYZ(3),
 
   vLocalGear = State->GetTb2l() * vWhlBodyVec;
 
-  if (debug_lvl & 2) cout << "Instantiated: FGLGear" << endl;
+  compressLength  = 0.0;
+  compressSpeed   = 0.0;
+  brakePct        = 0.0;
+  maxCompLen      = 0.0;
+
+  Debug(0);
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -180,6 +165,7 @@ FGLGear::FGLGear(const FGLGear& lgear)
   Reported        = lgear.Reported;
   name            = lgear.name;
   sSteerType      = lgear.sSteerType;
+  sRetractable    = lgear.sRetractable;
   eSteerType      = lgear.eSteerType;
   sBrakeGroup     = lgear.sBrakeGroup;
   eBrakeGrp       = lgear.eBrakeGrp;
@@ -193,32 +179,36 @@ FGLGear::FGLGear(const FGLGear& lgear)
 
 FGLGear::~FGLGear()
 {
-  if (debug_lvl & 2) cout << "Destroyed:    FGLGear" << endl;
+  Debug(1);
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 FGColumnVector3& FGLGear::Force(void)
 {
+  double SteerGain = 0;
+  double SinWheel, CosWheel;
+
   vForce.InitMatrix();
   vMoment.InitMatrix();
-  if(isRetractable ) {
-    if( FCS->GetGearPos() < 0.01 ) {
-      GearUp=true;GearDown=false;
-     } else if(FCS->GetGearPos() > 0.99) {
-      GearDown=true;GearUp=false;
+
+  if (isRetractable) {
+    if (FCS->GetGearPos() < 0.01) {
+      GearUp   = true;
+      GearDown = false;
+     } else if (FCS->GetGearPos() > 0.99) {
+      GearDown = true;
+      GearUp   = false;
      } else {
-      GearUp=false; GearDown=false;
+      GearUp   = false;
+      GearDown = false;
      }
   } else {
-      GearUp=false; GearDown=true;
+      GearUp   = false;
+      GearDown = true;
   }         
       
-  if( GearDown ) {
-    double SteerGain = 0;
-    double SinWheel, CosWheel, SideWhlVel, RollingWhlVel;
-    double RollingForce, SideForce, FCoeff;
-    double WheelSlip;
+  if (GearDown) {
 
     vWhlBodyVec     = (vXYZ - MassBalance->GetXYZcg()) / 12.0;
     vWhlBodyVec(eX) = -vWhlBodyVec(eX);
@@ -291,7 +281,7 @@ FGColumnVector3& FGLGear::Force(void)
                                              staticFCoeff*FCS->GetBrake(bgCenter);
         break;
       case bgNose:
-        SteerGain = 0.10;
+        SteerGain = -0.50;
         BrakeFCoeff = rollingFCoeff;
         break;
       case bgTail:
@@ -340,16 +330,6 @@ FGColumnVector3& FGLGear::Force(void)
         WheelSlip = radtodeg*atan2(SideWhlVel, RollingWhlVel);
       }
 
-// The following code normalizes the wheel velocity vector, reverses it, and zeroes out
-// the z component of the velocity. The question is, should the Z axis velocity be zeroed
-// out first before the normalization takes place or not? Subsequent to that, the Wheel
-// Velocity vector now points as a unit vector backwards and parallel to the wheel
-// velocity vector. It acts AT the wheel.
-
-// Note to Jon: I commented out this line because I wasn't sure we want to do this.
-//    vWhlVelVec      = -1.0 * vWhlVelVec.Normalize();
-//    vWhlVelVec(eZ)  =  0.00;
-
 // Compute the sideforce coefficients using similar assumptions to LaRCSim for now.
 // Allow a maximum of 10 degrees tire slip angle before wheel slides.  At that point,
 // transition from static to dynamic friction.  There are more complicated formulations
@@ -365,7 +345,7 @@ FGColumnVector3& FGLGear::Force(void)
 // in paper AIAA-2000-4303 - see header prologue comments). We might consider
 // allowing for both square and linear damping force calculation. Also need to
 // possibly give a "rebound damping factor" that differs from the compression
-// case. NOTE: SQUARE LAW DAMPING NO GOOD!
+// case.
 
       vLocalForce(eZ) =  min(-compressLength * kSpring
                              - compressSpeed * bDamp, (double)0.0);
@@ -414,9 +394,7 @@ FGColumnVector3& FGLGear::Force(void)
         MaximumStrutForce = MaximumStrutTravel = 0.0;
       }
 
-      compressLength = 0.0;// reset compressLength to zero for data output validity
-
-      
+      compressLength = 0.0; // reset compressLength to zero for data output validity
     }
 
     if (FirstContact) {
@@ -440,11 +418,9 @@ FGColumnVector3& FGLGear::Force(void)
         vMoment.Magnitude() > 5000000000.0 ||
         SinkRate > 1.4666*30)
     {
-      PutMessage("Crash Detected");
+      PutMessage("Crash Detected: Simulation FREEZE.");
       Exec->Freeze();
     }
-
-    
   } 
   return vForce; 
 }
@@ -468,9 +444,58 @@ void FGLGear::Report(void)
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-void FGLGear::Debug(void)
+//    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 FGLGear::Debug(int from)
 {
-  // TODO: Add user code here
+  if (debug_lvl <= 0) return;
+
+  if (debug_lvl & 1) { // Standard console startup message output
+    if (from == 0) { // Constructor
+      cout << "    Name: "               << name          << endl;
+      cout << "      Location: "         << vXYZ          << endl;
+      cout << "      Spring Constant:  " << kSpring       << endl;
+      cout << "      Damping Constant: " << bDamp         << endl;
+      cout << "      Dynamic Friction: " << dynamicFCoeff << endl;
+      cout << "      Static Friction:  " << staticFCoeff  << endl;
+      cout << "      Rolling Friction: " << rollingFCoeff << endl;
+      cout << "      Steering Type:    " << sSteerType    << endl;
+      cout << "      Grouping:         " << sBrakeGroup   << endl;
+      cout << "      Max Steer Angle:  " << maxSteerAngle << endl;
+      cout << "      Retractable:      " << sRetractable  << endl;
+    }
+  }
+  if (debug_lvl & 2 ) { // Instantiation/Destruction notification
+    if (from == 0) cout << "Instantiated: FGLGear" << endl;
+    if (from == 1) cout << "Destroyed:    FGLGear" << 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;
+    }
+  }
 }