generated from sirlilpanda/kicad-project-template-actionless
97 lines
3.8 KiB
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);
|
|
}
|
|
};
|