Skip to content

Commit dad3872

Browse files
committed
Simplify the sleep API
1 parent 8228e23 commit dad3872

File tree

4 files changed

+485
-849
lines changed

4 files changed

+485
-849
lines changed

examples/deep_sleep.rs

Lines changed: 48 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -11,97 +11,71 @@
1111
#![allow(unknown_lints)]
1212
#![allow(unexpected_cfgs)]
1313

14-
#[cfg(any(esp32, esp32s2, esp32s3, esp32c2, esp32c3))]
1514
use core::time::Duration;
16-
// #[cfg(any(esp32, esp32s2, esp32s3))]
17-
// use esp_idf_hal::gpio;
18-
#[cfg(any(esp32c2, esp32c3))]
19-
use esp_idf_hal::gpio::Level;
20-
#[cfg(any(esp32, esp32s2, esp32s3, esp32c2, esp32c3))]
21-
use esp_idf_hal::gpio::{PinDriver, Pull};
22-
#[cfg(any(esp32, esp32s2, esp32s3, esp32c2, esp32c3))]
15+
16+
use esp_idf_hal::gpio::{Level, PinDriver, Pull};
2317
use esp_idf_hal::peripherals::Peripherals;
2418
use esp_idf_hal::reset::{ResetReason, WakeupReason};
25-
#[cfg(any(esp32, esp32s2, esp32s3, esp32c2, esp32c3))]
2619
use esp_idf_hal::sleep::*;
2720

