]> git.mxchange.org Git - flightgear.git/commitdiff
Sync. w. JSBSim CVS.
authorehofman <ehofman>
Wed, 8 Feb 2006 09:15:57 +0000 (09:15 +0000)
committerehofman <ehofman>
Wed, 8 Feb 2006 09:15:57 +0000 (09:15 +0000)
src/FDM/JSBSim/initialization/FGTrim.h
src/FDM/JSBSim/math/FGFunction.cpp
src/FDM/JSBSim/math/FGTable.cpp
src/FDM/JSBSim/models/FGFCS.h
src/FDM/JSBSim/models/flight_control/FGFCSComponent.cpp
src/FDM/JSBSim/models/flight_control/FGFCSComponent.h
src/FDM/JSBSim/models/flight_control/FGFilter.h
src/FDM/JSBSim/models/flight_control/FGGain.h
src/FDM/JSBSim/models/flight_control/FGSensor.h
src/FDM/JSBSim/models/propulsion/FGPropeller.cpp

index 1f6bbce76b47b16fcc2c7af8e04ef4a520e1f2cf..d41708d4b8111444361d618d5812db28f87bbda1 100644 (file)
@@ -108,7 +108,8 @@ CLASS DOCUMENTATION
     at those conditions?  Check the speed, altitude, configuration (flaps,
     gear, etc.), weight, cg, and anything else that may be relevant.
 
-    Example usage:<pre>
+    Example usage:
+    @code
     FGFDMExec* FDMExec = new FGFDMExec();
 
     FGInitialCondition* fgic = new FGInitialCondition(FDMExec);
@@ -119,7 +120,8 @@ CLASS DOCUMENTATION
     if( !fgt.DoTrim() ) {
       cout << "Trim Failed" << endl;
     }
-    fgt.Report(); </pre>
+    fgt.Report();
+    @endcode
     @author Tony Peden
     @version "$Id$"
 */
