From: Torsten Dreyer Date: Tue, 2 Nov 2010 10:07:33 +0000 (+0100) Subject: add to components X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=c56aaa87714aac0f95c8bd2de8ecbc2ee86b7ff3;p=flightgear.git add to components The tag 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 input set the output-property to the input value output set the output-property to the output value none ignore input and output value --- diff --git a/src/Autopilot/digitalfilter.cxx b/src/Autopilot/digitalfilter.cxx index bdd39397a..57bca13c8 100644 --- a/src/Autopilot/digitalfilter.cxx +++ b/src/Autopilot/digitalfilter.cxx @@ -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(); diff --git a/src/Autopilot/digitalfilter.hxx b/src/Autopilot/digitalfilter.hxx index 4bc37a904..d9b0ac48d 100644 --- a/src/Autopilot/digitalfilter.hxx +++ b/src/Autopilot/digitalfilter.hxx @@ -53,6 +53,12 @@ class DigitalFilter : public AnalogComponent private: SGSharedPtr _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();