zsdl/src/utils/timer.zig

64 lines
2.0 KiB
Zig

const sdl = @import("./../sdl.zig").c;
const std = @import("std");
pub const TimerStatus = enum { started, stopped, paused };
pub const Timer = struct {
start_ticks_ns: f64 = 0.0,
pause_ticks_ns: f64 = 0.0,
status: TimerStatus = TimerStatus.stopped,
pub fn start(self: *Timer) void {
if (self.status == .started) return;
self.status = .started;
self.start_ticks_ns = @floatFromInt(std.time.nanoTimestamp());
self.pause_ticks_ns = 0;
}
pub fn stop(self: *Timer) void {
if (self.status == .stopped) return;
self.status = .stopped;
self.start_ticks_ns = 0;
self.pause_ticks_ns = 0;
}
// Resets the timer to 0 and starts it
pub fn reset(self: *Timer) void {
self.status = .started;
self.start_ticks_ns = @floatFromInt(std.time.nanoTimestamp());
self.pause_ticks_ns = 0;
}
pub fn pause(self: *Timer) void {
if (self.status == .paused or self.status == .stopped) return;
self.status = .paused;
const ns_stampf: f64 = @floatFromInt(std.time.nanoTimestamp());
self.pause_ticks_ns = (ns_stampf - self.start_ticks_ns) / 1_000_000;
}
pub fn unpause(self: *Timer) void {
if (self.status == .started or self.status == .stopped) return;
self.status = .started;
const ns_stampf: f64 = @floatFromInt(std.time.nanoTimestamp());
const diff_ns: f64 = ns_stampf - self.pause_ticks_ns;
self.start_ticks_ns = self.start_ticks_ns + diff_ns;
self.pause_ticks_ns = 0;
}
// Gets the current tick/ms of the timer
pub fn getTicks(self: *Timer) f64 {
switch (self.status) {
.stopped => {
return 0;
},
.paused => {
return self.pause_ticks_ns / 1_000_000;
},
.started => {
const ns_stampf: f64 = @floatFromInt(std.time.nanoTimestamp());
return (ns_stampf - self.start_ticks_ns) / 1_000_000;
},
}
}
};