+
+double limitRateOfChange(double cur, double target, double maxDeltaSec, double dt)
+{
+ double delta = target - cur;
+ double maxDelta = maxDeltaSec * dt;
+
+// if delta is > maxDelta, use maxDelta, but with the sign of delta.
+ return (fabs(delta) < maxDelta) ? delta : copysign(maxDelta, delta);
+}
+
+// drive various properties in a semi-realistic fashion.
+void FGAIAircraft::updateModelProperties(double dt)
+{
+ if (!props) {
+ return;
+ }
+
+ SGPropertyNode* gear = props->getChild("gear", 0, true);
+ double targetGearPos = fp->getCurrentWaypoint()->getGear_down() ? 1.0 : 0.0;
+ if (!gear->hasValue("gear/position-norm")) {
+ gear->setDoubleValue("gear/position-norm", targetGearPos);
+ }
+
+ double gearPosNorm = gear->getDoubleValue("gear/position-norm");
+ if (gearPosNorm != targetGearPos) {
+ gearPosNorm += limitRateOfChange(gearPosNorm, targetGearPos, 0.1, dt);
+ if (gearPosNorm < 0.001) {
+ gearPosNorm = 0.0;
+ } else if (gearPosNorm > 0.999) {
+ gearPosNorm = 1.0;
+ }
+
+ for (int i=0; i<6; ++i) {
+ SGPropertyNode* g = gear->getChild("gear", i, true);
+ g->setDoubleValue("position-norm", gearPosNorm);
+ } // of gear setting loop
+ } // of gear in-transit
+
+// double flapPosNorm = props->getDoubleValue();
+}
+