]> git.mxchange.org Git - flightgear.git/blob - src/FDM/UIUCModel/uiuc_menu.cpp
- remove the SG_GLxxxx_H #defines, since OSG provides its own versions
[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
163 #include <cstdlib>
164 #include <string>
165 #include <iostream>
166
167 #include "uiuc_menu.h"
168
169 using std::cerr;
170 using std::cout;
171 using std::endl;
172
173 #ifndef _MSC_VER
174 using std::exit;
175 #endif
176
177 void uiuc_menu( string aircraft_name )
178 {
179   string aircraft_directory;
180   stack command_list;
181   double token_value;
182   int token_value_recordRate;
183   int token_value_convert1, token_value_convert2, token_value_convert3;
184   
185   string linetoken1;
186   string linetoken2;
187   string linetoken3;
188   string linetoken4;
189   string linetoken5;
190   string linetoken6;
191   string linetoken7;
192   string linetoken8;
193   string linetoken9;
194   string linetoken10;
195   
196   /* the following default setting should eventually be moved to a default or uiuc_init routine */
197
198   recordRate = 1;       /* record every time step, default */
199   recordStartTime = 0;  /* record from beginning of simulation */
200
201 /* set speed at which dynamic pressure terms will be accounted for,
202    since if velocity is too small, coefficients will go to infinity */
203   dyn_on_speed      = 33;    /* 20 kts (33 ft/sec), default */
204   dyn_on_speed_zero = 0.5 * dyn_on_speed;    /* only used if use_dyn_on_speed_curve1 is used */
205   bootindex = 0;  // the index for the bootTime
206
207   /* Read the file and get the list of commands */
208   airplane = new ParseFile(aircraft_name); /* struct that includes all lines of the input file */
209   command_list = airplane -> getCommands();
210   /* structs to include all parts included in the input file for specific keyword groups */
211   initParts          = new ParseFile();
212   geometryParts      = new ParseFile();
213   massParts          = new ParseFile();
214   engineParts        = new ParseFile();
215   aeroDragParts      = new ParseFile();
216   aeroLiftParts      = new ParseFile();
217   aeroPitchParts     = new ParseFile();
218   aeroSideforceParts = new ParseFile();
219   aeroRollParts      = new ParseFile();
220   aeroYawParts       = new ParseFile();
221   gearParts          = new ParseFile();
222   recordParts        = new ParseFile();
223
224   if (command_list.begin() == command_list.end())
225   {
226     cerr << "UIUC ERROR: File " << aircraft_name <<" does not exist" << endl;
227     exit(-1);
228   }
229   
230   //construct aircraft-directory
231   aircraft_directory = aircraft_name;
232   int index_aircraft_dat = aircraft_directory.find("aircraft.dat");
233   aircraft_directory.erase(index_aircraft_dat,12);
234
235   for (LIST command_line = command_list.begin(); command_line!=command_list.end(); ++command_line)
236     {
237       cout << *command_line << endl;
238
239       linetoken1 = airplane -> getToken (*command_line, 1); 
240       linetoken2 = airplane -> getToken (*command_line, 2); 
241       if (linetoken2=="")
242         linetoken2="0";
243       linetoken3 = airplane -> getToken (*command_line, 3); 
244       if (linetoken3=="")
245         linetoken3="0";
246       linetoken4 = airplane -> getToken (*command_line, 4); 
247       if (linetoken4=="")
248         linetoken4="0";
249       linetoken5 = airplane -> getToken (*command_line, 5); 
250       if (linetoken5=="")
251         linetoken5="0";
252       linetoken6 = airplane -> getToken (*command_line, 6); 
253       if (linetoken6=="")
254         linetoken6="0";
255       linetoken7 = airplane -> getToken (*command_line, 7);
256       if (linetoken7=="")
257         linetoken7="0";
258       linetoken8 = airplane -> getToken (*command_line, 8);
259       if (linetoken8=="")
260         linetoken8="0";
261       linetoken9 = airplane -> getToken (*command_line, 9);
262       if (linetoken9=="")
263         linetoken9="0";
264       linetoken10 = airplane -> getToken (*command_line, 10);
265       if (linetoken10=="")
266         linetoken10="0";
267  
268       //cout << linetoken1 << endl;
269       //cout << linetoken2 << endl;
270       //cout << linetoken3 << endl;
271       //cout << linetoken4 << endl;
272       //cout << linetoken5 << endl;
273       //cout << linetoken6 << endl;
274       //cout << linetoken7 << endl;
275       //cout << linetoken8 << endl;
276       //cout << linetoken9 << endl;
277       //cout << linetoken10 << endl;
278      
279       //istrstream token3(linetoken3.c_str());
280       //istrstream token4(linetoken4.c_str());
281       //istrstream token5(linetoken5.c_str());
282       //istrstream token6(linetoken6.c_str());
283       //istrstream token7(linetoken7.c_str());
284       //istrstream token8(linetoken8.c_str());
285       //istrstream token9(linetoken9.c_str());
286       //istrstream token10(linetoken10.c_str());
287
288       switch (Keyword_map[linetoken1])
289         {
290         case init_flag:
291           {
292             parse_init( linetoken2, linetoken3, linetoken4, 
293                         linetoken5, linetoken6, linetoken7,
294                         linetoken8, linetoken9, linetoken10,
295                         aircraft_directory, command_line );
296             break;
297           } // end init map
298           
299       
300         case geometry_flag:
301           {
302             parse_geometry( linetoken2, linetoken3, linetoken4,
303                             linetoken5, linetoken6, linetoken7,
304                             linetoken8, linetoken9, linetoken10,
305                             aircraft_directory, command_line );
306             break;
307           } // end geometry map
308
309
310         case controlSurface_flag:
311           {
312             parse_controlSurface( linetoken2, linetoken3, linetoken4,
313                                   linetoken5, linetoken6, linetoken7,
314                                   linetoken8, linetoken9, linetoken10,
315                                   aircraft_directory, command_line );
316             break;
317           } // end controlSurface map
318
319
320         case mass_flag:
321           {
322             parse_mass( linetoken2, linetoken3, linetoken4,
323                         linetoken5, linetoken6, linetoken7,
324                         linetoken8, linetoken9, linetoken10,
325                         aircraft_directory, command_line );
326             break;
327           } // end mass map
328           
329           
330         case engine_flag:
331           {
332             parse_engine( linetoken2, linetoken3, linetoken4,
333                           linetoken5, linetoken6, linetoken7,
334                           linetoken8, linetoken9, linetoken10,
335                           aircraft_directory, command_line );
336             break;
337           } // end engine map
338           
339           
340         case CD_flag:
341           {
342             parse_CD( linetoken2, linetoken3, linetoken4,
343                       linetoken5, linetoken6, linetoken7,
344                       linetoken8, linetoken9, linetoken10,
345                       aircraft_directory, command_line );
346             break;
347           } // end CD map
348
349           
350         case CL_flag:
351           {
352             parse_CL( linetoken2, linetoken3, linetoken4,
353                       linetoken5, linetoken6, linetoken7,
354                       linetoken8, linetoken9, linetoken10,
355                       aircraft_directory, command_line );
356             break;
357           } // end CL map
358
359
360         case Cm_flag:
361           {
362             parse_Cm( linetoken2, linetoken3, linetoken4,
363                       linetoken5, linetoken6, linetoken7,
364                       linetoken8, linetoken9, linetoken10,
365                       aircraft_directory, command_line );
366             break;
367           } // end Cm map
368
369
370         case CY_flag:
371           {
372             parse_CY( linetoken2, linetoken3, linetoken4,
373                       linetoken5, linetoken6, linetoken7,
374                       linetoken8, linetoken9, linetoken10,
375                       aircraft_directory, command_line );
376             break;
377           } // end CY map
378
379
380         case Cl_flag:
381           {
382             parse_Cl( linetoken2, linetoken3, linetoken4,
383                       linetoken5, linetoken6, linetoken7,
384                       linetoken8, linetoken9, linetoken10,
385                       aircraft_directory, command_line );
386             break;
387           } // end Cl map
388
389
390         case Cn_flag:
391           {
392             parse_Cn( linetoken2, linetoken3, linetoken4,
393                       linetoken5, linetoken6, linetoken7,
394                       linetoken8, linetoken9, linetoken10,
395                       aircraft_directory, command_line );
396             break;
397           } // end Cn map
398           
399         
400         case gear_flag:
401           {
402             parse_gear( linetoken2, linetoken3, linetoken4,
403                         linetoken5, linetoken6, linetoken7,
404                         linetoken8, linetoken9, linetoken10,
405                         aircraft_directory, command_line );
406             break;
407           } // end gear map
408       
409
410         case ice_flag:
411           {
412             parse_ice( linetoken2, linetoken3, linetoken4,
413                        linetoken5, linetoken6, linetoken7,
414                        linetoken8, linetoken9, linetoken10,
415                        aircraft_directory, command_line );
416             break;
417           } // end ice map
418          
419
420         case fog_flag:
421           {
422             parse_fog( linetoken2, linetoken3, linetoken4,
423                        linetoken5, linetoken6, linetoken7,
424                        linetoken8, linetoken9, linetoken10,
425                        aircraft_directory, command_line );
426             break;
427           } // end fog map        
428           
429
430         case record_flag:
431           {
432             static int fout_flag=0;
433             if (fout_flag==0)
434             {
435               fout_flag=-1;
436               fout.open("uiuc_record.dat");
437             }
438             parse_record( linetoken2, linetoken3, linetoken4, 
439                           linetoken5, linetoken6, linetoken7,
440                           linetoken8, linetoken9, linetoken10,
441                           aircraft_directory, command_line );
442             break;
443           } // end record map               
444
445
446         case misc_flag:
447           {
448             parse_misc( linetoken2, linetoken3, linetoken4, 
449                         linetoken5, linetoken6, linetoken7,
450                         linetoken8, linetoken9, linetoken10,
451                         aircraft_directory, command_line );
452             break;
453           } // end misc map
454
455
456         default:
457           {
458             if (linetoken1=="*")
459                 return;
460             if (ignore_unknown_keywords) {
461               // do nothing
462             } else {
463               // print error message
464               uiuc_warnings_errors(2, *command_line);
465             }
466             break;
467           }
468         };
469     } // end keyword map
470   
471   delete airplane;
472 }
473
474 // end menu.cpp