Skip to content

Repository files navigation

Button driver

cratesdoc

This crate is a button driver for embedded Rust projects. It offers various usage scenarios, supports ESP, embedded_hal, embassy, wasm and no_std targets.

This crate aims to be as flexible as possible to support various HALs and use-cases.

Examples

For more examples consider looking into the examples folder. You can easily flash/run them using cargo run command! Use trunk serve to run the wasm example.

For ESP32C3 with std:

Required features: std, embedded_hal

use std::time::Instant;use button_driver::{Button,ButtonConfig};use esp_idf_hal::{gpio::PinDriver, prelude::Peripherals};use esp_idf_sys::EspError;use log::info;fnmain() -> Result<(),EspError>{
esp_idf_svc::log::EspLogger::initialize_default();let peripherals = Peripherals::take().unwrap();let pin = PinDriver::input(peripherals.pins.gpio9)?;letmut button = Button::<_,Instant>::new(pin,ButtonConfig::default());loop{
button.tick();ifletSome(dur) = button.held_time(){info!("Total holding time {:?}", dur);if button.is_clicked(){info!("Clicked + held");}elseif button.is_double_clicked(){info!("Double clicked + held");}elseif button.holds() == 2 && button.clicks() > 0{info!("Held twice with {} clicks", button.clicks());}elseif button.holds() == 2{info!("Held twice");}}else{if button.is_clicked(){info!("Click");}elseif button.is_double_clicked(){info!("Double click");}elseif button.is_triple_clicked(){info!("Triple click");}elseifletSome(dur) = button.current_holding_time(){info!("Held for {:?}", dur);}}
button.reset();}}

TODO

  1. asyncsupport
  2. Debounce strategies support

Algorithm

High-level state machine diagram

button-driver-state-machine

About

Advanced button handling crate

Resources

Stars

11 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages