00001
00002
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