diff options
Diffstat (limited to 'src/ticker.c')
-rw-r--r-- | src/ticker.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/ticker.c b/src/ticker.c new file mode 100644 index 0000000..d3c25b5 --- /dev/null +++ b/src/ticker.c @@ -0,0 +1,43 @@ +// SPDX-FileCopyrightText: 2024 Lizzy Fleckenstein <lizzy@vlhl.dev> +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +#include "ticker.h" + +static struct timespec timestamp_now() +{ + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); // TODO: handle error + return ts; +} + +static uint64_t timestamp_diff(struct timespec a, struct timespec b) +{ + return NANOS * ((uint64_t) a.tv_sec - b.tv_sec) + ((int64_t) a.tv_nsec - b.tv_nsec); +} + +void ticker_init(ticker *t, uint64_t f) +{ + t->freq_nanos = f; + t->timestamp = timestamp_now(); +} + +bool ticker_tick(ticker *t, uint64_t *dtime) +{ + struct timespec ts = timestamp_now(); + *dtime = timestamp_diff(ts, t->timestamp); + if (*dtime < t->freq_nanos) + return false; + t->timestamp = ts; + return true; +} + +// millis +int ticker_timeout(ticker *t) +{ + uint64_t nanos = timestamp_diff(timestamp_now(), t->timestamp); + if (t->freq_nanos > nanos) + return (t->freq_nanos - nanos) / 1000000; // nanos to millis + else + return 0; +} |