~ubuntu-branches/ubuntu/quantal/flightgear/quantal

« back to all changes in this revision

Viewing changes to src/FDM/LaRCsim/ls_interface.c

  • Committer: Bazaar Package Importer
  • Author(s): Ove Kaaven
  • Date: 2002-03-27 21:50:15 UTC
  • Revision ID: james.westby@ubuntu.com-20020327215015-0rvi3o8iml0a8s93
Tags: upstream-0.7.9
ImportĀ upstreamĀ versionĀ 0.7.9

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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: ls_interface.c,v 1.6 2002/01/30 15:17:27 david Exp $
 
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: /var/cvs/FlightGear-0.7/FlightGear/src/FDM/LaRCsim/ls_interface.c,v 1.6 2002/01/30 15:17:27 david Exp $
 
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_geodesy.h"
 
235
#include "ls_generic.h"
 
236
#include "ls_sim_control.h"
 
237
#include "ls_cockpit.h"
 
238
#include "ls_interface.h"
 
239
#include "ls_step.h"
 
240
#include "ls_accel.h"
 
241
#include "ls_aux.h"
 
242
#include "ls_model.h"
 
243
#include "ls_init.h"
 
244
 
 
245
// #include <Flight/flight.h>
 
246
// #include <Aircraft/aircraft.h>
 
247
// #include <Debug/fg_debug.h>
 
248
 
 
249
 
 
250
/* global variable declarations */
 
251
 
 
252
/* TAPE         *Tape; */
 
253
GENERIC         generic_;
 
254
SIM_CONTROL     sim_control_;
 
255
COCKPIT         cockpit_;
 
256
 
 
257
SCALAR          Simtime;
 
258
 
 
259
#define DEFAULT_TERM_UPDATE_HZ 20
 
260
#define DEFAULT_MODEL_HZ 120
 
261
#define DEFAULT_END_TIME 3600.
 
262
#define DEFAULT_SAVE_SPACING 8
 
263
#define DEFAULT_WRITE_SPACING 1
 
264
#define MAX_FILE_NAME_LENGTH 80
 
265
 
 
266
/* global variables */
 
267
 
 
268
char    *progname;
 
269
char    *fullname;
 
270
 
 
271
/* file variables - default simulation settings */
 
272
 
 
273
static double model_dt;
 
274
static double speedup;
 
275
static char  asc1name[MAX_FILE_NAME_LENGTH] = "run.asc1";
 
276
static char  tabname[MAX_FILE_NAME_LENGTH]  = "run.dat";
 
277
static char  fltname[MAX_FILE_NAME_LENGTH]  = "run.flt";
 
278
static char  matname[MAX_FILE_NAME_LENGTH]  = "run.m";
 
279
 
 
280
 
 
281
 
 
282
void ls_stamp( void ) {
 
283
    char rcsid[] = "$Id: ls_interface.c,v 1.6 2002/01/30 15:17:27 david Exp $";
 
284
    char revid[] = "$Revision: 1.6 $";
 
285
    char dateid[] = "$Date: 2002/01/30 15:17:27 $";
 
286
    struct tm *nowtime;
 
287
    time_t nowtime_t;
 
288
    long date;
 
289
    
 
290
    /* report version of LaRCsim*/
 
291
    printf("\nLaRCsim %s, %s\n\n", revid, dateid); 
 
292
    
 
293
    nowtime_t = time( 0 );
 
294
    nowtime = localtime( &nowtime_t ); /* set fields to correct time values */
 
295
    date = (nowtime->tm_year)*10000 
 
296
         + (nowtime->tm_mon + 1)*100
 
297
         + (nowtime->tm_mday);
 
298
    sprintf(sim_control_.date_string, "%06ld\0", date);
 
299
    sprintf(sim_control_.time_stamp, "%02d:%02d:%02d\0", 
 
300
        nowtime->tm_hour, nowtime->tm_min, nowtime->tm_sec);
 
301
#ifdef COMPILE_THIS_CODE_THIS_USELESS_CODE
 
302
    cuserid( sim_control_.userid );     /* set up user id */
 
303
#endif /* COMPILE_THIS_CODE_THIS_USELESS_CODE */
 
304
    return;
 
305
}
 
