#include "utilities/FixedIntervalRunLoop.h" #include #include "shell/Shell.h" FixedIntervalRunLoop * FixedIntervalRunLoop_create(double stepInterval, void (* stepCallback)(void *), void * stepContext) { FixedIntervalRunLoop * self; self = malloc(sizeof(FixedIntervalRunLoop)); FixedIntervalRunLoop_init(self, stepInterval, stepCallback, stepContext); return self; } void FixedIntervalRunLoop_init(FixedIntervalRunLoop * self, double stepInterval, void (* stepCallback)(void *), void * stepContext) { self->stepInterval = stepInterval; self->stepCallback = stepCallback; self->stepContext = stepContext; self->lastTime = Shell_getCurrentTime(); self->slop = 0.0; self->dispose = FixedIntervalRunLoop_dispose; self->run = FixedIntervalRunLoop_run; } void FixedIntervalRunLoop_dispose(void * selfPtr) { free(selfPtr); } void FixedIntervalRunLoop_run(void * selfPtr) { FixedIntervalRunLoop * self = selfPtr; double currentTime, interval; currentTime = Shell_getCurrentTime(); interval = (currentTime - self->lastTime) + self->slop; while (interval > self->stepInterval) { self->stepCallback(self->stepContext); interval -= self->stepInterval; } self->slop = interval; self->lastTime = currentTime; }