index d00fe2cff5a3eceef094c8372a250e13c510de96..016b6697fccc8a69c93b786baf65816118744bfc 100755 (executable)
@@ -77,7 +77,13 @@ FGFunction::FGFunction(FGPropertyManager* propMan, Element* el, string prefix)
     // data types
     if (operation == string("property")) {
       property_name = element->GetDataLine();
-      Parameters.push_back(new FGPropertyValue(PropertyManager->GetNode(property_name)));
+      FGPropertyManager* newNode = PropertyManager->GetNode(property_name);
+      if (newNode == 0) {
+        cerr << "The property " << property_name << " is undefined." << endl;
+        abort();
+      } else {
+        Parameters.push_back(new FGPropertyValue( newNode ));
+      }
     } else if (operation == string("value")) {
       Parameters.push_back(new FGRealValue(element->GetDataAsNumber()));
     } else if (operation == string("table")) {
index 302dd90db7a7215ceba49cadc7f52efd9f1891e2..f285117dee747431b2cf4b01bee3757bcc408b81 100644 (file)
@@ -158,6 +158,12 @@ FGTable::FGTable(FGPropertyManager* propMan, Element* el) : PropertyManager(prop
       property_string = axisElement->GetDataLine();
       node = PropertyManager->GetNode(property_string);
 
+      if (node == 0) {
+        cerr << "IndependenVar property, " << property_string
+             << " in Table definition is not defined." << endl;
+        abort();
+      }
+
       lookup_axis = axisElement->GetAttributeValue("lookup");
       if (lookup_axis == string("row")) {
         lookupProperty[eRow] = node;
index 9a99aded1560e8b71af172756d0ba9948251a19d..450d2b95100a0a5082e70799b6ef4854cb0448ff 100644 (file)
@@ -81,67 +81,110 @@ CLASS DOCUMENTATION
     which comprise the control laws for an axis are defined sequentially in
     the configuration file. For instance, for the X-15:
 
-    <pre>
-    \<flight_control name="X-15 SAS">
-      \<channel>
-        \<component name="Pitch Trim Sum" type="SUMMER">
+    @code
+    <flight_control name="X-15 SAS">
+      <channel>
+        <summer name="Pitch Trim Sum">
            <input> fcs/elevator-cmd-norm </input>
            <input> fcs/pitch-trim-cmd-norm </input>
            <clipto>
              <min>-1</min>
              <max>1</max>
            </clipto>
-        \</component>
+        </summer>
 
-        \<component name="Pitch Command Scale" TYPE="AEROSURFACE_SCALE">
+        <aerosurface_scale name="Pitch Command Scale">
           <input> fcs/pitch-trim-sum </input>
-          <limit>
+          <range>
             <min> -50 </min>
             <max>  50 </max>
-          </limit>
-        \</component>
+          </range>
+        </aerosurface_scale>
 
         ... etc.
-    </pre>
+    @endcode
 
     In the above case we can see the first few components of the pitch channel
-    defined. The input to the first component, as can be seen in the "Pitch trim
+    defined. The input to the first component (a summer), as can be seen in the "Pitch trim
     sum" component, is really the sum of two parameters: elevator command (from
-    the stick - a pilot input), and pitch trim. The type of this component is
-    "Summer".
+    the stick - a pilot input), and pitch trim.
     The next component created is an aerosurface scale component - a type of
     gain (see the LoadFCS() method for insight on how the various types of
     components map into the actual component classes).  This continues until the
     final component for an axis when the
-    \<output> element specifies where the output is supposed to go. See the
+    \<output> element is usually used to specify where the output is supposed to go. See the
     individual components for more information on how they are mechanized.
 
     Another option for the flight controls portion of the config file is that in
     addition to using the "NAME" attribute in,
 
-    <pre>
+    @code
     \<flight_control name="X-15 SAS">
-    </pre>
+    @endcode
 
     one can also supply a filename:
 
-    <pre>
+    @code
     \<flight_control name="X-15 SAS" file="X15.xml">
     \</flight_control>
-    </pre>
+    @endcode
 
     In this case, the FCS would be read in from another file.
 
+    <h2>Properties</h2>
+    @property fcs/aileron-cmd-norm normalized aileron command
+    @property fcs/elevator-cmd-norm normalized elevator command
+    @property fcs/rudder-cmd-norm
+    @property fcs/steer-cmd-norm
+    @property fcs/flap-cmd-norm
+    @property fcs/speedbrake-cmd-norm
+    @property fcs/spoiler-cmd-norm
+    @property fcs/pitch-trim-cmd-norm
+    @property fcs/roll-trim-cmd-norm
+    @property fcs/yaw-trim-cmd-norm
+    @property gear/gear-cmd-norm
+    @property fcs/left-aileron-pos-rad
+    @property fcs/left-aileron-pos-deg
+    @property fcs/left-aileron-pos-norm
+    @property fcs/mag-left-aileron-pos-rad
+    @property fcs/right-aileron-pos-rad
+    @property fcs/right-aileron-pos-deg
+    @property fcs/right-aileron-pos-norm
+    @property fcs/mag-right-aileron-pos-rad
+    @property fcs/elevator-pos-rad
+    @property fcs/elevator-pos-deg
+    @property fcs/elevator-pos-norm
+    @property fcs/mag-elevator-pos-rad
+    @property fcs/rudder-pos-rad
+    @property fcs/rudder-pos-deg
+    @property fcs/rudder-pos-norm
+    @property fcs/mag-rudder-pos-rad
+    @property fcs/flap-pos-rad
+    @property fcs/flap-pos-deg
+    @property fcs/flap-pos-norm
+    @property fcs/speedbrake-pos-rad
+    @property fcs/speedbrake-pos-deg
+    @property fcs/speedbrake-pos-norm
+    @property fcs/mag-speedbrake-pos-rad
+    @property fcs/spoiler-pos-rad
+    @property fcs/spoiler-pos-deg
+    @property fcs/spoiler-pos-norm
+    @property fcs/mag-spoiler-pos-rad
+    @property gear/gear-pos-norm
+
     @author Jon S. Berndt
-    @version $Id$
+    @version $Revision$
     @see FGFCSComponent
     @see FGXMLElement
     @see FGGain
     @see FGSummer
     @see FGSwitch
+    @see FGFCSFunction
+    @see FGCondition
     @see FGGradient
     @see FGFilter
     @see FGDeadBand
+    @see FGKinemat
 */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -461,9 +504,7 @@ public:
   //@}
 
   /** Loads the Flight Control System.
-      The FGAircraft instance is actually responsible for reading the config file
-      and calling the various Load() methods of the other systems, passing in
-      the XML Element instance pointer. Load() is called from FGAircraft.
+      Load() is called from FGFDMExec.
       @param el pointer to the Element instance
       @return true if succesful */
   bool Load(Element* el);
index d103b20c22cace8c372fe6252f19dcf39879964d..b67ffaef821b05c68d745b5b4eaf2c842af82cf1 100644 (file)
@@ -54,6 +54,7 @@ FGFCSComponent::FGFCSComponent(FGFCS* _fcs, Element* element) : fcs(_fcs)
   Input = Output = clipmin = clipmax = 0.0;
   OutputNode = treenode = 0;
   ClipMinPropertyNode = ClipMaxPropertyNode = 0;
+  clipMinSign = clipMaxSign = 1.0;
   IsOutput   = clip = false;
   string input, clip_string;
 
@@ -121,12 +122,14 @@ FGFCSComponent::FGFCSComponent(FGFCS* _fcs, Element* element) : fcs(_fcs)
   if (clip_el) {
     clip_string = clip_el->FindElementValue("min");
     if (clip_string.find_first_not_of("+-.0123456789") != string::npos) { // it's a property
+      if (clip_string[0] == '-') clipMinSign = -1.0;
       ClipMinPropertyNode = PropertyManager->GetNode( clip_string );
     } else {
       clipmin = clip_el->FindElementValueAsNumber("min");
     }
     clip_string = clip_el->FindElementValue("max");
     if (clip_string.find_first_not_of("+-.0123456789") != string::npos) { // it's a property
+      if (clip_string[0] == '-') clipMaxSign = -1.0;
       ClipMaxPropertyNode = PropertyManager->GetNode( clip_string );
     } else {
       clipmax = clip_el->FindElementValueAsNumber("max");
@@ -166,8 +169,8 @@ bool FGFCSComponent::Run(void)
 void FGFCSComponent::Clip(void)
 {
   if (clip) {
-    if (ClipMinPropertyNode != 0) clipmin = ClipMinPropertyNode->getDoubleValue();
-    if (ClipMaxPropertyNode != 0) clipmax = ClipMaxPropertyNode->getDoubleValue();
+    if (ClipMinPropertyNode != 0) clipmin = clipMinSign*ClipMinPropertyNode->getDoubleValue();
+    if (ClipMaxPropertyNode != 0) clipmax = clipMaxSign*ClipMaxPropertyNode->getDoubleValue();
     if (Output > clipmax)      Output = clipmax;
     else if (Output < clipmin) Output = clipmin;
   }
index eb5bf1b9a1bbe3cfece87c752c2d8ce6658100ab..17beb089b375aa47fe679a8ded62a858de08cfab 100644 (file)
@@ -69,7 +69,7 @@ CLASS DOCUMENTATION
 
 /** Base class for JSBSim Flight Control System Components.
     The Flight Control System (FCS) for JSBSim consists of the FCS container
-    class (see \URL[FGFCS]{FGFCS.html}), the FGFCSComponent base class, and the
+    class (see FGFCS), the FGFCSComponent base class, and the
     component classes from which can be constructed a string, or channel. See:
 
     - FGSwitch
@@ -119,6 +119,7 @@ protected:
   double Input;
   double Output;
   double clipmax, clipmin;
+  float clipMinSign, clipMaxSign;
   bool IsOutput;
   bool clip;
 
index 694018e136855d2b7f0c2f5e5b9c71229e2b0af3..5ff57e7cf215fcc39758ed97d0c4093276880389 100644 (file)
@@ -4,7 +4,7 @@
  Author:       Jon S. Berndt
  Date started: 4/2000
 
- ------------- Copyright (C)  -------------
+ ------------- Copyright (C) 2000 Jon S. Berndt jsb@hal-pc.org -------------
 
  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
@@ -57,115 +57,163 @@ CLASS DOCUMENTATION
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
 /** Encapsulates a filter for the flight control system.
-The filter component can simulate any filter up to second order. The
+The filter component can simulate any first or second order filter. The
 Tustin substitution is used to take filter definitions from LaPlace space to the
 time domain. The general format for a filter specification is:
 
-<pre>
-\<component name="name" type="type">
-  \<input> property \</input>
-  \<c1> value \<c/1>
-  [\<c2> value \<c/2>]
-  [\<c3> value \<c/3>]
-  [\<c4> value \<c/4>]
-  [\<c5> value \<c/5>]
-  [\<c6> value \<c/6>]
-  [\<output> property \<output>]
-\</component>
-</pre>
+@code
+<typename name="name">
+  <input> property </input>
+  <c1> value </c1>
+  [<c2> value </c2>]
+  [<c3> value </c3>]
+  [<c4> value </c4>]
+  [<c5> value </c5>]
+  [<c6> value </c6>]
+  [<clipto>
+    <min> {[-]property name | value} </min>
+    <max> {[-]property name | value} </max>
+  </clipto>]
+  [<output> property </output>]
+</typename>
+@endcode
 
 For a lag filter of the form,
-<pre>
+
+@code
   C1
 ------
 s + C1
-</pre>
+@endcode
+
 the corresponding filter definition is:
-<pre>
-\<component name="name" type="LAG_FILTER">
-  \<input> property \</input>
-  \<c1> value \<c/1>
-  [\<output> property \<output>]
-\</component>
-</pre>
+
+@code
+<lag_filter name="name">
+  <input> property </input>
+  <c1> value </c1>
+  [<clipto>
+    <min> {[-]property name | value} </min>
+    <max> {[-]property name | value} </max>
+  </clipto>]
+  [<output> property <output>]
+</lag_filter>
+@endcode
+
 As an example, for the specific filter:
-<pre>
+
+@code
   600
 ------
 s + 600
-</pre>
+@endcode
+
 the corresponding filter definition could be:
-<pre>
-\<component name="Heading Roll Error Lag" type="LAG_FILTER">
-  \<input> fcs/heading-command \</input>
-  \<c1> 600 \</c1>
-\</component>
-</pre>
+
+@code
+<lag_filter name="Heading Roll Error Lag">
+  <input> fcs/heading-command </input>
+  <c1> 600 </c1>
+</lag_filter>
+@endcode
+
 For a lead-lag filter of the form:
-<pre>
+
+@code
 C1*s + C2
 ---------
 C3*s + C4
-</pre>
+@endcode
+
 The corresponding filter definition is:
-<pre>
-\<component name="name" type="LEAD_LAG_FILTER">
-  \<input> property \</input>
-  \<c1> value \<c/1>
-  \<c2> value \<c/2>
-  \<c3> value \<c/3>
-  \<c4> value \<c/4>
-  [\<output> property \<output>]
-\</component>
-</pre>
+
+@code
+<lead_lag_filter name="name">
+  <input> property </input>
+  <c1> value <c/1>
+  <c2> value <c/2>
+  <c3> value <c/3>
+  <c4> value <c/4>
+  [<clipto>
+    <min> {[-]property name | value} </min>
+    <max> {[-]property name | value} </max>
+  </clipto>]
+  [<output> property </output>]
+</lead_lag_filter>
+@endcode
+
 For a washout filter of the form:
-<pre>
+
+@code
   s
 ------
 s + C1
-</pre>
+@endcode
+
 The corresponding filter definition is:
-<pre>
-\<component name="name" type="WASHOUT_FILTER">
-  \<input> property \</input>
-  \<c1> value \</c1>
-  [\<output> property \<output>]
-\</component>
-</pre>
+
+@code
+<washout_filter name="name">
+  <input> property </input>
+  <c1> value </c1>
+  [<clipto>
+    <min> {[-]property name | value} </min>
+    <max> {[-]property name | value} </max>
+  </clipto>]
+  [<output> property </output>]
+</washout_filter>
+@endcode
+
 For a second order filter of the form:
-<pre>
+
+@code
 C1*s^2 + C2*s + C3
 ------------------
 C4*s^2 + C5*s + C6
-</pre>
+@endcode
+
 The corresponding filter definition is:
-<pre>
-\<component name="name" type="SECOND_ORDER_FILTER">
-  \<input> property \</input>
-  \<c1> value \<c/1>
-  \<c2> value \<c/2>
-  \<c3> value \<c/3>
-  \<c4> value \<c/4>
-  \<c5> value \<c/5>
-  \<c6> value \<c/6>
-  [\<output> property \<output>]
-\</component>
-</pre>
+
+@code
+<second_order_filter name="name">
+  <input> property </input>
+  <c1> value </c1>
+  <c2> value </c2>
+  <c3> value </c3>
+  <c4> value </c4>
+  <c5> value </c5>
+  <c6> value </c6>
+  [<clipto>
+    <min> {[-]property name | value} </min>
+    <max> {[-]property name | value} </max>
+  </clipto>]
+  [<output> property </output>]
+</second_order_filter>
+@endcode
+
 For an integrator of the form:
-<pre>
+
+@code
  C1
  ---
   s
-</pre>
+@endcode
+
 The corresponding filter definition is:
-<pre>
-\<component name="name" type="INTEGRATOR">
-  \<input> property \</input>
-  \<c1> value \<c/1>
-  [\<trigger> property \</trigger>]
-  [\<output> property \<output>]
-\</component>
-</pre>
+
+@code
+<integrator name="name">
+  <input> property </input>
+  <c1> value </c1>
+  [<trigger> property </trigger>]
+  [<clipto>
+    <min> {[-]property name | value} </min>
+    <max> {[-]property name | value} </max>
+  </clipto>]
+  [<output> property </output>]
+</integrator>
+@endcode
+
 For the integrator, the trigger features the following behavior. If the trigger
 property value is:
   - 0: no action is taken - the output is calculated normally
@@ -177,7 +225,8 @@ is so that the last component in a "string" can copy its value to the appropriat
 output, such as the elevator, or speedbrake, etc.
 
 @author Jon S. Berndt
-@version $Id$
+@version $Revision$
+
 */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
index 778ad0376b4e3c34eb4dd3c2d4714061bc6ca4aa..ab20a31c18b1442ef705af227476c7f0368d05e5 100644 (file)
@@ -1,10 +1,10 @@
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
  Header:       FGGain.h
- Author:
- Date started:
+ Author:       Jon Berndt
+ Date started: 1998 ?
 
- ------------- Copyright (C)  -------------
+ ------------- Copyright (C) 1998 by Jon S. Berndt, jsb@hal-pc.org -------------
 
  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
@@ -68,98 +68,155 @@ CLASS DOCUMENTATION
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
 /** Encapsulates a gain component for the flight control system.
-    The gain component merely multiplies the input by a gain.  The form of the
-    gain component specification is:
-    <pre>
-    \<component name="name" type="PURE_GAIN">
-      \<input> property \</input>
-      \<gain> value \</gain>
-      [\<output> property \</output>]
-    \</component>
-    </pre>
-    Note: as is the case with the Summer component, the input property name may be
-    immediately preceded by a minus sign to invert that signal.
-
-    The scheduled gain component multiplies the input by a variable gain that is
+    The gain component merely multiplies the input by a gain.  The <b>pure gain</b> form
+    of the component specification is:
+
+    @code
+    <pure_gain name="name">
+      <input> {[-]property} </input>
+      <gain> {property name | value} </gain>
+      [<clipto>
+        <min> {property name | value} </min>
+        <max> {property name | value} </max>
+      </clipto>]
+      [<output> {property} </output>]
+    </pure_gain>
+    @endcode
+
+    Example:
+
+    @code
+    <pure_gain name="Roll AP Wing Leveler">
+      <input>fcs/attitude/sensor/phi-rad</input>
+      <gain>2.0</gain>
+      <clipto>
+        <min>-0.255</min>
+        <max>0.255</max>
+      </clipto>
+    </pure_gain>
+    @endcode
+
+    Note: the input property name may be immediately preceded by a minus sign to
+    invert that signal.
+
+    The <b>scheduled gain</b> component multiplies the input by a variable gain that is
     dependent on another property (such as qbar, altitude, etc.).  The lookup
     mapping is in the form of a table.  This kind of component might be used, for
     example, in a case where aerosurface deflection must only be commanded to
     acceptable settings - i.e at higher qbar the commanded elevator setting might
     be attenuated.  The form of the scheduled gain component specification is:
-    <pre>
-    \<COMPONENT NAME="name" TYPE="SCHEDULED_GAIN">
-      INPUT \<property>
-      [GAIN  \<value>]
-      SCHEDULED_BY \<property>
-      ROWS \<number_of_rows>
-      \<lookup_value  gain_value>
-      ?
-      [CLIPTO \<min> \<max> 1]
-      [OUTPUT \<property>]
-    \</COMPONENT>
-    </pre>
+
+    @code
+    <scheduled_gain name="name">
+      <input> {[-]property} </input>
+      <table>
+        <tableData>
+          ...
+        </tableData>
+      </table>
+      [<clipto>
+        <min> {[-]property name | value} </min>
+        <max> {[-]property name | value} </max>
+      </clipto>]
+      [<gain> {property name | value} </gain>]
+      [<output> {property} </output>]
+    </scheduled_gain>
+    @endcode
+
+    Example:
+
+    @code
+    <scheduled_gain name="Scheduled Steer Pos Deg">
+        <input>fcs/steer-cmd-norm</input>
+        <table>
+            <independentVar>velocities/vg-fps</independentVar>
+            <tableData>
+                10.0        80.0
+                50.0        15.0
+                150.0       2.0
+            </tableData>
+        </table>
+        <gain>0.017</gain>
+        <output>fcs/steer-pos-rad</output>
+    </scheduled_gain>
+    @endcode
+
     An overall GAIN may be supplied that is multiplicative with the scheduled gain.
 
-    Note: as is the case with the Summer component, the input property name may
-    be immediately preceded by a minus sign to invert that signal.
-
-    Here is an example of a scheduled gain component specification:
-    <pre>
-    \<COMPONENT NAME="Pitch Scheduled Gain 1" TYPE="SCHEDULED_GAIN">
-      INPUT        fcs/pitch-gain-1
-      GAIN         0.017
-      SCHEDULED_BY fcs/elevator-pos-rad
-      ROWS         22
-      -0.68  -26.548
-      -0.595 -20.513
-      -0.51  -15.328
-      -0.425 -10.993
-      -0.34   -7.508
-      -0.255  -4.873
-      -0.17   -3.088
-      -0.085  -2.153
-       0      -2.068
-       0.085  -2.833
-       0.102  -3.088
-       0.119  -3.377
-       0.136  -3.7
-       0.153  -4.057
-       0.17   -4.448
-       0.187  -4.873
-       0.272  -7.508
-       0.357 -10.993
-       0.442 -15.328
-       0.527 -20.513
-       0.612 -26.548
-       0.697 -33.433
-    \</COMPONENT>
-    </pre>
-    In the example above, we see the utility of the overall GAIN value in
+    Note: the input property name may be immediately preceded by a minus sign to
+    invert that signal.
+
+    In the example above, we see the utility of the overall gain value in
     effecting a degrees-to-radians conversion.
 
-    The aerosurface scale component is a modified version of the simple gain
-    component.  The normal purpose
-    for this component is to take control inputs that range from -1 to +1 or
-    from 0 to +1 and scale them to match the expected inputs to a flight control
-    system.  For instance, the normal and expected ability of a pilot to push or
-    pull on a control stick is about 50 pounds.  The input to the pitch channelb
-    lock diagram of a flight control system is in units of pounds.  Yet, the
-    joystick control input is usually in a range from -1 to +1.  The form of the
-    aerosurface scaling component specification is:
-<pre>
-    \<COMPONENT NAME="name" TYPE="AEROSURFACE_SCALE">
-      INPUT \<property>
-      MIN \<value>
-      MAX \<value>
-      [GAIN  \<value>]
-      [OUTPUT \<property>]
-    \</COMPONENT>
-</pre>
-    Note: as is the case with the Summer component, the input property name may be
-    immediately preceded by a minus sign to invert that signal.
+    The <b>aerosurface scale</b> component is a modified version of the simple gain
+    component.  The purpose for this component is to take control inputs from the
+    domain minimum and maximum, as specified (or from -1 to +1 by default) and
+    scale them to map to a specified range. This can be done, for instance, to match
+    the component outputs to the expected inputs to a flight control system.
+
+    The zero_centered element dictates whether the domain-to-range mapping is linear
+    or centered about zero. For example, if zero_centered is false, and if the domain
+    or range is not symmetric about zero, and an input value is zero, the output
+    will not be zero. Let's say that the domain is min=-2 and max=+4, with a range
+    of -1 to +1. If the input is 0.0, then the "normalized" input is calculated to
+    be 33% of the way from the minimum to the maximum. That input would be mapped
+    to an output of -0.33, which is 33% of the way from the range minimum to maximum.
+    If zero_centered is set to true (or 1) then an input of 0.0 will be mapped to an
+    output of 0.0, although if either the domain or range are unsymmetric about
+    0.0, then the scales for the positive and negative portions of the input domain
+    (above and below 0.0) will be different. The zero_centered element is true by
+    default. Note that this feature may be important for some control surface mappings,
+    where the maximum upper and lower deflections may be different, but where a zero
+    setting is desired to be the "undeflected" value, and where full travel of the
+    stick is desired to cause a full deflection of the control surface.
+
+    The form of the aerosurface scaling component specification is:
+
+    @code
+    <aerosurface_scale name="name">
+      <input> {[-]property name} </input>
+      <domain>
+        <min> {value} </min>   <!-- If omitted, default is -1.0 ->
+        <max> {value} </max>   <!-- If omitted, default is  1.0 ->
+      </domain>
+      <range>
+        <min> {value} </min>   <!-- If omitted, default is 0 ->
+        <max> {value} </max>   <!-- If omitted, default is 0 ->
+      </range>
+      <zero_centered< value </zero_centered>
+      [<clipto>
+        <min> {[-]property name | value} </min>
+        <max> {[-]property name | value} </max>
+      </clipto>]
+      [<gain> {property name | value} </gain>]
+      [<output> {property} </output>]
+    </aerosurface_scale>
+    @endcode
+
+    Note: the input property name may be immediately preceded by a minus sign to
+    invert that signal.
+
+    For instance, the normal and expected ability of a
+    pilot to push or pull on a control stick is about 50 pounds.  The input to the
+    pitch channel block diagram of a flight control system is often in units of pounds.
+    Yet, the joystick control input usually defines a span from -1 to +1. The aerosurface_scale
+    form of the gain component maps the inputs to the desired output range. The example
+    below shoes a simple aerosurface_scale component that maps the joystick
+    input to a range of +/- 50, which represents pilot stick force in pounds for the F-16.
+
+    @code
+    <aerosurface_scale name="Pilot input">
+      <input>fcs/elevator-cmd-norm</input>
+      <range>
+        <min> -50 </min>   <!-- If omitted, default is 0 ->
+        <max>  50 </max>   <!-- If omitted, default is 0 ->
+      </range>
+    </aerosurface_scale>
+    @endcode
 
     @author Jon S. Berndt
-    @version $Id$
+    @version $Revision$
 */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
index a21644ae475a9c7516e1fdd6a298703901161051..37205ba0790967527f44da1b08f8464190b44a3a 100755 (executable)
@@ -99,6 +99,8 @@ 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.
 
+@author Jon S. Berndt
+@version $Revision$
   */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -110,7 +112,7 @@ class FGSensor  : public FGFCSComponent
 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;}
index 40ef4a5de6cf43ece9f0b379e534ce6cda8e9047..af7fb564c1099c9b07c286a862943978304c40e2 100644 (file)
@@ -223,7 +223,7 @@ double FGPropeller::GetPowerRequired(void)
     cPReq = cPower->GetValue(J);
   } else {                      // Variable pitch prop
 
-    if (MaxRPM != MinRPM) {   // fixed-speed prop
+    if (MaxRPM != MinRPM) {   // constant speed prop
 
       // do normal calculation when propeller is neither feathered nor reversed
       if (!Feathered) {