306
 
 
307
void ls_setdefopts( void ) {
 
308
    /* set default values for most options */
 
309
 
 
310
    sim_control_.debug = 0;             /* change to non-zero if in dbx! */
 
311
    sim_control_.vision = 0;
 
312
    sim_control_.write_av = 0;          /* write Agile-Vu '.flt' file */
 
313
    sim_control_.write_mat = 0;         /* write matrix-x/matlab script */
 
314
    sim_control_.write_tab = 0;         /* write tab delim. history file */
 
315
    sim_control_.write_asc1 = 0;        /* write GetData file */
 
316
    sim_control_.save_spacing = DEFAULT_SAVE_SPACING;   
 
317
                                        /* interpolation on recording */
 
318
    sim_control_.write_spacing = DEFAULT_WRITE_SPACING; 
 
319
                                        /* interpolation on output */
 
320
    sim_control_.end_time = DEFAULT_END_TIME;
 
321
    sim_control_.model_hz = DEFAULT_MODEL_HZ;
 
322
    sim_control_.term_update_hz = DEFAULT_TERM_UPDATE_HZ;
 
323
    sim_control_.time_slices = (long int)(DEFAULT_END_TIME * DEFAULT_MODEL_HZ / 
 
324
        DEFAULT_SAVE_SPACING);
 
325
    sim_control_.paused = 0;
 
326
 
 
327
    speedup = 1.0;
 
328
}
 
329
 
 
330
 
 
331
/* return result codes from ls_checkopts */
 
332
 
 
333
#define OPT_OK 0
 
334
#define OPT_ERR 1
 
335
 
 
336
#ifdef COMPILE_THIS_CODE_THIS_USELESS_CODE
 
337
 
 
338
extern char *optarg;
 
339
extern int optind;
 
340
 
 
341
int ls_checkopts(argc, argv)    /* check and set options flags */
 
342
  int argc;
 
343
  char *argv[];
 
