use embassy_time::{Duration, Timer};
use esp_hal::{
gpio::{Event, Input, InputConfig, Pull},
peripherals::GPIO0,
};
const DEBOUNCE: Duration = Duration::from_millis(10);
#[derive(Debug)]
pub struct Button {
input: Input<'static>,
}
impl Button {
#[must_use]
pub fn is_pressed(&self) -> bool {
self.input.is_low()
}
pub async fn wait_for_press(&mut self) {
loop {
self.input.wait_for_high().await;
self.input.wait_for_low().await;
Timer::after(DEBOUNCE).await;
if self.is_pressed() {
return;
}
}
}
pub fn listen_for_wake(&mut self) {
self.input.listen(Event::LowLevel);
}
}
#[must_use]
pub fn button(pin: GPIO0<'static>) -> Button {
Button {
input: Input::new(pin, InputConfig::default().with_pull(Pull::Up)),
}
}