28-
fn print_wakeup_result() {
21+
fn main() -> anyhow::Result<()> {
22+
esp_idf_hal::sys::link_patches();
23+
2924
let reset_reason = ResetReason::get();
3025
let wakeup_reason = WakeupReason::get();
3126
println!(
32-
"reset after {:?} wakeup due to {:?}",
27+
"Reset after {:?}; wakeup due to {:?}",
3328
reset_reason, wakeup_reason
3429
);
35-
}
3630

37-
fn main() -> anyhow::Result<()> {
38-
esp_idf_hal::sys::link_patches();
31+
let peripherals = Peripherals::take()?;
3932

40-
print_wakeup_result();
41-
42-
#[cfg(any(esp32, esp32s2, esp32s3, esp32c2, esp32c3))]
43-
let peripherals = Peripherals::take().unwrap();
44-
45-
// RTC wakeup definitions
46-
#[cfg(esp32)]
47-
let rtc0 = PinDriver::rtc_input(peripherals.pins.gpio26, Pull::Down)?;
48-
#[cfg(esp32)]
49-
let rtc1 = PinDriver::rtc_input(peripherals.pins.gpio27, Pull::Down)?;
50-
51-
#[cfg(any(esp32s2, esp32s3))]
52-
let rtc0 = PinDriver::rtc_input(peripherals.pins.gpio1, Pull::Down)?;
53-
#[cfg(any(esp32s2, esp32s3))]
54-
let rtc1 = PinDriver::rtc_input(peripherals.pins.gpio2, Pull::Down)?;
55-
56-
#[cfg(any(esp32, esp32s2, esp32s3))]
57-
let rtc_pin0 = &rtc0;
58-
#[cfg(any(esp32, esp32s2, esp32s3))]
59-
let rtc_pin1 = &rtc1;
60-
#[cfg(any(esp32, esp32s2, esp32s3))]
61-
let rtc_wakeup = Some(RtcWakeup {
62-
pins: rtc_pin0.chain(rtc_pin1),
63-
wake_level: RtcWakeLevel::AnyHigh,
64-
});
65-
66-
#[cfg(any(esp32, esp32s2, esp32s3))]
67-
let dsleep = make_deep_sleep_rtc_pins(
68-
Some(TimerWakeup::new(Duration::from_secs(5))),
69-
rtc_wakeup,
70-
None,
71-
None,
72-
);
33+
// Sample GPIO pins
34+
// GPIO pins can only be used in deep sleep on the esp32c2 and esp32c3 where there are no RTC pins
35+
//
36+
// Note also, that ONLY pins connected to the VDD3P3_RTC power domain can be used for deep-sleep wakeup,
37+
// which is not enforced in the deep-sleep API.
7338

74-
// GPIO wakeup definitions
7539
#[cfg(any(esp32c2, esp32c3))]
76-
let gpio0 = PinDriver::input(peripherals.pins.gpio0, Pull::Down)?;
40+
let gpio0 = PinDriver::input(peripherals.pins.gpio12, Pull::Down)?;
7741
#[cfg(any(esp32c2, esp32c3))]
78-
let gpio1 = PinDriver::input(peripherals.pins.gpio1, Pull::Down)?;
42+
let gpio1 = PinDriver::input(peripherals.pins.gpio14, Pull::Down)?;
7943

80-
#[cfg(any(esp32c2, esp32c3))]
81-
let gpio_pin0 = GpioWakeupPin {
82-
pindriver: &gpio0,
83-
wake_level: Level::High,
84-
};
85-
#[cfg(any(esp32c2, esp32c3))]
86-
let gpio_pin1 = GpioWakeupPin {
87-
pindriver: &gpio1,
88-
wake_level: Level::Low,
89-
};
90-
#[cfg(any(esp32c2, esp32c3))]
91-
let gpio_wakeup = Some(GpioDeepWakeup {
92-
pins: EmptyGpioWakeupPins::chain(gpio_pin0).chain(gpio_pin1),
93-
});
44+
// Sample RTC pins
45+
// No RTC on esp32c2 and esp32c3
46+
47+
#[cfg(not(any(esp32c2, esp32c3)))]
48+
let rtc0 = PinDriver::rtc_input(peripherals.pins.gpio15, Pull::Down)?;
49+
#[cfg(not(any(esp32c2, esp32c3)))]
50+
let rtc1 = PinDriver::rtc_input(peripherals.pins.gpio16, Pull::Down)?;
51+
52+
// Assemble the wakeup sources now
53+
54+
let wakeup = Empty
55+
// Add timer wakeup
56+
.chain(TimerWakeup::new(Duration::from_secs(5)));
9457

9558
#[cfg(any(esp32c2, esp32c3))]
96-
let dsleep =
97-
make_deep_sleep_gpio_pins(Some(TimerWakeup::new(Duration::from_secs(5))), gpio_wakeup);
98-
99-
#[cfg(any(esp32, esp32s2, esp32s3, esp32c2, esp32c3))]
100-
println!("Deep sleep with: {:?}", dsleep);
101-
#[cfg(any(esp32, esp32s2, esp32s3, esp32c2, esp32c3))]
102-
dsleep.prepare()?;
103-
#[cfg(any(esp32, esp32s2, esp32s3, esp32c2, esp32c3))]
104-
dsleep.sleep();
105-
#[cfg(not(any(esp32, esp32s2, esp32s3, esp32c2, esp32c3)))]
59+
let wakeup = wakeup
60+
// Add GPIO wakeup
61+
.chain(PinsWakeup::<_, Gpio>::new(
62+
Empty
63+
.chain((&gpio0, Level::High))
64+
.chain((&gpio1, Level::High)),
65+
));
66+
67+
#[cfg(not(any(esp32c2, esp32c3)))]
68+
let wakeup = wakeup
69+
// Add RTC wakeup
70+
.chain(PinsWakeup::<_, Rtc>::new(
71+
Empty.chain(&rtc0, Level::High).chain(&rtc1, Level::High),
72+
));
73+
74+
println!("Deep sleep with wakeup: {:?}", wakeup);
75+
76+
let e = deep_sleep(wakeup);
77+
78+
println!("Failed to enter deep sleep: {:?}", e);
79+
10680
Ok(())
10781
}

0 commit comments

Comments
 (0)