unflappable

A batteries-included [embedded-hal] [InputPin] debouncer.

Quickstart

Add the following to your Cargo.toml:

toml [dependencies] unflappable = "0.1"

Create an uninitialized [Debouncer] in static storage.

rust use unflappable::{debouncer_uninit, Debouncer, default::ActiveLow}; static DEBOUNCER: Debouncer<PinType, ActiveLow> = debouncer_uninit!();

Initialize the Debouncer with your input pin, returning the [Debounced] pin. Use this pin just as you would any other [InputPin], such as passing ownership to another abstraction.

rust let debounced_pin = unsafe { DEBOUNCER.init(input_pin) }.unwrap();

Regularly poll the Debouncer, perhaps in an interrupt service routine.

rust unsafe { DEBOUNCER.poll()?; }

Documentation

API Docs

API docs are hosted on docs.rs:

[API Documentation]

Minimum Supported Rust Version

This crate makes use of trait bounds on a const fn, which is currently unstable. Therefore, we require use of the nightly compiler. When [rust-lang/rust#67792] stabilizes, we will establish a MSRV policy.

Comparison to other debounce crates

There are at least three debouncing crates targeting embedded Rust development. How does this one compare to the others?

Crate: unflappable Wraps InputPin: Yes Can move wrapped pin: Yes Algorithm: Integration-based by [Kuhn] State overhead: u8

Crate: [debounced-pin] Wraps InputPin: Yes Can move wrapped pin: No Algorithm: Differentiation-based by [Greensted] State overhead: u8 + enum

Crate: [debouncr] Wraps InputPin: No Can move wrapped pin: N/A Algorithm: Differentiation-based by [Ganssle] State overhead: u8

Crate: [debouncing] Wraps InputPin: No Can move wrapped pin: N/A Algorithm: Differentiation-based by [Hackaday] State overhead: u8 + dynamically-allocated Vec

Contributing

I'm happy to see any and all contributions, including bug reports, usability suggestions, patches, or angry yet well-intentioned rants. You are encouraged to report issues to the official [issue tracker] and send any questions or patches to the [mailing list]. Pull requests to the GitHub mirror are also acceptable.