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