41#include "models/FGFCS.h"
42#include "math/FGParameterValue.h"
43#include "math/FGTable.h"
44#include "input_output/FGLog.h"
54FGGain::FGGain(FGFCS* fcs, Element* element) : FGFCSComponent(fcs, element)
60 OutMin = OutMax = 0.0;
62 CheckInputNodes(1, 1, element);
64 if (Type ==
"PURE_GAIN") {
65 if ( !element->FindElement(
"gain") ) {
66 FGXMLLogging log(element, LogLevel::ERROR);
67 log << LogFormat::BOLD <<
" No GAIN specified (default: 1.0)\n";
71 auto PropertyManager = fcs->GetPropertyManager();
72 Element* gain_element = element->FindElement(
"gain");
74 Gain =
new FGParameterValue(gain_element, PropertyManager);
76 Gain =
new FGRealValue(1.0);
78 if (Type ==
"AEROSURFACE_SCALE") {
79 Element* scale_element = element->FindElement(
"domain");
81 if (scale_element->FindElement(
"max") && scale_element->FindElement(
"min") )
83 InMax = scale_element->FindElementValueAsNumber(
"max");
84 InMin = scale_element->FindElementValueAsNumber(
"min");
87 scale_element = element->FindElement(
"range");
89 XMLLogException err(scale_element);
90 err <<
"No range supplied for aerosurface scale component\n";
93 if (scale_element->FindElement(
"max") && scale_element->FindElement(
"min") )
95 OutMax = scale_element->FindElementValueAsNumber(
"max");
96 OutMin = scale_element->FindElementValueAsNumber(
"min");
98 XMLLogException err(scale_element);
99 err <<
"Maximum and minimum output values must be supplied for the "
100 "aerosurface scale component\n";
104 Element* zero_centered = element->FindElement(
"zero_centered");
107 string sZeroCentered = element->FindElementValue(
"zero_centered");
108 if (sZeroCentered ==
string(
"0") || sZeroCentered ==
string(
"false")) {
109 ZeroCentered =
false;
114 if (Type ==
"SCHEDULED_GAIN") {
115 if (element->FindElement(
"table")) {
116 Table =
new FGTable(PropertyManager, element->FindElement(
"table"));
118 XMLLogException err(element);
119 err <<
"A table must be provided for the scheduled gain component\n";
124 bind(element, PropertyManager.get());
140bool FGGain::Run(
void )
142 Input = InputNodes[0]->getDoubleValue();
144 if (Type ==
"PURE_GAIN") {
146 Output = Gain * Input;
148 }
else if (Type ==
"SCHEDULED_GAIN") {
150 double SchedGain = Table->GetValue();
151 Output = Gain * SchedGain * Input;
153 }
else if (Type ==
"AEROSURFACE_SCALE") {
158 }
else if (Input > 0) {
159 Output = (Input / InMax) * OutMax;
161 Output = (Input / InMin) * OutMin;
164 Output = OutMin + ((Input - InMin) / (InMax - InMin)) * (OutMax - OutMin);
167 Output *= Gain->GetValue();
195void FGGain::Debug(
int from)
197 if (debug_lvl <= 0)
return;
201 FGLogging log(LogLevel::DEBUG);
202 log <<
" INPUT: " << InputNodes[0]->GetNameWithSign() <<
"\n";
203 log <<
" GAIN: " << Gain->GetName() << fixed <<
"\n";
205 for (
auto node: OutputNodes)
206 log <<
" OUTPUT: " << node->getNameString() <<
"\n";
208 if (Type ==
"AEROSURFACE_SCALE") {
209 log <<
" In/Out Mapping:\n" << setprecision(4);
210 log <<
" Input MIN: " << InMin <<
"\n";
211 log <<
" Input MAX: " << InMax <<
"\n";
212 log <<
" Output MIN: " << OutMin <<
"\n";
213 log <<
" Output MAX: " << OutMax <<
"\n";
216 log <<
" Scheduled by table:\n";
221 if (debug_lvl & 2 ) {
222 FGLogging log(LogLevel::DEBUG);
223 if (from == 0) log <<
"Instantiated: FGGain\n";
224 if (from == 1) log <<
"Destroyed: FGGain\n";
226 if (debug_lvl & 4 ) {
228 if (debug_lvl & 8 ) {
230 if (debug_lvl & 16) {
232 if (debug_lvl & 64) {
Main namespace for the JSBSim Flight Dynamics Model.