+++ /dev/null
-/***************************************************************************
-
- TITLE: ls_sync.c
-
-----------------------------------------------------------------------------
-
- FUNCTION: Real-time synchronization routines for LaRCSIM
-
-----------------------------------------------------------------------------
-
- MODULE STATUS: Developmental
-
-----------------------------------------------------------------------------
-
- GENEALOGY: Written 921229 by Bruce Jackson
-
-----------------------------------------------------------------------------
-
- DESIGNED BY: EBJ
-
- CODED BY: EBJ
-
- MAINTAINED BY: EBJ
-
-----------------------------------------------------------------------------
-
- MODIFICATION HISTORY:
-
- DATE PURPOSE BY
-
- 930104 Added ls_resync() call to avoid having to pass DT as a
- global variable. EBJ
- 940204 Added calculation of sim_control variable overrun to
- indicate a frame overrun has occurred. EBJ
- 940506 Added support for sim_control_.debug flag, which disables
- synchronization (there is still a local dbg flag that
- enables synch error logging) EBJ
-
- CURRENT RCS HEADER:
-
-$Header$
-$Log$
-Revision 1.1 1997/05/29 00:10:00 curt
-Initial Flight Gear revision.
-
- * Revision 1.7 1994/05/06 15:34:54 bjax
- * Removed "freerun" variable, and substituted sim_control_.debug flag.
- *
- * Revision 1.6 1994/02/16 13:01:22 bjax
- * Added logic to signal frame overrun; corrected syntax on ls_catch call
- * (old style may be BSD format). EBJ
- *
- * Revision 1.5 1993/07/30 18:33:14 bjax
- * Added 'dt' parameter to call to ls_sync from ls_resync routine.
- *
- * Revision 1.4 1993/03/15 14:56:13 bjax
- * Removed call to ls_pause; this should be done in cockpit routine.
- *
- * Revision 1.3 93/03/13 20:34:09 bjax
- * Modified to allow for sync times longer than a second; added ls_pause() EBJ
- *
- * Revision 1.2 93/01/06 09:50:47 bjax
- * Added ls_resync() function.
- *
- * Revision 1.1 92/12/30 13:19:51 bjax
- * Initial revision
- *
- * Revision 1.3 93/12/31 10:34:11 bjax
- * Added $Log marker as well.
- *
-
-----------------------------------------------------------------------------
-
- REFERENCES:
-
-----------------------------------------------------------------------------
-
- CALLED BY:
-
-----------------------------------------------------------------------------
-
- CALLS TO:
-
-----------------------------------------------------------------------------
-
- INPUTS:
-
-----------------------------------------------------------------------------
-
- OUTPUTS:
-
---------------------------------------------------------------------------*/
-#include <sys/time.h>
-#include <signal.h>
-#include <stdio.h>
-#include "ls_types.h"
-#include "ls_sim_control.h"
-
-
-extern SCALAR Simtime;
-
-/* give the time interval data structure FILE visibility */
-
-static struct itimerval t, ot;
-
-static int dbug = 0;
-
-/*void ls_catch( sig, code, sc) /* signal handler */
-/*int sig;
-int code;
-struct sigcontext *sc;*/
-void ls_catch()
-{
- static DATA lastSimtime = -99.9;
-
- /* printf("In ls_catch()\n"); */
-
- /*if (lastSimtime == Simtime) fprintf(stderr, "Overrun.\n"); */
- if (dbug) printf("ls_catch called\n");
- sim_control_.overrun = (lastSimtime == Simtime);
- lastSimtime = Simtime;
- signal(SIGALRM, ls_catch);
-}
-
-void ls_sync(dt)
-float dt;
-
-/* this routine syncs up the interval timer for a new dt value */
-{
- int terr;
- int isec;
- float usec;
-
- if (sim_control_.debug!=0) return;
-
- isec = (int) dt;
- usec = 1000000* (dt - (float) isec);
-
- t.it_interval.tv_sec = isec;
- t.it_interval.tv_usec = usec;
- t.it_value.tv_sec = isec;
- t.it_value.tv_usec = usec;
- if (dbug) printf("ls_sync called\n");
- ls_catch(); /* set up for SIGALRM signal catch */
- terr = setitimer( ITIMER_REAL, &t, &ot );
- if (terr) perror("Error returned from setitimer");
-}
-
-void ls_unsync()
-/* this routine unsyncs the interval timer */
-{
- int terr;
-
- if (sim_control_.debug!=0) return;
- t.it_interval.tv_sec = 0;
- t.it_interval.tv_usec = 0;
- t.it_value.tv_sec = 0;
- t.it_value.tv_usec = 0;
-if (dbug) printf("ls_unsync called\n");
-
- terr = setitimer( ITIMER_REAL, &t, &ot );
- if (terr) perror("Error returned from setitimer");
-
-}
-
-void ls_resync()
-/* this routine resynchronizes the interval timer to the old
- interrupt period, stored in struct ot by a previous call
- to ls_unsync(). */
-{
- float dt;
-
- if (sim_control_.debug!=0) return;
- if (dbug) printf("ls_resync called\n");
- dt = ((float) ot.it_interval.tv_usec)/1000000. +
- ((float) ot.it_interval.tv_sec);
- ls_sync(dt);
-}
-
-void ls_pause()
-/* this routine waits for the next interrupt */
-{
- if (sim_control_.debug!=0) return;
- if (dbug) printf("ls_pause called\n");
- pause();
-}
-