344
  {
 
345
    int c;
 
346
    int opt_err = 0;
 
347
    int mod_end_time = 0;
 
348
    int mod_buf_size = 0;
 
349
    float buffer_time, data_rate;
 
350
 
 
351
    /* set default values */
 
352
 
 
353
    buffer_time = sim_control_.time_slices * sim_control_.save_spacing / 
 
354
        sim_control_.model_hz;
 
355
    data_rate   = sim_control_.model_hz / sim_control_.save_spacing;
 
356
 
 
357
    while ((c = getopt(argc, argv, "Aa:b:de:f:hi:kmo:r:s:t:x:")) != EOF)
 
358
        switch (c) {
 
359
            case 'A':
 
360
                if (sim_control_.sim_type == GLmouse)
 
361
                  {
 
362
                    fprintf(stderr, "Cannot specify both keyboard (k) and ACES (A) cockpits option\n");
 
363
                    fprintf(stderr, "Keyboard operation assumed.\n");
 
364
                    break;
 
365
                  }
 
366
                sim_control_.sim_type = cockpit;
 
367
                break;
 
368
            case 'a':
 
369
                sim_control_.write_av = 1;
 
370
                if (optarg != NULL)
 
371
                if (*optarg != '-') 
 
372
                    strncpy(fltname, optarg, MAX_FILE_NAME_LENGTH);
 
373
                else
 
374
                    optind--;
 
375
                break;
 
376
            case 'b':   
 
377
                buffer_time = atof(optarg);
 
378
                if (buffer_time <= 0.) opt_err = -1;
 
379
                mod_buf_size++;
 
380
                break;
 
381
            case 'd':
 
382
                sim_control_.debug = 1;
 
383
                break;
 
384
            case 'e':
 
385
                sim_control_.end_time = atof(optarg);
 
386
                mod_end_time++;
 
387
                break;
 
388
            case 'f':
 
389
                sim_control_.model_hz = atof(optarg);
 
390
                break;
 
391
            case 'h': 
 
392
                opt_err = 1;
 
393
                break;
 
394
            case 'i':
 
395
                /* ls_get_settings( optarg ); */
 
396
                break;
 
397
            case 'k':
 
398
                sim_control_.sim_type = GLmouse;
 
399
                break;
 
400
            case 'm':
 
401
                sim_control_.vision = 1;
 
402
                break;
 
403
            case 'o': 
 
404
                sim_control_.term_update_hz = atof(optarg);
 
405
                if (sim_control_.term_update_hz <= 0.) opt_err = 1;
 
406
                break;
 
407
            case 'r':
 
408
                sim_control_.write_mat = 1;
 
409
                if (optarg != NULL)
 
410
                if (*optarg != '-') 
 
411
                    strncpy(matname, optarg, MAX_FILE_NAME_LENGTH);
 
412
                else
 
413
                    optind--;
 
414
                break;
 
415
            case 's':
 
416
                data_rate = atof(optarg);
 
417
                if (data_rate <= 0.) opt_err = -1;
 
418
                break;
 
419
            case 't':
 
420
                sim_control_.write_tab = 1;
 
421
                if (optarg != NULL)
 
422
                if (*optarg != '-') 
 
423
                    strncpy(tabname, optarg, MAX_FILE_NAME_LENGTH);
 
424
                else
 
425
                    optind--;
 
426
                break;
 
427
            case 'x':
 
428
                sim_control_.write_asc1 = 1;
 
429
                if (optarg != NULL)
 
430
                if (*optarg != '-') 
 
431
                    strncpy(asc1name, optarg, MAX_FILE_NAME_LENGTH);
 
432
                else
 
433
                    optind--;
 
434
                break;
 
435
            default:
 
436
                opt_err = 1;
 
437
            
 
438
        }
 
439
 
 
440
    if (opt_err)
 
441
      {
 
442
        fprintf(stderr, "Usage: %s [-options]\n", progname);
 
443
        fprintf(stderr, "\n");
 
444
        fprintf(stderr, "  where [-options] is zero or more of the following:\n");
 
445
        fprintf(stderr, "\n");
 
446
        fprintf(stderr, "  [A|k]           Run mode: [A]CES cockpit   [default]\n");
 
447
        fprintf(stderr, "                         or [k]eyboard\n");
 
448
        fprintf(stderr, "\n");
 
449
        fprintf(stderr, "  [i <filename>]  [i]nitial conditions filename\n");
 
450
        fprintf(stderr, "\n");
 
451
        fprintf(stderr, "  [f <value>]     Iteration rate [f]requency, Hz (default is %5.2f Hz)\n", 
 
452
                                                sim_control_.model_hz);
 
453
        fprintf(stderr, "\n");
 
454
        fprintf(stderr, "  [o <value>]     Display [o]utput frequency, Hz (default is %5.2f Hz)\n", 
 
455
                                                sim_control_.term_update_hz);
 
456
        fprintf(stderr, "\n");
 
457
        fprintf(stderr, "  [s <value>]     Data storage frequency, Hz (default is %5.2f Hz)\n",
 
458
                                                data_rate);
 
459
        fprintf(stderr, "\n");
 
460
        fprintf(stderr, "  [e <value>]     [e]nd time in seconds (default %5.1f seconds)\n", 
 
461
                                                sim_control_.end_time);
 
462
        fprintf(stderr, "\n");
 
463
        fprintf(stderr, "  [b <value>]     circular time history storage [b]uffer size, in seconds \n");
 
464
        fprintf(stderr, "                  (default %5.1f seconds) (normally same as end time)\n", 
 
465
                                                sim_control_.time_slices*sim_control_.save_spacing/
 
466
                                                        sim_control_.model_hz);
 
467
        fprintf(stderr, "\n");
 
468
        fprintf(stderr, "  [atxr [<filename>]] Output: [a]gile-vu  (default name: %s )\n", fltname);
 
469
        fprintf(stderr, "                       and/or [t]ab delimited ( '' name: %s )\n", tabname);
 
470
        fprintf(stderr, "                       and/or [x]plot     (default name: %s)\n", asc1name);
 
471
        fprintf(stderr, "                       and/or mat[r]ix script ( '' name: %s   )\n", matname);
 
472
        fprintf(stderr, "\n");
 
473
        return OPT_ERR;
 
474
      }
 
475
 
 
476
/* calculate additional controls */
 
477
 
 
478
    sim_control_.save_spacing = (int) (0.5 + sim_control_.model_hz / data_rate);
 
479
    if (sim_control_.save_spacing < 1) sim_control_.save_spacing = 1;
 
480
 
 
481
    sim_control_.time_slices = buffer_time * sim_control_.model_hz / 
 
482
        sim_control_.save_spacing;
 
483
    if (sim_control_.time_slices < 2) sim_control_.time_slices = 2;
 
484
         
 
485
    return OPT_OK;
 
486
  }
 
