65 lines
1.7 KiB
C
65 lines
1.7 KiB
C
#include "timer.h"
|
|
|
|
void ftoi(float f, int p, long *i, long *d) {
|
|
long prec = 1;
|
|
int x = p;
|
|
while(x>0) {
|
|
prec *= 10;
|
|
x--;
|
|
}
|
|
*d = (long)((f - (long)f) * prec);
|
|
*i = (long)f;
|
|
}
|
|
|
|
void getTime(struct PTimer *time) {
|
|
struct timespec ts;
|
|
clock_gettime(CLOCK_MONOTONIC, &ts);
|
|
time->s = ts.tv_sec;
|
|
time->m = ts.tv_sec*1000;
|
|
time->n = ts.tv_nsec;
|
|
}
|
|
|
|
void doSleep(long seconds, long milliseconds, long nanoseconds) {
|
|
struct timespec ts;
|
|
ts.tv_sec = seconds;
|
|
ts.tv_nsec = nanoseconds + (milliseconds*1000000);
|
|
if (nanosleep(&ts, NULL) < 0)
|
|
printf("ERR\n");
|
|
}
|
|
|
|
int main() {
|
|
printf(" - testing high precision timer - use Ctrl-C to quit\n");
|
|
struct PTimer start_timer;
|
|
getTime(&start_timer);
|
|
struct PTimer last_timer;
|
|
getTime(&last_timer);
|
|
printf("yup\n");
|
|
printf("\tstart PTimer values - s: %d, m: %d, n: %d\n", start_timer.s, start_timer.m, start_timer.n);
|
|
|
|
float tickrate = 1000.0f/60.0f; // 60 fps = 16.6666667ms
|
|
printf("\tstart tickrate: %f\n", tickrate);
|
|
struct PTimer sleep_time;
|
|
ftoi(tickrate, 6, &sleep_time.m, &sleep_time.n);
|
|
printf("\tstart tickrate: %ld.%ld\n", sleep_time.m, sleep_time.n);
|
|
|
|
sleep(2);
|
|
|
|
while(1) {
|
|
struct PTimer current_timer;
|
|
getTime(¤t_timer);
|
|
|
|
// processing would occur here
|
|
|
|
struct PTimer delta_time;
|
|
delta_time.s = current_timer.s - last_timer.s;
|
|
delta_time.m = current_timer.m - last_timer.m;
|
|
delta_time.n = current_timer.n - last_timer.n;
|
|
|
|
printf("delta is %ds or %dm, with %dn (%d.%d)\n", delta_time.s, delta_time.m, delta_time.n, delta_time.m, delta_time.n);
|
|
printf("sleeping for %d.%dms\n", sleep_time.m, sleep_time.n);
|
|
|
|
last_timer = current_timer;
|
|
doSleep(0, sleep_time.m, sleep_time.n);
|
|
}
|
|
}
|