]> git.mxchange.org Git - flightgear.git/blob - Time/fg_timer.c
5e0c7a59a6cd3bbb09dccbbed83566364b320761
[flightgear.git] / Time / fg_timer.c
1 /**************************************************************************
2  * fg_timer.c -- time handling routines
3  *
4  * Written by Curtis Olson, started June 1997.
5  *
6  * Copyright (C) 1997  Curtis L. Olson  - curt@infoplane.com
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License as
10  * published by the Free Software Foundation; either version 2 of the
11  * License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21  *
22  * $Id$
23  * (Log is kept at end of this file)
24  **************************************************************************/
25
26
27 #include <signal.h>    /* for timer routines */
28 #include <stdio.h>     /* for printf() */
29 #include <sys/time.h>  /* for get/setitimer, gettimeofday, struct timeval */
30 #include <unistd.h>
31
32
33 #include "fg_timer.h"
34
35
36 unsigned long int fgSimTime;
37 static struct itimerval t, ot;
38 static void (*callbackfunc)(int multi_loop);
39
40
41 /* This routine catches the SIGALRM */
42 void fgTimerCatch() {
43     /* ignore any SIGALRM's until we come back from our EOM iteration */
44     signal(SIGALRM, SIG_IGN);
45
46     /* printf("In fgTimerCatch()\n"); */
47
48     /* -1 tells the routine to use default interval rather than something
49        dynamically calculated based on frame rate */
50     callbackfunc(-1); 
51
52     signal(SIGALRM, fgTimerCatch);
53 }
54
55
56 /* this routine initializes the interval timer to generate a SIGALRM after
57  * the specified interval (dt) */
58 void fgTimerInit(float dt, void (*f)()) {
59     int terr;
60     int isec;
61     float usec;
62
63     callbackfunc = f;
64
65     isec = (int) dt;
66     usec = 1000000* (dt - (float) isec);
67
68     t.it_interval.tv_sec = isec;
69     t.it_interval.tv_usec = usec;
70     t.it_value.tv_sec = isec;
71     t.it_value.tv_usec = usec;
72     /* printf("fgTimerInit() called\n"); */
73     fgTimerCatch();   /* set up for SIGALRM signal catch */
74     terr = setitimer( ITIMER_REAL, &t, &ot );
75     if (terr) {
76         printf("Error returned from setitimer");
77         exit(0);
78     }
79 }
80
81
82 /* This function returns the number of milleseconds since the last
83    time it was called. */
84 int fgGetTimeInterval() {
85     static struct timeval last;
86     static struct timeval current;
87     static struct timezone tz;
88     static int inited = 0;
89
90     int interval;
91
92     if ( ! inited ) {
93         inited = 1;
94         gettimeofday(&last, &tz);
95         interval = 0;
96     } else {
97         gettimeofday(&current, &tz);
98         interval = 1000000 * (current.tv_sec - last.tv_sec) + 
99             (current.tv_usec - last.tv_usec);
100         interval /= 1000;  /* convert back to milleseconds */
101         last = current;
102     }
103
104     return(interval);
105 }
106
107
108 /* $Log$
109 /* Revision 1.3  1997/06/17 16:52:04  curt
110 /* Timer interval stuff now uses gettimeofday() instead of ftime()
111 /*
112  * Revision 1.2  1997/06/17 03:41:10  curt
113  * Nonsignal based interval timing is now working.
114  * This would be a good time to look at cleaning up the code structure a bit.
115  *
116  * Revision 1.1  1997/06/16 19:24:20  curt
117  * Initial revision.
118  *
119  */