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., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
70 USA or view http://www.gnu.org/copyleft/gpl.html.
72 **********************************************************************/
74 #include <simgear/compiler.h>
76 #if defined( __MWERKS__ )
77 // -dw- optimizer chokes (big-time) trying to optimize humongous
78 // loop/switch statements
79 #pragma optimization_level 0
86 #include "uiuc_menu_controlSurface.h"
96 void parse_controlSurface( const string& linetoken2, const string& linetoken3,
97 const string& linetoken4, const string& linetoken5,
98 const string& linetoken6, const string& linetoken7,
99 const string& linetoken8, const string& linetoken9,
100 const string& linetoken10,
101 const string& aircraft_directory,
102 LIST command_line ) {
104 int token_value_convert1, token_value_convert2;
105 istringstream token3(linetoken3.c_str());
106 istringstream token4(linetoken4.c_str());
107 istringstream token5(linetoken5.c_str());
108 istringstream token6(linetoken6.c_str());
109 istringstream token7(linetoken7.c_str());
110 istringstream token8(linetoken8.c_str());
111 istringstream token9(linetoken9.c_str());
112 istringstream token10(linetoken10.c_str());
114 switch(controlSurface_map[linetoken2])
118 if (check_float(linetoken3))
119 token3 >> token_value;
121 uiuc_warnings_errors(1, *command_line);
125 if (check_float(linetoken4))
126 token4 >> token_value;
128 uiuc_warnings_errors(1, *command_line);
135 if (check_float(linetoken3))
136 token3 >> token_value;
138 uiuc_warnings_errors(1, *command_line);
142 if (check_float(linetoken4))
143 token4 >> token_value;
145 uiuc_warnings_errors(1, *command_line);
152 if (check_float(linetoken3))
153 token3 >> token_value;
155 uiuc_warnings_errors(1, *command_line);
159 if (check_float(linetoken4))
160 token4 >> token_value;
162 uiuc_warnings_errors(1, *command_line);
167 case set_Long_trim_flag:
169 if (check_float(linetoken3))
170 token3 >> token_value;
172 uiuc_warnings_errors(1, *command_line);
174 set_Long_trim = true;
175 elevator_tab = token_value;
178 case set_Long_trim_deg_flag:
180 if (check_float(linetoken3))
181 token3 >> token_value;
183 uiuc_warnings_errors(1, *command_line);
185 set_Long_trim = true;
186 elevator_tab = token_value * DEG_TO_RAD;
189 case zero_Long_trim_flag:
191 zero_Long_trim = true;
194 case elevator_step_flag:
196 // set step input flag
197 elevator_step = true;
199 // read in step angle in degrees and convert
200 if (check_float(linetoken3))
201 token3 >> token_value;
203 uiuc_warnings_errors(1, *command_line);
205 elevator_step_angle = token_value * DEG_TO_RAD;
207 // read in step start time
208 if (check_float(linetoken4))
209 token4 >> token_value;
211 uiuc_warnings_errors(1, *command_line);
213 elevator_step_startTime = token_value;
216 case elevator_singlet_flag:
218 // set singlet input flag
219 elevator_singlet = true;
221 // read in singlet angle in degrees and convert
222 if (check_float(linetoken3))
223 token3 >> token_value;
225 uiuc_warnings_errors(1, *command_line);
227 elevator_singlet_angle = token_value * DEG_TO_RAD;
229 // read in singlet start time
230 if (check_float(linetoken4))
231 token4 >> token_value;
233 uiuc_warnings_errors(1, *command_line);
235 elevator_singlet_startTime = token_value;
237 // read in singlet duration
238 if (check_float(linetoken5))
239 token5 >> token_value;
241 uiuc_warnings_errors(1, *command_line);
243 elevator_singlet_duration = token_value;
246 case elevator_doublet_flag:
248 // set doublet input flag
249 elevator_doublet = true;
251 // read in doublet angle in degrees and convert
252 if (check_float(linetoken3))
253 token3 >> token_value;
255 uiuc_warnings_errors(1, *command_line);
257 elevator_doublet_angle = token_value * DEG_TO_RAD;
259 // read in doublet start time
260 if (check_float(linetoken4))
261 token4 >> token_value;
263 uiuc_warnings_errors(1, *command_line);
265 elevator_doublet_startTime = token_value;
267 // read in doublet duration
268 if (check_float(linetoken5))
269 token5 >> token_value;
271 uiuc_warnings_errors(1, *command_line);
273 elevator_doublet_duration = token_value;
276 case elevator_input_flag:
278 elevator_input = true;
279 elevator_input_file = aircraft_directory + linetoken3;
280 token4 >> token_value_convert1;
281 token5 >> token_value_convert2;
282 convert_y = uiuc_convert(token_value_convert1);
283 convert_x = uiuc_convert(token_value_convert2);
284 uiuc_1DdataFileReader(elevator_input_file,
285 elevator_input_timeArray,
286 elevator_input_deArray,
287 elevator_input_ntime);
288 token6 >> token_value;
289 elevator_input_startTime = token_value;
292 case aileron_input_flag:
294 aileron_input = true;
295 aileron_input_file = aircraft_directory + linetoken3;
296 token4 >> token_value_convert1;
297 token5 >> token_value_convert2;
298 convert_y = uiuc_convert(token_value_convert1);
299 convert_x = uiuc_convert(token_value_convert2);
300 uiuc_1DdataFileReader(aileron_input_file,
301 aileron_input_timeArray,
302 aileron_input_daArray,
303 aileron_input_ntime);
304 token6 >> token_value;
305 aileron_input_startTime = token_value;
308 case rudder_input_flag:
311 rudder_input_file = aircraft_directory + linetoken3;
312 token4 >> token_value_convert1;
313 token5 >> token_value_convert2;
314 convert_y = uiuc_convert(token_value_convert1);
315 convert_x = uiuc_convert(token_value_convert2);
316 uiuc_1DdataFileReader(rudder_input_file,
317 rudder_input_timeArray,
318 rudder_input_drArray,
320 token6 >> token_value;
321 rudder_input_startTime = token_value;
324 case flap_pos_input_flag:
326 flap_pos_input = true;
327 flap_pos_input_file = aircraft_directory + linetoken3;
328 token4 >> token_value_convert1;
329 token5 >> token_value_convert2;
330 convert_y = uiuc_convert(token_value_convert1);
331 convert_x = uiuc_convert(token_value_convert2);
332 uiuc_1DdataFileReader(flap_pos_input_file,
333 flap_pos_input_timeArray,
334 flap_pos_input_dfArray,
335 flap_pos_input_ntime);
336 token6 >> token_value;
337 flap_pos_input_startTime = token_value;
340 case pilot_elev_no_flag:
342 pilot_elev_no_check = true;
345 case pilot_ail_no_flag:
347 pilot_ail_no_check = true;
350 case pilot_rud_no_flag:
352 pilot_rud_no_check = true;
357 if (check_float(linetoken3))
358 token3 >> token_value;
360 uiuc_warnings_errors(1, *command_line);
363 flap_max = token_value;
368 if (check_float(linetoken3))
369 token3 >> token_value;
371 uiuc_warnings_errors(1, *command_line);
374 flap_rate = token_value;
377 case spoiler_max_flag:
379 if (check_float(linetoken3))
380 token3 >> token_value;
382 uiuc_warnings_errors(1, *command_line);
385 spoiler_max = token_value;
388 case spoiler_rate_flag:
390 if (check_float(linetoken3))
391 token3 >> token_value;
393 uiuc_warnings_errors(1, *command_line);
396 spoiler_rate = token_value;
399 case aileron_sas_KP_flag:
401 if (check_float(linetoken3))
402 token3 >> token_value;
404 uiuc_warnings_errors(1, *command_line);
406 aileron_sas_KP = token_value;
409 case aileron_sas_max_flag:
411 if (check_float(linetoken3))
412 token3 >> token_value;
414 uiuc_warnings_errors(1, *command_line);
415 aileron_sas_max = token_value;
416 use_aileron_sas_max = true;
419 case aileron_stick_gain_flag:
421 if (check_float(linetoken3))
422 token3 >> token_value;
424 uiuc_warnings_errors(1, *command_line);
425 aileron_stick_gain = token_value;
426 use_aileron_stick_gain = true;
429 case elevator_sas_KQ_flag:
431 if (check_float(linetoken3))
432 token3 >> token_value;
434 uiuc_warnings_errors(1, *command_line);
435 elevator_sas_KQ = token_value;
438 case elevator_sas_max_flag:
440 if (check_float(linetoken3))
441 token3 >> token_value;
443 uiuc_warnings_errors(1, *command_line);
444 elevator_sas_max = token_value;
445 use_elevator_sas_max = true;
448 case elevator_sas_min_flag:
450 if (check_float(linetoken3))
451 token3 >> token_value;
453 uiuc_warnings_errors(1, *command_line);
454 elevator_sas_min = token_value;
455 use_elevator_sas_min = true;
458 case elevator_stick_gain_flag:
460 if (check_float(linetoken3))
461 token3 >> token_value;
463 uiuc_warnings_errors(1, *command_line);
464 elevator_stick_gain = token_value;
465 use_elevator_stick_gain = true;
468 case rudder_sas_KR_flag:
470 if (check_float(linetoken3))
471 token3 >> token_value;
473 uiuc_warnings_errors(1, *command_line);
474 rudder_sas_KR = token_value;
477 case rudder_sas_max_flag:
479 if (check_float(linetoken3))
480 token3 >> token_value;
482 uiuc_warnings_errors(1, *command_line);
483 rudder_sas_max = token_value;
484 use_rudder_sas_max = true;
487 case rudder_stick_gain_flag:
489 if (check_float(linetoken3))
490 token3 >> token_value;
492 uiuc_warnings_errors(1, *command_line);
493 rudder_stick_gain = token_value;
494 use_rudder_stick_gain = true;
497 case use_aileron_sas_type1_flag:
499 use_aileron_sas_type1 = true;
502 case use_elevator_sas_type1_flag:
504 use_elevator_sas_type1 = true;
507 case use_rudder_sas_type1_flag:
509 use_rudder_sas_type1 = true;
514 if (check_float(linetoken3))
515 token3 >> token_value;
517 uiuc_warnings_errors(1, *command_line);
519 ap_pah_start_time=token_value;
525 if (check_float(linetoken3))
526 token3 >> token_value;
528 uiuc_warnings_errors(1, *command_line);
530 ap_alh_start_time=token_value;
536 if (check_float(linetoken3))
537 token3 >> token_value;
539 uiuc_warnings_errors(1, *command_line);
541 ap_rah_start_time=token_value;
547 if (check_float(linetoken3))
548 token3 >> token_value;
550 uiuc_warnings_errors(1, *command_line);
552 ap_hh_start_time=token_value;
556 case ap_Theta_ref_flag:
558 if (check_float(linetoken3))
559 token3 >> token_value;
561 uiuc_warnings_errors(1, *command_line);
562 token4 >> token_value_convert1;
563 convert_y = uiuc_convert(token_value_convert1);
565 ap_Theta_ref_rad = token_value * convert_y;
568 case ap_alt_ref_flag:
570 if (check_float(linetoken3))
571 token3 >> token_value;
573 uiuc_warnings_errors(1, *command_line);
575 ap_alt_ref_ft = token_value;
578 case ap_Phi_ref_flag:
580 if (check_float(linetoken3))
581 token3 >> token_value;
583 uiuc_warnings_errors(1, *command_line);
584 token4 >> token_value_convert1;
585 convert_y = uiuc_convert(token_value_convert1);
587 ap_Phi_ref_rad = token_value * convert_y;
590 case ap_Psi_ref_flag:
592 if (check_float(linetoken3))
593 token3 >> token_value;
595 uiuc_warnings_errors(1, *command_line);
596 token4 >> token_value_convert1;
597 convert_y = uiuc_convert(token_value_convert1);
599 ap_Psi_ref_rad = token_value * convert_y;
604 if (ignore_unknown_keywords) {
607 // print error message
608 uiuc_warnings_errors(2, *command_line);