Files

153 lines
5.4 KiB
Zig

const sys = @import("sys");
const errors = @import("error");
// ---------------------------------------------------------------------------
// Wakeup cause
// ---------------------------------------------------------------------------
pub const WakeupCause = enum(sys.esp_sleep_wakeup_cause_t) {
undefined_cause = sys.ESP_SLEEP_WAKEUP_UNDEFINED,
all = sys.ESP_SLEEP_WAKEUP_ALL,
ext0 = sys.ESP_SLEEP_WAKEUP_EXT0,
ext1 = sys.ESP_SLEEP_WAKEUP_EXT1,
timer = sys.ESP_SLEEP_WAKEUP_TIMER,
touchpad = sys.ESP_SLEEP_WAKEUP_TOUCHPAD,
ulp = sys.ESP_SLEEP_WAKEUP_ULP,
gpio = sys.ESP_SLEEP_WAKEUP_GPIO,
uart = sys.ESP_SLEEP_WAKEUP_UART,
wifi = sys.ESP_SLEEP_WAKEUP_WIFI,
bt = sys.ESP_SLEEP_WAKEUP_BT,
_,
};
// ---------------------------------------------------------------------------
// Power domain configuration
// ---------------------------------------------------------------------------
pub const PdDomain = enum(sys.esp_sleep_pd_domain_t) {
rtc_periph = sys.ESP_PD_DOMAIN_RTC_PERIPH,
rtc_slow_mem = sys.ESP_PD_DOMAIN_RTC_SLOW_MEM,
rtc_fast_mem = sys.ESP_PD_DOMAIN_RTC_FAST_MEM,
xtal = sys.ESP_PD_DOMAIN_XTAL,
rc_fast = sys.ESP_PD_DOMAIN_RC_FAST,
vddsdio = sys.ESP_PD_DOMAIN_VDDSDIO,
modem = sys.ESP_PD_DOMAIN_MODEM,
max = sys.ESP_PD_DOMAIN_MAX,
};
pub const PdOption = enum(sys.esp_sleep_pd_option_t) {
off = sys.ESP_PD_OPTION_OFF,
on = sys.ESP_PD_OPTION_ON,
auto = sys.ESP_PD_OPTION_AUTO,
};
/// Configure the power state of a peripheral domain during sleep.
pub fn pdConfig(domain: PdDomain, option: PdOption) !void {
try errors.espCheckError(sys.esp_sleep_pd_config(@intFromEnum(domain), @intFromEnum(option)));
}
// ---------------------------------------------------------------------------
// Wakeup source configuration
// ---------------------------------------------------------------------------
/// Enable wakeup by timer after `time_in_us` microseconds.
pub fn enableTimerWakeup(time_in_us: u64) !void {
try errors.espCheckError(sys.esp_sleep_enable_timer_wakeup(time_in_us));
}
/// Enable wakeup from a GPIO level change (light sleep only on most targets).
pub fn enableGpioWakeup() !void {
try errors.espCheckError(sys.esp_sleep_enable_gpio_wakeup());
}
/// Enable wakeup by external signal on one RTC IO pin (ESP32 / ESP32-S* only).
pub fn enableExt0Wakeup(gpio_num: sys.gpio_num_t, level: c_int) !void {
try errors.espCheckError(sys.esp_sleep_enable_ext0_wakeup(gpio_num, level));
}
/// Enable wakeup by any/all of the given RTC IO pins.
pub fn enableExt1Wakeup(io_mask: u64, level_mode: sys.esp_sleep_ext1_wakeup_mode_t) !void {
try errors.espCheckError(sys.esp_sleep_enable_ext1_wakeup(io_mask, level_mode));
}
/// Enable wakeup from UART activity.
pub fn enableUartWakeup(uart_num: c_int) !void {
try errors.espCheckError(sys.esp_sleep_enable_uart_wakeup(uart_num));
}
/// Enable Bluetooth as a wakeup source.
pub fn enableBtWakeup() !void {
try errors.espCheckError(sys.esp_sleep_enable_bt_wakeup());
}
/// Enable WiFi as a wakeup source.
pub fn enableWifiWakeup() !void {
try errors.espCheckError(sys.esp_sleep_enable_wifi_wakeup());
}
/// Enable ULP co-processor as a wakeup source.
pub fn enableUlpWakeup() !void {
try errors.espCheckError(sys.esp_sleep_enable_ulp_wakeup());
}
/// Disable a wakeup source.
pub fn disableWakeupSource(source: sys.esp_sleep_source_t) !void {
try errors.espCheckError(sys.esp_sleep_disable_wakeup_source(source));
}
// ---------------------------------------------------------------------------
// Sleep entry points
// ---------------------------------------------------------------------------
/// Enter deep sleep immediately. Does not return.
/// Configure wakeup sources before calling.
pub fn deepSleepStart() noreturn {
sys.esp_deep_sleep_start();
unreachable;
}
/// Enter deep sleep for exactly `time_in_us` microseconds.
/// Convenience shortcut — sets timer wakeup and enters deep sleep. Does not return.
pub fn deepSleep(time_in_us: u64) noreturn {
sys.esp_deep_sleep(time_in_us);
unreachable;
}
/// Try to enter deep sleep. Returns an error if not all conditions are met.
pub fn deepSleepTryToStart() !void {
try errors.espCheckError(sys.esp_deep_sleep_try_to_start());
}
/// Enter light sleep. Returns when a wakeup event is triggered.
pub fn lightSleepStart() !void {
try errors.espCheckError(sys.esp_light_sleep_start());
}
// ---------------------------------------------------------------------------
// Wakeup cause query
// ---------------------------------------------------------------------------
/// Get the reason the chip was last woken from sleep.
pub fn getWakeupCause() WakeupCause {
return @enumFromInt(sys.esp_sleep_get_wakeup_cause());
}
/// Returns true if the wakeup cause matches `cause`.
pub fn wasWokenBy(cause: WakeupCause) bool {
return getWakeupCause() == cause;
}
// ---------------------------------------------------------------------------
// Deep sleep hooks
// ---------------------------------------------------------------------------
/// Register a callback to run just before deep sleep entry.
pub fn registerDeepSleepHook(cb: sys.esp_deep_sleep_cb_t) !void {
try errors.espCheckError(sys.esp_deep_sleep_register_hook(cb));
}
/// Unregister a previously registered deep sleep hook.
pub fn deregisterDeepSleepHook(cb: sys.esp_deep_sleep_cb_t) void {
sys.esp_deep_sleep_deregister_hook(cb);
}