]> git.mxchange.org Git - flightgear.git/blob - src/FDM/UIUCModel/uiuc_menu.cpp
- rename fgcommand "set-mouse" to "set-cursor"
[flightgear.git] / src / FDM / UIUCModel / uiuc_menu.cpp
1 /**********************************************************************
2                                                                        
3  FILENAME:     uiuc_menu.cpp
4
5 ----------------------------------------------------------------------
6
7  DESCRIPTION:  reads input file for specified aircraft and creates 
8                approporiate data storage space
9
10 ----------------------------------------------------------------------
11
12  STATUS:       alpha version
13
14 ----------------------------------------------------------------------
15
16  REFERENCES:   based on "menu reader" format of Michael Selig
17
18 ----------------------------------------------------------------------
19
20  HISTORY:      01/29/2000   initial release
21                02/18/2000   (JS) added 1D data file capability for 
22                             CL(a) and CD(a) -- calls 
23                             uiuc_1DdataFileReader
24                02/22/2000   (JS) added ice map functions
25                02/29/2000   (JS) added 2D data file capability for 
26                             CL(a,de), CD(a,de), Cm(a,de), CY(a,da), 
27                             CY(beta,dr), Cl(a,da), Cl(beta,dr), 
28                             Cn(a,da), Cn(beta,dr) -- calls 
29                             uiuc_2DdataFileReader
30                02/02/2000   (JS) added record options for 1D and 
31                             2D interpolated variables
32                03/28/2000   (JS) streamlined conversion factors for 
33                             file readers -- since they are global 
34                             variables, it is not necessary to put 
35                             them in the function calls
36                03/29/2000   (JS) added Cmfa and Weight flags;
37                             added misc map; added Dx_cg (etc) to init 
38                             map
39                04/01/2000   (JS) added throttle, longitudinal, lateral, 
40                             and rudder inputs to record map
41                04/05/2000   (JS) added Altitude to init and record
42                             maps; added zero_Long_trim to 
43                             controlSurface map
44                03/09/2001   (DPM) added support for gear.
45                06/18/2001   (RD) Added Alpha, Beta, U_body,
46                             V_body, and W_body to init map.  Added 
47                             aileron_input, rudder_input, pilot_elev_no,
48                             pilot_ail_no, and pilot_rud_no to
49                             controlSurface map.  Added Throttle_pct_input
50                             to engine map.  Added CZfa to CL map.
51                07/05/2001   (RD) Changed pilot_elev_no = true to pilot_
52                             elev_no_check=false.  This is to allow pilot
53                             to fly aircraft after input files have been
54                             used.
55                08/27/2001   (RD) Added xxx_init_true and xxx_init for
56                             P_body, Q_body, R_body, Phi, Theta, Psi,
57                             U_body, V_body, and W_body to help in
58                             starting the A/C at an initial condition.
59                10/25/2001   (RD) Added new variables needed for the non-
60                             linear Twin Otter model at zero flaps
61                             (Cxfxxf0)
62                11/12/2001   (RD) Added new variables needed for the non-
63                             linear Twin Otter model with flaps
64                             (Cxfxxf).  Removed zero flap variables.
65                             Added minmaxfind() which is needed for non-
66                             linear variables
67                01/11/2002   (AP) Added keywords for bootTime
68                02/13/2002   (RD) Added variables so linear aero model
69                             values can be recorded
70                02/18/2002   (RD) Added variables necessary to use the
71                             uiuc_3Dinterp_quick() function.  Takes
72                             advantage of data in a "nice" form (data
73                             that are in a rectangular matrix).
74                03/13/2002   (RD) Added aircraft_directory so full path
75                             is no longer needed in the aircraft.dat file
76                04/02/2002   (RD) Removed minmaxfind() since it was no
77                             longer needed.  Added d_2_to_3(),
78                             d_1_to_2(), and i_1_to_2() so uiuc_menu()
79                             will compile with certain compilers.
80                08/29/2002   (RD) Separated each primary keyword into its
81                             own function to speed up compile time
82                08/29/2002   (RD w/ help from CO) Made changes to shorten
83                             compile time.  [] RD to add more comments here.
84                08/29/2003   (MSS) Adding new keywords for new engine model
85                             and slipstream effects on tail.
86                03/02/2003   (RD) Changed Cxfxxf areas so that there is a
87                             conversion factor for flap angle
88                03/03/2003   (RD) Added flap_cmd_record
89                03/16/2003   (RD) Added trigger record flags
90                04/02/2003   (RD) Tokens are now equal to 0 when no value
91                             is given in the input file
92                04/04/2003   (RD) To speed up compile time on this file,
93                             each first level token now goes to its
94                             own file uiuc_menu_*.cpp
95
96 ----------------------------------------------------------------------
97
98  AUTHOR(S):    Bipin Sehgal       <bsehgal@uiuc.edu>
99                Jeff Scott         http://www.jeffscott.net/
100                Robert Deters      <rdeters@uiuc.edu>
101                Michael Selig      <m-selig@uiuc.edu>
102                David Megginson    <david@megginson.com>
103                Ann Peedikayil     <peedikay@uiuc.edu>
104 ----------------------------------------------------------------------
105
106  VARIABLES:
107
108 ----------------------------------------------------------------------
109
110  INPUTS:       n/a
111
112 ----------------------------------------------------------------------
113
114  OUTPUTS:      n/a
115
116 ----------------------------------------------------------------------
117
118  CALLED BY:    uiuc_wrapper.cpp 
119
120 ----------------------------------------------------------------------
121
122  CALLS TO:     aircraft.dat
123                tabulated data files (if needed)
124                uiuc_menu_init()
125                uiuc_menu_geometry()
126                uiuc_menu_mass()
127                uiuc_menu_controlSurface()
128                uiuc_menu_CD()
129                uiuc_menu_CL()
130                uiuc_menu_Cm()
131                uiuc_menu_CY()
132                uiuc_menu_Cl()
133                uiuc_menu_Cn()
134                uiuc_menu_ice()
135                uiuc_menu_engine()
136                uiuc_menu_fog()
137                uiuc_menu_gear()
138                uiuc_menu_record()
139                uiuc_menu_misc()
140
141 ----------------------------------------------------------------------
142
143  COPYRIGHT:    (C) 2000 by Michael Selig
144
145  This program is free software; you can redistribute it and/or
146  modify it under the terms of the GNU General Public License
147  as published by the Free Software Foundation.
148
149  This program is distributed in the hope that it will be useful,
150  but WITHOUT ANY WARRANTY; without even the implied warranty of
151  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
152  GNU General Public License for more details.
153
154  You should have received a copy of the GNU General Public License
155  along with this program; if not, write to the Free Software
156  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
157
158 **********************************************************************/
159
160 #include <simgear/compiler.h>
161
162 #if defined( __MWERKS__ )
163 // -dw- optimizer chokes (big-time) trying to optimize humongous
164 // loop/switch statements
165 #pragma optimization_level 0
166 #endif
167
168 #include <cstdlib>
169 #include <string>
170 #include STL_IOSTREAM
171
172 #include "uiuc_menu.h"
173
174 SG_USING_STD(cerr);
175 SG_USING_STD(cout);
176 SG_USING_STD(endl);
177
178 #ifndef _MSC_VER
179 SG_USING_STD(exit);
180 #endif
181
182 void uiuc_menu( string aircraft_name )
183 {
184   string aircraft_directory;
185   stack command_list;
186   double token_value;
187   int token_value_recordRate;
188   int token_value_convert1, token_value_convert2, token_value_convert3;
189   
190   string linetoken1;
191   string linetoken2;
192   string linetoken3;
193   string linetoken4;
194   string linetoken5;
195   string linetoken6;
196   string linetoken7;
197   string linetoken8;
198   string linetoken9;
199   string linetoken10;
200   
201   /* the following default setting should eventually be moved to a default or uiuc_init routine */
202
203   recordRate = 1;       /* record every time step, default */
204   recordStartTime = 0;  /* record from beginning of simulation */
205
206 /* set speed at which dynamic pressure terms will be accounted for,
207    since if velocity is too small, coefficients will go to infinity */
208   dyn_on_speed      = 33;    /* 20 kts (33 ft/sec), default */
209   dyn_on_speed_zero = 0.5 * dyn_on_speed;    /* only used if use_dyn_on_speed_curve1 is used */
210   bootindex = 0;  // the index for the bootTime
211
212   /* Read the file and get the list of commands */
213   airplane = new ParseFile(aircraft_name); /* struct that includes all lines of the input file */
214   command_list = airplane -> getCommands();
215   /* structs to include all parts included in the input file for specific keyword groups */
216   initParts          = new ParseFile();
217   geometryParts      = new ParseFile();
218   massParts          = new ParseFile();
219   engineParts        = new ParseFile();
220   aeroDragParts      = new ParseFile();
221   aeroLiftParts      = new ParseFile();
222   aeroPitchParts     = new ParseFile();
223   aeroSideforceParts = new ParseFile();
224   aeroRollParts      = new ParseFile();
225   aeroYawParts       = new ParseFile();
226   gearParts          = new ParseFile();
227   recordParts        = new ParseFile();
228
229   if (command_list.begin() == command_list.end())
230   {
231     cerr << "UIUC ERROR: File " << aircraft_name <<" does not exist" << endl;
232     exit(-1);
233   }
234   
235   //construct aircraft-directory
236   aircraft_directory = aircraft_name;
237   int index_aircraft_dat = aircraft_directory.find("aircraft.dat");
238   aircraft_directory.erase(index_aircraft_dat,12);
239
240   for (LIST command_line = command_list.begin(); command_line!=command_list.end(); ++command_line)
241     {
242       cout << *command_line << endl;
243
244       linetoken1 = airplane -> getToken (*command_line, 1); 
245       linetoken2 = airplane -> getToken (*command_line, 2); 
246       if (linetoken2=="")
247         linetoken2="0";
248       linetoken3 = airplane -> getToken (*command_line, 3); 
249       if (linetoken3=="")
250         linetoken3="0";
251       linetoken4 = airplane -> getToken (*command_line, 4); 
252       if (linetoken4=="")
253         linetoken4="0";
254       linetoken5 = airplane -> getToken (*command_line, 5); 
255       if (linetoken5=="")
256         linetoken5="0";
257       linetoken6 = airplane -> getToken (*command_line, 6); 
258       if (linetoken6=="")
259         linetoken6="0";
260       linetoken7 = airplane -> getToken (*command_line, 7);
261       if (linetoken7=="")
262         linetoken7="0";
263       linetoken8 = airplane -> getToken (*command_line, 8);
264       if (linetoken8=="")
265         linetoken8="0";
266       linetoken9 = airplane -> getToken (*command_line, 9);
267       if (linetoken9=="")
268         linetoken9="0";
269       linetoken10 = airplane -> getToken (*command_line, 10);
270       if (linetoken10=="")
271         linetoken10="0";
272  
273       //cout << linetoken1 << endl;
274       //cout << linetoken2 << endl;
275       //cout << linetoken3 << endl;
276       //cout << linetoken4 << endl;
277       //cout << linetoken5 << endl;
278       //cout << linetoken6 << endl;
279       //cout << linetoken7 << endl;
280       //cout << linetoken8 << endl;
281       //cout << linetoken9 << endl;
282       //cout << linetoken10 << endl;
283      
284       //istrstream token3(linetoken3.c_str());
285       //istrstream token4(linetoken4.c_str());
286       //istrstream token5(linetoken5.c_str());
287       //istrstream token6(linetoken6.c_str());
288       //istrstream token7(linetoken7.c_str());
289       //istrstream token8(linetoken8.c_str());
290       //istrstream token9(linetoken9.c_str());
291       //istrstream token10(linetoken10.c_str());
292
293       switch (Keyword_map[linetoken1])
294         {
295         case init_flag:
296           {
297             parse_init( linetoken2, linetoken3, linetoken4, 
298                         linetoken5, linetoken6, linetoken7,
299                         linetoken8, linetoken9, linetoken10,
300                         aircraft_directory, command_line );
301             break;
302           } // end init map
303           
304       
305         case geometry_flag:
306           {
307             parse_geometry( linetoken2, linetoken3, linetoken4,
308                             linetoken5, linetoken6, linetoken7,
309                             linetoken8, linetoken9, linetoken10,
310                             aircraft_directory, command_line );
311             break;
312           } // end geometry map
313
314
315         case controlSurface_flag:
316           {
317             parse_controlSurface( linetoken2, linetoken3, linetoken4,
318                                   linetoken5, linetoken6, linetoken7,
319                                   linetoken8, linetoken9, linetoken10,
320                                   aircraft_directory, command_line );
321             break;
322           } // end controlSurface map
323
324
325         case mass_flag:
326           {
327             parse_mass( linetoken2, linetoken3, linetoken4,
328                         linetoken5, linetoken6, linetoken7,
329                         linetoken8, linetoken9, linetoken10,
330                         aircraft_directory, command_line );
331             break;
332           } // end mass map
333           
334           
335         case engine_flag:
336           {
337             parse_engine( linetoken2, linetoken3, linetoken4,
338                           linetoken5, linetoken6, linetoken7,
339                           linetoken8, linetoken9, linetoken10,
340                           aircraft_directory, command_line );
341             break;
342           } // end engine map
343           
344           
345         case CD_flag:
346           {
347             parse_CD( linetoken2, linetoken3, linetoken4,
348                       linetoken5, linetoken6, linetoken7,
349                       linetoken8, linetoken9, linetoken10,
350                       aircraft_directory, command_line );
351             break;
352           } // end CD map
353
354           
355         case CL_flag:
356           {
357             parse_CL( linetoken2, linetoken3, linetoken4,
358                       linetoken5, linetoken6, linetoken7,
359                       linetoken8, linetoken9, linetoken10,
360                       aircraft_directory, command_line );
361             break;
362           } // end CL map
363
364
365         case Cm_flag:
366           {
367             parse_Cm( linetoken2, linetoken3, linetoken4,
368                       linetoken5, linetoken6, linetoken7,
369                       linetoken8, linetoken9, linetoken10,
370                       aircraft_directory, command_line );
371             break;
372           } // end Cm map
373
374
375         case CY_flag:
376           {
377             parse_CY( linetoken2, linetoken3, linetoken4,
378                       linetoken5, linetoken6, linetoken7,
379                       linetoken8, linetoken9, linetoken10,
380                       aircraft_directory, command_line );
381             break;
382           } // end CY map
383
384
385         case Cl_flag:
386           {
387             parse_Cl( linetoken2, linetoken3, linetoken4,
388                       linetoken5, linetoken6, linetoken7,
389                       linetoken8, linetoken9, linetoken10,
390                       aircraft_directory, command_line );
391             break;
392           } // end Cl map
393
394
395         case Cn_flag:
396           {
397             parse_Cn( linetoken2, linetoken3, linetoken4,
398                       linetoken5, linetoken6, linetoken7,
399                       linetoken8, linetoken9, linetoken10,
400                       aircraft_directory, command_line );
401             break;
402           } // end Cn map
403           
404         
405         case gear_flag:
406           {
407             parse_gear( linetoken2, linetoken3, linetoken4,
408                         linetoken5, linetoken6, linetoken7,
409                         linetoken8, linetoken9, linetoken10,
410                         aircraft_directory, command_line );
411             break;
412           } // end gear map
413       
414
415         case ice_flag:
416           {
417             parse_ice( linetoken2, linetoken3, linetoken4,
418                        linetoken5, linetoken6, linetoken7,
419                        linetoken8, linetoken9, linetoken10,
420                        aircraft_directory, command_line );
421             break;
422           } // end ice map
423          
424
425         case fog_flag:
426           {
427             parse_fog( linetoken2, linetoken3, linetoken4,
428                        linetoken5, linetoken6, linetoken7,
429                        linetoken8, linetoken9, linetoken10,
430                        aircraft_directory, command_line );
431             break;
432           } // end fog map        
433           
434
435         case record_flag:
436           {
437             static int fout_flag=0;
438             if (fout_flag==0)
439             {
440               fout_flag=-1;
441               fout.open("uiuc_record.dat");
442             }
443             parse_record( linetoken2, linetoken3, linetoken4, 
444                           linetoken5, linetoken6, linetoken7,
445                           linetoken8, linetoken9, linetoken10,
446                           aircraft_directory, command_line );
447             break;
448           } // end record map               
449
450
451         case misc_flag:
452           {
453             parse_misc( linetoken2, linetoken3, linetoken4, 
454                         linetoken5, linetoken6, linetoken7,
455                         linetoken8, linetoken9, linetoken10,
456                         aircraft_directory, command_line );
457             break;
458           } // end misc map
459
460
461         default:
462           {
463             if (linetoken1=="*")
464                 return;
465             if (ignore_unknown_keywords) {
466               // do nothing
467             } else {
468               // print error message
469               uiuc_warnings_errors(2, *command_line);
470             }
471             break;
472           }
473         };
474     } // end keyword map
475   
476   delete airplane;
477 }
478
479 // end menu.cpp