]> git.mxchange.org Git - flightgear.git/blob - src/FDM/UIUCModel/uiuc_aerodeflections.cpp
Updates to the UIUCModel code. This includes some big compile time
[flightgear.git] / src / FDM / UIUCModel / uiuc_aerodeflections.cpp
1 /**********************************************************************
2
3  FILENAME:     uiuc_aerodeflections.cpp
4
5 ----------------------------------------------------------------------
6
7  DESCRIPTION:  determine the aero control surface deflections
8                elevator [rad]
9                aileron [rad]
10                rudder [rad]
11                
12 ----------------------------------------------------------------------
13
14  STATUS:       alpha version
15
16 ----------------------------------------------------------------------
17
18  REFERENCES:   based on deflection portions of c172_aero.c and 
19                uiuc_aero.c
20
21 ----------------------------------------------------------------------
22
23  HISTORY:      01/30/2000   initial release
24                04/05/2000   (JS) added zero_Long_trim command
25                07/05/2001   (RD) removed elevator_tab addidtion to
26                             elevator calculation
27                11/12/2001   (RD) added new flap routine.  Needed for
28                             Twin Otter non-linear model
29
30 ----------------------------------------------------------------------
31
32  AUTHOR(S):    Jeff Scott         <jscott@mail.com>
33                Robert Deters      <rdeters@uiuc.edu>
34                Michael Selig      <m-selig@uiuc.edu>
35
36 ----------------------------------------------------------------------
37
38  VARIABLES:
39
40 ----------------------------------------------------------------------
41
42  INPUTS:       *
43
44 ----------------------------------------------------------------------
45
46  OUTPUTS:      *
47
48 ----------------------------------------------------------------------
49
50  CALLED BY:    *
51
52 ----------------------------------------------------------------------
53
54  CALLS TO:     *
55
56 ----------------------------------------------------------------------
57
58  COPYRIGHT:    (C) 2000 by Michael Selig
59
60  This program is free software; you can redistribute it and/or
61  modify it under the terms of the GNU General Public License
62  as published by the Free Software Foundation.
63
64  This program is distributed in the hope that it will be useful,
65  but WITHOUT ANY WARRANTY; without even the implied warranty of
66  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
67  GNU General Public License for more details.
68
69  You should have received a copy of the GNU General Public License
70  along with this program; if not, write to the Free Software
71  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
72  USA or view http://www.gnu.org/copyleft/gpl.html.
73
74 **********************************************************************/
75
76 #include <math.h>
77
78 #include "uiuc_aerodeflections.h"
79
80 void uiuc_aerodeflections( double dt )
81 {
82   double prevFlapHandle = 0.0f;
83   double flap_transit_rate;
84   bool flaps_in_transit = false;
85   double demax_remain;
86   double demin_remain;
87
88   if (zero_Long_trim)
89     {
90       Long_trim = 0;
91       //elevator_tab = 0;
92     }
93
94   if (Lat_control <= 0)
95     aileron = - Lat_control * damin * DEG_TO_RAD;
96   else
97     aileron = - Lat_control * damax * DEG_TO_RAD;
98
99   if (Long_trim <= 0)
100     {
101       elevator = Long_trim * demax * DEG_TO_RAD;
102       demax_remain = demax + Long_trim * demax;
103       demin_remain = -1*Long_trim * demax + demin;
104       if (Long_control <= 0)
105         elevator += Long_control * demax_remain * DEG_TO_RAD;
106       else
107         elevator += Long_control * demin_remain * DEG_TO_RAD;
108     }
109   else
110     {
111       elevator = Long_trim * demin * DEG_TO_RAD;
112       demin_remain = demin - Long_trim * demin;
113       demax_remain = Long_trim * demin + demax;
114       if (Long_control >=0)
115         elevator += Long_control * demin_remain * DEG_TO_RAD;
116       else
117         elevator += Long_control * demax_remain * DEG_TO_RAD;
118     }
119
120   //if ((Long_control+Long_trim) <= 0)
121   //  elevator = (Long_control + Long_trim) * demax * DEG_TO_RAD;
122   //else
123   //  elevator = (Long_control + Long_trim) * demin * DEG_TO_RAD;
124
125   if (Rudder_pedal <= 0)
126     rudder = - Rudder_pedal * drmin * DEG_TO_RAD;
127   else
128     rudder = - Rudder_pedal * drmax * DEG_TO_RAD;
129
130
131   // new flap routine
132   // designed for the twin otter non-linear model
133   flap_percent     = Flap_handle / 30.0;       // percent of flaps desired
134   if (flap_percent>=0.31 && flap_percent<=0.35)
135     flap_percent = 1.0 / 3.0;
136   if (flap_percent>=0.65 && flap_percent<=0.69)
137     flap_percent = 2.0 / 3.0;
138   flap_goal        = flap_percent * flap_max;  // angle of flaps desired
139   flap_moving_rate = flap_rate * dt;           // amount flaps move per time step
140   
141   // determine flap position with respect to the flap goal
142   if (flap_pos < flap_goal)
143     {
144       flap_pos += flap_moving_rate;
145       if (flap_pos > flap_goal)
146         flap_pos = flap_goal;
147     }
148   else if (flap_pos > flap_goal)
149     {
150       flap_pos -= flap_moving_rate;
151       if (flap_pos < flap_goal)
152         flap_pos = flap_goal;
153     }
154
155
156   // old flap routine
157   // check for lowest flap setting
158   if (Flap_handle < dfArray[1])
159     {
160       Flap_handle    = dfArray[1];
161       prevFlapHandle = Flap_handle;
162       flap           = Flap_handle;
163     }
164   // check for highest flap setting
165   else if (Flap_handle > dfArray[ndf])
166     {
167       Flap_handle      = dfArray[ndf];
168       prevFlapHandle   = Flap_handle;
169       flap             = Flap_handle;
170     }
171   // otherwise in between
172   else          
173     {
174       if(Flap_handle != prevFlapHandle)
175         {
176           flaps_in_transit = true;
177         }
178       if(flaps_in_transit)
179         {
180           int iflap = 0;
181           while (dfArray[iflap] < Flap_handle)
182             {
183               iflap++;
184             }
185           if (flap < Flap_handle)
186             {
187               if (TimeArray[iflap] > 0)
188                 flap_transit_rate = (dfArray[iflap] - dfArray[iflap-1]) / TimeArray[iflap+1];
189               else
190                 flap_transit_rate = (dfArray[iflap] - dfArray[iflap-1]) / 5;
191             }
192           else 
193             {
194               if (TimeArray[iflap+1] > 0)
195                 flap_transit_rate = (dfArray[iflap] - dfArray[iflap+1]) / TimeArray[iflap+1];
196               else
197                 flap_transit_rate = (dfArray[iflap] - dfArray[iflap+1]) / 5;
198             }
199           if(fabs (flap - Flap_handle) > dt * flap_transit_rate)
200             flap += flap_transit_rate * dt;
201           else
202             {
203               flaps_in_transit = false;
204               flap = Flap_handle;
205             }
206         }
207     }
208   prevFlapHandle = Flap_handle;
209
210   return;
211 }
212
213 // end uiuc_aerodeflections.cpp