------------- Copyright (C) 2005 -------------
This program is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License as published by the Free Software
+ the terms of the GNU Lesser General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
details.
- You should have received a copy of the GNU General Public License along with
+ You should have received a copy of the GNU Lesser General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA.
- Further information about the GNU General Public License can also be found on
+ Further information about the GNU Lesser General Public License can also be found on
the world wide web at http://www.gnu.org.
HISTORY
#include "FGFCSComponent.h"
#include <input_output/FGXMLElement.h>
+#include <vector>
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS
namespace JSBSim {
+using std::vector;
class FGFCS;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Syntax:
-<sensor name=\94name\94 rate_group=\94name\94>
+@code
+<sensor name="name">
<input> property </input>
<lag> number </lag>
- <noise variation=\94PERCENT|ABSOLUTE\94> number </noise>
+ <noise variation="PERCENT|ABSOLUTE"> number </noise>
<quantization name="name">
<bits> number </bits>
<min> number </min>
</quantization>
<drift_rate> number </drift_rate>
<bias> number </bias>
+ <delay> number < /delay>
</sensor>
+@endcode
Example:
-<sensor name=\94aero/sensor/qbar\94 rate_group=\94HFCS\94>
+@code
+<sensor name="aero/sensor/qbar">
<input> aero/qbar </input>
<lag> 0.5 </lag>
- <noise variation=\94PERCENT\94> 2 </noise>
+ <noise variation="PERCENT"> 2 </noise>
<quantization name="aero/sensor/quantized/qbar">
<bits> 12 </bits>
<min> 0 </min>
</quantization>
<bias> 0.5 </bias>
</sensor>
+@endcode
The only required element in the sensor definition is the input element. In that
case, no degradation would be modeled, and the output would simply be the input.
understood to be +/-0.05 percent maximum variance. So, the actual value for the sensor
will be *anywhere* from 0.95 to 1.05 of the actual "perfect" value at any time -
even varying all the way from 0.95 to 1.05 in adjacent frames - whatever the delta
-time.
+time. The delay element can specify a frame delay. The integer number provided is
+the number of frames to delay the output signal.
- */
+@author Jon S. Berndt
+@version $Revision$
+*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DECLARATION
{
public:
FGSensor(FGFCS* fcs, Element* element);
- ~FGSensor();
-
- inline void SetFailLow(double val) {if (val > 0.0) fail_low = true; else fail_low = false;}
- inline void SetFailHigh(double val) {if (val > 0.0) fail_high = true; else fail_high = false;}
- inline void SetFailStuck(double val) {if (val > 0.0) fail_stuck = true; else fail_stuck = false;}
+ virtual ~FGSensor();
- inline double GetFailLow(void) const {if (fail_low) return 1.0; else return 0.0;}
- inline double GetFailHigh(void) const {if (fail_high) return 1.0; else return 0.0;}
- inline double GetFailStuck(void) const {if (fail_stuck) return 1.0; else return 0.0;}
+ void SetFailLow(double val) {if (val > 0.0) fail_low = true; else fail_low = false;}
+ void SetFailHigh(double val) {if (val > 0.0) fail_high = true; else fail_high = false;}
+ void SetFailStuck(double val) {if (val > 0.0) fail_stuck = true; else fail_stuck = false;}
- bool Run (void);
+ double GetFailLow(void) const {if (fail_low) return 1.0; else return 0.0;}
+ double GetFailHigh(void) const {if (fail_high) return 1.0; else return 0.0;}
+ double GetFailStuck(void) const {if (fail_stuck) return 1.0; else return 0.0;}
+ int GetQuantized(void) const {return quantized;}
-private:
+ virtual bool Run (void);
+
+protected:
enum eNoiseType {ePercent=0, eAbsolute} NoiseType;
+ enum eDistributionType {eUniform=0, eGaussian} DistributionType;
double dt;
double min, max;
double span;
double bias;
+ double gain;
double drift_rate;
double drift;
double noise_variance;
int bits;
int quantized;
int divisions;
+ int delay;
+ int index;
bool fail_low;
bool fail_high;
bool fail_stuck;
+ string quant_property;
+ vector <double> output_array;
void Noise(void);
void Bias(void);
void Drift(void);
void Quantize(void);
void Lag(void);
+ void Delay(void);
+ void Gain(void);
void bind(void);
+private:
void Debug(int from);
};
}