From c56aaa87714aac0f95c8bd2de8ecbc2ee86b7ff3 Mon Sep 17 00:00:00 2001 From: Torsten Dreyer Date: Tue, 2 Nov 2010 11:07:33 +0100 Subject: [PATCH] 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 --- src/Autopilot/digitalfilter.cxx | 35 ++++++++++++++++++++++++++++++--- src/Autopilot/digitalfilter.hxx | 7 +++++++ 2 files changed, 39 insertions(+), 3 deletions(-) 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(); -- 2.39.5