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