487
#endif /* COMPILE_THIS_CODE_THIS_USELESS_CODE */
 
488
 
 
489
void ls_set_model_dt(double dt) {
 
490
  model_dt = dt;
 
491
}  
 
492
 
 
493
void ls_loop( SCALAR dt, int initialize ) {
 
494
    /* printf ("  In ls_loop()\n"); */
 
495
    ls_step( dt, initialize );
 
496
    /* if (sim_control_.sim_type == cockpit ) ls_ACES();  */
 
497
    ls_aux();
 
498
    ls_model( dt, initialize );
 
499
    ls_accel();
 
500
}
 
501
 
 
502
 
 
503
 
 
504
int ls_cockpit( void ) {
 
505
    // fgCONTROLS *c;
 
506
 
 
507
    sim_control_.paused = 0;
 
508
 
 
509
    // c = current_aircraft.controls;
 
510
 
 
511
    // Lat_control = FG_Aileron;
 
512
    // Long_control = FG_Elevator;
 
513
    // Long_trim = FG_Elev_Trim;
 
514
    // Rudder_pedal = FG_Rudder;
 
515
    // Throttle_pct = FG_Throttle[0];
 
516
 
 
517
    /* printf("Mach = %.2f  ", Mach_number);
 
518
    printf("%.4f,%.4f,%.2f  ", Latitude, Longitude, Altitude);
 
519
    printf("%.2f,%.2f,%.2f\n", Phi, Theta, Psi); */
 
520
 
 
521
    return( 0 );
 
522
}
 
523
 
 
524
 
 
525
/* Initialize the LaRCsim flight model, dt is the time increment for
 
526
   each subsequent iteration through the EOM */
 
527
int ls_toplevel_init(double dt, char * aircraft) {
 
528
    model_dt = dt;
 
529
 
 
530
    ls_setdefopts();            /* set default options */
 
531
        
 
532
    ls_stamp();   /* ID stamp; record time and date of run */
 
533
 
 
534
    if (speedup == 0.0) {
 
535
        fprintf(stderr, "%s: Cannot run with speedup of 0.\n", progname);
 
536
        return 1;
 
537
    }
 
538
 
 
539
    /* printf("LS pre Init pos = %.2f\n", Latitude); */
 
540
 
 
541
    ls_init(aircraft);
 
542
 
 
543
    /* printf("LS post Init pos = %.2f\n", Latitude); */
 
544
 
 
545
    if (speedup > 0) {
 
546
        /* Initialize (get) cockpit (controls) settings */
 
547
        ls_cockpit();
 
548
    }
 
549
 
 
550
    return(1);
 
551
}
 
552
 
 
553
 
 
554
/* Run an iteration of the EOM (equations of motion) */
 
