realtime.c

Go to the documentation of this file.
00001 /*-----------------------------------------------------------------------------------*/
00002 /* INRIA */
00003 /*-----------------------------------------------------------------------------------*/ 
00004 #include <stdio.h>
00005 #include "machine.h"
00006 #include "realtime.h"
00007 #ifdef _MSC_VER
00008         #include <windows.h>
00009 #else
00010         #include <sys/time.h>
00011         #include <unistd.h>
00012 
00013         #ifndef __GNUC__
00014                 #define inline
00015         #endif
00016 #endif
00017 /*-----------------------------------------------------------------------------------*/ 
00018 #ifdef _MSC_VER
00019         static double simulation_start = 0;
00020         static double simulation_scale = 0;
00021         static __int64 realtime_start = 0;
00022         static int simulation_doinit = 1;
00023         union 
00024         {
00025                 FILETIME ftFileTime;
00026                 __int64  ftInt64;
00027         } ftRealTime; 
00028 #else
00029         static double simulation_start = 0;
00030         static double simulation_scale = 0;
00031         static unsigned long long realtime_start = 0;
00032         static int simulation_doinit = 1;
00033 #endif
00034 
00035 /*-----------------------------------------------------------------------------------*/ 
00036 #ifndef _MSC_VER
00037 static inline unsigned long long TIME2ULL(struct timeval t)
00038 {
00039   unsigned long long result;
00040   result = (unsigned long long)t.tv_sec * 1000000 + t.tv_usec;
00041   return result;
00042 }
00043 #endif
00044 /*-----------------------------------------------------------------------------------*/ 
00045 #ifndef _MSC_VER
00046 static inline struct timeval ULL2TIME(unsigned long long t)
00047 {
00048   struct timeval result;
00049   result.tv_sec = t / 1000000;
00050   result.tv_usec = t % 1000000;
00051   return result;
00052 }
00053 #endif
00054 /*-----------------------------------------------------------------------------------*/ 
00055 #ifndef _MSC_VER
00056 int C2F(realtimeinit)(double *t,double *scale)
00057 {
00058   struct timeval now;
00059   
00060   gettimeofday(&now, 0); 
00061   realtime_start = TIME2ULL(now);
00062   simulation_doinit = 1;
00063   simulation_scale = *scale;
00064   return 0;
00065 }
00066 #endif
00067 /*-----------------------------------------------------------------------------------*/ 
00068 #ifndef _MSC_VER
00069 int C2F(realtime)(double *t)
00070 {
00071   struct timeval now;
00072   unsigned long long realtime_diff;
00073   double simulation_diff;
00074   long long delay;
00075 
00076   if (simulation_doinit) {
00077     simulation_doinit = 0;
00078     simulation_start = *t;
00079   }
00080   gettimeofday(&now, 0); 
00081   realtime_diff = TIME2ULL(now) - realtime_start;
00082   simulation_diff = (*t - simulation_start) * simulation_scale;
00083   delay = (long long)(simulation_diff * 1000000) - realtime_diff;
00084 
00085   if (delay > 0) 
00086         {
00087     struct timeval d ;
00088     d = ULL2TIME(delay);
00089     select(0, 0, 0, 0, &d);
00090   }
00091   return 0;
00092 }
00093 #endif
00094 /*-----------------------------------------------------------------------------------*/ 
00095 #ifdef _MSC_VER
00096 int C2F(realtimeinit)(double *t, double *scale)
00097 {
00098   SYSTEMTIME st;
00099   GetSystemTime(&st);
00100   SystemTimeToFileTime(&st,&ftRealTime.ftFileTime); 
00101 
00102   realtime_start = ftRealTime.ftInt64;
00103   simulation_doinit = 1;
00104   simulation_scale = *scale;
00105   return 0;
00106 }
00107 #endif
00108 /*-----------------------------------------------------------------------------------*/ 
00109 #ifdef _MSC_VER
00110 int C2F(realtime)(double *t) 
00111 {
00112   __int64 realtime_diff;
00113   double simulation_diff;
00114   __int64 delay;
00115   SYSTEMTIME st;
00116 
00117   if (simulation_doinit) 
00118         {
00119     simulation_doinit = 0;
00120     simulation_start = *t;
00121   }
00122   GetSystemTime(&st);
00123   SystemTimeToFileTime(&st,&ftRealTime.ftFileTime);
00124 
00125   realtime_diff = ftRealTime.ftInt64  - realtime_start;
00126   simulation_diff = (*t - simulation_start) * simulation_scale;
00127   delay = (__int64)(simulation_diff * 10000000) - realtime_diff;
00128 
00129   if (delay > 0) 
00130   {
00131     Sleep((DWORD)(delay/10000));
00132   }
00133   return 0;
00134 }
00135 #endif
00136 /*-----------------------------------------------------------------------------------*/ 

Generated on Sun Mar 4 15:04:01 2007 for Scilab [trunk] by  doxygen 1.5.1