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