555
int ls_update(int multiloop) {
 
556
    int i;
 
557
 
 
558
    if (speedup > 0) {
 
559
        ls_cockpit();
 
560
    }
 
561
 
 
562
    for ( i = 0; i < multiloop; i++ ) {
 
563
        ls_loop( model_dt, 0);
 
564
    }
 
565
 
 
566
    return 1;
 
567
}
 
568
 
 
569
 
 
570
/* Set the altitude (force) */
 
571
int ls_ForceAltitude(double alt_feet) {
 
572
    Altitude = alt_feet;
 
573
    ls_geod_to_geoc( Latitude, Altitude, &Sea_level_radius, &Lat_geocentric);
 
574
    Radius_to_vehicle = Altitude + Sea_level_radius;
 
575
 
 
576
    return 0;
 
577
}
 
578
 
 
579
 
 
580
/* Flight Gear Modification Log
 
581
 *
 
582
 * $Log: ls_interface.c,v $
 
583
 * Revision 1.6  2002/01/30 15:17:27  david
 
584
 * Fixes from Cameron Moore:
 
585
 *
 
586
 * I've attached 3 diffs against files in FlightGear to fix some printf
 
587
 * format strings.  The changes are pretty straight forward.  Let me know
 
588
 * if you have any questions.  (BTW, I'm using gcc 2.95.4)
 
589
 *
 
590
 * Revision 1.5  2001/05/21 18:44:59  curt
 
591
 * Tile pager tweaks.
 
592
 * MSVC++ tweaks.
 
593
 *
 
594
 * Revision 1.4  2001/03/24 05:03:12  curt
 
595
 * SG-ified logstream.
 
596
 *
 
597
 * Revision 1.3  2000/10/23 22:34:54  curt
 
598
 * I tested:
 
599
 * LaRCsim c172 on-ground and in-air starts, reset: all work
 
600
 * UIUC Cessna172 on-ground and in-air starts work as expected, reset
 
601
 * results in an aircraft that is upside down but does not crash FG.   I
 
602
 * don't know what it was like before, so it may well be no change.
 
603
 * JSBSim c172 and X15 in-air starts work fine, resets now work (and are
 
604
 * trimmed), on-ground starts do not -- the c172 ends up on its back.  I
 
605
 * suspect this is no worse than before.
 
606
 *
 
607
 * I did not test:
 
608
 * Balloon (the weather code returns nan's for the atmosphere data --this
 
609
 * is in the weather module and apparently is a linux only bug)
 
610
 * ADA (don't know how)
 
611
 * MagicCarpet  (needs work yet)
 
612
 * External (don't know how)
 
613
 *
 
614
 * known to be broken:
 
615
 * LaRCsim c172 on-ground starts with a negative terrain altitude (this
 
616
 * happens at KPAO when the scenery is not present).   The FDM inits to
 
617
 * about 50 feet AGL and the model falls to the ground.  It does stay
 
618
 * upright, however, and seems to be fine once it settles out, FWIW.
 
619
 *
 
620
 * To do:
 
621
 * --implement set_Model on the bus
 
622
 * --bring Christian's weather data into JSBSim
 
623
 * -- add default method to bus for updating things like the sin and cos of
 
624
 * latitude (for Balloon, MagicCarpet)
 
625
 * -- lots of cleanup
 
626
 *
 
627
 * The files:
 
628
 * src/FDM/flight.cxx
 
629
 * src/FDM/flight.hxx
 
630
 * -- all data members now declared protected instead of private.
 
631
 * -- eliminated all but a small set of 'setters', no change to getters.
 
632
 * -- that small set is declared virtual, the default implementation
 
633
 * provided preserves the old behavior
 
634
 * -- all of the vector data members are now initialized.
 
635
 * -- added busdump() method -- SG_LOG's  all the bus data when called,
 
636
 * useful for diagnostics.
 
637
 *
 
638
 * src/FDM/ADA.cxx
 
639
 * -- bus data members now directly assigned to
 
640
 *
 
641
 * src/FDM/Balloon.cxx
 
642
 * -- bus data members now directly assigned to
 
643
 * -- changed V_equiv_kts to V_calibrated_kts
 
644
 *
 
645
 * src/FDM/JSBSim.cxx
 
646
 * src/FDM/JSBSim.hxx
 
647
 * -- bus data members now directly assigned to
 
648
 * -- implemented the FGInterface virtual setters with JSBSim specific
 
649
 * logic
 
650
 * -- changed the static FDMExec to a dynamic fdmex (needed so that the
 
651
 * JSBSim object can be deleted when a model change is called for)
 
652
 * -- implemented constructor and destructor, moved some of the logic
 
653
 * formerly in init() to constructor
 
654
 * -- added logic to bring up FGEngInterface objects and set the RPM and
 
655
 * throttle values.
 
656
 *
 
657
 * src/FDM/LaRCsim.cxx
 
658
 * src/FDM/LaRCsim.hxx
 
659
 * -- bus data members now directly assigned to
 
660
 * -- implemented the FGInterface virtual setters with LaRCsim specific
 
661
 * logic, uses LaRCsimIC
 
662
 * -- implemented constructor and destructor, moved some of the logic
 
663
 * formerly in init() to constructor
 
664
 * -- moved default inertias to here from fg_init.cxx
 
665
 * -- eliminated the climb rate calculation.  The equivalent, climb_rate =
 
666
 * -1*vdown, is now in copy_from_LaRCsim().
 
667
 *
 
668
 * src/FDM/LaRCsimIC.cxx
 
669
 * src/FDM/LaRCsimIC.hxx
 
670
 * -- similar to FGInitialCondition, this class has all the logic needed to
 
671
 * turn data like Vc and Mach into the more fundamental quantities LaRCsim
 
672
 * needs to initialize.
 
673
 * -- put it in src/FDM since it is a class
 
674
 *
 
675
 * src/FDM/MagicCarpet.cxx
 
676
 *  -- bus data members now directly assigned to
 
677
 *
 
678
 * src/FDM/Makefile.am
 
679
 * -- adds LaRCsimIC.hxx and cxx
 
680
 *
 
681
 * src/FDM/JSBSim/FGAtmosphere.h
 
682
 * src/FDM/JSBSim/FGDefs.h
 
683
 * src/FDM/JSBSim/FGInitialCondition.cpp
 
684
 * src/FDM/JSBSim/FGInitialCondition.h
 
685
 * src/FDM/JSBSim/JSBSim.cpp
 
686
 * -- changes to accomodate the new bus
 
687
 *
 
688
 * src/FDM/LaRCsim/atmos_62.h
 
689
 * src/FDM/LaRCsim/ls_geodesy.h
 
690
 * -- surrounded prototypes with #ifdef __cplusplus ... #endif , functions
 
691
 * here are needed in LaRCsimIC
 
692
 *
 
693
 * src/FDM/LaRCsim/c172_main.c
 
694
 * src/FDM/LaRCsim/cherokee_aero.c
 
695
 * src/FDM/LaRCsim/ls_aux.c
 
696
 * src/FDM/LaRCsim/ls_constants.h
 
697
 * src/FDM/LaRCsim/ls_geodesy.c
 
698
 * src/FDM/LaRCsim/ls_geodesy.h
 
699
 * src/FDM/LaRCsim/ls_step.c
 
700
 * src/FDM/UIUCModel/uiuc_betaprobe.cpp
 
701
 * -- changed PI to LS_PI, eliminates preprocessor naming conflict with
 
702
 * weather module
 
703
 *
 
704
 * src/FDM/LaRCsim/ls_interface.c
 
705
 * src/FDM/LaRCsim/ls_interface.h
 
706
 * -- added function ls_set_model_dt()
 
707
 *
 
708
 * src/Main/bfi.cxx
 
709
 * -- eliminated calls that set the NED speeds to body components.  They
 
710
 * are no longer needed and confuse the new bus.
 
711
 *
 
712
 * src/Main/fg_init.cxx
 
713
 * -- eliminated calls that just brought the bus data up-to-date (e.g.
 
714
 * set_sin_cos_latitude). or set default values.   The bus now handles the
 
715
 * defaults and updates itself when the setters are called (for LaRCsim and
 
716
 * JSBSim).  A default method for doing this needs to be added to the bus.
 
717
 * -- added fgVelocityInit() to set the speed the user asked for.  Both
 
718
 * JSBSim and LaRCsim can now be initialized using any of:
 
719
 * vc,mach, NED components, UVW components.
 
720
 *
 
721
 * src/Main/main.cxx
 
722
 * --eliminated call to fgFDMSetGroundElevation, this data is now 'pulled'
 
723
 * onto the bus every update()
 
724
 *
 
725
 * src/Main/options.cxx
 
726
 * src/Main/options.hxx
 
727
 * -- added enum to keep track of the speed requested by the user
 
728
 * -- eliminated calls to set NED velocity properties to body speeds, they
 
729
 * are no longer needed.
 
730
 * -- added options for the NED components.
 
731
 *
 
732
 * src/Network/garmin.cxx
 
733
 * src/Network/nmea.cxx
 
734
 * --eliminated calls that just brought the bus data up-to-date (e.g.
 
735
 * set_sin_cos_latitude).  The bus now updates itself when the setters are
 
736
 * called (for LaRCsim and JSBSim).  A default method for doing this needs
 
737
 * to be added to the bus.
 
738
 * -- changed set_V_equiv_kts to set_V_calibrated_kts.  set_V_equiv_kts no
 
739
 * longer exists ( get_V_equiv_kts still does, though)
 
740
 *
 
741
 * src/WeatherCM/FGLocalWeatherDatabase.cpp
 
742
 * -- commented out the code to put the weather data on the bus, a
 
743
 * different scheme for this is needed.
 
744
 *
 
745
 * Revision 1.2  2000/04/10 18:09:41  curt
 
746
 * David Megginson made a few (mostly minor) mods to the LaRCsim files, and
 
747
 * it's now possible to choose the LaRCsim model at runtime, as in
 
748
 *
 
749
 *   fgfs --aircraft=c172
 
750
 *
 
751
 * or
 
752
 *
 
753
 *   fgfs --aircraft=uiuc --aircraft-dir=Aircraft-uiuc/Boeing747
 
754
 *
 
755
 * I did this so that I could play with the UIUC stuff without losing
 
756
 * Tony's C172 with its flaps, etc.  I did my best to respect the design
 
757
 * of the LaRCsim code by staying in C, making only minimal changes, and
 
758
 * not introducing any dependencies on the rest of FlightGear.  The
 
759
 * modified files are attached.
 
760
 *
 
761
 * Revision 1.1.1.1  1999/06/17 18:07:33  curt
 
762
 * Start of 0.7.x branch
 
763
 *
 
764
 * Revision 1.2  1999/04/27 19:28:04  curt
 
765
 * Changes for the MacOS port contributed by Darrell Walisser.
 
766
 *
 
767
 * Revision 1.1.1.1  1999/04/05 21:32:45  curt
 
768
 * Start of 0.6.x branch.
 
769
 *
 
770
 * Revision 1.25  1999/01/19 20:57:02  curt
 
771
 * MacOS portability changes contributed by "Robert Puyol" <puyol@abvent.fr>
 
772
 *
 
773
 * Revision 1.24  1998/12/14 13:27:47  curt
 
774
 * Removed some old, outdated, no longer needed code.
 
775
 *
 
776
 * Revision 1.23  1998/10/16 23:27:44  curt
 
777
 * C++-ifying.
 
778
 *
 
779
 * Revision 1.22  1998/09/29 02:02:59  curt
 
780
 * Added a brake + autopilot mods.
 
781
 *
 
782
 * Revision 1.21  1998/08/22  14:49:56  curt
 
783
 * Attempting to iron out seg faults and crashes.
 
784
 * Did some shuffling to fix a initialization order problem between view
 
785
 * position, scenery elevation.
 
786
 *
 
787
 * Revision 1.20  1998/07/12 03:11:03  curt
 
788
 * Removed some printf()'s.
 
789
 * Fixed the autopilot integration so it should be able to update it's control
 
790
 *   positions every time the internal flight model loop is run, and not just
 
791
 *   once per rendered frame.
 
792
 * Added a routine to do the necessary stuff to force an arbitrary altitude
 
793
 *   change.
 
794
 * Gave the Navion engine just a tad more power.
 
795
 *
 
796
 * Revision 1.19  1998/05/11 18:17:28  curt
 
797
 * Output message tweaking.
 
798
 *
 
799
 * Revision 1.18  1998/04/21 16:59:38  curt
 
800
 * Integrated autopilot.
 
801
 * Prepairing for C++ integration.
 
802
 *
 
803
 * Revision 1.17  1998/02/23 19:07:58  curt
 
804
 * Incorporated Durk's Astro/ tweaks.  Includes unifying the sun position
 
805
 * calculation code between sun display, and other FG sections that use this
 
806
 * for things like lighting.
 
807
 *
 
808
 * Revision 1.16  1998/02/07 15:29:38  curt
 
809
 * Incorporated HUD changes and struct/typedef changes from Charlie Hotchkiss
 
810
 * <chotchkiss@namg.us.anritsu.com>
 
811
 *
 
812
 * Revision 1.15  1998/01/22 22:03:47  curt
 
813
 * Removed #include <sys/stat.h>
 
814
 *
 
815
 * Revision 1.14  1998/01/19 19:27:04  curt
 
816
 * Merged in make system changes from Bob Kuehne <rpk@sgi.com>
 
817
 * This should simplify things tremendously.
 
818
 *
 
819
 * Revision 1.13  1998/01/19 18:40:26  curt
 
820
 * Tons of little changes to clean up the code and to remove fatal errors
 
821
 * when building with the c++ compiler.
 
822
 *
 
823
 * Revision 1.12  1998/01/06 01:20:16  curt
 
824
 * Tweaks to help building with MSVC++
 
825
 *
 
826
 * Revision 1.11  1998/01/05 22:19:26  curt
 
827
 * #ifdef'd out some unused code that was problematic for MSVC++ to compile.
 
828
 *
 
829
 * Revision 1.10  1997/12/10 22:37:43  curt
 
830
 * Prepended "fg" on the name of all global structures that didn't have it yet.
 
831
 * i.e. "struct WEATHER {}" became "struct fgWEATHER {}"
 
832
 *
 
833
 * Revision 1.9  1997/08/27 03:30:08  curt
 
834
 * Changed naming scheme of basic shared structures.
 
835
 *
 
836
 * Revision 1.8  1997/06/21 17:12:50  curt
 
837
 * Capitalized subdirectory names.
 
838
 *
 
839
 * Revision 1.7  1997/05/31 19:16:28  curt
 
840
 * Elevator trim added.
 
841
 *
 
842
 * Revision 1.6  1997/05/31 04:13:53  curt
 
843
 * WE CAN NOW FLY!!!
 
844
 *
 
845
 * Continuing work on the LaRCsim flight model integration.
 
846
 * Added some MSFS-like keyboard input handling.
 
847
 *
 
848
 * Revision 1.5  1997/05/30 23:26:25  curt
 
849
 * Added elevator/aileron controls.
 
850
 *
 
851
 * Revision 1.4  1997/05/30 19:30:15  curt
 
852
 * The LaRCsim flight model is starting to look like it is working.
 
853
 *
 
854
 * Revision 1.3  1997/05/30 03:54:12  curt
 
855
 * Made a bit more progress towards integrating the LaRCsim flight model.
 
856
 *
 
857
 * Revision 1.2  1997/05/29 22:39:59  curt
 
858
 * Working on incorporating the LaRCsim flight model.
 
859
 *
 
860
 * Revision 1.1  1997/05/29 00:09:57  curt
 
861
 * Initial Flight Gear revision.
 
862
 *
 
863
 */