1 /**************************************************************************
2 * ls_interface.c -- the FG interface to the LaRCsim routines
3 * This is a heavily modified version of LaRCsim.c
4 * As a result there is much old baggage left in this file.
6 * Originally Written 921230 by Bruce Jackson
7 * Modified by Curtis Olson, started May 1997.
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License as
11 * published by the Free Software Foundation; either version 2 of the
12 * License, or (at your option) any later version.
14 * This program is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 * (Log is kept at end of this file)
25 **************************************************************************/
27 /* Original headers follow: */
29 /***************************************************************************
33 ----------------------------------------------------------------------------
35 FUNCTION: Top level routine for LaRCSIM. Includes
36 global variable declarations.
38 ----------------------------------------------------------------------------
40 MODULE STATUS: Developmental
42 ----------------------------------------------------------------------------
44 GENEALOGY: Written 921230 by Bruce Jackson
46 ----------------------------------------------------------------------------
54 ----------------------------------------------------------------------------
60 930111 Added "progname" variable to keep name of invoking command.
62 931012 Removed altitude < 0. test to support gear development. EBJ
63 931214 Added various pressures (Impact, Dynamic, Static, etc.) EBJ
64 931215 Adopted new generic variable structure. EBJ
65 931218 Added command line options decoding. EBJ
66 940110 Changed file type of matrix file to ".m" EBJ
67 940513 Renamed this routine "LaRCsim.c" from "ls_main.c" EBJ
68 940513 Added time_stamp routine, t_stamp. EBJ
69 950225 Added options flag, 'i', to set I/O output rate. EBJ
70 950306 Added calls to ls_get_settings() and ls_put_settings() EBJ
71 950314 Options flag 'i' now reads IC file; 'o' is output rate EBJ
72 950406 Many changes: added definition of default value macros;
73 removed local variables term_update_hz, model_dt, endtime,
74 substituted sim_control_ globals for these; removed
75 initialization of sim_control_.tape_channels; moved optarg
76 to generic extern; added mod_end_time & mod_buf_size flags
77 and temporary buffer_time and data_rate locals to
78 ls_checkopts(); added additional command line switches '-s'
79 and '-b'; made psuedo-mandatory file names for data output
80 switches; considerable rewrite of logic for setting data
81 buffer length and interleave parameters; updated '-h' help
82 output message; added protection logic to calculations of
83 these parameters; added check of return value on first call
84 to ls_cockpit() so <esc> abort works from initial pause
85 state; added call to ls_unsync() immediately following
86 first ls_sync() call, if paused (to avoid alarm clock
87 timeout); moved call to ls_record() into non-paused
88 multiloop path (was filling buffer with identical data
89 during pause); put check of paused flag before calling sync
90 routine ls_pause(); and added call to exit() on termination.
94 $Original log: LaRCsim.c,v $
95 * Revision 1.4.1.7 1995/04/07 01:04:37 bjax
96 * Many changes made to support storage of sim options from run to run,
97 * as well as restructuring storage buffer sizing and some loop logic
98 * changes. See the modification log for details.
100 * Revision 1.4.1.6 1995/03/29 16:12:09 bjax
101 * Added argument to -o switch; changed run loop to pass dt=0
102 * if in paused mode. EBj
104 * Revision 1.4.1.5 1995/03/15 12:30:20 bjax
105 * Set paused flag to non-zero by default; moved 'i' I/O rate flag
106 * switch to 'o'; made 'i' an initial conditions file switch; added
107 * null string to ls_get_settings() call so that default settings
108 * file will be read. EBJ
110 * Revision 1.4.1.4 1995/03/08 12:31:34 bjax
111 * Added userid retrieval and proper termination of time & date strings.
113 * Revision 1.4.1.3 1995/03/08 12:00:21 bjax
114 * Moved setting of default options to ls_setdefopts from
115 * ls_checkopts; rearranged order of ls_get_settings() call
116 * to between ls_setdefopts and ls_checkopts, so command
117 * line options will override settings file options.
120 * Revision 1.4.1.2 1995/03/06 18:48:49 bjax
121 * Added calles to ls_get_settings() and ls_put_settings(); added
122 * passing of dt and init flags in ls_model(). EBJ
124 * Revision 1.4.1.1 1995/03/03 02:23:08 bjax
125 * Beta version for LaRCsim, version 1.4
127 * Revision 1.3.2.7 1995/02/27 20:00:21 bjax
130 * Revision 1.3.2.6 1995/02/25 16:52:31 bjax
131 * Added 'i' option to set I/O iteration rate. EBJ
133 * Revision 1.3.2.5 1995/02/06 19:33:15 bjax
136 * Revision 1.3.2.4 1995/02/06 19:30:30 bjax
137 * Oops, should really compile these before checking in. Fixed capitailzation of
138 * Initialize in ls_loop parameter.
140 * Revision 1.3.2.3 1995/02/06 19:25:44 bjax
141 * Moved main simulation loop into subroutine ls_loop. EBJ
143 * Revision 1.3.2.2 1994/05/20 21:46:45 bjax
144 * A little better logic on checking for option arguments.
146 * Revision 1.3.2.1 1994/05/20 19:29:51 bjax
147 * Added options arguments to command line.
149 * Revision 1.3.1.16 1994/05/17 15:08:45 bjax
150 * Corrected so that full name to directyr and file is saved
151 * in new global variable "fullname"; this allows symbol table
152 * to be extracted when in another default directory.
154 * Revision 1.3.1.15 1994/05/17 14:50:24 bjax
157 * Revision 1.3.1.14 1994/05/17 14:50:23 bjax
160 * Revision 1.3.1.13 1994/05/17 14:50:21 bjax
163 * Revision 1.3.1.12 1994/05/17 14:50:20 bjax
166 * Revision 1.3.1.11 1994/05/17 13:56:24 bjax
169 * Revision 1.3.1.10 1994/05/17 13:23:03 bjax
172 * Revision 1.3.1.9 1994/05/17 13:20:03 bjax
175 * Revision 1.3.1.8 1994/05/17 13:19:23 bjax
178 * Revision 1.3.1.7 1994/05/17 13:18:29 bjax
181 * Revision 1.3.1.6 1994/05/17 13:16:30 bjax
184 * Revision 1.3.1.5 1994/05/17 13:03:44 bjax
187 * Revision 1.3.1.4 1994/05/17 13:03:38 bjax
190 * Revision 1.3.1.3 1994/05/17 12:49:08 bjax
193 * Revision 1.3.1.2 1994/05/17 12:48:45 bjax
194 * *** empty log message ***
196 * Revision 1.3.1.1 1994/05/13 20:39:17 bjax
199 * Revision 1.2 1994/05/13 19:51:50 bjax
203 ----------------------------------------------------------------------------
207 ----------------------------------------------------------------------------
211 ----------------------------------------------------------------------------
215 ----------------------------------------------------------------------------
219 ----------------------------------------------------------------------------
223 --------------------------------------------------------------------------*/
225 /* #include <sys/types.h> */
226 /* #include <sys/stat.h> */
232 #include "ls_types.h"
233 #include "ls_constants.h"
234 #include "ls_geodesy.h"
235 #include "ls_generic.h"
236 #include "ls_sim_control.h"
237 #include "ls_cockpit.h"
238 #include "ls_interface.h"
240 #include "ls_accel.h"
242 #include "ls_model.h"
245 // #include <Flight/flight.h>
246 // #include <Aircraft/aircraft.h>
247 // #include <Debug/fg_debug.h>
250 /* global variable declarations */
254 SIM_CONTROL sim_control_;
259 #define DEFAULT_TERM_UPDATE_HZ 20
260 #define DEFAULT_MODEL_HZ 120
261 #define DEFAULT_END_TIME 3600.
262 #define DEFAULT_SAVE_SPACING 8
263 #define DEFAULT_WRITE_SPACING 1
264 #define MAX_FILE_NAME_LENGTH 80
266 /* global variables */
271 /* file variables - default simulation settings */
273 static double model_dt;
274 static double speedup;
275 static char asc1name[MAX_FILE_NAME_LENGTH] = "run.asc1";
276 static char tabname[MAX_FILE_NAME_LENGTH] = "run.dat";
277 static char fltname[MAX_FILE_NAME_LENGTH] = "run.flt";
278 static char matname[MAX_FILE_NAME_LENGTH] = "run.m";
282 void ls_stamp( void ) {
283 char rcsid[] = "$Id$";
284 char revid[] = "$Revision$";
285 char dateid[] = "$Date$";
290 /* report version of LaRCsim*/
291 printf("\nLaRCsim %s, %s\n\n", revid, dateid);
293 nowtime_t = time( 0 );
294 nowtime = localtime( &nowtime_t ); /* set fields to correct time values */
295 date = (nowtime->tm_year)*10000
296 + (nowtime->tm_mon + 1)*100
297 + (nowtime->tm_mday);
298 sprintf(sim_control_.date_string, "%06d\0", date);
299 sprintf(sim_control_.time_stamp, "%02d:%02d:%02d\0",
300 nowtime->tm_hour, nowtime->tm_min, nowtime->tm_sec);
301 #ifdef COMPILE_THIS_CODE_THIS_USELESS_CODE
302 cuserid( sim_control_.userid ); /* set up user id */
303 #endif /* COMPILE_THIS_CODE_THIS_USELESS_CODE */
307 void ls_setdefopts( void ) {
308 /* set default values for most options */
310 sim_control_.debug = 0; /* change to non-zero if in dbx! */
311 sim_control_.vision = 0;
312 sim_control_.write_av = 0; /* write Agile-Vu '.flt' file */
313 sim_control_.write_mat = 0; /* write matrix-x/matlab script */
314 sim_control_.write_tab = 0; /* write tab delim. history file */
315 sim_control_.write_asc1 = 0; /* write GetData file */
316 sim_control_.save_spacing = DEFAULT_SAVE_SPACING;
317 /* interpolation on recording */
318 sim_control_.write_spacing = DEFAULT_WRITE_SPACING;
319 /* interpolation on output */
320 sim_control_.end_time = DEFAULT_END_TIME;
321 sim_control_.model_hz = DEFAULT_MODEL_HZ;
322 sim_control_.term_update_hz = DEFAULT_TERM_UPDATE_HZ;
323 sim_control_.time_slices = (long int)(DEFAULT_END_TIME * DEFAULT_MODEL_HZ /
324 DEFAULT_SAVE_SPACING);
325 sim_control_.paused = 0;
331 /* return result codes from ls_checkopts */
336 #ifdef COMPILE_THIS_CODE_THIS_USELESS_CODE
341 int ls_checkopts(argc, argv) /* check and set options flags */
347 int mod_end_time = 0;
348 int mod_buf_size = 0;
349 float buffer_time, data_rate;
351 /* set default values */
353 buffer_time = sim_control_.time_slices * sim_control_.save_spacing /
354 sim_control_.model_hz;
355 data_rate = sim_control_.model_hz / sim_control_.save_spacing;
357 while ((c = getopt(argc, argv, "Aa:b:de:f:hi:kmo:r:s:t:x:")) != EOF)
360 if (sim_control_.sim_type == GLmouse)
362 fprintf(stderr, "Cannot specify both keyboard (k) and ACES (A) cockpits option\n");
363 fprintf(stderr, "Keyboard operation assumed.\n");
366 sim_control_.sim_type = cockpit;
369 sim_control_.write_av = 1;
372 strncpy(fltname, optarg, MAX_FILE_NAME_LENGTH);
377 buffer_time = atof(optarg);
378 if (buffer_time <= 0.) opt_err = -1;
382 sim_control_.debug = 1;
385 sim_control_.end_time = atof(optarg);
389 sim_control_.model_hz = atof(optarg);
395 /* ls_get_settings( optarg ); */
398 sim_control_.sim_type = GLmouse;
401 sim_control_.vision = 1;
404 sim_control_.term_update_hz = atof(optarg);
405 if (sim_control_.term_update_hz <= 0.) opt_err = 1;
408 sim_control_.write_mat = 1;
411 strncpy(matname, optarg, MAX_FILE_NAME_LENGTH);
416 data_rate = atof(optarg);
417 if (data_rate <= 0.) opt_err = -1;
420 sim_control_.write_tab = 1;
423 strncpy(tabname, optarg, MAX_FILE_NAME_LENGTH);
428 sim_control_.write_asc1 = 1;
431 strncpy(asc1name, optarg, MAX_FILE_NAME_LENGTH);
442 fprintf(stderr, "Usage: %s [-options]\n", progname);
443 fprintf(stderr, "\n");
444 fprintf(stderr, " where [-options] is zero or more of the following:\n");
445 fprintf(stderr, "\n");
446 fprintf(stderr, " [A|k] Run mode: [A]CES cockpit [default]\n");
447 fprintf(stderr, " or [k]eyboard\n");
448 fprintf(stderr, "\n");
449 fprintf(stderr, " [i <filename>] [i]nitial conditions filename\n");
450 fprintf(stderr, "\n");
451 fprintf(stderr, " [f <value>] Iteration rate [f]requency, Hz (default is %5.2f Hz)\n",
452 sim_control_.model_hz);
453 fprintf(stderr, "\n");
454 fprintf(stderr, " [o <value>] Display [o]utput frequency, Hz (default is %5.2f Hz)\n",
455 sim_control_.term_update_hz);
456 fprintf(stderr, "\n");
457 fprintf(stderr, " [s <value>] Data storage frequency, Hz (default is %5.2f Hz)\n",
459 fprintf(stderr, "\n");
460 fprintf(stderr, " [e <value>] [e]nd time in seconds (default %5.1f seconds)\n",
461 sim_control_.end_time);
462 fprintf(stderr, "\n");
463 fprintf(stderr, " [b <value>] circular time history storage [b]uffer size, in seconds \n");
464 fprintf(stderr, " (default %5.1f seconds) (normally same as end time)\n",
465 sim_control_.time_slices*sim_control_.save_spacing/
466 sim_control_.model_hz);
467 fprintf(stderr, "\n");
468 fprintf(stderr, " [atxr [<filename>]] Output: [a]gile-vu (default name: %s )\n", fltname);
469 fprintf(stderr, " and/or [t]ab delimited ( '' name: %s )\n", tabname);
470 fprintf(stderr, " and/or [x]plot (default name: %s)\n", asc1name);
471 fprintf(stderr, " and/or mat[r]ix script ( '' name: %s )\n", matname);
472 fprintf(stderr, "\n");
476 /* calculate additional controls */
478 sim_control_.save_spacing = (int) (0.5 + sim_control_.model_hz / data_rate);
479 if (sim_control_.save_spacing < 1) sim_control_.save_spacing = 1;
481 sim_control_.time_slices = buffer_time * sim_control_.model_hz /
482 sim_control_.save_spacing;
483 if (sim_control_.time_slices < 2) sim_control_.time_slices = 2;
487 #endif /* COMPILE_THIS_CODE_THIS_USELESS_CODE */
490 void ls_loop( SCALAR dt, int initialize ) {
491 /* printf (" In ls_loop()\n"); */
492 ls_step( dt, initialize );
493 /* if (sim_control_.sim_type == cockpit ) ls_ACES(); */
495 ls_model( dt, initialize );
501 int ls_cockpit( void ) {
504 sim_control_.paused = 0;
506 // c = current_aircraft.controls;
508 // Lat_control = FG_Aileron;
509 // Long_control = FG_Elevator;
510 // Long_trim = FG_Elev_Trim;
511 // Rudder_pedal = FG_Rudder;
512 // Throttle_pct = FG_Throttle[0];
514 /* printf("Mach = %.2f ", Mach_number);
515 printf("%.4f,%.4f,%.2f ", Latitude, Longitude, Altitude);
516 printf("%.2f,%.2f,%.2f\n", Phi, Theta, Psi); */
522 /* Initialize the LaRCsim flight model, dt is the time increment for
523 each subsequent iteration through the EOM */
524 int ls_toplevel_init(double dt, char * aircraft) {
527 ls_setdefopts(); /* set default options */
529 ls_stamp(); /* ID stamp; record time and date of run */
531 if (speedup == 0.0) {
532 fprintf(stderr, "%s: Cannot run with speedup of 0.\n", progname);
536 /* printf("LS pre Init pos = %.2f\n", Latitude); */
540 /* printf("LS post Init pos = %.2f\n", Latitude); */
543 /* Initialize (get) cockpit (controls) settings */
551 /* Run an iteration of the EOM (equations of motion) */
552 int ls_update(int multiloop) {
559 for ( i = 0; i < multiloop; i++ ) {
560 ls_loop( model_dt, 0);
567 /* Set the altitude (force) */
568 int ls_ForceAltitude(double alt_feet) {
570 ls_geod_to_geoc( Latitude, Altitude, &Sea_level_radius, &Lat_geocentric);
571 Radius_to_vehicle = Altitude + Sea_level_radius;
575 /* Flight Gear Modification Log
578 * Revision 1.2 2000/04/10 18:09:41 curt
579 * David Megginson made a few (mostly minor) mods to the LaRCsim files, and
580 * it's now possible to choose the LaRCsim model at runtime, as in
582 * fgfs --aircraft=c172
586 * fgfs --aircraft=uiuc --aircraft-dir=Aircraft-uiuc/Boeing747
588 * I did this so that I could play with the UIUC stuff without losing
589 * Tony's C172 with its flaps, etc. I did my best to respect the design
590 * of the LaRCsim code by staying in C, making only minimal changes, and
591 * not introducing any dependencies on the rest of FlightGear. The
592 * modified files are attached.
594 * Revision 1.1.1.1 1999/06/17 18:07:33 curt
595 * Start of 0.7.x branch
597 * Revision 1.2 1999/04/27 19:28:04 curt
598 * Changes for the MacOS port contributed by Darrell Walisser.
600 * Revision 1.1.1.1 1999/04/05 21:32:45 curt
601 * Start of 0.6.x branch.
603 * Revision 1.25 1999/01/19 20:57:02 curt
604 * MacOS portability changes contributed by "Robert Puyol" <puyol@abvent.fr>
606 * Revision 1.24 1998/12/14 13:27:47 curt
607 * Removed some old, outdated, no longer needed code.
609 * Revision 1.23 1998/10/16 23:27:44 curt
612 * Revision 1.22 1998/09/29 02:02:59 curt
613 * Added a brake + autopilot mods.
615 * Revision 1.21 1998/08/22 14:49:56 curt
616 * Attempting to iron out seg faults and crashes.
617 * Did some shuffling to fix a initialization order problem between view
618 * position, scenery elevation.
620 * Revision 1.20 1998/07/12 03:11:03 curt
621 * Removed some printf()'s.
622 * Fixed the autopilot integration so it should be able to update it's control
623 * positions every time the internal flight model loop is run, and not just
624 * once per rendered frame.
625 * Added a routine to do the necessary stuff to force an arbitrary altitude
627 * Gave the Navion engine just a tad more power.
629 * Revision 1.19 1998/05/11 18:17:28 curt
630 * Output message tweaking.
632 * Revision 1.18 1998/04/21 16:59:38 curt
633 * Integrated autopilot.
634 * Prepairing for C++ integration.
636 * Revision 1.17 1998/02/23 19:07:58 curt
637 * Incorporated Durk's Astro/ tweaks. Includes unifying the sun position
638 * calculation code between sun display, and other FG sections that use this
639 * for things like lighting.
641 * Revision 1.16 1998/02/07 15:29:38 curt
642 * Incorporated HUD changes and struct/typedef changes from Charlie Hotchkiss
643 * <chotchkiss@namg.us.anritsu.com>
645 * Revision 1.15 1998/01/22 22:03:47 curt
646 * Removed #include <sys/stat.h>
648 * Revision 1.14 1998/01/19 19:27:04 curt
649 * Merged in make system changes from Bob Kuehne <rpk@sgi.com>
650 * This should simplify things tremendously.
652 * Revision 1.13 1998/01/19 18:40:26 curt
653 * Tons of little changes to clean up the code and to remove fatal errors
654 * when building with the c++ compiler.
656 * Revision 1.12 1998/01/06 01:20:16 curt
657 * Tweaks to help building with MSVC++
659 * Revision 1.11 1998/01/05 22:19:26 curt
660 * #ifdef'd out some unused code that was problematic for MSVC++ to compile.
662 * Revision 1.10 1997/12/10 22:37:43 curt
663 * Prepended "fg" on the name of all global structures that didn't have it yet.
664 * i.e. "struct WEATHER {}" became "struct fgWEATHER {}"
666 * Revision 1.9 1997/08/27 03:30:08 curt
667 * Changed naming scheme of basic shared structures.
669 * Revision 1.8 1997/06/21 17:12:50 curt
670 * Capitalized subdirectory names.
672 * Revision 1.7 1997/05/31 19:16:28 curt
673 * Elevator trim added.
675 * Revision 1.6 1997/05/31 04:13:53 curt
678 * Continuing work on the LaRCsim flight model integration.
679 * Added some MSFS-like keyboard input handling.
681 * Revision 1.5 1997/05/30 23:26:25 curt
682 * Added elevator/aileron controls.
684 * Revision 1.4 1997/05/30 19:30:15 curt
685 * The LaRCsim flight model is starting to look like it is working.
687 * Revision 1.3 1997/05/30 03:54:12 curt
688 * Made a bit more progress towards integrating the LaRCsim flight model.
690 * Revision 1.2 1997/05/29 22:39:59 curt
691 * Working on incorporating the LaRCsim flight model.
693 * Revision 1.1 1997/05/29 00:09:57 curt
694 * Initial Flight Gear revision.