1 /***************************************************************************
5 ----------------------------------------------------------------------------
7 FUNCTION: Initializes simulation
9 ----------------------------------------------------------------------------
11 MODULE STATUS: incomplete
13 ----------------------------------------------------------------------------
15 GENEALOGY: Written 921230 by Bruce Jackson
17 ----------------------------------------------------------------------------
25 ----------------------------------------------------------------------------
31 950314 Added get_set, put_set, and init routines. EBJ
37 Revision 1.2 2000/04/10 18:09:41 curt
38 David Megginson made a few (mostly minor) mods to the LaRCsim files, and
39 it's now possible to choose the LaRCsim model at runtime, as in
45 fgfs --aircraft=uiuc --aircraft-dir=Aircraft-uiuc/Boeing747
47 I did this so that I could play with the UIUC stuff without losing
48 Tony's C172 with its flaps, etc. I did my best to respect the design
49 of the LaRCsim code by staying in C, making only minimal changes, and
50 not introducing any dependencies on the rest of FlightGear. The
51 modified files are attached.
53 Revision 1.1.1.1 1999/06/17 18:07:34 curt
56 Revision 1.1.1.1 1999/04/05 21:32:45 curt
57 Start of 0.6.x branch.
59 Revision 1.5 1998/07/12 03:11:03 curt
60 Removed some printf()'s.
61 Fixed the autopilot integration so it should be able to update it's control
62 positions every time the internal flight model loop is run, and not just
63 once per rendered frame.
64 Added a routine to do the necessary stuff to force an arbitrary altitude
66 Gave the Navion engine just a tad more power.
68 Revision 1.4 1998/01/19 18:40:26 curt
69 Tons of little changes to clean up the code and to remove fatal errors
70 when building with the c++ compiler.
72 Revision 1.3 1998/01/05 22:19:25 curt
73 #ifdef'd out some unused code that was problematic for MSVC++ to compile.
75 Revision 1.2 1997/05/29 22:39:58 curt
76 Working on incorporating the LaRCsim flight model.
78 Revision 1.1 1997/05/29 00:09:57 curt
79 Initial Flight Gear revision.
81 * Revision 1.4 1995/03/15 12:15:23 bjax
82 * Added ls_init_get_set() and ls_init_put_set() and ls_init_init()
85 * Revision 1.3 1994/01/11 19:09:44 bjax
86 * Fixed header includes.
88 * Revision 1.2 1992/12/30 14:04:53 bjax
89 * Added call to ls_step(0, 1).
91 * Revision 1.1 92/12/30 14:02:19 bjax
94 * Revision 1.1 92/12/30 13:21:21 bjax
97 * Revision 1.3 93/12/31 10:34:11 bjax
98 * Added $Log marker as well.
101 ----------------------------------------------------------------------------
105 ----------------------------------------------------------------------------
109 ----------------------------------------------------------------------------
113 ----------------------------------------------------------------------------
117 ----------------------------------------------------------------------------
121 --------------------------------------------------------------------------*/
122 static char rcsid[] = "$Id$";
126 #include "ls_types.h"
130 #include "navion_init.h"
131 #include "ls_model.h"
134 #include "ls_generic.h"
136 #define MAX_NUMBER_OF_CONTINUOUS_STATES 100
137 #define MAX_NUMBER_OF_DISCRETE_STATES 20
139 #define NIL_POINTER 0L
141 #define FACILITY_NAME_STRING "init"
142 #define CURRENT_VERSION 10
157 extern SCALAR Simtime;
159 /* static int Symbols_loaded = 0; */
160 static int Number_of_Continuous_States = 0;
161 static int Number_of_Discrete_States = 0;
162 static cont_state_rec Continuous_States[ MAX_NUMBER_OF_CONTINUOUS_STATES ];
163 static disc_state_rec Discrete_States[ MAX_NUMBER_OF_DISCRETE_STATES ];
166 void ls_init_init( void ) {
170 if (Number_of_Continuous_States == 0)
172 Number_of_Continuous_States = HARDWIRED;
174 for (i=0;i<HARDWIRED;i++)
175 strcpy( Continuous_States[i].Symbol.Mod_Name, "*" );
177 strcpy( Continuous_States[ 0].Symbol.Par_Name,
178 "generic_.geodetic_position_v[0]");
179 strcpy( Continuous_States[ 1].Symbol.Par_Name,
180 "generic_.geodetic_position_v[1]");
181 strcpy( Continuous_States[ 2].Symbol.Par_Name,
182 "generic_.geodetic_position_v[2]");
183 strcpy( Continuous_States[ 3].Symbol.Par_Name,
184 "generic_.v_local_v[0]");
185 strcpy( Continuous_States[ 4].Symbol.Par_Name,
186 "generic_.v_local_v[1]");
187 strcpy( Continuous_States[ 5].Symbol.Par_Name,
188 "generic_.v_local_v[2]");
189 strcpy( Continuous_States[ 6].Symbol.Par_Name,
190 "generic_.euler_angles_v[0]");
191 strcpy( Continuous_States[ 7].Symbol.Par_Name,
192 "generic_.euler_angles_v[1]");
193 strcpy( Continuous_States[ 8].Symbol.Par_Name,
194 "generic_.euler_angles_v[2]");
195 strcpy( Continuous_States[ 9].Symbol.Par_Name,
196 "generic_.omega_body_v[0]");
197 strcpy( Continuous_States[10].Symbol.Par_Name,
198 "generic_.omega_body_v[1]");
199 strcpy( Continuous_States[11].Symbol.Par_Name,
200 "generic_.omega_body_v[2]");
201 strcpy( Continuous_States[12].Symbol.Par_Name,
202 "generic_.earth_position_angle");
205 /* commented out by CLO
206 for (i=0;i<Number_of_Continuous_States;i++)
208 (void) ls_get_sym_val( &Continuous_States[i].Symbol, &error );
209 if (error) Continuous_States[i].Symbol.Addr = NIL_POINTER;
212 for (i=0;i<Number_of_Discrete_States;i++)
214 (void) ls_get_sym_val( &Discrete_States[i].Symbol, &error );
215 if (error) Discrete_States[i].Symbol.Addr = NIL_POINTER;
220 void ls_init( char * aircraft ) {
225 if (!strcasecmp(aircraft, "c172")) {
226 printf("Initializing LaRCsim for C172\n");
227 current_model = C172;
228 } else if (!strcasecmp(aircraft, "navion")) {
229 printf("Initializing LaRCsim for Navion\n");
230 current_model = NAVION;
231 } else if (!strcasecmp(aircraft, "cherokee")) {
232 printf("Initializing LaRCsim for Cherokee\n");
233 current_model = CHEROKEE;
234 } else if (!strcasecmp(aircraft, "uiuc")) {
235 printf("Initializing LaRCsim for UIUC models\n");
236 current_model = UIUC;
238 printf("Unknown LaRCsim aircraft: %s; defaulting to C172\n", aircraft);
239 current_model = C172;
242 /* printf("LS in init() pos = %.2f\n", Latitude); */
246 /* printf("LS after init_init() pos = %.2f\n", Latitude); */
248 /* move the states to proper values */
250 /* commented out by CLO
251 for(i=0;i<Number_of_Continuous_States;i++)
252 if (Continuous_States[i].Symbol.Addr)
253 ls_set_sym_val( &Continuous_States[i].Symbol,
254 Continuous_States[i].value );
256 for(i=0;i<Number_of_Discrete_States;i++)
257 if (Discrete_States[i].Symbol.Addr)
258 ls_set_sym_val( &Discrete_States[i].Symbol,
259 (double) Discrete_States[i].value );
262 switch (current_model) {
277 /* printf("LS after model_init() pos = %.2f\n", Latitude); */
281 /* printf("LS after ls_step() pos = %.2f\n", Latitude); */
285 #ifdef COMPILE_THIS_CODE_THIS_USELESS_CODE
287 char *ls_init_get_set(char *buffer, char *eob)
288 /* This routine parses the settings file for "init" entries. */
291 static char *fac_name = FACILITY_NAME_STRING;
294 int n, ver, i, error, abrt;
296 enum {cont_states_header, cont_states, disc_states_header, disc_states, done } looking_for;
299 looking_for = cont_states_header;
301 n = sscanf(buffer, "%s", line);
302 if (n == 0) return 0L;
303 if (strncasecmp( fac_name, line, strlen(fac_name) )) return 0L;
305 bufptr = strtok( buffer+strlen(fac_name)+1, "\n");
306 if (bufptr == 0) return 0L;
308 sscanf( bufptr, "%d", &ver );
309 if (ver != CURRENT_VERSION) return 0L;
313 while( !abrt && (eob > bufptr))
315 bufptr = strtok( 0L, "\n");
316 if (bufptr == 0) return 0L;
317 if (strncasecmp( bufptr, "end", 3) == 0) break;
319 sscanf( bufptr, "%s", line );
320 if (line[0] != '#') /* ignore comments */
324 case cont_states_header:
326 if (strncasecmp( line, "continuous_states", 17) == 0)
328 n = sscanf( bufptr, "%s%d", line,
329 &Number_of_Continuous_States );
330 if (n != 2) abrt = 1;
331 looking_for = cont_states;
338 n = sscanf( bufptr, "%s%s%le",
339 Continuous_States[i].Symbol.Mod_Name,
340 Continuous_States[i].Symbol.Par_Name,
341 &Continuous_States[i].value );
342 if (n != 3) abrt = 1;
343 Continuous_States[i].Symbol.Addr = NIL_POINTER;
345 if (i >= Number_of_Continuous_States)
346 looking_for = disc_states_header;
349 case disc_states_header:
351 if (strncasecmp( line, "discrete_states", 15) == 0)
353 n = sscanf( bufptr, "%s%d", line,
354 &Number_of_Discrete_States );
355 if (n != 2) abrt = 1;
356 looking_for = disc_states;
363 n = sscanf( bufptr, "%s%s%ld",
364 Discrete_States[i].Symbol.Mod_Name,
365 Discrete_States[i].Symbol.Par_Name,
366 &Discrete_States[i].value );
367 if (n != 3) abrt = 1;
368 Discrete_States[i].Symbol.Addr = NIL_POINTER;
370 if (i >= Number_of_Discrete_States) looking_for = done;
381 Symbols_loaded = !abrt;
385 #endif /* COMPILE_THIS_CODE_THIS_USELESS_CODE */
388 void ls_init_put_set( FILE *fp )
394 fprintf(fp, "#============================== %s\n", FACILITY_NAME_STRING);
396 fprintf(fp, FACILITY_NAME_STRING);
398 fprintf(fp, "%04d\n", CURRENT_VERSION);
399 fprintf(fp, " continuous_states: %d\n", Number_of_Continuous_States);
400 fprintf(fp, "# module parameter value\n");
401 for (i=0; i<Number_of_Continuous_States; i++)
402 fprintf(fp, " %s\t%s\t%E\n",
403 Continuous_States[i].Symbol.Mod_Name,
404 Continuous_States[i].Symbol.Par_Name,
405 Continuous_States[i].value );
407 fprintf(fp, " discrete_states: %d\n", Number_of_Discrete_States);
408 fprintf(fp, "# module parameter value\n");
409 for (i=0;i<Number_of_Discrete_States;i++)
410 fprintf(fp, " %s\t%s\t%ld\n",
411 Discrete_States[i].Symbol.Mod_Name,
412 Discrete_States[i].Symbol.Par_Name,
413 Discrete_States[i].value );
414 fprintf(fp, "end\n");
418 void ls_save_current_as_ic( void ) {
419 /* Save current states as initial conditions */
423 /* commented out by CLO
424 for(i=0;i<Number_of_Continuous_States;i++)
425 if (Continuous_States[i].Symbol.Addr)
426 Continuous_States[i].value =
427 ls_get_sym_val( &Continuous_States[i].Symbol, &error );
429 for(i=0;i<Number_of_Discrete_States;i++)
430 if (Discrete_States[i].Symbol.Addr)
431 Discrete_States[i].value = (long)
432 ls_get_sym_val( &Discrete_States[i].Symbol, &error );