]> git.mxchange.org Git - flightgear.git/commitdiff
add <initialize-to> to components
authorTorsten Dreyer <Torsten@t3r.de>
Tue, 2 Nov 2010 10:07:33 +0000 (11:07 +0100)
committerTorsten Dreyer <Torsten@t3r.de>
Tue, 2 Nov 2010 10:07:33 +0000 (11:07 +0100)
The tag <initialize-to> can be used to control the value
of the output when the component is first enabled. This
controls initialization of the output property and the current
value for internal computation
Valid values are

  <initialize-to>input</initialize-to>
set the output-property to the input value

  <initialize-to>output</initialize-to>
set the output-property to the output value

  <initialize-to>none</initialize-to>
ignore input and output value

src/Autopilot/digitalfilter.cxx
src/Autopilot/digitalfilter.hxx

index bdd39397a51b6dc97410e52a65188589ced08b1c..57bca13c86269977665dd5a0b8eee03309bbb7c7 100644 (file)
@@ -303,7 +303,8 @@ bool ExponentialFilterImplementation::configure( const std::string & nodeName, S
 /* --------------------------------------------------------------------------------- */
 
 DigitalFilter::DigitalFilter() :
-    AnalogComponent()
+    AnalogComponent(),
+    _initializeTo(INITIALIZE_INPUT)
 {
 }
 
@@ -335,6 +336,20 @@ bool DigitalFilter::configure(const string& nodeName, SGPropertyNode_ptr configN
     return true;
   }
 
+  if( nodeName == "initialize-to" ) {
+    string s( configNode->getStringValue() );
+    if( s == "input" ) {
+      _initializeTo = INITIALIZE_INPUT;
+    } else if( s == "output" ) {
+      _initializeTo = INITIALIZE_OUTPUT;
+    } else if( s == "none" ) {
+      _initializeTo = INITIALIZE_NONE;
+    } else {
+      SG_LOG( SG_AUTOPILOT, SG_WARN, "unhandled initialize-to value '" << s << "' ignored" );
+    }
+    return true;
+  }
+
   SG_LOG( SG_AUTOPILOT, SG_BULK, "DigitalFilter::configure(" << nodeName << ") [unhandled]" << endl );
   return false; // not handled by us, let the base class try
 }
@@ -344,8 +359,22 @@ void DigitalFilter::update( bool firstTime, double dt)
   if( _implementation == NULL ) return;
 
   if( firstTime ) {
-    SG_LOG(SG_AUTOPILOT,SG_DEBUG, "First time initialization of " << get_name() << " to " << _valueInput.get_value() );
-    _implementation->initialize( _valueInput.get_value() );
+    switch( _initializeTo ) {
+
+      case INITIALIZE_INPUT:
+        SG_LOG(SG_AUTOPILOT,SG_DEBUG, "First time initialization of " << get_name() << " to " << _valueInput.get_value() );
+        _implementation->initialize( _valueInput.get_value() );
+        break;
+
+      case INITIALIZE_OUTPUT:
+        SG_LOG(SG_AUTOPILOT,SG_DEBUG, "First time initialization of " << get_name() << " to " << get_output_value() );
+        _implementation->initialize( get_output_value() );
+        break;
+
+      default:
+        SG_LOG(SG_AUTOPILOT,SG_DEBUG, "First time initialization of " << get_name() << " to (uninitialized)" );
+        break;
+    }
   }
 
   double input = _valueInput.get_value() - _referenceInput.get_value();
index 4bc37a9045470e9711623ca8a26a0c4ef978fb9c..d9b0ac48d8d9500d7ca0af7ca941437e87cd3000 100644 (file)
@@ -53,6 +53,12 @@ class DigitalFilter : public AnalogComponent
 private:
     SGSharedPtr<DigitalFilterImplementation> _implementation;
 
+    enum InitializeTo {
+      INITIALIZE_OUTPUT,
+      INITIALIZE_INPUT,
+      INITIALIZE_NONE
+    };
+
 protected:
     bool configure( const std::string & nodeName, SGPropertyNode_ptr configNode);
     void update( bool firstTime, double dt);
@@ -61,6 +67,7 @@ protected:
     InputValueList _samples;
     InputValueList _rateOfChange;
     InputValueList _gain;
+    InitializeTo _initializeTo;
 
 public:
     DigitalFilter();