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