summaryrefslogtreecommitdiff
path: root/src/ticker.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ticker.c')
-rw-r--r--src/ticker.c43
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;
+}