]> git.mxchange.org Git - flightgear.git/blob - Time/fg_timer.c
Nonsignal based interval timing is now working.
[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 <time.h>      /* for get/setitimer */
30 #include <sys/timeb.h> /* for ftime() and struct timeb */
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 timeb last;
86     static struct timeb current;
87     static int inited = 0;
88
89     int interval;
90
91     if ( ! inited ) {
92         inited = 1;
93         ftime(&last);
94         interval = 0;
95     } else {
96         ftime(&current);
97         interval = 1000 * (current.time - last.time) + 
98             (current.millitm - last.millitm);
99         last = current;
100     }
101
102     return(interval);
103 }
104
105
106 /* $Log$
107 /* Revision 1.2  1997/06/17 03:41:10  curt
108 /* Nonsignal based interval timing is now working.
109 /* This would be a good time to look at cleaning up the code structure a bit.
110 /*
111  * Revision 1.1  1997/06/16 19:24:20  curt
112  * Initial revision.
113  *
114  */