]> git.mxchange.org Git - flightgear.git/blob - LaRCsim/ls_interface.c
Incorporated HUD changes and struct/typedef changes from Charlie Hotchkiss
[flightgear.git] / LaRCsim / ls_interface.c
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.
5  *
6  * Originally Written 921230 by Bruce Jackson
7  * Modified by Curtis Olson, started May 1997.
8  *
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.
13  *
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.
18  *
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.
22  *
23  * $Id$
24  * (Log is kept at end of this file)
25  **************************************************************************/
26
27 /* Original headers follow: */
28
29 /***************************************************************************
30
31         TITLE:          LaRCsim.c
32         
33 ----------------------------------------------------------------------------
34
35         FUNCTION:       Top level routine for LaRCSIM.  Includes
36                         global variable declarations.
37
38 ----------------------------------------------------------------------------
39
40         MODULE STATUS:  Developmental
41
42 ----------------------------------------------------------------------------
43
44         GENEALOGY:      Written 921230 by Bruce Jackson
45
46 ----------------------------------------------------------------------------
47
48         DESIGNED BY:    EBJ
49         
50         CODED BY:       EBJ
51         
52         MAINTAINED BY:  EBJ
53
54 ----------------------------------------------------------------------------
55
56         MODIFICATION HISTORY:
57         
58         DATE    PURPOSE                                         BY
59
60         930111  Added "progname" variable to keep name of invoking command.
61                                                                         EBJ
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.
91
92
93 $Header$
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.
99  *
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
103  *
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
109  *
110  * Revision 1.4.1.4  1995/03/08  12:31:34  bjax
111  * Added userid retrieval and proper termination of time & date strings.
112  *
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.
118  * EBJ
119  *
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
123  *
124  * Revision 1.4.1.1  1995/03/03  02:23:08  bjax
125  * Beta version for LaRCsim, version 1.4
126  *
127  * Revision 1.3.2.7  1995/02/27  20:00:21  bjax
128  * Rebuilt LaRCsim
129  *
130  * Revision 1.3.2.6  1995/02/25  16:52:31  bjax
131  * Added 'i' option to set I/O iteration rate. EBJ
132  *
133  * Revision 1.3.2.5  1995/02/06  19:33:15  bjax
134  * Rebuilt LaRCsim
135  *
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.
139  *
140  * Revision 1.3.2.3  1995/02/06  19:25:44  bjax
141  * Moved main simulation loop into subroutine ls_loop. EBJ
142  *
143  * Revision 1.3.2.2  1994/05/20  21:46:45  bjax
144  * A little better logic on checking for option arguments.
145  *
146  * Revision 1.3.2.1  1994/05/20  19:29:51  bjax
147  * Added options arguments to command line.
148  *
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.
153  *
154  * Revision 1.3.1.15  1994/05/17  14:50:24  bjax
155  * Rebuilt LaRCsim
156  *
157  * Revision 1.3.1.14  1994/05/17  14:50:23  bjax
158  * Rebuilt LaRCsim
159  *
160  * Revision 1.3.1.13  1994/05/17  14:50:21  bjax
161  * Rebuilt LaRCsim
162  *
163  * Revision 1.3.1.12  1994/05/17  14:50:20  bjax
164  * Rebuilt LaRCsim
165  *
166  * Revision 1.3.1.11  1994/05/17  13:56:24  bjax
167  * Rebuilt LaRCsim
168  *
169  * Revision 1.3.1.10  1994/05/17  13:23:03  bjax
170  * Rebuilt LaRCsim
171  *
172  * Revision 1.3.1.9  1994/05/17  13:20:03  bjax
173  * Rebuilt LaRCsim
174  *
175  * Revision 1.3.1.8  1994/05/17  13:19:23  bjax
176  * Rebuilt LaRCsim
177  *
178  * Revision 1.3.1.7  1994/05/17  13:18:29  bjax
179  * Rebuilt LaRCsim
180  *
181  * Revision 1.3.1.6  1994/05/17  13:16:30  bjax
182  * Rebuilt LaRCsim
183  *
184  * Revision 1.3.1.5  1994/05/17  13:03:44  bjax
185  * Rebuilt LaRCsim
186  *
187  * Revision 1.3.1.4  1994/05/17  13:03:38  bjax
188  * Rebuilt LaRCsim
189  *
190  * Revision 1.3.1.3  1994/05/17  12:49:08  bjax
191  * Rebuilt LaRCsim
192  *
193  * Revision 1.3.1.2  1994/05/17  12:48:45  bjax
194  * *** empty log message ***
195  *
196  * Revision 1.3.1.1  1994/05/13  20:39:17  bjax
197  * Top of 1.3 branch.
198  *
199  * Revision 1.2  1994/05/13  19:51:50  bjax
200  * Skip rev
201  *
202
203 ----------------------------------------------------------------------------
204
205         REFERENCES:
206
207 ----------------------------------------------------------------------------
208
209         CALLED BY:
210
211 ----------------------------------------------------------------------------
212
213         CALLS TO:
214
215 ----------------------------------------------------------------------------
216
217         INPUTS:
218
219 ----------------------------------------------------------------------------
220
221         OUTPUTS:
222
223 --------------------------------------------------------------------------*/
224
225 #include <sys/types.h>
226 /* #include <sys/stat.h> */
227 #include <stdlib.h>
228 #include <stdio.h>
229 #include <math.h>
230 #include <time.h>
231
232 #include "ls_types.h"
233 #include "ls_constants.h"
234 #include "ls_generic.h"
235 #include "ls_sim_control.h"
236 #include "ls_cockpit.h"
237 #include "ls_interface.h"
238 #include "ls_step.h"
239 #include "ls_accel.h"
240 #include "ls_aux.h"
241 #include "ls_model.h"
242 #include "ls_init.h"
243 #include <Flight/flight.h>
244 #include <Aircraft/aircraft.h>
245
246 /* global variable declarations */
247
248 /* TAPE         *Tape; */
249 GENERIC         generic_;
250 SIM_CONTROL     sim_control_;
251 COCKPIT         cockpit_;
252
253 SCALAR          Simtime;
254
255 /* #define DEFAULT_TERM_UPDATE_HZ 20 */ /* original value */
256 #define DEFAULT_TERM_UPDATE_HZ 20
257 #define DEFAULT_MODEL_HZ 120
258 #define DEFAULT_END_TIME 3600.
259 #define DEFAULT_SAVE_SPACING 8
260 #define DEFAULT_WRITE_SPACING 1
261 #define MAX_FILE_NAME_LENGTH 80
262
263 /* global variables */
264
265 char    *progname;
266 char    *fullname;
267
268 /* file variables - default simulation settings */
269
270 static double model_dt;
271 static double speedup;
272 static char  asc1name[MAX_FILE_NAME_LENGTH] = "run.asc1";
273 static char  tabname[MAX_FILE_NAME_LENGTH]  = "run.dat";
274 static char  fltname[MAX_FILE_NAME_LENGTH]  = "run.flt";
275 static char  matname[MAX_FILE_NAME_LENGTH]  = "run.m";
276
277
278
279 void ls_stamp( void ) {
280     char rcsid[] = "$Id$";
281     char revid[] = "$Revision$";
282     char dateid[] = "$Date$";
283     struct tm *nowtime;
284     time_t nowtime_t;
285     long date;
286     
287     /* report version of LaRCsim*/
288     printf("\nLaRCsim %s, %s\n\n", revid, dateid); 
289     
290     nowtime_t = time( 0 );
291     nowtime = localtime( &nowtime_t ); /* set fields to correct time values */
292     date = (nowtime->tm_year)*10000 
293          + (nowtime->tm_mon + 1)*100
294          + (nowtime->tm_mday);
295     sprintf(sim_control_.date_string, "%06d\0", date);
296     sprintf(sim_control_.time_stamp, "%02d:%02d:%02d\0", 
297         nowtime->tm_hour, nowtime->tm_min, nowtime->tm_sec);
298 #ifdef COMPILE_THIS_CODE_THIS_USELESS_CODE
299     cuserid( sim_control_.userid );     /* set up user id */
300 #endif /* COMPILE_THIS_CODE_THIS_USELESS_CODE */
301     return;
302 }
303
304 void ls_setdefopts( void ) {
305     /* set default values for most options */
306
307     sim_control_.debug = 0;             /* change to non-zero if in dbx! */
308     sim_control_.vision = 0;
309     sim_control_.write_av = 0;          /* write Agile-Vu '.flt' file */
310     sim_control_.write_mat = 0;         /* write matrix-x/matlab script */
311     sim_control_.write_tab = 0;         /* write tab delim. history file */
312     sim_control_.write_asc1 = 0;        /* write GetData file */
313     sim_control_.save_spacing = DEFAULT_SAVE_SPACING;   
314                                         /* interpolation on recording */
315     sim_control_.write_spacing = DEFAULT_WRITE_SPACING; 
316                                         /* interpolation on output */
317     sim_control_.end_time = DEFAULT_END_TIME;
318     sim_control_.model_hz = DEFAULT_MODEL_HZ;
319     sim_control_.term_update_hz = DEFAULT_TERM_UPDATE_HZ;
320     sim_control_.time_slices = (long int)(DEFAULT_END_TIME * DEFAULT_MODEL_HZ / 
321         DEFAULT_SAVE_SPACING);
322     sim_control_.paused = 0;
323
324     speedup = 1.0;
325 }
326
327
328 /* return result codes from ls_checkopts */
329
330 #define OPT_OK 0
331 #define OPT_ERR 1
332
333 #ifdef COMPILE_THIS_CODE_THIS_USELESS_CODE
334
335 extern char *optarg;
336 extern int optind;
337
338 int ls_checkopts(argc, argv)    /* check and set options flags */
339   int argc;
340   char *argv[];
341   {
342     int c;
343     int opt_err = 0;
344     int mod_end_time = 0;
345     int mod_buf_size = 0;
346     float buffer_time, data_rate;
347
348     /* set default values */
349
350     buffer_time = sim_control_.time_slices * sim_control_.save_spacing / 
351         sim_control_.model_hz;
352     data_rate   = sim_control_.model_hz / sim_control_.save_spacing;
353
354     while ((c = getopt(argc, argv, "Aa:b:de:f:hi:kmo:r:s:t:x:")) != EOF)
355         switch (c) {
356             case 'A':
357                 if (sim_control_.sim_type == GLmouse)
358                   {
359                     fprintf(stderr, "Cannot specify both keyboard (k) and ACES (A) cockpits option\n");
360                     fprintf(stderr, "Keyboard operation assumed.\n");
361                     break;
362                   }
363                 sim_control_.sim_type = cockpit;
364                 break;
365             case 'a':
366                 sim_control_.write_av = 1;
367                 if (optarg != NULL)
368                 if (*optarg != '-') 
369                     strncpy(fltname, optarg, MAX_FILE_NAME_LENGTH);
370                 else
371                     optind--;
372                 break;
373             case 'b':   
374                 buffer_time = atof(optarg);
375                 if (buffer_time <= 0.) opt_err = -1;
376                 mod_buf_size++;
377                 break;
378             case 'd':
379                 sim_control_.debug = 1;
380                 break;
381             case 'e':
382                 sim_control_.end_time = atof(optarg);
383                 mod_end_time++;
384                 break;
385             case 'f':
386                 sim_control_.model_hz = atof(optarg);
387                 break;
388             case 'h': 
389                 opt_err = 1;
390                 break;
391             case 'i':
392                 /* ls_get_settings( optarg ); */
393                 break;
394             case 'k':
395                 sim_control_.sim_type = GLmouse;
396                 break;
397             case 'm':
398                 sim_control_.vision = 1;
399                 break;
400             case 'o': 
401                 sim_control_.term_update_hz = atof(optarg);
402                 if (sim_control_.term_update_hz <= 0.) opt_err = 1;
403                 break;
404             case 'r':
405                 sim_control_.write_mat = 1;
406                 if (optarg != NULL)
407                 if (*optarg != '-') 
408                     strncpy(matname, optarg, MAX_FILE_NAME_LENGTH);
409                 else
410                     optind--;
411                 break;
412             case 's':
413                 data_rate = atof(optarg);
414                 if (data_rate <= 0.) opt_err = -1;
415                 break;
416             case 't':
417                 sim_control_.write_tab = 1;
418                 if (optarg != NULL)
419                 if (*optarg != '-') 
420                     strncpy(tabname, optarg, MAX_FILE_NAME_LENGTH);
421                 else
422                     optind--;
423                 break;
424             case 'x':
425                 sim_control_.write_asc1 = 1;
426                 if (optarg != NULL)
427                 if (*optarg != '-') 
428                     strncpy(asc1name, optarg, MAX_FILE_NAME_LENGTH);
429                 else
430                     optind--;
431                 break;
432             default:
433                 opt_err = 1;
434             
435         }
436
437     if (opt_err)
438       {
439         fprintf(stderr, "Usage: %s [-options]\n", progname);
440         fprintf(stderr, "\n");
441         fprintf(stderr, "  where [-options] is zero or more of the following:\n");
442         fprintf(stderr, "\n");
443         fprintf(stderr, "  [A|k]           Run mode: [A]CES cockpit   [default]\n");
444         fprintf(stderr, "                         or [k]eyboard\n");
445         fprintf(stderr, "\n");
446         fprintf(stderr, "  [i <filename>]  [i]nitial conditions filename\n");
447         fprintf(stderr, "\n");
448         fprintf(stderr, "  [f <value>]     Iteration rate [f]requency, Hz (default is %5.2f Hz)\n", 
449                                                 sim_control_.model_hz);
450         fprintf(stderr, "\n");
451         fprintf(stderr, "  [o <value>]     Display [o]utput frequency, Hz (default is %5.2f Hz)\n", 
452                                                 sim_control_.term_update_hz);
453         fprintf(stderr, "\n");
454         fprintf(stderr, "  [s <value>]     Data storage frequency, Hz (default is %5.2f Hz)\n",
455                                                 data_rate);
456         fprintf(stderr, "\n");
457         fprintf(stderr, "  [e <value>]     [e]nd time in seconds (default %5.1f seconds)\n", 
458                                                 sim_control_.end_time);
459         fprintf(stderr, "\n");
460         fprintf(stderr, "  [b <value>]     circular time history storage [b]uffer size, in seconds \n");
461         fprintf(stderr, "                  (default %5.1f seconds) (normally same as end time)\n", 
462                                                 sim_control_.time_slices*sim_control_.save_spacing/
463                                                         sim_control_.model_hz);
464         fprintf(stderr, "\n");
465         fprintf(stderr, "  [atxr [<filename>]] Output: [a]gile-vu  (default name: %s )\n", fltname);
466         fprintf(stderr, "                       and/or [t]ab delimited ( '' name: %s )\n", tabname);
467         fprintf(stderr, "                       and/or [x]plot     (default name: %s)\n", asc1name);
468         fprintf(stderr, "                       and/or mat[r]ix script ( '' name: %s   )\n", matname);
469         fprintf(stderr, "\n");
470         return OPT_ERR;
471       }
472
473 /* calculate additional controls */
474
475     sim_control_.save_spacing = (int) (0.5 + sim_control_.model_hz / data_rate);
476     if (sim_control_.save_spacing < 1) sim_control_.save_spacing = 1;
477
478     sim_control_.time_slices = buffer_time * sim_control_.model_hz / 
479         sim_control_.save_spacing;
480     if (sim_control_.time_slices < 2) sim_control_.time_slices = 2;
481          
482     return OPT_OK;
483   }
484 #endif /* COMPILE_THIS_CODE_THIS_USELESS_CODE */
485
486
487 void ls_loop( SCALAR dt, int initialize ) {
488     /* printf ("  In ls_loop()\n"); */
489     ls_step( dt, initialize );
490     /* if (sim_control_.sim_type == cockpit ) ls_ACES();  */
491     ls_aux();
492     ls_model( dt, initialize );
493     ls_accel();
494 }
495
496
497
498 int ls_cockpit( void ) {
499     fgCONTROLS *c;
500
501     sim_control_.paused = 0;
502
503     c = current_aircraft.controls;
504
505     Lat_control = FG_Aileron;
506     Long_control = FG_Elevator;
507     Long_trim = FG_Elev_Trim;
508     Rudder_pedal = FG_Rudder;
509     Throttle_pct = FG_Throttle[0];
510
511     /* printf("Mach = %.2f  ", Mach_number);
512     printf("%.4f,%.4f,%.2f  ", Latitude, Longitude, Altitude);
513     printf("%.2f,%.2f,%.2f\n", Phi, Theta, Psi); */
514
515     return( 0 );
516 }
517
518
519 /* Initialize the LaRCsim flight model, dt is the time increment for
520    each subsequent iteration through the EOM */
521 int fgLaRCsimInit(double dt) {
522     model_dt = dt;
523
524     ls_setdefopts();            /* set default options */
525         
526     ls_stamp();   /* ID stamp; record time and date of run */
527
528     if (speedup == 0.0) {
529         fprintf(stderr, "%s: Cannot run with speedup of 0.\n", progname);
530         return 1;
531     }
532
533     printf("LS pre Init pos = %.2f\n", Latitude);
534
535     ls_init();
536
537     printf("LS post Init pos = %.2f\n", Latitude);
538
539     if (speedup > 0) {
540         /* Initialize (get) cockpit (controls) settings */
541         ls_cockpit();
542     }
543
544     return(1);
545 }
546
547
548 /* Run an iteration of the EOM (equations of motion) */
549 int fgLaRCsimUpdate(int multiloop) {
550     int i;
551
552     if (speedup > 0) {
553         ls_cockpit();
554     }
555
556     for ( i = 0; i < multiloop; i++ ) {
557         ls_loop( model_dt, 0);
558     }
559
560     return(1);
561 }
562
563
564 /* Convert from the fgFLIGHT struct to the LaRCsim generic_ struct */
565 int fgFlight_2_LaRCsim (fgFLIGHT *f) {
566     Mass =      FG_Mass;
567     I_xx =      FG_I_xx;
568     I_yy =      FG_I_yy;
569     I_zz =      FG_I_zz;
570     I_xz =      FG_I_xz;
571     Dx_pilot =  FG_Dx_pilot;
572     Dy_pilot =  FG_Dy_pilot;
573     Dz_pilot =  FG_Dz_pilot;
574     Dx_cg =     FG_Dx_cg;
575     Dy_cg =     FG_Dy_cg;
576     Dz_cg =     FG_Dz_cg;
577     F_X =       FG_F_X;
578     F_Y =       FG_F_Y;
579     F_Z =       FG_F_Z;
580     F_north =   FG_F_north;
581     F_east =    FG_F_east;
582     F_down =    FG_F_down;
583     F_X_aero =  FG_F_X_aero;
584     F_Y_aero =  FG_F_Y_aero;
585     F_Z_aero =  FG_F_Z_aero;
586     F_X_engine =        FG_F_X_engine;
587     F_Y_engine =        FG_F_Y_engine;
588     F_Z_engine =        FG_F_Z_engine;
589     F_X_gear =  FG_F_X_gear;
590     F_Y_gear =  FG_F_Y_gear;
591     F_Z_gear =  FG_F_Z_gear;
592     M_l_rp =    FG_M_l_rp;
593     M_m_rp =    FG_M_m_rp;
594     M_n_rp =    FG_M_n_rp;
595     M_l_cg =    FG_M_l_cg;
596     M_m_cg =    FG_M_m_cg;
597     M_n_cg =    FG_M_n_cg;
598     M_l_aero =  FG_M_l_aero;
599     M_m_aero =  FG_M_m_aero;
600     M_n_aero =  FG_M_n_aero;
601     M_l_engine =        FG_M_l_engine;
602     M_m_engine =        FG_M_m_engine;
603     M_n_engine =        FG_M_n_engine;
604     M_l_gear =  FG_M_l_gear;
605     M_m_gear =  FG_M_m_gear;
606     M_n_gear =  FG_M_n_gear;
607     V_dot_north =       FG_V_dot_north;
608     V_dot_east =        FG_V_dot_east;
609     V_dot_down =        FG_V_dot_down;
610     U_dot_body =        FG_U_dot_body;
611     V_dot_body =        FG_V_dot_body;
612     W_dot_body =        FG_W_dot_body;
613     A_X_cg =    FG_A_X_cg;
614     A_Y_cg =    FG_A_Y_cg;
615     A_Z_cg =    FG_A_Z_cg;
616     A_X_pilot = FG_A_X_pilot;
617     A_Y_pilot = FG_A_Y_pilot;
618     A_Z_pilot = FG_A_Z_pilot;
619     N_X_cg =    FG_N_X_cg;
620     N_Y_cg =    FG_N_Y_cg;
621     N_Z_cg =    FG_N_Z_cg;
622     N_X_pilot = FG_N_X_pilot;
623     N_Y_pilot = FG_N_Y_pilot;
624     N_Z_pilot = FG_N_Z_pilot;
625     P_dot_body =        FG_P_dot_body;
626     Q_dot_body =        FG_Q_dot_body;
627     R_dot_body =        FG_R_dot_body;
628     V_north =   FG_V_north;
629     V_east =    FG_V_east;
630     V_down =    FG_V_down;
631     V_north_rel_ground =        FG_V_north_rel_ground;
632     V_east_rel_ground = FG_V_east_rel_ground;
633     V_down_rel_ground = FG_V_down_rel_ground;
634     V_north_airmass =   FG_V_north_airmass;
635     V_east_airmass =    FG_V_east_airmass;
636     V_down_airmass =    FG_V_down_airmass;
637     V_north_rel_airmass =       FG_V_north_rel_airmass;
638     V_east_rel_airmass =        FG_V_east_rel_airmass;
639     V_down_rel_airmass =        FG_V_down_rel_airmass;
640     U_gust =    FG_U_gust;
641     V_gust =    FG_V_gust;
642     W_gust =    FG_W_gust;
643     U_body =    FG_U_body;
644     V_body =    FG_V_body;
645     W_body =    FG_W_body;
646     V_rel_wind =        FG_V_rel_wind;
647     V_true_kts =        FG_V_true_kts;
648     V_rel_ground =      FG_V_rel_ground;
649     V_inertial =        FG_V_inertial;
650     V_ground_speed =    FG_V_ground_speed;
651     V_equiv =   FG_V_equiv;
652     V_equiv_kts =       FG_V_equiv_kts;
653     V_calibrated =      FG_V_calibrated;
654     V_calibrated_kts =  FG_V_calibrated_kts;
655     P_body =    FG_P_body;
656     Q_body =    FG_Q_body;
657     R_body =    FG_R_body;
658     P_local =   FG_P_local;
659     Q_local =   FG_Q_local;
660     R_local =   FG_R_local;
661     P_total =   FG_P_total;
662     Q_total =   FG_Q_total;
663     R_total =   FG_R_total;
664     Phi_dot =   FG_Phi_dot;
665     Theta_dot = FG_Theta_dot;
666     Psi_dot =   FG_Psi_dot;
667     Latitude_dot =      FG_Latitude_dot;
668     Longitude_dot =     FG_Longitude_dot;
669     Radius_dot =        FG_Radius_dot;
670     Lat_geocentric =    FG_Lat_geocentric;
671     Lon_geocentric =    FG_Lon_geocentric;
672     Radius_to_vehicle = FG_Radius_to_vehicle;
673     Latitude =  FG_Latitude;
674     Longitude = FG_Longitude;
675     Altitude =  FG_Altitude;
676     Phi =       FG_Phi;
677     Theta =     FG_Theta;
678     Psi =       FG_Psi;
679     T_local_to_body_11 =        FG_T_local_to_body_11;
680     T_local_to_body_12 =        FG_T_local_to_body_12;
681     T_local_to_body_13 =        FG_T_local_to_body_13;
682     T_local_to_body_21 =        FG_T_local_to_body_21;
683     T_local_to_body_22 =        FG_T_local_to_body_22;
684     T_local_to_body_23 =        FG_T_local_to_body_23;
685     T_local_to_body_31 =        FG_T_local_to_body_31;
686     T_local_to_body_32 =        FG_T_local_to_body_32;
687     T_local_to_body_33 =        FG_T_local_to_body_33;
688     Gravity =   FG_Gravity;
689     Centrifugal_relief =        FG_Centrifugal_relief;
690     Alpha =     FG_Alpha;
691     Beta =      FG_Beta;
692     Alpha_dot = FG_Alpha_dot;
693     Beta_dot =  FG_Beta_dot;
694     Cos_alpha = FG_Cos_alpha;
695     Sin_alpha = FG_Sin_alpha;
696     Cos_beta =  FG_Cos_beta;
697     Sin_beta =  FG_Sin_beta;
698     Cos_phi =   FG_Cos_phi;
699     Sin_phi =   FG_Sin_phi;
700     Cos_theta = FG_Cos_theta;
701     Sin_theta = FG_Sin_theta;
702     Cos_psi =   FG_Cos_psi;
703     Sin_psi =   FG_Sin_psi;
704     Gamma_vert_rad =    FG_Gamma_vert_rad;
705     Gamma_horiz_rad =   FG_Gamma_horiz_rad;
706     Sigma =     FG_Sigma;
707     Density =   FG_Density;
708     V_sound =   FG_V_sound;
709     Mach_number =       FG_Mach_number;
710     Static_pressure =   FG_Static_pressure;
711     Total_pressure =    FG_Total_pressure;
712     Impact_pressure =   FG_Impact_pressure;
713     Dynamic_pressure =  FG_Dynamic_pressure;
714     Static_temperature =        FG_Static_temperature;
715     Total_temperature = FG_Total_temperature;
716     Sea_level_radius =  FG_Sea_level_radius;
717     Earth_position_angle =      FG_Earth_position_angle;
718     Runway_altitude =   FG_Runway_altitude;
719     Runway_latitude =   FG_Runway_latitude;
720     Runway_longitude =  FG_Runway_longitude;
721     Runway_heading =    FG_Runway_heading;
722     Radius_to_rwy =     FG_Radius_to_rwy;
723     D_cg_north_of_rwy = FG_D_cg_north_of_rwy;
724     D_cg_east_of_rwy =  FG_D_cg_east_of_rwy;
725     D_cg_above_rwy =    FG_D_cg_above_rwy;
726     X_cg_rwy =  FG_X_cg_rwy;
727     Y_cg_rwy =  FG_Y_cg_rwy;
728     H_cg_rwy =  FG_H_cg_rwy;
729     D_pilot_north_of_rwy =      FG_D_pilot_north_of_rwy;
730     D_pilot_east_of_rwy =       FG_D_pilot_east_of_rwy;
731     D_pilot_above_rwy = FG_D_pilot_above_rwy;
732     X_pilot_rwy =       FG_X_pilot_rwy;
733     Y_pilot_rwy =       FG_Y_pilot_rwy;
734     H_pilot_rwy =       FG_H_pilot_rwy;
735
736     return( 0 );
737 }
738
739
740 /* Convert from the LaRCsim generic_ struct to the fgFLIGHT struct */
741 int fgLaRCsim_2_Flight (fgFLIGHT *f) {
742     FG_Mass =   Mass;
743     FG_I_xx =   I_xx;
744     FG_I_yy =   I_yy;
745     FG_I_zz =   I_zz;
746     FG_I_xz =   I_xz;
747     FG_Dx_pilot =       Dx_pilot;
748     FG_Dy_pilot =       Dy_pilot;
749     FG_Dz_pilot =       Dz_pilot;
750     FG_Dx_cg =  Dx_cg;
751     FG_Dy_cg =  Dy_cg;
752     FG_Dz_cg =  Dz_cg;
753     FG_F_X =    F_X;
754     FG_F_Y =    F_Y;
755     FG_F_Z =    F_Z;
756     FG_F_north =        F_north;
757     FG_F_east = F_east;
758     FG_F_down = F_down;
759     FG_F_X_aero =       F_X_aero;
760     FG_F_Y_aero =       F_Y_aero;
761     FG_F_Z_aero =       F_Z_aero;
762     FG_F_X_engine =     F_X_engine;
763     FG_F_Y_engine =     F_Y_engine;
764     FG_F_Z_engine =     F_Z_engine;
765     FG_F_X_gear =       F_X_gear;
766     FG_F_Y_gear =       F_Y_gear;
767     FG_F_Z_gear =       F_Z_gear;
768     FG_M_l_rp = M_l_rp;
769     FG_M_m_rp = M_m_rp;
770     FG_M_n_rp = M_n_rp;
771     FG_M_l_cg = M_l_cg;
772     FG_M_m_cg = M_m_cg;
773     FG_M_n_cg = M_n_cg;
774     FG_M_l_aero =       M_l_aero;
775     FG_M_m_aero =       M_m_aero;
776     FG_M_n_aero =       M_n_aero;
777     FG_M_l_engine =     M_l_engine;
778     FG_M_m_engine =     M_m_engine;
779     FG_M_n_engine =     M_n_engine;
780     FG_M_l_gear =       M_l_gear;
781     FG_M_m_gear =       M_m_gear;
782     FG_M_n_gear =       M_n_gear;
783     FG_V_dot_north =    V_dot_north;
784     FG_V_dot_east =     V_dot_east;
785     FG_V_dot_down =     V_dot_down;
786     FG_U_dot_body =     U_dot_body;
787     FG_V_dot_body =     V_dot_body;
788     FG_W_dot_body =     W_dot_body;
789     FG_A_X_cg = A_X_cg;
790     FG_A_Y_cg = A_Y_cg;
791     FG_A_Z_cg = A_Z_cg;
792     FG_A_X_pilot =      A_X_pilot;
793     FG_A_Y_pilot =      A_Y_pilot;
794     FG_A_Z_pilot =      A_Z_pilot;
795     FG_N_X_cg = N_X_cg;
796     FG_N_Y_cg = N_Y_cg;
797     FG_N_Z_cg = N_Z_cg;
798     FG_N_X_pilot =      N_X_pilot;
799     FG_N_Y_pilot =      N_Y_pilot;
800     FG_N_Z_pilot =      N_Z_pilot;
801     FG_P_dot_body =     P_dot_body;
802     FG_Q_dot_body =     Q_dot_body;
803     FG_R_dot_body =     R_dot_body;
804     FG_V_north =        V_north;
805     FG_V_east = V_east;
806     FG_V_down = V_down;
807     FG_V_north_rel_ground =     V_north_rel_ground;
808     FG_V_east_rel_ground =      V_east_rel_ground;
809     FG_V_down_rel_ground =      V_down_rel_ground;
810     FG_V_north_airmass =        V_north_airmass;
811     FG_V_east_airmass = V_east_airmass;
812     FG_V_down_airmass = V_down_airmass;
813     FG_V_north_rel_airmass =    V_north_rel_airmass;
814     FG_V_east_rel_airmass =     V_east_rel_airmass;
815     FG_V_down_rel_airmass =     V_down_rel_airmass;
816     FG_U_gust = U_gust;
817     FG_V_gust = V_gust;
818     FG_W_gust = W_gust;
819     FG_U_body = U_body;
820     FG_V_body = V_body;
821     FG_W_body = W_body;
822     FG_V_rel_wind =     V_rel_wind;
823     FG_V_true_kts =     V_true_kts;
824     FG_V_rel_ground =   V_rel_ground;
825     FG_V_inertial =     V_inertial;
826     FG_V_ground_speed = V_ground_speed;
827     FG_V_equiv =        V_equiv;
828     FG_V_equiv_kts =    V_equiv_kts;
829     FG_V_calibrated =   V_calibrated;
830     FG_V_calibrated_kts =       V_calibrated_kts;
831     FG_P_body = P_body;
832     FG_Q_body = Q_body;
833     FG_R_body = R_body;
834     FG_P_local =        P_local;
835     FG_Q_local =        Q_local;
836     FG_R_local =        R_local;
837     FG_P_total =        P_total;
838     FG_Q_total =        Q_total;
839     FG_R_total =        R_total;
840     FG_Phi_dot =        Phi_dot;
841     FG_Theta_dot =      Theta_dot;
842     FG_Psi_dot =        Psi_dot;
843     FG_Latitude_dot =   Latitude_dot;
844     FG_Longitude_dot =  Longitude_dot;
845     FG_Radius_dot =     Radius_dot;
846     FG_Lat_geocentric = Lat_geocentric;
847     FG_Lon_geocentric = Lon_geocentric;
848     FG_Radius_to_vehicle =      Radius_to_vehicle;
849     FG_Latitude =       Latitude;
850     FG_Longitude =      Longitude;
851     FG_Altitude =       Altitude;
852     FG_Phi =    Phi;
853     FG_Theta =  Theta;
854     FG_Psi =    Psi;
855     FG_T_local_to_body_11 =     T_local_to_body_11;
856     FG_T_local_to_body_12 =     T_local_to_body_12;
857     FG_T_local_to_body_13 =     T_local_to_body_13;
858     FG_T_local_to_body_21 =     T_local_to_body_21;
859     FG_T_local_to_body_22 =     T_local_to_body_22;
860     FG_T_local_to_body_23 =     T_local_to_body_23;
861     FG_T_local_to_body_31 =     T_local_to_body_31;
862     FG_T_local_to_body_32 =     T_local_to_body_32;
863     FG_T_local_to_body_33 =     T_local_to_body_33;
864     FG_Gravity =        Gravity;
865     FG_Centrifugal_relief =     Centrifugal_relief;
866     FG_Alpha =  Alpha;
867     FG_Beta =   Beta;
868     FG_Alpha_dot =      Alpha_dot;
869     FG_Beta_dot =       Beta_dot;
870     FG_Cos_alpha =      Cos_alpha;
871     FG_Sin_alpha =      Sin_alpha;
872     FG_Cos_beta =       Cos_beta;
873     FG_Sin_beta =       Sin_beta;
874     FG_Cos_phi =        Cos_phi;
875     FG_Sin_phi =        Sin_phi;
876     FG_Cos_theta =      Cos_theta;
877     FG_Sin_theta =      Sin_theta;
878     FG_Cos_psi =        Cos_psi;
879     FG_Sin_psi =        Sin_psi;
880     FG_Gamma_vert_rad = Gamma_vert_rad;
881     FG_Gamma_horiz_rad =        Gamma_horiz_rad;
882     FG_Sigma =  Sigma;
883     FG_Density =        Density;
884     FG_V_sound =        V_sound;
885     FG_Mach_number =    Mach_number;
886     FG_Static_pressure =        Static_pressure;
887     FG_Total_pressure = Total_pressure;
888     FG_Impact_pressure =        Impact_pressure;
889     FG_Dynamic_pressure =       Dynamic_pressure;
890     FG_Static_temperature =     Static_temperature;
891     FG_Total_temperature =      Total_temperature;
892     FG_Sea_level_radius =       Sea_level_radius;
893     FG_Earth_position_angle =   Earth_position_angle;
894     FG_Runway_altitude =        Runway_altitude;
895     FG_Runway_latitude =        Runway_latitude;
896     FG_Runway_longitude =       Runway_longitude;
897     FG_Runway_heading = Runway_heading;
898     FG_Radius_to_rwy =  Radius_to_rwy;
899     FG_D_cg_north_of_rwy =      D_cg_north_of_rwy;
900     FG_D_cg_east_of_rwy =       D_cg_east_of_rwy;
901     FG_D_cg_above_rwy = D_cg_above_rwy;
902     FG_X_cg_rwy =       X_cg_rwy;
903     FG_Y_cg_rwy =       Y_cg_rwy;
904     FG_H_cg_rwy =       H_cg_rwy;
905     FG_D_pilot_north_of_rwy =   D_pilot_north_of_rwy;
906     FG_D_pilot_east_of_rwy =    D_pilot_east_of_rwy;
907     FG_D_pilot_above_rwy =      D_pilot_above_rwy;
908     FG_X_pilot_rwy =    X_pilot_rwy;
909     FG_Y_pilot_rwy =    Y_pilot_rwy;
910     FG_H_pilot_rwy =    H_pilot_rwy;
911
912     return ( 0 );
913 }
914
915 /* Flight Gear Modification Log
916  *
917  * $Log$
918  * Revision 1.16  1998/02/07 15:29:38  curt
919  * Incorporated HUD changes and struct/typedef changes from Charlie Hotchkiss
920  * <chotchkiss@namg.us.anritsu.com>
921  *
922  * Revision 1.15  1998/01/22 22:03:47  curt
923  * Removed #include <sys/stat.h>
924  *
925  * Revision 1.14  1998/01/19 19:27:04  curt
926  * Merged in make system changes from Bob Kuehne <rpk@sgi.com>
927  * This should simplify things tremendously.
928  *
929  * Revision 1.13  1998/01/19 18:40:26  curt
930  * Tons of little changes to clean up the code and to remove fatal errors
931  * when building with the c++ compiler.
932  *
933  * Revision 1.12  1998/01/06 01:20:16  curt
934  * Tweaks to help building with MSVC++
935  *
936  * Revision 1.11  1998/01/05 22:19:26  curt
937  * #ifdef'd out some unused code that was problematic for MSVC++ to compile.
938  *
939  * Revision 1.10  1997/12/10 22:37:43  curt
940  * Prepended "fg" on the name of all global structures that didn't have it yet.
941  * i.e. "struct WEATHER {}" became "struct fgWEATHER {}"
942  *
943  * Revision 1.9  1997/08/27 03:30:08  curt
944  * Changed naming scheme of basic shared structures.
945  *
946  * Revision 1.8  1997/06/21 17:12:50  curt
947  * Capitalized subdirectory names.
948  *
949  * Revision 1.7  1997/05/31 19:16:28  curt
950  * Elevator trim added.
951  *
952  * Revision 1.6  1997/05/31 04:13:53  curt
953  * WE CAN NOW FLY!!!
954  *
955  * Continuing work on the LaRCsim flight model integration.
956  * Added some MSFS-like keyboard input handling.
957  *
958  * Revision 1.5  1997/05/30 23:26:25  curt
959  * Added elevator/aileron controls.
960  *
961  * Revision 1.4  1997/05/30 19:30:15  curt
962  * The LaRCsim flight model is starting to look like it is working.
963  *
964  * Revision 1.3  1997/05/30 03:54:12  curt
965  * Made a bit more progress towards integrating the LaRCsim flight model.
966  *
967  * Revision 1.2  1997/05/29 22:39:59  curt
968  * Working on incorporating the LaRCsim flight model.
969  *
970  * Revision 1.1  1997/05/29 00:09:57  curt
971  * Initial Flight Gear revision.
972  *
973  */