generated from sirlilpanda/kicad-project-template-actionless
Added the zig_main project to software for zig based implementation of code for robot
This commit is contained in:
152
software/zig_main/imports/sleep.zig
Normal file
152
software/zig_main/imports/sleep.zig
Normal file
@@ -0,0 +1,152 @@
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user