1 /**********************************************************************
3 FILENAME: uiuc_menu_controlSurface.cpp
5 ----------------------------------------------------------------------
7 DESCRIPTION: reads input data for specified aircraft and creates
8 approporiate data storage space
10 ----------------------------------------------------------------------
14 ----------------------------------------------------------------------
16 REFERENCES: based on "menu reader" format of Michael Selig
18 ----------------------------------------------------------------------
20 HISTORY: 04/04/2003 initial release
21 06/30/2003 (RD) replaced istrstream with istringstream
22 to get rid of the annoying warning about
23 using the strstream header
25 ----------------------------------------------------------------------
27 AUTHOR(S): Robert Deters <rdeters@uiuc.edu>
28 Michael Selig <m-selig@uiuc.edu>
30 ----------------------------------------------------------------------
34 ----------------------------------------------------------------------
38 ----------------------------------------------------------------------
42 ----------------------------------------------------------------------
44 CALLED BY: uiuc_menu()
46 ----------------------------------------------------------------------
48 CALLS TO: check_float() if needed
54 ----------------------------------------------------------------------
56 COPYRIGHT: (C) 2003 by Michael Selig
58 This program is free software; you can redistribute it and/or
59 modify it under the terms of the GNU General Public License
60 as published by the Free Software Foundation.
62 This program is distributed in the hope that it will be useful,
63 but WITHOUT ANY WARRANTY; without even the implied warranty of
64 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
65 GNU General Public License for more details.
67 You should have received a copy of the GNU General Public License
68 along with this program; if not, write to the Free Software
69 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
71 **********************************************************************/
73 #include <simgear/compiler.h>
75 #if defined( __MWERKS__ )
76 // -dw- optimizer chokes (big-time) trying to optimize humongous
77 // loop/switch statements
78 #pragma optimization_level 0
85 #include "uiuc_menu_controlSurface.h"
95 void parse_controlSurface( const string& linetoken2, const string& linetoken3,
96 const string& linetoken4, const string& linetoken5,
97 const string& linetoken6, const string& linetoken7,
98 const string& linetoken8, const string& linetoken9,
99 const string& linetoken10,
100 const string& aircraft_directory,
101 LIST command_line ) {
103 int token_value_convert1, token_value_convert2;
104 istringstream token3(linetoken3.c_str());
105 istringstream token4(linetoken4.c_str());
106 istringstream token5(linetoken5.c_str());
107 istringstream token6(linetoken6.c_str());
108 istringstream token7(linetoken7.c_str());
109 istringstream token8(linetoken8.c_str());
110 istringstream token9(linetoken9.c_str());
111 istringstream token10(linetoken10.c_str());
113 switch(controlSurface_map[linetoken2])
117 if (check_float(linetoken3))
118 token3 >> token_value;
120 uiuc_warnings_errors(1, *command_line);
124 if (check_float(linetoken4))
125 token4 >> token_value;
127 uiuc_warnings_errors(1, *command_line);
134 if (check_float(linetoken3))
135 token3 >> token_value;
137 uiuc_warnings_errors(1, *command_line);
141 if (check_float(linetoken4))
142 token4 >> token_value;
144 uiuc_warnings_errors(1, *command_line);
151 if (check_float(linetoken3))
152 token3 >> token_value;
154 uiuc_warnings_errors(1, *command_line);
158 if (check_float(linetoken4))
159 token4 >> token_value;
161 uiuc_warnings_errors(1, *command_line);
166 case set_Long_trim_flag:
168 if (check_float(linetoken3))
169 token3 >> token_value;
171 uiuc_warnings_errors(1, *command_line);
173 set_Long_trim = true;
174 elevator_tab = token_value;
177 case set_Long_trim_deg_flag:
179 if (check_float(linetoken3))
180 token3 >> token_value;
182 uiuc_warnings_errors(1, *command_line);
184 set_Long_trim = true;
185 elevator_tab = token_value * DEG_TO_RAD;
188 case zero_Long_trim_flag:
190 zero_Long_trim = true;
193 case elevator_step_flag:
195 // set step input flag
196 elevator_step = true;
198 // read in step angle in degrees and convert
199 if (check_float(linetoken3))
200 token3 >> token_value;
202 uiuc_warnings_errors(1, *command_line);
204 elevator_step_angle = token_value * DEG_TO_RAD;
206 // read in step start time
207 if (check_float(linetoken4))
208 token4 >> token_value;
210 uiuc_warnings_errors(1, *command_line);
212 elevator_step_startTime = token_value;
215 case elevator_singlet_flag:
217 // set singlet input flag
218 elevator_singlet = true;
220 // read in singlet angle in degrees and convert
221 if (check_float(linetoken3))
222 token3 >> token_value;
224 uiuc_warnings_errors(1, *command_line);
226 elevator_singlet_angle = token_value * DEG_TO_RAD;
228 // read in singlet start time
229 if (check_float(linetoken4))
230 token4 >> token_value;
232 uiuc_warnings_errors(1, *command_line);
234 elevator_singlet_startTime = token_value;
236 // read in singlet duration
237 if (check_float(linetoken5))
238 token5 >> token_value;
240 uiuc_warnings_errors(1, *command_line);
242 elevator_singlet_duration = token_value;
245 case elevator_doublet_flag:
247 // set doublet input flag
248 elevator_doublet = true;
250 // read in doublet angle in degrees and convert
251 if (check_float(linetoken3))
252 token3 >> token_value;
254 uiuc_warnings_errors(1, *command_line);
256 elevator_doublet_angle = token_value * DEG_TO_RAD;
258 // read in doublet start time
259 if (check_float(linetoken4))
260 token4 >> token_value;
262 uiuc_warnings_errors(1, *command_line);
264 elevator_doublet_startTime = token_value;
266 // read in doublet duration
267 if (check_float(linetoken5))
268 token5 >> token_value;
270 uiuc_warnings_errors(1, *command_line);
272 elevator_doublet_duration = token_value;
275 case elevator_input_flag:
277 elevator_input = true;
278 elevator_input_file = aircraft_directory + linetoken3;
279 token4 >> token_value_convert1;
280 token5 >> token_value_convert2;
281 convert_y = uiuc_convert(token_value_convert1);
282 convert_x = uiuc_convert(token_value_convert2);
283 uiuc_1DdataFileReader(elevator_input_file,
284 elevator_input_timeArray,
285 elevator_input_deArray,
286 elevator_input_ntime);
287 token6 >> token_value;
288 elevator_input_startTime = token_value;
291 case aileron_input_flag:
293 aileron_input = true;
294 aileron_input_file = aircraft_directory + linetoken3;
295 token4 >> token_value_convert1;
296 token5 >> token_value_convert2;
297 convert_y = uiuc_convert(token_value_convert1);
298 convert_x = uiuc_convert(token_value_convert2);
299 uiuc_1DdataFileReader(aileron_input_file,
300 aileron_input_timeArray,
301 aileron_input_daArray,
302 aileron_input_ntime);
303 token6 >> token_value;
304 aileron_input_startTime = token_value;
307 case rudder_input_flag:
310 rudder_input_file = aircraft_directory + linetoken3;
311 token4 >> token_value_convert1;
312 token5 >> token_value_convert2;
313 convert_y = uiuc_convert(token_value_convert1);
314 convert_x = uiuc_convert(token_value_convert2);
315 uiuc_1DdataFileReader(rudder_input_file,
316 rudder_input_timeArray,
317 rudder_input_drArray,
319 token6 >> token_value;
320 rudder_input_startTime = token_value;
323 case flap_pos_input_flag:
325 flap_pos_input = true;
326 flap_pos_input_file = aircraft_directory + linetoken3;
327 token4 >> token_value_convert1;
328 token5 >> token_value_convert2;
329 convert_y = uiuc_convert(token_value_convert1);
330 convert_x = uiuc_convert(token_value_convert2);
331 uiuc_1DdataFileReader(flap_pos_input_file,
332 flap_pos_input_timeArray,
333 flap_pos_input_dfArray,
334 flap_pos_input_ntime);
335 token6 >> token_value;
336 flap_pos_input_startTime = token_value;
339 case pilot_elev_no_flag:
341 pilot_elev_no_check = true;
344 case pilot_ail_no_flag:
346 pilot_ail_no_check = true;
349 case pilot_rud_no_flag:
351 pilot_rud_no_check = true;
356 if (check_float(linetoken3))
357 token3 >> token_value;
359 uiuc_warnings_errors(1, *command_line);
362 flap_max = token_value;
367 if (check_float(linetoken3))
368 token3 >> token_value;
370 uiuc_warnings_errors(1, *command_line);
373 flap_rate = token_value;
376 case spoiler_max_flag:
378 if (check_float(linetoken3))
379 token3 >> token_value;
381 uiuc_warnings_errors(1, *command_line);
384 spoiler_max = token_value;
387 case spoiler_rate_flag:
389 if (check_float(linetoken3))
390 token3 >> token_value;
392 uiuc_warnings_errors(1, *command_line);
395 spoiler_rate = token_value;
398 case aileron_sas_KP_flag:
400 if (check_float(linetoken3))
401 token3 >> token_value;
403 uiuc_warnings_errors(1, *command_line);
405 aileron_sas_KP = token_value;
408 case aileron_sas_max_flag:
410 if (check_float(linetoken3))
411 token3 >> token_value;
413 uiuc_warnings_errors(1, *command_line);
414 aileron_sas_max = token_value;
415 use_aileron_sas_max = true;
418 case aileron_stick_gain_flag:
420 if (check_float(linetoken3))
421 token3 >> token_value;
423 uiuc_warnings_errors(1, *command_line);
424 aileron_stick_gain = token_value;
425 use_aileron_stick_gain = true;
428 case elevator_sas_KQ_flag:
430 if (check_float(linetoken3))
431 token3 >> token_value;
433 uiuc_warnings_errors(1, *command_line);
434 elevator_sas_KQ = token_value;
437 case elevator_sas_max_flag:
439 if (check_float(linetoken3))
440 token3 >> token_value;
442 uiuc_warnings_errors(1, *command_line);
443 elevator_sas_max = token_value;
444 use_elevator_sas_max = true;
447 case elevator_sas_min_flag:
449 if (check_float(linetoken3))
450 token3 >> token_value;
452 uiuc_warnings_errors(1, *command_line);
453 elevator_sas_min = token_value;
454 use_elevator_sas_min = true;
457 case elevator_stick_gain_flag:
459 if (check_float(linetoken3))
460 token3 >> token_value;
462 uiuc_warnings_errors(1, *command_line);
463 elevator_stick_gain = token_value;
464 use_elevator_stick_gain = true;
467 case rudder_sas_KR_flag:
469 if (check_float(linetoken3))
470 token3 >> token_value;
472 uiuc_warnings_errors(1, *command_line);
473 rudder_sas_KR = token_value;
476 case rudder_sas_max_flag:
478 if (check_float(linetoken3))
479 token3 >> token_value;
481 uiuc_warnings_errors(1, *command_line);
482 rudder_sas_max = token_value;
483 use_rudder_sas_max = true;
486 case rudder_stick_gain_flag:
488 if (check_float(linetoken3))
489 token3 >> token_value;
491 uiuc_warnings_errors(1, *command_line);
492 rudder_stick_gain = token_value;
493 use_rudder_stick_gain = true;
496 case use_aileron_sas_type1_flag:
498 use_aileron_sas_type1 = true;
501 case use_elevator_sas_type1_flag:
503 use_elevator_sas_type1 = true;
506 case use_rudder_sas_type1_flag:
508 use_rudder_sas_type1 = true;
513 if (check_float(linetoken3))
514 token3 >> token_value;
516 uiuc_warnings_errors(1, *command_line);
518 ap_pah_start_time=token_value;
524 if (check_float(linetoken3))
525 token3 >> token_value;
527 uiuc_warnings_errors(1, *command_line);
529 ap_alh_start_time=token_value;
535 if (check_float(linetoken3))
536 token3 >> token_value;
538 uiuc_warnings_errors(1, *command_line);
540 ap_rah_start_time=token_value;
546 if (check_float(linetoken3))
547 token3 >> token_value;
549 uiuc_warnings_errors(1, *command_line);
551 ap_hh_start_time=token_value;
555 case ap_Theta_ref_flag:
557 if (check_float(linetoken3))
558 token3 >> token_value;
560 uiuc_warnings_errors(1, *command_line);
561 token4 >> token_value_convert1;
562 convert_y = uiuc_convert(token_value_convert1);
564 ap_Theta_ref_rad = token_value * convert_y;
567 case ap_alt_ref_flag:
569 if (check_float(linetoken3))
570 token3 >> token_value;
572 uiuc_warnings_errors(1, *command_line);
574 ap_alt_ref_ft = token_value;
577 case ap_Phi_ref_flag:
579 if (check_float(linetoken3))
580 token3 >> token_value;
582 uiuc_warnings_errors(1, *command_line);
583 token4 >> token_value_convert1;
584 convert_y = uiuc_convert(token_value_convert1);
586 ap_Phi_ref_rad = token_value * convert_y;
589 case ap_Psi_ref_flag:
591 if (check_float(linetoken3))
592 token3 >> token_value;
594 uiuc_warnings_errors(1, *command_line);
595 token4 >> token_value_convert1;
596 convert_y = uiuc_convert(token_value_convert1);
598 ap_Psi_ref_rad = token_value * convert_y;
603 if (ignore_unknown_keywords) {
606 // print error message
607 uiuc_warnings_errors(2, *command_line);