Files
esp32-racer/software/zig_main/imports/timer.zig

97 lines
3.8 KiB
Zig

const sys = @import("sys");
const errors = @import("error");
// ---------------------------------------------------------------------------
// Type aliases
// ---------------------------------------------------------------------------
pub const Handle = sys.esp_timer_handle_t;
pub const Callback = sys.esp_timer_cb_t;
pub const CreateArgs = sys.esp_timer_create_args_t;
/// Dispatch method: callback runs in a dedicated high-priority task (TASK)
/// or directly from the ISR (ISR — use only for very short callbacks).
pub const Dispatch = enum(sys.esp_timer_dispatch_t) {
task = sys.ESP_TIMER_TASK,
max = sys.ESP_TIMER_MAX,
};
// ---------------------------------------------------------------------------
// High-resolution timer (esp_timer)
// ---------------------------------------------------------------------------
pub const Timer = struct {
// ── Lifecycle ────────────────────────────────────────────────────────────
/// Create a new timer. `args.callback` must be non-null.
/// Returns the handle; caller owns it and must call `delete()` when done.
pub fn create(args: *const CreateArgs) !Handle {
var handle: Handle = null;
try errors.espCheckError(sys.esp_timer_create(args, &handle));
return handle;
}
/// Start a one-shot timer that fires after `timeout_us` microseconds.
pub fn startOnce(handle: Handle, timeout_us: u64) !void {
try errors.espCheckError(sys.esp_timer_start_once(handle, timeout_us));
}
/// Start a periodic timer that fires every `period_us` microseconds.
pub fn startPeriodic(handle: Handle, period_us: u64) !void {
try errors.espCheckError(sys.esp_timer_start_periodic(handle, period_us));
}
/// Restart a running timer with a new `timeout_us`.
/// Works for both one-shot and periodic timers.
pub fn restart(handle: Handle, timeout_us: u64) !void {
try errors.espCheckError(sys.esp_timer_restart(handle, timeout_us));
}
/// Stop a running timer. Does not delete it.
pub fn stop(handle: Handle) !void {
try errors.espCheckError(sys.esp_timer_stop(handle));
}
/// Delete a timer. The timer must be stopped first.
pub fn delete(handle: Handle) !void {
try errors.espCheckError(sys.esp_timer_delete(handle));
}
// ── Query ────────────────────────────────────────────────────────────────
/// Return current time in microseconds since boot.
/// This never returns an error.
pub fn getTime() i64 {
return sys.esp_timer_get_time();
}
/// Return the expiry time (µs since boot) of the next pending alarm.
pub fn getNextAlarm() i64 {
return sys.esp_timer_get_next_alarm();
}
/// Return the expiry time of the next alarm that can wake the system.
pub fn getNextAlarmForWakeUp() i64 {
return sys.esp_timer_get_next_alarm_for_wake_up();
}
/// Return the period (µs) of a periodic timer.
pub fn getPeriod(handle: Handle) !u64 {
var period: u64 = 0;
try errors.espCheckError(sys.esp_timer_get_period(handle, &period));
return period;
}
/// Return the expiry time (µs since boot) for a one-shot timer.
pub fn getExpiryTime(handle: Handle) !u64 {
var expiry: u64 = 0;
try errors.espCheckError(sys.esp_timer_get_expiry_time(handle, &expiry));
return expiry;
}
/// Returns `true` if the timer is currently active (started, not yet fired / periodic).
pub fn isActive(handle: Handle) bool {
return sys.esp_timer_is_active(handle);
}
};